【python】使用百度飞桨PaddleOCR进行本地文字识别
【python】使用百度飞桨PaddleOCR进行本地文字识别
- 1 前言
- 2 百度飞桨框架 PaddlePaddle
- 2.1 理论
- 框架图
- 文档
- CUDA 11、12区别
- 2.2 操作
- 查看 CUDA 版本
- 更新、下载 CUDA版本
- 安装 PaddlePaddle
- CPU端安装
- GPU端安装
- 安装后验证
- 卸载 PaddlePaddle
- 2.1 理论
- 3 百度飞桨 PaddleOCR【版本3.xx】
- 3.1 理论
- 3.1.1 飞桨OCR、PP-OCRv5
- 3.1.2 文档
- 3.1.3 函数参数
- 函数说明
- PaddleOCR()
- PaddleOCR() 参数
- predict() 方法 的参数
- 将结果 打印、另存为json、图片
- 获取结果的 json、img属性
- TextRecognition 文本识别模块
- TextRecognition 参数
- predict() 方法 的参数
- 对结果的操作
- TextRecognition()示例
- 文本识别 返回值 总结
- 3.1.4 模型
- 模型介绍
- 文本检测模块
- 文本识别模块
- 指定模型位置
- 模型介绍
- 3.2 操作
- 安装 PaddleOCR
- 3.3 例子 PaddleOCR
- 读取中文名图片
- 2.x版本
- cpu版
- 3.x版本
- 最简单的官方示例
- 实战:对本地图片、屏幕上的内容进行文字识别
- 3.1 理论
1 前言
这是一个前言指引,百度飞桨 是一个大型的工具,它有很多应用场景。
我主要用这个工具进行本地文字ocr、远端文字ocr,计算速度取决于电脑配置。
使用百度飞桨的文字ocr功能,你得先安装底层的 百度飞桨框架 PaddlePaddle,然后再安装 百度飞桨 PaddleOCR,虽然安装很麻烦很慢,但是它就是我目前遇到的好用的了。
入门使用花费了大量时间,但目前也只能算是小小的入门了。写这个的目的,仅仅只是分享一下
对于只想快速上手实现ocr文字,使用python的pip安装,你的流程:
- 安装 百度飞桨框架 PaddlePaddle【3.xx版本】
- 官方版本
- CPU版本【没显卡的安装这个,不需要CPU版本和GPU版本都安装】
- GPU版本安装
- 查看 CUDA 版本
- 百度飞桨框架 PaddlePaddle GPU版本 安装
- 我的版本
- 安装 PaddlePaddle
- 官方版本
- 安装 百度飞桨 PaddleOCR【3.xx版本】
- 官方版本
- 我的版本
- 安装 PaddleOCR
- 直奔示例,跳过我记的理论(我的理论也是从官方文档记的)
- 3.3 例子 PaddleOCR
对于想要深入使用,建议多看看官方的文档
- 百度飞桨框架 PaddlePaddle 我只在安装的时候去看过,需要看的不多
- 主要还是看 百度飞桨 PaddleOCR 的文档(我的理论也是从官方文档记的)
2 百度飞桨框架 PaddlePaddle
2.1 理论
框架图

文档
开始使用_飞桨-源于产业实践的开源深度学习平台
10分钟快速上手飞桨-使用文档-PaddlePaddle深度学习平台
CUDA 11、12区别
CUDA版本总结 - 知乎
Python、PyTorch、CUDA 与显卡版本对应关系速查表-ZEEKLOG博客
AI 写的,仅供参考
| 对比项目 | CUDA 11.8 | CUDA 12.6 |
|---|---|---|
| 支持的操作系统 | Linux(如 Ubuntu 18.04、20.04)、Windows 10/11 和部分企业级 Linux 发行版 | Windows 11 22H2、Ubuntu 22.04 LTS、RHEL 9.0 或更新版本 |
| 支持的显卡架构 | Kepler、Maxwell、Pascal、Volta、Turing、Ampere、Hopper | Ampere、Ada Lovelace 等较新架构,对于旧架构可能仅支持有限功能 |
| 部分支持的显卡型号 | RTX 20 系列及以下老显卡 | 基于 Ampere 架构的 RTX 30 系列以及基于 Ada Lovelace 架构的 RTX 40 系列等较新型号 |
| 驱动版本要求 | NVIDIA 驱动版本 520 及以上 | 最低要求 R550 Driver |
| 核心优势 | 长期支持(LTS)版本,适配成熟 | 新架构算力优化,支持混合精度训练等新特性 |
| 适用场景 | 老显卡、旧系统、生产环境、追求兼容性 | 新显卡、新系统、算力密集场景(如批量 OCR、深度学习训练) |
PaddlePaddle 安装包已内置对应 CUDA 依赖,无需手动安装完整 CUDA 工具包,只需确保显卡支持该 CUDA 版本即可。
2.2 操作
查看 CUDA 版本
nvidia-smi # 右上角 CUDA Version: 11.1 C:\Users\h1369>nvidia-smi Thu Nov 06 15:10:06 2025 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 457.49 Driver Version: 457.49 CUDA Version: 11.1||-------------------------------+----------------------+----------------------+ | GPU Name TCC/WDDM | Bus-Id Disp.A | Volatile Uncorr. ECC || Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |||| MIG M. ||===============================+======================+======================||0 GeForce MX150 WDDM | 00000000:01:00.0 Off | N/A || N/A 60C P5 N/A / N/A | 124MiB / 2048MiB |6% Default |||| N/A | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: || GPU GI CI PID Type Process name GPU Memory || ID ID Usage ||=============================================================================||0 N/A N/A 2464 C+G Insufficient Permissions N/A ||0 N/A N/A 3576 C+G ...les\Obsidian\Obsidian.exe N/A ||0 N/A N/A 4536 C+G ...ws\System32\ShellHost.exe N/A ||0 N/A N/A 6092 C+G Insufficient Permissions N/A ||0 N/A N/A 6176 C+G ...artMenuExperienceHost.exe N/A ||0 N/A N/A 6316 C+G ...ewy\CrossDeviceResume.exe N/A ||0 N/A N/A 8500 C+G ...537.71\msedgewebview2.exe N/A ||0 N/A N/A 9148 C+G ...e6\promecefpluginhost.exe N/A ||0 N/A N/A 9720 C+G ...n1h2txyewy\SearchHost.exe N/A ||0 N/A N/A 9736 C+G ...pplication\360ChromeX.exe N/A ||0 N/A N/A 10496 C+G ...1491.127\DesktopMgr64.exe N/A ||0 N/A N/A 16188 C+G ...oft OneDrive\OneDrive.exe N/A ||0 N/A N/A 16308 C+G ...Tencent\Wein\Wein.exe N/A ||0 N/A N/A 17456 C+G Insufficient Permissions N/A ||0 N/A N/A 18788 C+G ...cw5n1h2txyewy\LockApp.exe N/A ||0 N/A N/A 18796 C+G ...d\runtime\WeChatAppEx.exe N/A ||0 N/A N/A 19512 C+G ....127\Win11ContextMenu.exe N/A ||0 N/A N/A 21104 C+G ...8bbwe\WindowsTerminal.exe N/A ||0 N/A N/A 22624 C+G ...2txyewy\TextInputHost.exe N/A ||0 N/A N/A 22776 C+G ...main\current\DingTalk.exe N/A | +-----------------------------------------------------------------------------+ C:\Users\h1369>更新、下载 CUDA版本
CUDA在大版本下向下兼容

安装 PaddlePaddle
Windows 下的 PIP 安装-使用文档-PaddlePaddle深度学习平台
开始使用_飞桨-源于产业实践的开源深度学习平台
安装前,最好先安装下 Microsoft C++ 生成工具 - Visual Studio 这里的C++环境(安装的时候,选组件,选:使用 C++ 的桌面开发),不然后面装ocr包可能会报错CPU端安装
python -m pip installpaddlepaddle==3.0.0 -i https://www.paddlepaddle.org.cn/packages/stable/cpu/ # 安装后验证 C:\Windows\System32> C:\Windows\System32>pip show paddlepaddle Name: paddlepaddle Version: 3.0.0 Summary: Parallel Distributed Deep Learning Home-page: UNKNOWN Author: Author-email: [email protected] License: Apache Software License Location: c:\users\h1369\appdata\local\programs\python\python38\lib\site-packages Requires: astor, decorator, httpx, networkx, numpy, opt-einsum, Pillow, protobuf, typing-extensions Required-by: C:\Windows\System32>GPU端安装
请注意,PaddleOCR 依赖于 3.0 及以上版本的飞桨框架。
GPU端安装,由于GPU端需要根据具体 CUDA版本 来对应安装使用
旧版本安装_飞桨
Pip 安装-使用文档-PaddlePaddle深度学习平台
--pre 表示允许安装 PaddlePaddle 的预发布版本(例如开发版、测试版、 nightly 夜间构建版等)
如果不添加 --pre,pip 会默认只安装正式发布(stable)的版本,而忽略预发布版本
安装 GPU cuda12.6 版本的命令为:
python -m pip install paddlepaddle-gpu==3.0.0 -i https://www.paddlepaddle.org.cn/packages/stable/cu126/ 安装 GPU cuda11.8 版本的命令为:
python -m pip install paddlepaddle-gpu==3.2.1 -i https://www.paddlepaddle.org.cn/packages/stable/cu118/ python -m pip install paddlepaddle-gpu==3.0.0 -i https://www.paddlepaddle.org.cn/packages/stable/cu118/ 安装后验证
使用 python 进入 python 解释器,输入 import paddle ,再输入 paddle.utils.run_check()。
如果出现 PaddlePaddle is installed successfully!,说明您已成功安装。
python import paddle paddle.utils.run_check()# 验证安装是否成功其他查看
print(paddle.__version__)# 查看版本卸载 PaddlePaddle
- CPU 版本的 PaddlePaddle:
python -m pip uninstall paddlepaddle - GPU 版本的 PaddlePaddle:
python -m pip uninstall paddlepaddle-gpu 3 百度飞桨 PaddleOCR【版本3.xx】
3.1 理论
3.1.1 飞桨OCR、PP-OCRv5
OCR(光学字符识别,Optical Character Recognition)是一种将图像中的文字转换为可编辑文本的技术。它广泛应用于文档数字化、信息提取和数据处理等领域。OCR 可以识别印刷文本、手写文本,甚至某些类型的字体和符号。
通用 OCR 产线用于解决文字识别任务,提取图片中的文字信息以文本形式输出,本产线支持PP-OCRv3、PP-OCRv4、PP-OCRv5模型的使用,其中默认模型为 PaddleOCR3.0发布的PP-OCRv5_server 模型,其在多个场景中较 PP-OCRv4_server 提升 13 个百分点。
PP-OCRv5 是 PP-OCR 新一代文字识别解决方案,该方案聚焦于多场景、多文字类型的文字识别。在文字类型方面,PP-OCRv5支持简体中文、中文拼音、繁体中文、英文、日文5大主流文字类型,在场景方面,PP-OCRv5升级了中英复杂手写体、竖排文本、生僻字等多种挑战性场景的识别能力。在内部多场景复杂评估集上,PP-OCRv5较PP-OCRv4端到端提升13个百分点。
通用OCR产线中包含以下 5个模块。每个模块均可独立进行训练和推理,并包含多个模型。
- 文档图像方向分类模块 (可选)
- 文本图像矫正模块 (可选)
- 文本行方向分类模块 (可选)
- 文本检测模块
- 负责在图像中
定位和标记出包含文本的区域。 - 该模块的性能直接
影响到整个OCR系统的准确性和效率。 - 文本检测模块通常会输出文本区域的边界框(Bounding Boxes),这些 边界框 将作为输入传递给 文本识别模块 进行后续处理。
- 负责在图像中
- 文本识别模块
- 文本识别模块 通常接收 文本检测模块输出的文本区域的边界框(Bounding Boxes)作为输入,然后通过复杂的图像处理和深度学习算法,将图像中的文本转化为可编辑和可搜索的电子文本。文本识别结果的准确性,对于后续的信息提取和数据挖掘等应用至关重要。
3.1.2 文档
3.1.3 函数参数
函数说明
| 维度 | PaddleOCR() | TextRecognition() |
|---|---|---|
| 功能范围 | 完整 OCR 流程(检测 + 识别 + 可选预处理) | 仅文本识别(需外部提供文字区域) |
| 封装程度 | 高层封装,易用性高 | 低层封装,灵活性高 |
| 依赖模块 | 内部自动集成检测、识别等模块 | 需手动配合检测模块或外部预处理 |
| 适用场景 | 快速实现完整 OCR 功能 | 单独定制识别环节或底层开发 |
简单来说:
- 如果需要 “一键式” OCR 功能,优先用
PaddleOCR(); - 如果只需要识别裁剪好的文字区域,或需拆分流程定制,再用
TextRecognition()
PaddleOCR()
PaddleOCR() 参数
| 参数 | 参数说明 | 参数类型 | 默认值 |
|---|---|---|---|
| doc_orientation_classify_model_name | 文档方向分类模型的名称。如果设置为None,将会使用产线默认模型。 | str|None | None |
| doc_orientation_classify_model_dir | 文档方向分类模型的目录路径。如果设置为None,将会下载官方模型。 | str|None | None |
| doc_unwarping_model_name | 文本图像矫正模型的名称。如果设置为None,将会使用产线默认模型。 | str|None | None |
| doc_unwarping_model_dir | 文本图像矫正模型的目录路径。如果设置为None,将会下载官方模型。 | str|None | None |
| text_detection_model_name | 文本检测模型的名称。如果设置为None,将会使用产线默认模型。 | str|None | None |
| text_detection_model_dir | 文本检测模型的目录路径。如果设置为None,将会下载官方模型。 | str|None | None |
| textline_orientation_model_name | 文本行方向模型的名称。如果设置为None,将会使用产线默认模型。 | str|None | None |
| textline_orientation_model_dir | 文本行方向模型的目录路径。如果设置为None,将会下载官方模型。 | str|None | None |
| textline_orientation_batch_size | 文本行方向模型的batch size。如果设置为None,将默认设置batch size为1。 | int|None | None |
| text_recognition_model_name | 文本识别模型的名称。如果设置为None,将会使用产线默认模型。 | str|None | None |
| text_recognition_model_dir | 文本识别模型的目录路径。如果设置为None,将会下载官方模型。 | str|None | None |
| text_recognition_batch_size | 文本识别模型的batch size。如果设置为None,将默认设置batch size为1。 | int|None | None |
| use_doc_orientation_classify | 是否加载并使用文档方向分类模块。如果设置为None,将使用产线初始化的该参数值,默认初始化为True。 | bool|None | None |
| use_doc_unwarping | 是否加载并使用文本图像矫正模块。如果设置为None,将使用产线初始化的该参数值,默认初始化为True。 | bool|None | None |
| use_textline_orientation | 是否加载并使用文本行方向模块。如果设置为None,将使用产线初始化的该参数值,默认初始化为True。 | bool|None | None |
| text_det_limit_side_len | 文本检测的图像边长限制。 int:大于 0 的任意整数; None:如果设置为None,将使用产线初始化的该参数值,默认初始化为 64。 | int|None | None |
| text_det_limit_type | 文本检测的边长度限制类型。 str:支持 min 和 max,min 表示保证图像最短边不小于 det_limit_side_len,max 表示保证图像最长边不大于 limit_side_len; None:如果设置为None,将使用产线初始化的该参数值,默认初始化为 min。 | str|None | None |
| text_det_thresh | 文本检测像素阈值,输出的概率图中,得分大于该阈值的像素点才会被认为是文字像素点。 float:大于0的任意浮点数; None:如果设置为None,将使用产线初始化的该参数值(默认为0.3)。 | float|None | None |
| text_det_box_thresh | 文本检测框阈值,检测结果边框内,所有像素点的平均得分大于该阈值时,该结果会被认为是文字区域。 float:大于0的任意浮点数; None:如果设置为None,将使用产线初始化的该参数值(默认为0.6)。 | float|None | None |
| text_det_unclip_ratio | 文本检测扩张系数,使用该方法对文字区域进行扩张,该值越大,扩张的面积越大。 float:大于0的任意浮点数; None:如果设置为None,将使用产线初始化的该参数值(默认为2.0)。 | float|None | None |
| text_det_input_shape | 文本检测的输入形状。 | tuple|None | None |
| text_rec_score_thresh | 文本识别阈值,得分大于该阈值的文本结果会被保留。 float:大于0的任意浮点数; None:如果设置为None,将使用产线初始化的该参数值(默认为0.0,即不设阈值)。 | float|None | None |
| text_rec_input_shape | 文本识别的输入形状。 | tuple|None | None |
| lang | 使用指定语言的 OCR 模型。 附录中的表格中列举了全部支持的语言。 | str|None | None |
| ocr_version | OCR 模型版本。 PP-OCRv5:使用PP-OCRv5系列模型; PP-OCRv4:使用PP-OCRv4系列模型; PP-OCRv3:使用PP-OCRv3系列模型。 注意不是每个ocr_version都支持所有的lang,请查看附录中的对应关系表。 | str|None | None |
| device | 用于推理的设备。支持指定具体卡号:- CPU:如 cpu 表示使用 CPU 进行推理;- GPU:如 gpu:0 表示使用第 1 块 GPU 进行推理;- NPU:如 npu:0 表示使用第 1 块 NPU 进行推理;- XPU:如 xpu:0 表示使用第 1 块 XPU 进行推理;- MLU:如 mlu:0 表示使用第 1 块 MLU 进行推理;- DCU:如 dcu:0 表示使用第 1 块 DCU 进行推理;- None:如果设置为 None,将默认使用产线初始化的该参数值,初始化时,会优先使用本地的 GPU 0号设备,如果没有,则使用 CPU 设备。 | str|None | None |
| enable_hpi | 是否启用高性能推理。 | bool | False |
| use_tensorrt | 是否启用 Paddle Inference 的 TensorRT 子图引擎。如果模型不支持通过 TensorRT 加速,即使设置了此标志,也不会使用加速。 对于 CUDA 11.8 版本的飞桨,兼容的 TensorRT 版本为 8.x(x>=6),建议安装 TensorRT 8.6.1.6。 | bool | False |
| precision | 计算精度,如 fp32、fp16。 | str | “fp32” |
| enable_mkldnn | 是否启用 MKL-DNN 加速推理。如果 MKL-DNN 不可用或模型不支持通过 MKL-DNN 加速,即使设置了此标志,也不会使用加速。 | bool | True |
| mkldnn_cache_capacity | MKL-DNN 缓存容量。 | int | 10 |
| cpu_threads | 在 CPU 上进行推理时使用的线程数。 | int | 8 |
| paddlex_config | PaddleX产线配置文件路径。 | str|None | None |
predict() 方法 的参数
调用 OCR 产线对象的 predict() 方法进行 推理预测,该方法会返回一个结果列表。
另外,产线还提供了 predict_iter() 方法。
两者在参数接受和结果返回方面是完全一致的,区别在于 predict_iter() 返回的是一个 generator,能够逐步处理和获取预测结果,适合处理大型数据集或希望节省内存的场景。
可以根据实际需求选择使用这两种方法中的任意一种。
以下是 predict() 方法的参数及其说明:
| 参数 | 参数说明 | 参数类型 | 默认值 |
|---|---|---|---|
| input | 待预测数据,支持多种输入类型,必填。 - Python Var:如 numpy.ndarray 表示的图像数据;- str:如图像文件或者PDF文件的本地路径: /root/data/img.jpg;如URL链接,如图像文件或PDF文件的网络URL:示例;如本地目录,该目录下需包含待预测图像,如本地路径:/root/data/(当前不支持目录中包含PDF文件的预测,PDF文件需要指定到具体文件路径);- list:列表元素需为上述类型数据,如 [numpy.ndarray, numpy.ndarray],["/root/data/img1.jpg", "/root/data/img2.jpg"],["/root/data1", "/root/data2"]。 | Python Var|str|list | |
| use_doc_orientation_classify | 是否在推理时使用文档方向分类模块。 | bool|None | None |
| use_doc_unwarping | 是否在推理时使用文本图像矫正模块。 | bool|None | None |
| use_textline_orientation | 是否在推理时使用文本行方向分类模块。 | bool|None | None |
| text_det_limit_side_len | 参数含义与实例化参数基本相同。设置为None表示使用实例化参数,否则该参数优先级更高。 | int|None | None |
| text_det_limit_type | 参数含义与实例化参数基本相同。设置为None表示使用实例化参数,否则该参数优先级更高。 | str|None | None |
| text_det_thresh | 参数含义与实例化参数基本相同。设置为None表示使用实例化参数,否则该参数优先级更高。 | float|None | None |
| text_det_box_thresh | 参数含义与实例化参数基本相同。设置为None表示使用实例化参数,否则该参数优先级更高。 | float|None | None |
| text_det_unclip_ratio | 参数含义与实例化参数基本相同。设置为None表示使用实例化参数,否则该参数优先级更高。 | float|None | None |
| text_rec_score_thresh | 参数含义与实例化参数基本相同。设置为None表示使用实例化参数,否则该参数优先级更高。 | float|None | None |
将结果 打印、另存为json、图片
对预测结果进行处理,每个样本的预测结果均为对应的Result对象,
且支持 打印、保存为图片、保存为 json 文件、获取结果的 json、img 属性:
- 调用
print()方法会将结果打印到终端,打印到终端的内容解释如下:input_path:(str)待预测图像的输入路径page_index:(Union[int, None])如果输入是PDF文件,则表示当前是PDF的第几页,否则为Nonemodel_settings:(Dict[str, bool])配置产线所需的模型参数use_doc_preprocessor:(bool)控制是否启用文档预处理子产线use_textline_orientation:(bool)控制是否启用文本行方向分类模块
doc_preprocessor_res:(Dict[str, Union[str, Dict[str, bool], int]])文档预处理子产线的输出结果。仅当use_doc_preprocessor=True时存在input_path:(Union[str, None])图像预处理子产线接受的图像路径,当输入为numpy.ndarray时,保存为Nonemodel_settings:(Dict)预处理子产线的模型配置参数use_doc_orientation_classify:(bool)控制是否启用文档方向分类use_doc_unwarping:(bool)控制是否启用文本图像矫正
angle:(int)文档方向分类的预测结果。启用时取值为[0,1,2,3],分别对应[0°,90°,180°,270°];未启用时为-1
dt_polys:(List[numpy.ndarray])文本检测的多边形框列表。每个检测框由4个顶点坐标构成的numpy数组表示,数组shape为(4, 2),数据类型为int16dt_scores:(List[float])文本检测框的置信度列表text_det_params:(Dict[str, Dict[str, int, float]])文本检测模块的配置参数limit_side_len:(int)图像预处理时的边长限制值limit_type:(str)边长限制的处理方式thresh:(float)文本像素分类的置信度阈值box_thresh:(float)文本检测框的置信度阈值unclip_ratio:(float)文本检测框的膨胀系数text_type:(str)文本检测的类型,当前固定为"general"
textline_orientation_angles:(List[int])文本行方向分类的预测结果。启用时返回实际角度值(如[0,0,1]),未启用时返回[-1,-1,-1]text_rec_score_thresh:(float)文本识别结果的过滤阈值rec_texts:(List[str])文本识别结果列表,仅包含置信度超过text_rec_score_thresh的文本rec_scores:(List[float])文本识别的置信度列表,已按text_rec_score_thresh过滤rec_polys:(List[numpy.ndarray])经过置信度过滤的文本检测框列表,格式同dt_polysrec_boxes:(numpy.ndarray)检测框的矩形边界框数组,shape为(n, 4),dtype为int16。每一行表示一个矩形框的[x_min, y_min, x_max, y_max]坐标,其中(x_min, y_min)为左上角坐标,(x_max, y_max)为右下角坐标
- 调用
save_to_json()方法会将上述内容保存到指定的save_path中,如果指定为目录,则保存的路径为save_path/{your_img_basename}_res.json,如果指定为文件,则直接保存到该文件中。由于json文件不支持保存numpy数组,因此会将其中的numpy.array类型转换为列表形式。 - 调用
save_to_img()方法会将可视化结果保存到指定的save_path中,如果指定为目录,则保存的路径为save_path/{your_img_basename}_ocr_res_img.{your_img_extension},如果指定为文件,则直接保存到该文件中。(产线通常包含较多结果图片,不建议直接指定为具体的文件路径,否则多张图会被覆盖,仅保留最后一张图)
获取结果的 json、img属性
- 此外,也支持通过属性获取带结果的可视化图像和预测结果,具体如下:
| 属性 | 属性说明 |
|---|---|
json | 获取预测的json格式的结果 |
img | 获取格式为dict的可视化图像 |
json属性获取的预测结果为dict类型的数据,相关内容与调用save_to_json()方法保存的内容一致。img属性返回的预测结果是一个dict类型的数据。其中,键分别为ocr_res_img和preprocessed_img,对应的值是两个Image.Image对象:- 一个用于显示 OCR 结果的可视化图像,
- 另一个用于展示图像预处理的可视化图像。
- 如果没有使用图像预处理子模块,则dict中只包含
ocr_res_img。
for res in result:# res.print()# res.save_to_img("output")# res.save_to_json("output")# 在遍历时,直接 .json,获取 json 格式的结果,不要加 括号print(res.json)# 在遍历时,直接 .img,获取 dict 格式的结果,不要加 括号print(res.img)# 调试的输出:>>> res.json {'res':{'input_path':None,'page_index':None,'model_settings':{'use_doc_preprocessor':True,'use_textline_orientation':False},'doc_preprocessor_res':{'input_path':None,'page_index':None,'model_settings':{'use_doc_orientation_classify':False,'use_doc_unwarping':False},'angle':-1},'dt_polys':[[[109,9],[141,9],[141,28],[109,28]],[[522,8],[556,8],[556,29],[522,29]],[[707,7],[766,9],[765,31],[706,29]],[[916,9],[948,9],[948,28],[916,28]],[[35,77],[235,77],[235,96],[35,96]],[[522,74],[561,74],[561,98],[522,98]],[[722,75],[757,75],[757,97],[722,97]],[[917,76],[948,76],[948,95],[917,95]],[[35,175],[242,175],[242,193],[35,193]],[[522,171],[561,171],[561,195],[522,195]],[[713,171],[757,171],[757,194],[713,194]],[[917,173],[948,173],[948,191],[917,191]],[[35,271],[235,271],[235,290],[35,290]],[[522,269],[560,269],[560,293],[522,293]],[[708,269],[756,269],[756,291],[708,291]],[[917,270],[948,270],[948,290],[917,290]]],'text_det_params':{'limit_side_len':736,'limit_type':'min','thresh':0.3,'max_side_limit':4000,'box_thresh':0.6,'unclip_ratio':1.5},'text_type':'general','textline_orientation_angles':[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],'text_rec_score_thresh':0.0,'rec_texts':['道具','期限','出售价格','购买','宝宝巴士','永久','150','购买','宝宝巴士V','永久','1100','购买','宝宝巴士','永久','2499','购买'],'rec_scores':[0.9986263513565063,0.9999188184738159,0.9993999004364014,0.9999532103538513,0.9988628625869751,0.9999917149543762,0.9990103840827942,0.999974250793457,0.9985808730125427,0.9999917149543762,0.9990518689155579,0.9999517798423767,0.985887885093689,0.9999889731407166,0.9992300271987915,0.9999874234199524],'rec_polys':[[[109,9],[141,9],[141,28],[109,28]],[[522,8],[556,8],[556,29],[522,29]],[[707,7],[766,9],[765,31],[706,29]],[[916,9],[948,9],[948,28],[916,28]],[[35,77],[235,77],[235,96],[35,96]],[[522,74],[561,74],[561,98],[522,98]],[[722,75],[757,75],[757,97],[722,97]],[[917,76],[948,76],[948,95],[917,95]],[[35,175],[242,175],[242,193],[35,193]],[[522,171],[561,171],[561,195],[522,195]],[[713,171],[757,171],[757,194],[713,194]],[[917,173],[948,173],[948,191],[917,191]],[[35,271],[235,271],[235,290],[35,290]],[[522,269],[560,269],[560,293],[522,293]],[[708,269],[756,269],[756,291],[708,291]],[[917,270],[948,270],[948,290],[917,290]]],'rec_boxes':[[109,9,141,28],[522,8,556,29],[706,7,766,31],[916,9,948,28],[35,77,235,96],[522,74,561,98],[722,75,757,97],[917,76,948,95],[35,175,242,193],[522,171,561,195],[713,171,757,194],[917,173,948,191],[35,271,235,290],[522,269,560,293],[708,269,756,291],[917,270,948,290]]}}>>> res.img {'ocr_res_img':<PIL.Image.Image image mode=RGB size=2232x446 at 0x1E584E9C3D0>,'preprocessed_img':<PIL.Image.Image image mode=RGB size=3348x471 at 0x1E584E9CAC0>}>>>len(result)1TextRecognition 文本识别模块
TextRecognition 参数
TextRecognition实例化文本识别模型(此处以PP-OCRv5_server_rec为例),具体说明如下:
| 参数 | 参数说明 | 参数类型 | 默认值 |
|---|---|---|---|
| model_name | 模型名称。如果设置为None,则使用PP-OCRv5_server_rec。 | str|None | None |
| model_dir | 模型存储路径。 | str|None | None |
| device | 用于推理的设备。 例如:“cpu”、“gpu”、“npu”、“gpu:0”、“gpu:0,1”。 如指定多个设备,将进行并行推理。 默认情况下,优先使用 GPU 0;若不可用则使用 CPU。 | str|None | None |
| enable_hpi | 是否启用高性能推理。 | bool | FALSE |
| use_tensorrt | 是否启用 Paddle Inference 的 TensorRT 子图引擎。如果模型不支持通过 TensorRT 加速,即使设置了此标志,也不会使用加速。 对于 CUDA 11.8 版本的飞桨,兼容的 TensorRT 版本为 8.x(x>=6),建议安装 TensorRT 8.6.1.6。 | bool | FALSE |
| precision | 当使用 Paddle Inference 的 TensorRT 子图引擎时设置的计算精度。 可选项: "fp32"、"fp16"。 | str | “fp32” |
| enable_mkldnn | 是否启用 MKL-DNN 加速推理。如果 MKL-DNN 不可用或模型不支持通过 MKL-DNN 加速,即使设置了此标志,也不会使用加速。 | bool | TRUE |
| mkldnn_cache_capacity | MKL-DNN 缓存容量。 | int | 10 |
| cpu_threads | 在 CPU 上推理时使用的线程数量。 | int | 10 |
| input_shape | 模型输入图像尺寸,格式为 (C, H, W)。 | tuple|None | None |
predict() 方法 的参数
- 调用文本识别模型的
predict()方法进行推理预测,该方法会返回一个 结果 列表。 - 另外,本模块还提供了
predict_iter()方法。 - 两者在参数接受和结果返回方面是完全一致的,区别在于
predict_iter()返回的是一个generator,能够逐步处理和获取预测结果,适合处理大型数据集或希望节省内存的场景。 - 可以根据实际需求选择使用这两种方法中的任意一种。
predict()方法参数有input和batch_size,具体说明如下:
| 参数 | 参数说明 | 参数类型 | 默认值 |
|---|---|---|---|
| input | 待预测数据,支持多种输入类型,必填。 - Python Var:如 numpy.ndarray 表示的图像数据- str:如图像文件或者PDF文件的本地路径: /root/data/img.jpg;如URL链接,如图像文件或PDF文件的网络URL:示例;如本地目录,该目录下需包含待预测图像,如本地路径:/root/data/(当前不支持目录中包含PDF文件的预测,PDF文件需要指定到具体文件路径)- list:列表元素需为上述类型数据,如 [numpy.ndarray, numpy.ndarray],["/root/data/img1.jpg", "/root/data/img2.jpg"],["/root/data1", "/root/data2"] | Python Var|str|list | |
| batch_size | 批大小,可设置为任意正整数。 | int | 1 |
对结果的操作
对预测结果进行处理,每个样本的预测结果均为对应的Result对象,且支持打印、保存为图片、保存为json文件的操作:
| 方法 | 方法说明 | 参数 | 参数类型 | 参数说明 |
|---|---|---|---|---|
print() | 打印结果到终端 | format_json | bool | 是否对输出内容进行使用 JSON 缩进格式化 |
| indent | int | 指定缩进级别,以美化输出的 JSON 数据,使其更具可读性,仅当 format_json 为 True 时有效 | ||
| ensure_ascii | bool | 控制是否将非 ASCII 字符转义为 Unicode。设置为 True 时,所有非 ASCII 字符将被转义;False 则保留原始字符,仅当format_json为True时有效 | ||
save_to_json() | 将结果保存为json格式的文件 | save_path | str | 保存的文件路径,当为目录时,保存文件命名与输入文件类型命名一致 |
| indent | int | 指定缩进级别,以美化输出的 JSON 数据,使其更具可读性,仅当 format_json 为 True 时有效 | ||
| ensure_ascii | bool | 控制是否将非 ASCII 字符转义为 Unicode。设置为 True 时,所有非 ASCII 字符将被转义;False 则保留原始字符,仅当format_json为True时有效 | ||
save_to_img() | 将结果保存为图像格式的文件 | save_path | str | 保存的文件路径,当为目录时,保存文件命名与输入文件类型命名一致 |
TextRecognition()示例
from paddleocr import TextRecognition model = TextRecognition(model_name="PP-OCRv5_server_rec") output = model.predict(input="general_ocr_rec_001.png", batch_size=1)for res in output: res.print() res.save_to_img(save_path="./output/") res.save_to_json(save_path="./output/res.json")# 在遍历时,直接 .json,获取 json 格式的结果,不要加 括号# print(res.json)# 在遍历时,直接 .img,获取 dict 格式的结果,不要加 括号# print(res.img)运行后,得到的结果为:
{'res':{'input_path':'general_ocr_rec_001.png','page_index':None,'rec_text':'绿洲仕格维花园公寓','rec_score':0.9823867082595825}}运行结果参数含义如下:
input_path:表示输入待预测文本行图像的路径page_index:如果输入是PDF文件,则表示当前是PDF的第几页,否则为Nonerec_text:表示文本行图像的预测文本rec_score:表示文本行图像的预测置信度
文本识别 返回值 总结
如果要简单,就把返回的数据用 .json 获取出来,这样就是 字典、数组
如果不用 .json 获取,那原来的数据类型就很多,比如 坐标 是 numpy类型的:
>>>print(type(result))<class'list'>>>>print(type(result[0]))<class'paddlex.inference.pipelines.ocr.result.OCRResult'>>>>print(result[0]) 完整的数据,很多 常用的键:
# 文本识别 结果列表 a['res']['rec_texts']# 文本识别 的置信度列表 a['res']['rec_scores']# 文本坐标(4个顶点 的坐标,左上、左下、右上、右下)。[[[x1,y1], [x2,y2], [x3,y3], [x4,y4]], ...] a['res']['rec_polys']# 文本坐标(左上、右下 点 的坐标)。[[x1,y1, x2,y2], ...] a['res']['rec_boxes']# 示例import cv2 import numpy as np from paddleocr import PaddleOCR ocr = PaddleOCR( use_doc_orientation_classify=False, use_doc_unwarping=False, use_textline_orientation=False)# 文本检测+文本识别 img ="QQ20250926001505.png" result = ocr.predict(img)print('识别完成')# 把数据转为 json 格式 a = result[0].json for i,x in a['res'].items():print('---')print(i,x)--- input_path None--- page_index None--- model_settings {'use_doc_preprocessor':True,'use_textline_orientation':False}--- doc_preprocessor_res {'input_path':None,'page_index':None,'model_settings':{'use_doc_orientation_classify':False,'use_doc_unwarping':False},'angle':-1}--- dt_polys [[[109,9],[141,9],[141,28],[109,28]],[[522,8],[556,8],[556,29],[522,29]],[[707,7],[766,9],[765,31],[706,29]],[[916,9],[948,9],[948,28],[916,28]],[[35,77],[235,77],[235,96],[35,96]],[[522,74],[561,74],[561,98],[522,98]],[[722,75],[757,75],[757,97],[722,97]],[[917,76],[948,76],[948,95],[917,95]],[[35,175],[242,175],[242,193],[35,193]],[[522,171],[561,171],[561,195],[522,195]],[[713,171],[757,171],[757,194],[713,194]],[[917,173],[948,173],[948,191],[917,191]],[[35,271],[235,271],[235,290],[35,290]],[[522,269],[560,269],[560,293],[522,293]],[[708,269],[756,269],[756,291],[708,291]],[[917,270],[948,270],[948,290],[917,290]]]--- text_det_params {'limit_side_len':736,'limit_type':'min','thresh':0.3,'max_side_limit':4000,'box_thresh':0.6,'unclip_ratio':1.5}--- text_type general --- textline_orientation_angles [-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1]--- text_rec_score_thresh 0.0--- rec_texts ['道具','期限','出售价格','购买','宝宝巴士','永久','150','购买','宝宝巴士V','永久','1100','购买','宝宝巴士','永久','2499','购买']--- rec_scores [0.9986263513565063,0.9999188184738159,0.9993999004364014,0.9999532103538513,0.9988628625869751,0.9999917149543762,0.9990103840827942,0.999974250793457,0.9985808730125427,0.9999917149543762,0.9990518689155579,0.9999517798423767,0.985887885093689,0.9999889731407166,0.9992300271987915,0.9999874234199524]--- rec_polys [[[109,9],[141,9],[141,28],[109,28]],[[522,8],[556,8],[556,29],[522,29]],[[707,7],[766,9],[765,31],[706,29]],[[916,9],[948,9],[948,28],[916,28]],[[35,77],[235,77],[235,96],[35,96]],[[522,74],[561,74],[561,98],[522,98]],[[722,75],[757,75],[757,97],[722,97]],[[917,76],[948,76],[948,95],[917,95]],[[35,175],[242,175],[242,193],[35,193]],[[522,171],[561,171],[561,195],[522,195]],[[713,171],[757,171],[757,194],[713,194]],[[917,173],[948,173],[948,191],[917,191]],[[35,271],[235,271],[235,290],[35,290]],[[522,269],[560,269],[560,293],[522,293]],[[708,269],[756,269],[756,291],[708,291]],[[917,270],[948,270],[948,290],[917,290]]]--- rec_boxes [[109,9,141,28],[522,8,556,29],[706,7,766,31],[916,9,948,28],[35,77,235,96],[522,74,561,98],[722,75,757,97],[917,76,948,95],[35,175,242,193],[522,171,561,195],[713,171,757,194],[917,173,948,191],[35,271,235,290],[522,269,560,293],[708,269,756,291],[917,270,948,290]]{'res':{'input_path':'','page_index':'','model_settings':{'use_doc_preprocessor':'','use_textline_orientation':''},'doc_preprocessor_res':{'input_path':'','page_index':'','model_settings':{'use_doc_orientation_classify':'','use_doc_unwarping':''},'angle':''},'dt_polys':'','text_det_params':{'limit_side_len':'','limit_type':'','thresh':'','max_side_limit':'','box_thresh':'','unclip_ratio':''},'text_type':'','textline_orientation_angles':'','text_rec_score_thresh':'','rec_texts':'','rec_scores':'','rec_polys':'','rec_boxes':''}}3.1.4 模型
模型介绍
文本检测模块
- 文本检测模块
- 负责在图像中
定位和标记出包含文本的区域。 - 该模块的性能直接
影响到整个OCR系统的准确性和效率。 - 文本检测模块通常会输出文本区域的边界框(Bounding Boxes),这些 边界框 将作为输入传递给 文本识别模块 进行后续处理。
- 负责在图像中
文本识别模块
- 文本识别模块
- 文本识别模块 通常接收 文本检测模块输出的文本区域的边界框(Bounding Boxes)作为输入,然后通过复杂的图像处理和深度学习算法,将图像中的文本转化为可编辑和可搜索的电子文本。文本识别结果的准确性,对于后续的信息提取和数据挖掘等应用至关重要。
下面的 PP-OCRv5_rec 是新一代文本识别模型。该模型致力于以单一模型高效、精准地支持简体中文、繁体中文、英文、日文四种主要语言,以及手写、竖版、拼音、生僻字等复杂文本场景的识别。在保持识别效果的同时,兼顾推理速度和模型鲁棒性,为各种场景下的文档理解提供高效、精准的技术支撑。
| 模型 | 模型下载链接 | 识别 Avg Accuracy(%) | GPU推理耗时(ms) [常规模式 / 高性能模式] | CPU推理耗时(ms) [常规模式 / 高性能模式] | 模型存储大小(MB) |
|---|---|---|---|---|---|
| PP-OCRv5_server_rec | 推理模型/训练模型 | 86.38 | 8.46 / 2.36 | 31.21 / 31.21 | 81 |
| PP-OCRv5_mobile_rec | 推理模型/训练模型 | 81.29 | 5.43 / 1.46 | 21.20 / 5.32 | 16 |

指定模型位置
4.2.1 通过参数指定本地模型路径
在初始化产线对象时,通过参数指定本地模型路径。以文本检测模型微调后的权重的使用方法为例,示例如下:
命令行方式:
# 通过 --text_detection_model_dir 指定本地模型路径 paddleocr ocr -i ./general_ocr_002.png --text_detection_model_dir your_det_model_path # 默认使用 PP-OCRv5_server_det 模型作为默认文本检测模型,如果微调的不是该模型,通过 --text_detection_model_name 修改模型名称 paddleocr ocr -i ./general_ocr_002.png --text_detection_model_name PP-OCRv5_mobile_det --text_detection_model_dir your_v5_mobile_det_model_path python 脚本方式:
from paddleocr import PaddleOCR # 通过 text_detection_model_dir 指定本地模型路径 pipeline = PaddleOCR(text_detection_model_dir="./your_det_model_path")# 默认使用 PP-OCRv5_server_det 模型作为默认文本检测模型,如果微调的不是该模型,通过 text_detection_model_name 修改模型名称 pipeline = PaddleOCR(text_detection_model_name="PP-OCRv5_mobile_det", text_detection_model_dir="./your_v5_mobile_det_model_path")3.2 操作
安装 PaddleOCR
安装 - PaddleOCR 文档
如果只希望使用 PaddleOCR 的推理功能【就是简单的文字识别】,请参考 安装推理包;
如果希望进行模型训练、导出等,请参考 安装训练依赖。在同一环境中安装推理包和训练依赖是允许的,无需进行环境隔离。
3.x版本的 paddleocr,python版本要求 3.9 起步。 如果是python3.9以下,就装2.x版本 C:\Windows\System32>pip index versions paddleocr paddleocr (3.2.0) Available versions: 3.2.0, 3.1.1, 3.1.0, 3.0.3, 3.0.2, 3.0.1, 3.0.0, 2.10.0, 2.9.1, 2.9.0, 2.8.1, 2.8.0, 2.7.3, 2.7.2, 2.7.0.3, 2.7.0.2, 2.7.0.1, 2.7.0.0, 2.6.1.3, 2.6.1.2, 2.6.1.1, 2.6.1.0, 2.6.0.3, 2.6.0.2, 2.6.0.1, 2.6, 2.5.0.3, 2.5.0.2, 2.5, 2.4.0.4, 2.4.0.3, 2.4.0.2, 2.4.0.1, 2.4, 2.3.0.2, 2.3.0.1, 2.3, 2.2.0.2, 2.2.0.1, 2.2, 2.0.6, 2.0.5, 2.0.4, 2.0.3, 2.0.2, 2.0.1, 1.1.1, 1.0.1, 1.0.0, 0.0.3.1, 0.0.3, 0.0.2, 0.0.1.1, 0.0.0 INSTALLED: 3.2.0 LATEST: 3.2.0 C:\Windows\System32>只希望使用 基础文字识别功能(返回文字位置坐标和文本内容)
python -m pip installpaddleocr==3.0.0 希望使用文档解析、文档理解、文档翻译、关键信息抽取等全部功能
python -m pip install"paddleocr[all]"C:\Windows\System32>pip show paddleocr Name: paddleocr Version: 3.2.0 Summary: Awesome multilingual OCR and document parsing toolkits based on PaddlePaddle Home-page: https://github.com/PaddlePaddle/PaddleOCR Author: Author-email: PaddlePaddle <[email protected]> License: Apache License 2.0 Location: c:\users\h1369\appdata\local\programs\python\python38\lib\site-packages Requires: paddlex, PyYAML, typing-extensions Required-by: C:\Windows\System32>3.3 例子 PaddleOCR
读取中文名图片
import os import cv2 import numpy as np from paddleocr import PaddleOCR ocr = PaddleOCR( use_doc_orientation_classify=False, use_doc_unwarping=False, use_textline_orientation=False) img ="QQ20250926001505 - 副本.png"# 使用OpenCV读取图片,支持中文路径# 先读取为numpy数组,再转换为BGR格式# 这种方式会导致没有文件名,会提示:由于没有输入文件名作为保存结果文件名的参考,所以保存的结果文件将使用 时间戳和随机数 来命名:`1759224064_2786` img = cv2.imdecode(np.fromfile(img, dtype=np.uint8), cv2.IMREAD_COLOR) result = ocr.predict(img)for res in result: res.print() res.save_to_img("output") res.save_to_json("output")2.x版本
cpu版
from paddleocr import PaddleOCR import matplotlib.pyplot as plt from PIL import Image import numpy as np # 1. 初始化OCR模型(2.6.1.3 CPU版) ocr = PaddleOCR( use_gpu=False, lang='ch', cls=True# 启用方向分类(虽有警告,但不影响识别))# 2. 本地图片路径(替换为你的图片路径) img_path ="QQ20250926001505.png"# 相对路径/绝对路径均可# 3. 执行OCR识别print('开始识别...') result = ocr.ocr(img_path, cls=True)# result = [[[[[112.0, 10.0], [141.0, 10.0], [141.0, 28.0], [112.0, 28.0]], ('道具', 0.9917236566543579)], [[[524.0, 10.0], [555.0, 10.0], [555.0, 29.0], [524.0, 29.0]], ('期限', 0.9742878675460815)], [[[709.0, 12.0], [764.0, 12.0], [764.0, 29.0], [709.0, 29.0]], ('出售价格', 0.9982539415359497)], [[[918.0, 10.0], [947.0, 10.0], [947.0, 28.0], [918.0, 28.0]], ('购买', 0.9150546789169312)], [[[36.0, 80.0], [231.0, 80.0], [231.0, 95.0], [36.0, 95.0]], ('宝宝巴士', 0.9421949982643127)], [[[525.0, 79.0], [558.0, 79.0], [558.0, 98.0], [525.0, 98.0]], ('永久', 0.9970362186431885)], [[[724.0, 78.0], [761.0, 78.0], [761.0, 95.0], [724.0, 95.0]], ('150', 0.709652841091156)], [[[917.0, 77.0], [947.0, 77.0], [947.0, 94.0], [917.0, 94.0]], ('购买', 0.9994500875473022)], [[[37.0, 177.0], [241.0, 177.0], [241.0, 193.0], [37.0, 193.0]], ('宝宝巴士V', 0.9707132577896118)], [[[525.0, 175.0], [558.0, 175.0], [558.0, 194.0], [525.0, 194.0]], ('永久', 0.9980766773223877)], [[[713.0, 173.0], [779.0, 170.0], [780.0, 191.0], [714.0, 194.0]], ('1100?', 0.776985764503479)], [[[917.0, 174.0], [947.0, 174.0], [947.0, 192.0], [917.0, 192.0]], ('购买', 0.9996713399887085)], [[[37.0, 274.0], [234.0, 274.0], [234.0, 290.0], [37.0, 290.0]], ('宝宝巴士', 0.9323314428329468)], [[[521.0, 272.0], [559.0, 269.0], [561.0, 291.0], [523.0, 294.0]], ('永久', 0.9989298582077026)], [[[711.0, 272.0], [759.0, 272.0], [759.0, 289.0], [711.0, 289.0]], ('2499', 0.8633398413658142)], [[[917.0, 272.0], [947.0, 272.0], [947.0, 289.0], [917.0, 289.0]], ('购买', 0.9994500875473022)]]]print('识别结束')print(result)print('--------------------------------') tmp_str =''for i in result[0]:# print(i)for x in i:print('------')iftype(x[0])==str:print(x) tmp_str += x[0]print('----------')print(tmp_str)3.x版本
最简单的官方示例
import os import cv2 import numpy as np from paddleocr import PaddleOCR ocr = PaddleOCR( use_doc_orientation_classify=False, use_doc_unwarping=False, use_textline_orientation=False)# 文本检测+文本识别# ocr = PaddleOCR(use_doc_orientation_classify=True, use_doc_unwarping=True) # 文本图像预处理+文本检测+方向分类+文本识别# ocr = PaddleOCR(use_doc_orientation_classify=False, use_doc_unwarping=False) # 文本检测+文本行方向分类+文本识别 img ="QQ20250926001505 - 副本.png"# 使用OpenCV读取图片,支持中文路径# 先读取为numpy数组,再转换为BGR格式# 这种方式会导致没有文件名,会提示:由于没有输入文件名作为保存结果文件名的参考,所以保存的结果文件将使用 时间戳和随机数 来命名:`1759224064_2786` img = cv2.imdecode(np.fromfile(img, dtype=np.uint8), cv2.IMREAD_COLOR) result = ocr.predict(img)for res in result: res.print() res.save_to_img("output") res.save_to_json("output")实战:对本地图片、屏幕上的内容进行文字识别
功能:
- ocr_find_str 对图片(本地图片、截图数据)进行orc,查找文字,返回文字居中位置
- screenshot_and_ocr 截屏(支持指定区域) 进行 ocr识别
- screenshot_and_find_str 截屏(支持指定区域)并查找 目标文字
- click_str 截屏,并点击文字位置
- find_str 截屏,并查找文字位置
import pyautogui import numpy import cv2 import time from paddleocr import PaddleOCR classBaiduOCR:""" 功能: ocr_find_str 对图片(本地图片、截图数据)进行orc,查找文字,返回文字居中位置 screenshot_and_ocr 截屏(支持指定区域) 进行 ocr识别 screenshot_and_find_str 截屏(支持指定区域)并查找 目标文字 click_str 截屏,并点击文字位置 find_str 截屏,并查找文字位置 """def__init__(self):# 类参数 self.win_Width_size, self.win_Height_size = pyautogui.size()# 获取显示器分辨率 self.all_task_et_flag =None# 所有任务退出标志# 初始化OCR self.ocr =None self.init_ocr()print("BaiduOCR 初始化成功")# ---------------------- 通用方法 ---------------------- #defmini_task_set_region(self, region=None):""" 处理 截图预设的范围 """# 计算要偏移多少x、y坐标(默认截取全屏时,偏移为0)ifisinstance(region,str):# 为region预设了几种范围,省的手动计算区域:"上、下、左、右、中、左上、左下、右上、右下"if region =="上":# 上半屏:x=0, y=0, 宽度全屏, 高度半屏 region =(0,0, self.win_Width_size, self.win_Height_size //2)elif region =="下":# 下半屏:x=0, y=半屏高度, 宽度全屏, 高度半屏 region =(0, self.win_Height_size //2, self.win_Width_size, self.win_Height_size //2)elif region =="左":# 左半屏:x=0, y=0, 宽度半屏, 高度全屏 region =(0,0, self.win_Width_size //2, self.win_Height_size)elif region =="右":# 右半屏:x=半屏宽度, y=0, 宽度半屏, 高度全屏 region =(self.win_Width_size //2,0, self.win_Width_size //2, self.win_Height_size)elif region =="中":# 中间区域:x=1/4屏宽, y=1/4屏高, 宽度1/2屏宽, 高度1/2屏高(居中) region =(self.win_Width_size //4, self.win_Height_size //4, self.win_Width_size //2, self.win_Height_size //2)elif region =="左上":# 左上区域:x=0, y=0, 宽度半屏, 高度半屏 region =(0,0, self.win_Width_size //2, self.win_Height_size //2)elif region =="左下":# 左下区域:x=0, y=半屏高度, 宽度半屏, 高度半屏 region =(0, self.win_Height_size //2, self.win_Width_size //2, self.win_Height_size //2)elif region =="右上":# 右上区域:x=半屏宽度, y=0, 宽度半屏, 高度半屏 region =(self.win_Width_size //2,0, self.win_Width_size //2, self.win_Height_size //2)elif region =="右下":# 右下区域:x=半屏宽度, y=半屏高度, 宽度半屏, 高度半屏 region =(self.win_Width_size //2, self.win_Height_size //2, self.win_Width_size //2, self.win_Height_size //2)else:# 处理无效的字符串值print(f'--117-- 无效的区域字符串 "{region}",将使用全屏') region =Nonereturn region # ---------------------- OCR相关方法 ---------------------- #definit_ocr(self): self.ocr = PaddleOCR( use_doc_orientation_classify=False,# 控制是否启用文档方向分类 use_doc_unwarping=False,# 控制是否启用文本图像矫正 use_textline_orientation=False,# 控制是否启用文本行方向分类模块 text_det_limit_side_len=32,# 文本检测边长限制长度, 保证图像的「最短边」不小于 xx 。默认64 text_det_limit_type='min',# 文本检测的边长度限制类型,默认初始化为 min text_det_thresh=0.3,# 文本检测像素阈值,输出的概率图中,得分大于该阈值的像素点才会被认为是文字像素点(默认为0.3) text_det_unclip_ratio=3.0,# *文本检测扩张系数*,使用该方法对文字区域进行扩张,该值越大,扩张的面积越大。(默认为2.0))defocr_cpu_gpu(self, img):""" ocr识别,支持cpu、gpu,由安装的PaddlePaddle飞浆版本决定 :param img: 图片 或者 截屏的数据 :return: """# 使用OpenCV读取图片,支持中文路径,先读取为numpy数组,再转换为BGR格式# 这种方式会导致没有文件名,会提示:由于没有输入文件名作为保存结果文件名的参考,所以保存的结果文件将使用 时间戳和随机数 来命名:`1759224064_2786`ifisinstance(img, numpy.ndarray):# 检查 img 是否是 numpy.ndarray 类型的对象,如果img是numpy数组(截屏结果),可直接使用,无需解码本地文件 img_cv = img # 截屏的numpy数组直接用else:# 兼容原逻辑:如果是文件路径,按原方式读取 img_cv = cv2.imdecode(numpy.fromfile(img, dtype=numpy.uint8), cv2.IMREAD_COLOR)# OCR识别 result = self.ocr.predict(img_cv) result = result[0].json # print('识别完成,识别结果为:\n', result)return result defocr_find_str(self, img, find_txt):""" 对图片(本地图片、截图数据)进行orc,查找文字,返回文字居中位置 """ temp_json = self.ocr_cpu_gpu(img)# 识别图片# print(f"find_str() 文本识别 的结果列表: {temp_json['res']['rec_texts']}") txt_index =0 find_txt_flag =Falsefor i in temp_json['res']['rec_texts']:if find_txt in i:# print('找到文字:', i) find_txt_flag =Truebreakelse: txt_index +=1if find_txt_flag:# print(f'找到文字:{txt}, 索引是:{txt_index}')# print(f"文本识别 的置信度列表: {temp_json['res']['rec_scores']}")# print(f"文本坐标(4个顶点 的坐标,左上、左下、右上、右下): {temp_json['res']['rec_polys']}")# print(f"文本坐标(左上、右下 点 的坐标): {temp_json['res']['rec_boxes']}") temp_rec_points = temp_json['res']['rec_boxes'][txt_index]# print(f"{find_txt} 文本坐标: {temp_rec_points}") # [[x1,y1, x2,y2], ...]# 直接计算中心点 temp_x =int((temp_rec_points[0]+ temp_rec_points[2])/2) temp_y =int((temp_rec_points[1]+ temp_rec_points[3])/2) temp_xy =(temp_x, temp_y)# print(f'计算后的 中心点坐标 {temp_xy}')return temp_xy else:# print(f'find_str() 未找到文字:{find_txt}')returnFalsedefscreenshot_and_ocr(self, region=None):""" 截屏(支持指定区域) 进行 ocr识别 :param region: 截屏区域,格式为 (x, y, width, height),如 (100, 200, 800, 600) 若为None,则截取全屏 :return: 字典 res_dict,包含 文字、文本坐标 """ start_time = time.time()# 记录开始时间 region = self.mini_task_set_region(region)# 计算要截取的区域# 1. 截屏(返回PIL.Image对象) screenshot = pyautogui.screenshot(region=region)# 2. 转换为OpenCV格式(BGR) screenshot_cv = cv2.cvtColor(numpy.array(screenshot), cv2.COLOR_RGB2BGR)# 3. 识别图片 temp_json = self.ocr_cpu_gpu(screenshot_cv)# print(f"文本识别 的结果列表: {temp_json['res']['rec_texts']}")# print(f"文本坐标(左上、右下 点 的坐标): {temp_json['res']['rec_boxes']}") end_time = time.time() elapsed_time = end_time - start_time print(f"--111-- 识别耗费时间: {elapsed_time:.2f} 秒") res_dict ={"文本列表": temp_json['res']['rec_texts'],"坐标列表":temp_json['res']['rec_boxes'],}return res_dict defscreenshot_and_find_str(self, txt=None, region=None):""" 截屏(支持指定区域)并查找 目标文字 :param region: 截屏区域,格式为 (x, y, width, height),如 (100, 200, 800, 600) 若为None,则截取全屏 :param txt: 要查找的文字 :return: 文字中心点坐标(x, y),未找到则返回False """if txt isNone:print(f'-- 118 -- 未指定要查找的文字')returnFalse# result 存储结果信息 result ={"坐标":(0,0),"原始识别坐标":(0,0),"匹配结果":False,'识别耗费时间':''} start_time = time.time()# 记录开始时间 offset_x, offset_y =0,0# 要偏移的x、y坐标# 计算要偏移多少x、y坐标(默认截取全屏时,偏移为0) region = self.mini_task_set_region(region)if region:# region 不为 None 时,更新 x、y偏移量# print(f'--117-- 计算后的 截屏区域 为 {region}') offset_x, offset_y = region[0], region[1]# 更新 区域偏移量,偏移多少x、y# 1. 截屏(返回PIL.Image对象) screenshot = pyautogui.screenshot(region=region)# 2. 转换为OpenCV格式(BGR) screenshot_cv = cv2.cvtColor(numpy.array(screenshot), cv2.COLOR_RGB2BGR)# 3. 调用find_str识别区域内坐标 region_xy = self.ocr_find_str(screenshot_cv, txt)if region_xy: result["原始识别坐标"]= region_xy # 计算屏幕坐标(区域内坐标 + 区域偏移量) screen_x = region_xy[0]+ offset_x screen_y = region_xy[1]+ offset_y result["坐标"]=(screen_x, screen_y) end_time = time.time() elapsed_time = end_time - start_time # 识别耗费时间# result = {"坐标": (0, 0), "匹配结果": False, '识别耗费时间': ''} result['识别耗费时间']=f'{elapsed_time:.2f}' result["匹配结果"]=True# print(f"--111 --screenshot_and_find()-- 文本识别耗费时间: {result['识别耗费时间']} 秒")# print(f"--112 --screenshot_and_find()-- 转换后的屏幕坐标: {result["坐标"]}")return result else:return result defclick_str(self, txt=None, region=None, find_count=20):""" 截屏,并点击文字位置 Args: find_count: 查找图片 超时次数 :return: 找到就返回 结果字典,没找到返回False """for i inrange(find_count):if self.all_task_et_flag:print(f"dj_image: self.all_task_et_flag=True, {txt}取消查找")break time.sleep(0.5) result = self.screenshot_and_find_str(txt=txt, region=region)if result["匹配结果"]:# 点击左键 pyautogui.click(result["坐标"][0], result["坐标"][1])print(f'--click_str-- 点击文字:{txt}, 识别区域:{region}, 点击坐标:{result["坐标"]}, 识别耗费时间: {result["识别耗费时间"]} 秒')return result print(f'--click_str-- 查找{find_count}次, 未找到文字:{txt}, 识别区域:{region}')returnFalsedeffind_str(self, txt=None, region=None, find_count=20):""" 截屏,并查找文字文字位置 Args: find_count: 查找图片 超时次数 :return: 找到就返回 结果字典,没找到返回False """for i inrange(find_count):if self.all_task_et_flag:print(f"dj_image: self.et_flag=True, {txt}取消查找")break time.sleep(0.5) result = self.screenshot_and_find_str(txt=txt, region=region)if result["匹配结果"]:print(f'--click_str-- 找到文字:{txt}, 识别区域:{region}, 点击坐标:{result["坐标"]}, 识别耗费时间: {result["识别耗费时间"]} 秒')return result print(f'--click_str-- 查找{find_count}次, 未找到文字:{txt}, 识别区域:{region}')returnFalseif __name__ =='__main__':# 测试机,CPU i5 8250U, 显卡 MX150,百度飞桨3.x版本 a = BaiduOCR() temp_str1 = a.ocr_find_str('QQ20250926001505 - 副本.png','150')print(f'在本地图片中 查找文字,结果:{temp_str1}') temp_str2 = a.screenshot_and_ocr((0,0,200,100))print(f'对屏幕指定区域进行文本识别,结果:{temp_str2}') temp_str3 = a.find_str('Python 3.9',region='右下')print(f'对屏幕 右下区域 查找文字“Python 3.9”,结果:{temp_str3}') a.click_str('Python 3.9',region='右下')# 示例执行输出: C:\Users\h1369\AppData\Local\Programs\Python\Python39\python.exe "C:\Users\h1369\OneDrive\Python\PY_Project\2025-10-本地文字OCR\ocr主类.py" Creating model: ('PP-OCRv5_mobile_det', None) Using official model (PP-OCRv5_mobile_det), the model files will be automatically downloaded and saved in C:\Users\h1369\.paddlex\official_models. ��Ϣ: ���ṩ��ģʽ���ҵ��ļ��� C:\Users\h1369\AppData\Local\Programs\Python\Python39\lib\site-packages\paddle\utils\cpp_extension\extension_utils.py:711: UserWarning: No ccache found. Please be aware that recompiling all source files may be required. You can download and install ccache from: https://github.com/ccache/ccache/blob/master/doc/INSTALL.md warnings.warn(warning_message) Creating model: ('PP-OCRv5_mobile_rec', None) Using official model (PP-OCRv5_mobile_rec), the model files will be automatically downloaded and saved in C:\Users\h1369\.paddlex\official_models. BaiduOCR 初始化成功 在本地图片中 查找文字,结果:(91, 87) --111-- 识别耗费时间: 0.14 秒 对屏幕指定区域进行文本识别,结果:{'文本列表':['M', '□0', '2025-10-本地文', '项目', '√'], '坐标列表':[[4, 4, 34, 35], [92, 10, 116, 29], [111, 6, 200, 31], [47, 49, 82, 73], [82, 56, 93, 66]]} --click_str-- 找到文字:Python 3.9, 识别区域:右下, 点击坐标:(1839, 1016), 识别耗费时间: 0.72 秒 对屏幕 右下区域 查找文字“Python 3.9”,结果:{'坐标':(1839, 1016), '原始识别坐标':(879, 476), '匹配结果': True, '识别耗费时间':'0.72'} --click_str-- 点击文字:Python 3.9, 识别区域:右下, 点击坐标:(1839, 1016), 识别耗费时间: 0.76 秒 进程已结束,退出代码为 0