Windows下PaddleOCR安装与使用指南:从环境搭建到调优实战
很多人第一次在 Windows 上接触 PaddleOCR都是被“国产最强开源 OCR”这几个字吸引过来的。但真到动手装环境的时候一大堆问题就冒出来了pip 装到一半卡死、模型下载失败、import 直接报 DLL 加载错误、识别出来全是一堆乱码……尤其是国内网络环境下模型下载问题几乎人人都会遇到。这篇文章我把整套流程从零讲清楚包括 Python 环境怎么搭、CPU 和 GPU 版怎么选、新版 API 和旧版教程的差异、推理代码怎么写、识别精度怎么调以及那些最容易让 Windows 用户心态崩溃的报错怎么排查。内容全部基于我实际在 Windows 上反复安装和测试过的经验照着做基本能一次跑通。1. 为什么 Windows 上的 OCR 选型我会给 PaddleOCR 投一票先聊聊选型这决定了你接下来几天的开发体验。我做 OCR 相关的小工具也有三四年了从 Tesseract 开始玩后来用过 EasyOCR也接过百度云的 API最近一年多项目里的 OCR 主力基本固定成了 PaddleOCR。Windows 平台上选 OCR 框架我总结下来就看三件事安装友好度、中文识别效果、离线可用性。Tesseract 的安装其实很有历史感Windows 上要先装 exe再下训练好的语言包中文包体积不小而且识别印刷体还行遇到背景稍微复杂点的图正确率掉得很快。EasyOCR 使用的深度学习模型对中文效果比 Tesseract 强但它是基于 PyTorch 的Windows 上装 PyTorch 的 CUDA 版本要自己处理一大堆依赖而且模型文件很大推理速度也不算理想。云端的 OCR 服务效果确实好但每次调用都要上传图片数据敏感一点的场景根本没法用还牵扯到按量付费的问题。对比下来PaddleOCR 在 Windows 上的优势就很明显了。它是百度开源的对中文场景做了大量优化自带文本检测、方向分类、文本识别三条完整 pipeline模型文件也不大PP-OCRv4 的中文识别模型体积只有十几 MB普通 CPU 上跑一张图也就一两秒出结果。更重要的是它支持纯离线推理装完之后断网也能用。安装上虽然要装 PaddlePaddle 框架但 pip 一条命令就能搞定CPU 版几乎零门槛。我用实际项目对比过同样一张带倾斜角度的中文发票照片Tesseract 识别出来基本不能看EasyOCR 勉强能读出关键数字但会有错字PaddleOCR 开启方向分类后关键字段能正确识别出来。这个差距很直观。还有一个 Windows 用户很在意的点PaddleOCR 提供了非常清晰的 Python API而且 3.0 版本之后接口做了大幅简化不用像 2.x 那样传一堆参数几行代码就能实现从图片到文字的完整流程。对于想在 Windows 上快速做个办公自动化小工具的人来说这是最佳的落地路径。当然它也有缺点。最大的坑就是 PaddlePaddle 框架本身GPU 版本对 CUDA 版本要求很严格装错了就会报错这一点在后面的环境搭建部分我会详细展开。另外PaddleOCR 的新版和旧版 API 差异很大网上搜索出来的教程很多还是 2.x 时代的写法直接复制到新版环境里跑不通这也是很多人安装失败后觉得“教程怎么都对不上”的根本原因。一句话总结我的观点如果你是 Windows 用户主要识别中文需要本地离线部署PaddleOCR 是当前综合成本最低的选择。接下来直接进入实战。2. Windows 环境搭建Python 版本、虚拟环境与 PaddlePaddle 安装的取舍环境搭建是整个过程中最容易劝退新手的环节。Windows 上 Python 环境乱不是一天两天了好在 PaddlePaddle 的兼容性这些年改善不少只要按下面这个流程走基本不会再踩雷。2.1 Python 版本选择别用最新版3.9 到 3.11 最稳PaddlePaddle 和 PaddleOCR 虽然更新很快但它们的预编译包对 Python 版本的支持总有一定滞后。我在多台 Windows 机器上实测下来Python 3.9、3.10、3.11 这几个版本是最稳的区间。3.12 及以上版本出现过预编译 wheel 包缺失的情况可能需要等待官方更新或自行编译非常折腾。3.8 以下版本则太老部分依赖库的新版已经不再支持了。安装 Python 时有两个建议。第一一定要勾选安装器底部的“Add Python to PATH”选项。很多人装完 Python 后在 cmd 里输python提示不是内部或外部命令基本都是没勾这个导致的。如果已经装好了才发现没加 PATH可以到“设置 - 系统 - 关于 - 高级系统设置 - 环境变量”手动把 Python 安装目录和Scripts子目录加进去。第二建议顺手装一下 Anaconda 或者 Miniconda。不是强制要求但 conda 在管理虚拟环境方面确实省心。特别是你机器上可能还有别的 Python 项目不同项目依赖的库版本不一样用虚拟环境隔离后各玩各的互不干扰。我自己的习惯是用 conda 创建一个专门的 OCR 环境就算装坏了也不会影响到主环境。conda create -n paddle python3.10 conda activate paddle这条命令创建了一个名为paddle的独立环境Python 版本 3.10后续所有安装操作都发生在这个环境内部。如果你不想用 conda直接用 Python 自带的venv也完全可以区别只是虚拟环境的管理方式不同。2.2 CPU 版安装一条命令搞定如果你只是偶尔识别几张图、跑跑办公自动化脚本CPU 版完全够用。安装命令很简单python -m pip install paddlepaddle注意 PyPI 官方源在部分网络环境下可能较慢可以使用国内镜像源加速下载例如清华源:python -m pip install paddlepaddle -i https://pypi.tuna.tsinghua.edu.cn/simple装完之后验证一下python -c import paddle; print(paddle.__version__)如果顺利输出版本号比如3.0.0说明 PaddlePaddle 框架已经装好了。我在几台没有独显的办公机上测试过CPU 版识别人脸、发票、截图等常见图片单张耗时基本在 0.5 到 2 秒之间完全在可接受范围内。2.3 GPU 版的正确打开方式先查驱动和 CUDA再装包GPU 版的坑明显比 CPU 版多。很多人一上来直接pip install paddlepaddle-gpu结果导入时报错 CUDA 版本不匹配或者找不到 cuDNN。PaddlePaddle 的 GPU 版和 CUDA 版本是强绑定的装错版本跑不起来。正确顺序是这样的。先看显卡驱动支持的最高 CUDA 版本。在 cmd 里运行nvidia-smi输出的右上角有“CUDA Version”字样那个数字不是说你机器上装了 CUDA而是表示驱动最高兼容的 CUDA 版本。比如显示 CUDA 12.4你就可以放心安装支持 CUDA 12.x 的 PaddlePaddle 包。然后根据这个数字去 PaddlePaddle 官方安装页查找对应版本的安装命令。PaddlePaddle 的版本号和 CUDA 版本有对应关系例如最新版通常支持 CUDA 12.0 和 12.6 等版本如果你是老显卡可能要找历史版本。在没有合适 PyPI 包的情况下可以通过安装指令启用额外的索引源如https://www.paddlepaddle.org.cn/packages/stable/cu123/来安装。这里我强烈建议在安装 GPU 版之前先创建一个全新的虚拟环境不要和 CPU 版混在同一个环境里。两个版本的 PaddlePaddle 都是大体积依赖混装容易出现动态链接库冲突报错极其诡异。我自己就吃过这个亏CPU 版和 GPU 版在同一个环境里识别结果模型加载时随机崩溃。GPU 版装完后同样验证一下这次可以多检查一步python -c import paddle; paddle.utils.run_check()如果输出了 “PaddlePaddle is installed successfully! Lets start deep learning.” 类似的提示说明 GPU 环境没问题。如果运行报错找不到 CUDA 库检查环境变量PATH里有没有 CUDA 的bin目录没有的话手动加上再试。2.4 安装 PaddleOCR注意依赖版本冲突框架装好之后安装 PaddleOCR 本身很简单python -m pip install paddleocr这一步几乎不会出问题真正的问题是它拉起来的一堆依赖比如 opencv-python、numpy、shapely、Pillow 等这些库之间偶尔会有版本冲突。最典型的情况是 numpy 版本过高导致某些图像处理操作报错或者 opencv 版本与 PaddlePaddle 的图像预处理库不兼容。如果你在后面的使用过程中遇到奇怪的报错且报错指向 numpy 或者 opencv大概率就是依赖版本问题。处理办法是手动把关键依赖降到兼容版本比如python -m pip install numpy1.26.4 opencv-python4.8.1.78这种“框架装好了但依赖库相互打架”的问题在 Windows 上尤其常见因为 Windows 下的二进制包编译链更长版本可选择性也更少。好在只要锁定这几个核心库的版本一般就能稳定下来。3. 跑通第一行识别代码新版 API 与旧版教程的坑一次说明白环境装好之后最激动人心的时刻就是写代码跑识别了。但这里有个大坑PaddleOCR 2.x 和 3.x 的 API 差异非常大网上很多教程、博客、视频用的还是 2.x 的写法你拿到新版环境下直接跑大概率得到一堆 TypeError。3.1 2.x 时代的经典写法在老版本中PaddleOCR 的使用方式大致是这样的from paddleocr import PaddleOCR ocr PaddleOCR(use_angle_clsTrue, langch, show_logFalse) result ocr.ocr(test.jpg, clsTrue) for line in result: for word_info in line: print(word_info[1][0])这段代码在 2.x 时代很好用但在 PaddleOCR 3.0 之后use_angle_cls这个参数已经被移除了ocr.ocr()方法也被标记为过时运行时会有 DeprecationWarning而且部分参数行为也变了。照着老教程写你会发现 IDE 里全是红色波浪线。3.2 新版推荐写法新版本推荐的是更标准的对象式调用。先初始化识别器再调用predict方法from paddleocr import PaddleOCR # 初始化识别器 ocr PaddleOCR( langch, # 识别语言中文 use_doc_orientation_classifyFalse, use_doc_unwarpingFalse, use_textline_orientationTrue, ) # 对图片进行预测 result ocr.predict(inputtest.jpg) # 解析结果 for res in result: # 输出结果是一个字典格式的对象 print(res)新版预测结果返回的是一个包含多个字段的对象其中rec_texts是识别出的文本列表rec_scores是对应的置信度。如果你只想快速看到文本内容可以这样提取for res in result: texts res[rec_texts] scores res[rec_scores] for text, score in zip(texts, scores): print(f{text} 置信度: {score:.2f})3.3 draw_ocr 可视化把识别框画到原图上识别出文字只是第一步很多时候你要把识别区域框出来方便人工核对或者展示效果。新版 PaddleOCR 仍然保留了画框工具from paddleocr import PaddleOCR from paddleocr import draw_ocr ocr PaddleOCR(langch) result ocr.predict(inputtest.jpg) # 取出第一张图的检测框和识别结果 res result[0] boxes [line[box] for line in res[rec_boxes]] texts res[rec_texts] scores res[rec_scores] # 画图并保存 from PIL import Image image Image.open(test.jpg).convert(RGB) im_show draw_ocr(image, boxesboxes, txtstexts, scoresscores, font_pathsimfang.ttf) im_show.save(result.jpg)draw_ocr需要传一个字体文件路径Windows 系统自带simfang.ttf仿宋路径通常在C:/Windows/Fonts/simfang.ttf。不传或字体路径不对画出来的中文可能全是方框。如果你系统里没有这个字体用simhei.ttf黑体也行。3.4 模型自动下载与手动指定位置PaddleOCR 初始化时会自动检测本地有没有对应模型没有就自动下载。默认下载位置在 Windows 用户目录下的.paddlex/official_models目录里。首次运行时会看到下载进度条这个过程在网络条件好的情况下一般几分钟就完成了。问题在于部分网络环境下自动下载非常容易失败。如果反复下载失败建议你手动下载模型文件然后通过参数指定模型路径。文本检测模型det_model_dir方向分类模型cls_model_dir文本识别模型rec_model_dir用法示例ocr PaddleOCR( langch, det_model_dirD:/models/ch_PP-OCRv4_det_infer, rec_model_dirD:/models/ch_PP-OCRv4_rec_infer, cls_model_dirD:/models/ch_ppocr_mobile_v2.0_cls_infer, )手动下载模型时要注意下载的压缩包要解压到目录里且目录名不能随便改因为模型读取时会按照固定的目录结构去找文件。解压后检查目录里有没有inference.pdmodel和inference.pdiparams这两个文件缺一个都会加载失败。另外有个细节3.x 版本默认使用 PP-OCRv5 模型如果你之前在 2.x 时代用的是 PP-OCRv4 或者更早的模型新版会自动下载一套新模型不用手动去管。旧模型也能用但效果上不如 v5 新模型稳定。3.5 跑通后的第一个真实案例我拿一张有倾斜角度的中文名片做了测试代码就是上面新版写法的完整流程。原图里有一行字“北京百度网讯科技有限公司”位置是略微倾斜的。因为初始化时开启了use_textline_orientationTrue方向分类器把倾斜文本矫正后再进行识别最终输出结果正确识别出了整行文字置信度 0.97。如果没有开方向矫正这行倾斜文字有可能被识别成支离破碎的片段。这个参数在识别手机拍照的文档、票据时非常重要别因为它默认值不影响就忽略掉。4. 识别精度与性能优化图像预处理和参数调校才是拉开差距的地方很多人跑通识别之后就直接进入“能用就行”模式。但实际投入到业务场景比如批量识别上百张票据、截图或者素材质量参差不齐的图片时你会发现默认参数的识别率还不够理想。这里把我调优的经验分享出来。4.1 图像预处理别让原始图片直接进模型PaddleOCR 内部虽然自带了图像预处理逻辑但在喂给模型之前自己做一遍基础的质量提升往往能显著提高识别率。我用 OpenCV 做三件事降噪、灰度化、尺寸归一化。import cv2 img cv2.imread(test.jpg) # 转灰度 gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 降噪 denoised cv2.fastNlMeansDenoising(gray, None, 30, 7, 21) # 尺寸归一化短边缩放到1080左右 h, w denoised.shape[:2] if min(h, w) 1080: scale 1080 / min(h, w) denoised cv2.resize(denoised, (int(w * scale), int(h * scale)))降噪对扫描件、老旧照片这类带颗粒噪点的图片效果非常明显识别率能提升好几个百分点。尺寸归一化主要解决图片太大导致推理变慢的问题在 CPU 上推理尤其重要。分辨率太高并不会等比例提升识别准确率模型输入尺寸是固定的太大会被强制压缩反而可能造成细节丢失。如果原图背景很复杂比如是带底纹的票据可以先做二值化增强前景和背景的对比度_, binary cv2.threshold(denoised, 0, 255, cv2.THRESH_BINARY cv2.THRESH_OTSU)Otsu 自动阈值在大部分场景都能找到合适的分隔点比手动指定阈值靠谱得多。注意二值化之后要重新转回三通道因为 PaddleOCR 推理时会把图像转成 RGB 格式单通道图虽然也能跑但部分预处理环节会出警告。4.2 核心参数det 系列参数和 cls 参数的作用PaddleOCR 的文本检测阶段有很多带det_前缀的参数默认值在大多数场景下表现不错但遇到特殊情况需要手动调节。几个常用的参数名默认值作用调优建议det_db_thresh0.3检测框置信度阈值低于此值的区域不认为是文本文本较浅时降低到 0.2det_db_box_thresh0.6检测框 box 的阈值过滤掉过于扁平的检测框框不完整时降低到 0.5det_db_unclip_ratio1.5检测框向外扩的比例影响框边界和文本贴合度文本边缘被截断时增大到 2.0det_limit_side_len960检测阶段图像的短边长度限制越大越慢但可能更准CPU 上建议保持 960GPU 可调到 1280方向分类的参数是cls_thresh控制方向分类结果的置信度阈值。如果图片里的文字基本都是正的不用管如果大量是手机随手拍的横竖混排版建议把use_textline_orientation保持默认开启。这些参数怎么传以新版 API 为例ocr PaddleOCR( langch, det_db_thresh0.2, det_db_box_thresh0.5, det_db_unclip_ratio2.0, )4.3 为什么同一个模型识别效果忽好忽坏模型选择是隐藏变量PaddleOCR 对不同场景提供了不同模型风格。PaddleOCR 3.x 默认下载的 PP-OCRv5 系列模型是移动端优化版体积小、速度快、精度也不差适合大多数场景。但如果你识别的是长文档、学术论文这类排版规整的文本使用服务器端模型精度会更高。手动指定模型目录加载ocr PaddleOCR( langch, det_model_dirD:/models/ch_PP-OCRv5_server_det_infer, rec_model_dirD:/models/ch_PP-OCRv5_server_rec_infer, )移动端模型和服务器端模型的差别主要在骨干网络结构上服务器端模型通常更重、更慢但特征提取能力更强。在 Windows CPU 机器上移动端模型单张图片大约 0.8 秒服务器端模型可能要 3 到 5 秒。如果不是对精度有极端要求我建议默认移动端模型就足够用了。还要注意一点如果图片里包含英文、数字和中文混排langch可以同时识别中英文。但如果内容主要是英文比如识别英文论文截图建议改langen中文模型在处理纯英文时偶尔会误识别出汉字偏旁。4.4 性能调优CPU 多线程和 GPU 显存控制Windows 下 CPU 推理时PaddlePaddle 支持设置线程数。默认线程数可能不多你可以在初始化之前设置import paddle paddle.set_device(cpu) # 设置 CPU 线程数 paddle.set_flags({FLAGS_use_mkldnn: True}) ocr PaddleOCR(langch)如果机器 CPU 核心数较多增大线程数能明显提升推理速度。但注意线程数不是越大越好线程过多会造成上下文切换开销一般设成物理核心数的一半到三分之二比较合适。mkldnnMKL-DNN是英特尔 CPU 的加速库开启后对推理速度有质的提升CPU 用户强烈建议开启。GPU 用户主要注意显存管理。默认批处理大小可能偏大在批量识别时容易出现显存溢出。新版本里可以通过ocr.predict(inputtest.jpg, batch_size16)控制推理批大小。显存只有 4G 的入门级显卡建议 batch_size 控制在 8 以内16G 以上显存可以放到 32 甚至更大吞吐量会更高但注意发热和功耗。5. Windows 高频报错与乱码问题排查我的踩坑实录与解决思路Windows 平台上跑 PaddleOCR报错信息往往比代码本身更劝退。我整理了几个出现频率最高的问题每个都给出完整的排查思路和解决方案。5.1DLL load failed while importing paddle这是最经典的 Windows 专属报错第一次装完 PaddlePaddle在 Python 里import paddle直接弹出DLL load failed新人大概率此时就崩溃了。这个问题九成原因是缺少 Microsoft Visual C Redistributable 运行库。PaddlePaddle 的预编译包是在 MSVC 环境下编译的运行时会动态加载一系列 DLL。Windows 系统如果缺少对应的 VC 运行库就会导入失败报错信息和具体 DLL 名称还会因 PaddlePaddle 版本不同而变化。解决办法是去微软官网下载最新的 Visual C Redistributablex64 版本安装后重启电脑。装完再试python -c import paddle; print(ok)这里多说一句一个比较隐蔽的原因是系统 PATH 环境变量里同时存在多个 Python 安装路径导致 Python 加载了不同版本的 DLL。如果你机器上装了多个 Python 发行版建议在 cmd 里用where python查看当前生效的是哪个确保它是你安装 PaddlePaddle 的那个环境。5.2 模型下载失败或卡在 Downloading别反复重试手动下载最快首次初始化 PaddleOCR 时如果网络不稳定模型下载会卡住很久最后提示超时。很多人选择一遍遍重试其实效率很低。处理思路分两类。其一配置代理或更换网络运营商的环境一般能解决问题但如果你不方便操作就直接走手动下载模型文件的路线。PaddleOCR 的模型文件在官网和 GitHub 上都有发布。手动下载后指定模型路径参考前面 3.4 小节的做法。手动下载模型要注意压缩包解压后要放在一个不含空格和中文的路径下。Windows 上放在C:\paddle_models这类路径最保险放在中文用户名目录下可能导致路径解析异常。下载器还有一个小细节如果模型下载到一半中断残留的临时文件会导致下次下载仍然失败。这时候需要手动删除下载目录里的临时文件。Windows 下模型默认存在C:\Users\你的用户名\.paddlex\official_models把整个目录删掉重新下载即可。5.3 Windows 控制台输出乱码不是识别问题是代码页问题经常有人把 PaddleOCR 识别结果打印到 Windows 控制台时出现乱码就误以为是模型识别错误。实际上绝大多数情况是 Windows 命令行的默认编码是 GBK而 Python 输出的是 UTF-8两者不一致导致显示乱码。解决办法很简单启动 Python 之前先切换控制台代码页chcp 65001或者在代码里重定向标准输出import sys import io sys.stdout io.TextIOWrapper(sys.stdout.buffer, encodingutf-8)顺带把识别结果的存储也统一编码写入文件时指定 UTF-8with open(result.txt, w, encodingutf-8) as f: f.write(\n.join(texts))5.4 GPU 版报错 CUDA error: no kernel image available这个报错主要发生在老显卡 新版 CUDA 工具包组合。PaddlePaddle GPU 版编译时针对特定架构生成 kernel老显卡的 compute capability 如果低于包的最低要求运行时就会报 no kernel image available。处理方法有两个方向。换用支持老架构的旧版 PaddlePaddle GPU 包比如 CUDA 10.x 时代的版本但旧版又无法使用新模型或者更新显卡驱动驱动更新后有时能解决问题。我建议在安装 GPU 版之前先查清楚自己显卡的 compute capability再决定使用哪个版本的 PaddlePaddle。PaddlePaddle 官网的安装页面会列出每个版本支持的 CUDA 版本选对应的就行。如果折腾半天 GPU 版始终跑不起来退回 CPU 版也是一个合理的选择。OCR 推理本身模型不大CPU 单张一两秒完全够用别为了追求 GPU 把自己卡死在环境上。5.5 识别结果全空或检测框为 0多数是二值化参数过严有时候图传进去PaddleOCR 一个框都检测不出来返回结果为空。除了图片本身确实没有文字外最常见的原因是你的图像预处理过头了二值化之后文字和背景融为一体检测模型反而找不到文本区域。排查方法把你预处理后的图片保存下来肉眼看一下是不是正常的黑白文字效果。如果二值化后文字发虚、有断笔画调低阈值或者干脆去掉二值化步骤只做灰度化和降噪就够了。还有一种情况图片分辨率太小文字区域不足几个像素检测模型根本看不到。这种情况要放大图片而不是缩小至少保证文字高度在 20 像素以上。6. 把 PaddleOCR 接入实际业务批量识别、结果落地与前端可视化跑通单张图片识别只是第一步。办公自动化和数据处理场景里更常见的是批量识别一批图片再把结果整理成结构化文件。下面分享我常用的两个落地方向。6.1 批量图片识别os 遍历 结果落盘批量识别目录下的所有图片逻辑很简单遍历目录、挨个预测、结果汇总。但有几个细节值得注意。第一不要用完一个识别器就重新初始化一个。PaddleOCR 初始化要加载模型这个过程很慢批量场景必须复用同一个对象from paddleocr import PaddleOCR from pathlib import Path ocr PaddleOCR(langch) img_dir Path(D:/test_images) results [] for img_path in img_dir.glob(*.jpg): res ocr.predict(inputstr(img_path))[0] text \n.join(res[rec_texts]) results.append((img_path.name, text)) print(f已识别: {img_path.name})第二批量识别时如果图片对象过多建议先统一读成 numpy 数组列表再批量传入predictimgs [cv2.imread(str(p)) for p in img_dir.glob(*.jpg)] res_all ocr.predict(inputimgs, batch_size16)这种方式底层会走 batch 推理比单张循环快很多尤其在有 GPU 的环境下提升明显。第三中途如果某张图识别出错不要让它中断整个循环。在循环内捕获异常记录失败文件最后统一排查。try: res ocr.predict(inputstr(img_path))[0] except Exception as e: fail_list.append((img_path.name, str(e))) continue6.2 把识别结果整理成 CSV给 Excel 用识别出的文本是长字符串如果想按行拆分成表格通常要对结果做后处理。如果图片本身是规整表格建议直接用 PaddleOCR 的表格识别能力如果只是普通文本图片可以按换行符拆分再按固定的字段格式写入 CSVimport csv with open(ocr_result.csv, w, encodingutf-8-sig, newline) as f: writer csv.writer(f) writer.writerow([文件名, 识别文本]) writer.writerows(results)编码用utf-8-sig而不是utf-8不然 Excel 打开 CSV 时中文会乱码这是 Windows 用户特有的坑。6.3 本地 OCR 小服务Flask 封装如果你想给同事提供一个“上传图片返回文字”的网页工具用 Flask 封装一个最简接口只需几十行代码from flask import Flask, request, jsonify from paddleocr import PaddleOCR import cv2 import numpy as np app Flask(__name__) ocr PaddleOCR(langch) app.route(/ocr, methods[POST]) def ocr_api(): file request.files[image] img_bytes np.frombuffer(file.read(), np.uint8) img cv2.imdecode(img_bytes, cv2.IMREAD_COLOR) res ocr.predict(inputimg)[0] return jsonify({texts: res[rec_texts], scores: res[rec_scores]}) if __name__ __main__: app.run(host0.0.0.0, port5000)注意初始化ocr要放在全局位置不要放在接口函数内部不然每次请求都要重新加载模型速度慢到没法用。这个接口在局域网内可以直接用浏览器或 POST 工具测试非常适合对接 RPA、自动化脚本等场景。6.4 进阶方向给自己的工具加一个轻量 GUI很多同事对命令行有心理门槛做一个简单的拖拽识别小工具会更实用。Windows 下可以用 Tkinter 快速实现文件选择框关键代码很简单import tkinter as tk from tkinter import filedialog root tk.Tk() root.withdraw() file_path filedialog.askopenfilename(filetypes[(Image, *.jpg *.png)])拿到路径后复用前面的识别逻辑把结果写到和图片同名的 txt 文件里。这种“选择图片 - 自动识别 - 生成 txt”的小工具我做过给不会编程的同事用反馈很好比上网找在线 OCR 网站方便多了。7. 几个实用小技巧识别效果不稳时先检查这些写到这里主体流程和问题排查都说完了。最后分享几个在实际使用中反复验证过的小技巧算是对全文的补充。第一检测和识别分开调参。PaddleOCR 的流水线是“检测 - 方向分类 - 识别”如果识别结果乱序问题可能在检测阶段如果识别错字问题可能在识别阶段。调试时可以分别查看result[0][rec_boxes]的坐标分布判断检测框是否准确覆盖文本区域。第二文档扫描件识别先用use_doc_unwarpingTrue。新版支持文档去扭曲拍摄的弯曲书页、折角纸张都能拉平识别率提升非常明显。代价是推理时间变长但如果识别的是照片拍摄的文档这个参数值得开。第三遇到同一张图多次识别结果不一致的情况不要怀疑模型随机性而是检查图像是否在预处理阶段被改动过。PaddleOCR 每次推理结果的确定性很强结果不稳定通常是图片被外部程序覆盖写入了或者内存不足导致的随机采样。第四日志级别可以控制。默认初始化 PaddleOCR 会输出很多调试日志批量识别时刷屏严重。可以设置环境变量或传参关闭日志import logging logging.disable(logging.DEBUG)或者初始化时传log_levelERROR只看错误信息输出干净很多。根据我个人的使用经验PaddleOCR 在 Windows 上最让人头疼的从来不是模型效果而是环境依赖的不可控。只要按照这篇教程把 Python 版本、虚拟环境、PaddlePaddle 和 PaddleOCR 的依赖关系理清楚后面所有功能开发都会顺畅很多。如果你正准备在 Windows 上做一套 OCR 识别工具建议先把环境跑通再用自己的真实图片测试效果逐步调整参数——这比网上找现成代码复制粘贴要靠谱得多。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →