【python】使用百度飞桨PaddleOCR进行本地文字识别

【python】使用百度飞桨PaddleOCR进行本地文字识别

【python】使用百度飞桨PaddleOCR进行本地文字识别

  • 1 前言
  • 2 百度飞桨框架 PaddlePaddle
    • 2.1 理论
        • 框架图
        • 文档
        • CUDA 11、12区别
    • 2.2 操作
        • 查看 CUDA 版本
        • 更新、下载 CUDA版本
        • 安装 PaddlePaddle
          • CPU端安装
          • GPU端安装
          • 安装后验证
        • 卸载 PaddlePaddle
  • 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版本
          • 最简单的官方示例
          • 实战:对本地图片、屏幕上的内容进行文字识别

1 前言

这是一个前言指引,百度飞桨 是一个大型的工具,它有很多应用场景。
我主要用这个工具进行本地文字ocr、远端文字ocr,计算速度取决于电脑配置。
使用百度飞桨的文字ocr功能,你得先安装底层的 百度飞桨框架 PaddlePaddle,然后再安装 百度飞桨 PaddleOCR,虽然安装很麻烦很慢,但是它就是我目前遇到的好用的了。
入门使用花费了大量时间,但目前也只能算是小小的入门了。写这个的目的,仅仅只是分享一下


对于只想快速上手实现ocr文字,使用python的pip安装,你的流程:
  1. 安装 百度飞桨框架 PaddlePaddle【3.xx版本】
    1. 官方版本
      1. CPU版本【没显卡的安装这个,不需要CPU版本和GPU版本都安装】
        1. 百度飞桨框架 PaddlePaddle CPU版本 安装
      2. GPU版本安装
        1. 查看 CUDA 版本
        2. 百度飞桨框架 PaddlePaddle GPU版本 安装
    2. 我的版本
      1. 安装 PaddlePaddle
  2. 安装 百度飞桨 PaddleOCR【3.xx版本】
    1. 官方版本
      1. 百度飞桨 PaddleOCR 安装
    2. 我的版本
      1. 安装 PaddleOCR
  3. 直奔示例,跳过我记的理论(我的理论也是从官方文档记的)
    1. 3.3 例子 PaddleOCR
对于想要深入使用,建议多看看官方的文档
  1. 百度飞桨框架 PaddlePaddle 我只在安装的时候去看过,需要看的不多
  2. 主要还是看 百度飞桨 PaddleOCR 的文档(我的理论也是从官方文档记的)
    1. 使用教程 - PaddleOCR 文档

2 百度飞桨框架 PaddlePaddle

2.1 理论

框架图
在这里插入图片描述
文档

飞桨PaddlePaddle-首页

开始使用_飞桨-源于产业实践的开源深度学习平台
10分钟快速上手飞桨-使用文档-PaddlePaddle深度学习平台

CUDA 11、12区别

CUDA版本总结 - 知乎
Python、PyTorch、CUDA 与显卡版本对应关系速查表-ZEEKLOG博客

AI 写的,仅供参考
对比项目CUDA 11.8CUDA 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、HopperAmpere、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 工具包存档 |NVIDIA 开发人员

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 夜间构建版等)
如果不添加 --prepip 会默认只安装正式发布(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 文档

使用教程 - PaddleOCR 文档

通用OCR产线 - PaddleX 文档

3.1.3 函数参数

函数说明
维度PaddleOCR()TextRecognition()
功能范围完整 OCR 流程(检测 + 识别 + 可选预处理)仅文本识别(需外部提供文字区域)
封装程度高层封装,易用性高低层封装,灵活性高
依赖模块内部自动集成检测、识别等模块需手动配合检测模块或外部预处理
适用场景快速实现完整 OCR 功能单独定制识别环节或底层开发

简单来说:

  • 如果需要 “一键式” OCR 功能,优先用 PaddleOCR()
  • 如果只需要识别裁剪好的文字区域,或需拆分流程定制,再用 TextRecognition()
PaddleOCR()

使用教程 - PaddleOCR 文档

PaddleOCR() 参数
参数参数说明参数类型默认值
doc_orientation_classify_model_name文档方向分类模型的名称。如果设置为None,将会使用产线默认模型。str|NoneNone
doc_orientation_classify_model_dir文档方向分类模型的目录路径。如果设置为None,将会下载官方模型。str|NoneNone
doc_unwarping_model_name文本图像矫正模型的名称。如果设置为None,将会使用产线默认模型。str|NoneNone
doc_unwarping_model_dir文本图像矫正模型的目录路径。如果设置为None,将会下载官方模型。str|NoneNone
text_detection_model_name文本检测模型的名称。如果设置为None,将会使用产线默认模型。str|NoneNone
text_detection_model_dir文本检测模型的目录路径。如果设置为None,将会下载官方模型。str|NoneNone
textline_orientation_model_name文本行方向模型的名称。如果设置为None,将会使用产线默认模型。str|NoneNone
textline_orientation_model_dir文本行方向模型的目录路径。如果设置为None,将会下载官方模型。str|NoneNone
textline_orientation_batch_size文本行方向模型的batch size。如果设置为None,将默认设置batch size为1。int|NoneNone
text_recognition_model_name文本识别模型的名称。如果设置为None,将会使用产线默认模型。str|NoneNone
text_recognition_model_dir文本识别模型的目录路径。如果设置为None,将会下载官方模型。str|NoneNone
text_recognition_batch_size文本识别模型的batch size。如果设置为None,将默认设置batch size为1。int|NoneNone
use_doc_orientation_classify是否加载并使用文档方向分类模块。如果设置为None,将使用产线初始化的该参数值,默认初始化为True。bool|NoneNone
use_doc_unwarping是否加载并使用文本图像矫正模块。如果设置为None,将使用产线初始化的该参数值,默认初始化为True。bool|NoneNone
use_textline_orientation是否加载并使用文本行方向模块。如果设置为None,将使用产线初始化的该参数值,默认初始化为True。bool|NoneNone
text_det_limit_side_len文本检测的图像边长限制
int:大于 0 的任意整数;
None:如果设置为None,将使用产线初始化的该参数值,默认初始化为 64。
int|NoneNone
text_det_limit_type文本检测的边长度限制类型。
str:支持 min 和 max,min 表示保证图像最短边不小于 det_limit_side_len,max 表示保证图像最长边不大于 limit_side_len;
None:如果设置为None,将使用产线初始化的该参数值,默认初始化为 min。
str|NoneNone
text_det_thresh文本检测像素阈值,输出的概率图中,得分大于该阈值的像素点才会被认为是文字像素点。
float:大于0的任意浮点数;
None:如果设置为None,将使用产线初始化的该参数值(默认为0.3)。
float|NoneNone
text_det_box_thresh文本检测框阈值,检测结果边框内,所有像素点的平均得分大于该阈值时,该结果会被认为是文字区域。
float:大于0的任意浮点数;
None:如果设置为None,将使用产线初始化的该参数值(默认为0.6)。
float|NoneNone
text_det_unclip_ratio文本检测扩张系数,使用该方法对文字区域进行扩张,该值越大,扩张的面积越大。
float:大于0的任意浮点数;
None:如果设置为None,将使用产线初始化的该参数值(默认为2.0)。
float|NoneNone
text_det_input_shape文本检测的输入形状。tuple|NoneNone
text_rec_score_thresh文本识别阈值,得分大于该阈值的文本结果会被保留。
float:大于0的任意浮点数;
None:如果设置为None,将使用产线初始化的该参数值(默认为0.0,即不设阈值)。
float|NoneNone
text_rec_input_shape文本识别的输入形状。tuple|NoneNone
lang使用指定语言的 OCR 模型。 附录中的表格中列举了全部支持的语言。str|NoneNone
ocr_versionOCR 模型版本。
PP-OCRv5:使用PP-OCRv5系列模型;
PP-OCRv4:使用PP-OCRv4系列模型;
PP-OCRv3:使用PP-OCRv3系列模型。
注意不是每个ocr_version都支持所有的lang,请查看附录中的对应关系表。
str|NoneNone
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|NoneNone
enable_hpi是否启用高性能推理。boolFalse
use_tensorrt是否启用 Paddle Inference 的 TensorRT 子图引擎。如果模型不支持通过 TensorRT 加速,即使设置了此标志,也不会使用加速。
对于 CUDA 11.8 版本的飞桨,兼容的 TensorRT 版本为 8.x(x>=6),建议安装 TensorRT 8.6.1.6。
boolFalse
precision计算精度,如 fp32、fp16。str“fp32”
enable_mkldnn是否启用 MKL-DNN 加速推理。如果 MKL-DNN 不可用或模型不支持通过 MKL-DNN 加速,即使设置了此标志,也不会使用加速。boolTrue
mkldnn_cache_capacityMKL-DNN 缓存容量。int10
cpu_threads在 CPU 上进行推理时使用的线程数。int8
paddlex_configPaddleX产线配置文件路径。str|NoneNone
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|NoneNone
use_doc_unwarping是否在推理时使用文本图像矫正模块。bool|NoneNone
use_textline_orientation是否在推理时使用文本行方向分类模块。bool|NoneNone
text_det_limit_side_len参数含义与实例化参数基本相同。设置为None表示使用实例化参数,否则该参数优先级更高。int|NoneNone
text_det_limit_type参数含义与实例化参数基本相同。设置为None表示使用实例化参数,否则该参数优先级更高。str|NoneNone
text_det_thresh参数含义与实例化参数基本相同。设置为None表示使用实例化参数,否则该参数优先级更高。float|NoneNone
text_det_box_thresh参数含义与实例化参数基本相同。设置为None表示使用实例化参数,否则该参数优先级更高。float|NoneNone
text_det_unclip_ratio参数含义与实例化参数基本相同。设置为None表示使用实例化参数,否则该参数优先级更高。float|NoneNone
text_rec_score_thresh参数含义与实例化参数基本相同。设置为None表示使用实例化参数,否则该参数优先级更高。float|NoneNone
将结果 打印、另存为json、图片

对预测结果进行处理,每个样本的预测结果均为对应的Result对象
且支持 打印、保存为图片、保存为 json 文件、获取结果的 json、img 属性:

  • 调用print() 方法会将结果打印到终端,打印到终端的内容解释如下:
    • input_path: (str) 待预测图像的输入路径
    • page_index: (Union[int, None]) 如果输入是PDF文件,则表示当前是PDF的第几页,否则为 None
    • model_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时,保存为None
      • model_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),数据类型为int16
    • dt_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_polys
    • rec_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_imgpreprocessed_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)1
TextRecognition 文本识别模块

文本识别模块 - PaddleOCR 文档

TextRecognition 参数
TextRecognition实例化文本识别模型(此处以PP-OCRv5_server_rec为例),具体说明如下:
参数参数说明参数类型默认值
model_name模型名称。如果设置为None,则使用PP-OCRv5_server_rec。str|NoneNone
model_dir模型存储路径。str|NoneNone
device用于推理的设备。
例如:“cpu”、“gpu”、“npu”、“gpu:0”、“gpu:0,1”。
如指定多个设备,将进行并行推理。
默认情况下,优先使用 GPU 0;若不可用则使用 CPU。
str|NoneNone
enable_hpi是否启用高性能推理。boolFALSE
use_tensorrt是否启用 Paddle Inference 的 TensorRT 子图引擎。如果模型不支持通过 TensorRT 加速,即使设置了此标志,也不会使用加速。
对于 CUDA 11.8 版本的飞桨,兼容的 TensorRT 版本为 8.x(x>=6),建议安装 TensorRT 8.6.1.6。
boolFALSE
precision当使用 Paddle Inference 的 TensorRT 子图引擎时设置的计算精度。
可选项:"fp32""fp16"
str“fp32”
enable_mkldnn是否启用 MKL-DNN 加速推理。如果 MKL-DNN 不可用或模型不支持通过 MKL-DNN 加速,即使设置了此标志,也不会使用加速。boolTRUE
mkldnn_cache_capacityMKL-DNN 缓存容量。int10
cpu_threads在 CPU 上推理时使用的线程数量。int10
input_shape模型输入图像尺寸,格式为 (C, H, W)。tuple|NoneNone
predict() 方法 的参数
  • 调用文本识别模型的 predict() 方法进行推理预测,该方法会返回一个 结果 列表
  • 另外,本模块还提供了 predict_iter() 方法。
  • 两者在参数接受和结果返回方面是完全一致的,区别在于 predict_iter() 返回的是一个 generator,能够逐步处理和获取预测结果,适合处理大型数据集或希望节省内存的场景。
  • 可以根据实际需求选择使用这两种方法中的任意一种。
predict() 方法参数有 inputbatch_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批大小,可设置为任意正整数。int1
对结果的操作
对预测结果进行处理,每个样本的预测结果均为对应的Result对象,且支持打印、保存为图片、保存为json文件的操作:
方法方法说明参数参数类型参数说明
print()打印结果到终端format_jsonbool是否对输出内容进行使用 JSON 缩进格式化
indentint指定缩进级别,以美化输出的 JSON 数据,使其更具可读性,仅当 format_json 为 True 时有效
ensure_asciibool控制是否将非 ASCII 字符转义为 Unicode。设置为 True 时,所有非 ASCII 字符将被转义;False 则保留原始字符,仅当format_json为True时有效
save_to_json()将结果保存为json格式的文件save_pathstr保存的文件路径,当为目录时,保存文件命名与输入文件类型命名一致
indentint指定缩进级别,以美化输出的 JSON 数据,使其更具可读性,仅当 format_json 为 True 时有效
ensure_asciibool控制是否将非 ASCII 字符转义为 Unicode。设置为 True 时,所有非 ASCII 字符将被转义;False 则保留原始字符,仅当format_json为True时有效
save_to_img()将结果保存为图像格式的文件save_pathstr保存的文件路径,当为目录时,保存文件命名与输入文件类型命名一致
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的第几页,否则为 None
  • rec_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.388.46 / 2.3631.21 / 31.2181
PP-OCRv5_mobile_rec推理模型/训练模型81.295.43 / 1.4621.20 / 5.3216
在这里插入图片描述
指定模型位置
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

Read more

【Java 开发日记】我们来说一下 synchronized 与 ReentrantLock 的区别

【Java 开发日记】我们来说一下 synchronized 与 ReentrantLock 的区别

目录 一、基本特性对比 二、详细区别分析 1. 实现层面 2. 使用方式 3. 公平性选择 4. 条件变量(Condition) 5. 中断与超时 6. 性能差异 三、适用场景 优先使用 synchronized 的情况 优先使用 ReentrantLock 的情况 四、示例对比 场景:生产者-消费者模型 五、总结 面试回答 一、基本特性对比 特性 synchronized ReentrantLock 锁的实现机制 JVM 内置关键字,通过监视器实现 JDK 提供的 API 类(java.util.concurrent.locks)

By Ne0inhk
Java SpringBoot框架Web开发实战04--使用Lockback技术进行日志管理

Java SpringBoot框架Web开发实战04--使用Lockback技术进行日志管理

日志是每个网页所必须的东西,当网站出错时,日志就可以帮我们快速查看错误,传统的systemout进行输出日志有很多缺陷。一是如果后来某一大板块不需要日志进行输出,这时候你想要修改代码要把所有的输出代码全部删除,二是这种方式不会保留日志文件,如果出现闪退现象你无法得知是哪里的错误,但是使用lockback技术就可以避免这些问题。 下面是一段完整的logback.xml代码。 <?xml version="1.0" encoding="UTF-8"?> <configuration> <!-- 控制台输出 --> <appender name="STDOUT"> <encoder> <!--格式化输出:%d 表示日期,%thread 表示线程名,%-5level表示级别从左显示5个字符宽度,%logger显示日志记录器的名称, %msg表示日志消息,

By Ne0inhk
用AI科研绘图全新升级!借助谷歌新发布模型Nano Banana pro实测一键绘制机制图与技术路线图,直接告别文字乱码与低画质

用AI科研绘图全新升级!借助谷歌新发布模型Nano Banana pro实测一键绘制机制图与技术路线图,直接告别文字乱码与低画质

之前有同仁反馈,用Nano Banana画科研插图的时候,要么文字部分容易乱码,要么抓不住关键内容,画出来的效果反复修改后,还是达不到理想的效果。 终于在Gemini 3发布没几天,万众期待的大香蕉模型也成功升级到了Pro版本,官方名称叫“Gemini 3 Pro Image”,实际上也就是我们说的Nano Banana 2。 这次的Nano Banana Pro模型,不仅可以直出4K高清图,还能自定义比例,推理能力和中文文字的稳定性也得到了提升。 七哥实测用Nano Banana Pro模型来绘制科研插图,效果非常好,接下来我来进行实操,分别用它来画机制图和技术路线图。 开始之前我们需要打开Gemini 3Pro的Thinking模式,然后点击工具中的“Creat Image”,这样才算是调用Nano Banana Pro模型。 1、机制图 机制图的核心要求是科学准确,逻辑、符号和关键信息绝对不能出错,格式方面要统一,配色需符合特定期刊要求。

By Ne0inhk
个人健康中枢的多元化AI硬件革新与精准健康路径探析

个人健康中枢的多元化AI硬件革新与精准健康路径探析

在医疗信息化领域,个人健康中枢正经历着一场由硬件技术革新驱动的深刻变革。随着可穿戴设备、传感器技术和人工智能算法的快速发展,新一代健康监测硬件能够采集前所未有的多维度生物数据,并通过智能分析提供精准的健康建议。本文将深入探讨构成个人健康中枢的最新硬件技术,分析它们如何采集和处理多维生物数据,以及这些数据如何转化为个性化的健康指导方案,最终实现从被动治疗到主动预防的健康管理模式转变。 多维度生物数据采集的最新硬件技术 个人健康中枢的构建离不开先进的数据采集硬件,近年来,各类创新设备在生物信号采集能力上取得了显著突破,能够从生理、心理及行为等多个维度获取健康相关数据。 智能穿戴设备已从简单的步数计数器进化为精密的生物传感器网络。现代智能手表和手环不仅能够持续监测心率、血氧饱和度、血压等传统生理指标,还整合了心电图(ECG)和连续血糖监测(CGM)功能,实现了对心血管系统和代谢系统的高精度追踪[0

By Ne0inhk