PP-OCRv5 ONNX部署但使用OnnxOCR
1、OnnxOCR是啥?
手搓ONNX部署PP-OCRv5模型的文章中,有小伙伴告诉我OnnxOCR也不错,可以试试。
对,试试就试试。
OnnxOCR是一个开源的项目,github上是这样介绍自己的:基于PaddleOCR重构,并且脱离PaddlePaddle深度学习训练框架的轻量级OCR,推理速度超快。
从github地址就可以看出来,该项目的核心作者是刘劲松(Jingsong Liu),据说他也是PaddleOCR的作者。
该项目的核心目标与我手搓ONNX部署是异曲同工的:脱离PaddlePaddle深度学习训练框架,便于直接部署,并实现跨架构(x86 和 ARM)推理。
在2026.05.01版本中,新增了以下功能:
- 车牌检测与车牌号识别能力
- 表格识别能力
- 中英文版面分析能力
- 文档版面分析与 Markdown 导出能力
今天我的任务就是验证上述几个功能效果如何。
2、OnnxOCR的安装
下载源代码:
git clone https://github.com/jingsongliujing/OnnxOCR.git
创建虚拟环境:
cd OnnxOCR
python -m venv .venv
\.venv\Scripts\Activate.ps1
安装依赖:
python>=3.8 # 确保使用Python 3.8及以上版本但要小于3.13版本
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
避坑指南
我用了python 3.13,安装依赖时就报错了,只能删掉重来。
deactivate # 退出虚拟环境
rmdir -r .venv
重新创建虚拟环境,安装依赖,再试一次。
这次我不厚道的使用了conda来创建虚拟环境。一切顺利。
模型下载:
国内还是使用魔塔,如果没有先安装它:
pip install modelscope
python scripts/download_models.py
该脚本将需要的26个文件都下载下来了,你也可以有选择的下载。当然也可以手动下载模型(链接放到最下面了)。
3、OnnxOCR的试运行
现在到了验证它的时候了。我将之前经常使用的图片放到\OnnxOCR\onnxocr\test_images目录下。
修改run_general_ocr()方法中的读取图片路径:
img = cv2.imread(str(TEST_IMAGE_DIR / "pic002.png"))
执行如下命令:
python test_ocr.py
默认是用CPU推理的,默认模型是ppocrv5的mobile版本,它的速度很快,仅需要0.250秒。
2026-05-25 21:37:02 | INFO | onnxocr.inference_engine:create_session:162 | Creating ONNX session: D:\workspace\github\ocr\OnnxOCR\onnxocr\models\ppocrv5\det\det.onnx, providers=['CPUExecutionProvider']
2026-05-25 21:37:02 | INFO | onnxocr.predict_det:__init__:54 | Detection model loaded: D:\workspace\github\ocr\OnnxOCR\onnxocr\models\ppocrv5\det\det.onnx
2026-05-25 21:37:02 | INFO | onnxocr.inference_engine:create_session:162 | Creating ONNX session: D:\workspace\github\ocr\OnnxOCR\onnxocr\models\ppocrv5\rec\rec.onnx, providers=['CPUExecutionProvider']
2026-05-25 21:37:03 | INFO | onnxocr.predict_rec:__init__:28 | Recognition model loaded: D:\workspace\github\ocr\OnnxOCR\onnxocr\models\ppocrv5\rec\rec.onnx
2026-05-25 21:37:03 | INFO | onnxocr.onnx_paddleocr:__init__:80 | OCR model initialized: det=True, cls=False, rec=True
general OCR total time: 0.250
general OCR result: [[[[[0.0, 10.0], [24.0, 10.0], [24.0, 28.0], [0.0, 28.0]], ('五、', 0.9723315834999084)], [[[32.0, 8.0], [107.0, 5.0], [107.0, 28.0], [32.0, 31.0]], ('中文识别', 0.9992046356201172)], [[[32.0, 55.0], [142.0, 55.0], [142.0, 78.0], [32.0, 78.0]], ('高级应用场景', 0.9991479516029358)], [[[7.0, 82.0], [52.0, 79.0], [53.0, 96.0], [8.0, 99.0]], ('5.1', 0.9949715733528137)], [[[44.0, 78.0], [172.0, 78.0], [172.0, 100.0], [44.0, 100.0]], ('结构化数据提取', 0.999606192111969)]]]

4、OnnxOCR的server模型识别
先来指定模型,在test_general_ocr.py中run_general_ocr()方法中修改如下代码:
model = ONNXPaddleOcr(
use_angle_cls=False,
use_gpu=False,
det_model_dir="../onnxocr/models/ppocrv5/det/ch_PP-OCRv5_det_server.onnx",
rec_model_dir="../onnxocr/models/ppocrv5/rec/ch_PP-OCRv5_rec_server.onnx",
)
执行后效果如下:
2026-05-26 09:16:29 | INFO | onnxocr.inference_engine:create_session:162 | Creating ONNX session: ../onnxocr/models/ppocrv5/det/ch_PP-OCRv5_det_server.onnx, providers=['CPUExecutionProvider']
2026-05-26 09:16:30 | INFO | onnxocr.predict_det:__init__:54 | Detection model loaded: ../onnxocr/models/ppocrv5/det/ch_PP-OCRv5_det_server.onnx
2026-05-26 09:16:31 | INFO | onnxocr.inference_engine:create_session:162 | Creating ONNX session: ../onnxocr/models/ppocrv5/rec/ch_PP-OCRv5_rec_server.onnx, providers=['CPUExecutionProvider']
2026-05-26 09:16:32 | INFO | onnxocr.predict_rec:__init__:28 | Recognition model loaded: ../onnxocr/models/ppocrv5/rec/ch_PP-OCRv5_rec_server.onnx
2026-05-26 09:16:33 | INFO | onnxocr.onnx_paddleocr:__init__:80 | OCR model initialized: det=True, cls=False, rec=True
general OCR total time: 2.074
general OCR result: [[[[[0.0, 7.0], [107.0, 4.0], [107.0, 27.0], [0.0, 30.0]], ('五、中文识别', 0.9980642199516296)], [[[0.0, 55.0], [141.0, 53.0], [141.0, 76.0], [0.0, 79.0]], ('六、高级应用场景', 0.9990465641021729)], [[[8.0, 82.0], [50.0, 82.0], [50.0, 97.0], [8.0, 97.0]], ('5.1', 0.9984381794929504)], [[[42.0, 78.0], [172.0, 78.0], [172.0, 100.0], [42.0, 100.0]], ('结构化数据提取', 0.9998837113380432)]]]
整个识别过程需要2.074秒,比mobile版本慢了很多。对于一些简单的识别场景,首推还是用mobile版本模型。
5、OnnxOCR的GPU推理
本以为将use_gpu=True,就可以用GPU推理了,但是我遇到了一些关于onnxruntime库相关的问题。
OP Conv (Conv.XX) running in Fallback mode. May be extremely slow.
不知道大家有没有遇到这个问题。我搜集了一些信息,说这是模型中的某些卷积层无法在当前 CUDA 执行提供器(Execution Provider)下高效运行,因此被降级到 CPU 上执行。
这就导致了GPU推理的性能问题。
2026-05-26 10:01:32 | INFO | onnxocr.inference_engine:create_session:162 | Creating ONNX session: ../onnxocr/models/ppocrv5/det/ch_PP-OCRv5_det_server.onnx, providers=[('CUDAExecutionProvider', {'cudnn_conv_algo_search': 'DEFAULT', 'device_id': 0}), 'CPUExecutionProvider']
2026-05-26 10:01:33 | INFO | onnxocr.predict_det:__init__:54 | Detection model loaded: ../onnxocr/models/ppocrv5/det/ch_PP-OCRv5_det_server.onnx
2026-05-26 10:01:34 | INFO | onnxocr.inference_engine:create_session:162 | Creating ONNX session: ../onnxocr/models/ppocrv5/rec/ch_PP-OCRv5_rec_server.onnx, providers=[('CUDAExecutionProvider', {'cudnn_conv_algo_search': 'DEFAULT', 'device_id': 0}), 'CPUExecutionProvider']
2026-05-26 10:01:35 | INFO | onnxocr.predict_rec:__init__:28 | Recognition model loaded: ../onnxocr/models/ppocrv5/rec/ch_PP-OCRv5_rec_server.onnx
general OCR total time: 0.688
general OCR result: [[[[[0.0, 7.0], [107.0, 4.0], [107.0, 27.0], [0.0, 30.0]], ('五、中文识别', 0.9980624318122864)], [[[0.0, 55.0], [141.0, 53.0], [141.0, 76.0], [0.0, 79.0]], ('六、高级应用场景', 0.9990451335906982)], [[[8.0, 82.0], [50.0, 82.0], [50.0, 97.0], [8.0, 97.0]], ('5.1', 0.9984377026557922)], [[[42.0, 78.0], [172.0, 78.0], [172.0, 100.0], [42.0, 100.0]], ('结构化数据提取', 0.9998835921287537)]]]
同样的图片,server模型的推理时间0.688秒。这与我手搓ONNX部署的推理时间0.325秒相比,也慢了近一倍。
我调查后发现,要搞定这个问题,一个是使用TensorRT,一个是修改模型。时间关系,这次就先不折腾了。
6、车牌识别
在做OCR探索时,我对比了Tesseract、EasyOCR和PP-OCRv4的默认模型识别车牌,发现还是PP-OCRv4的识别效果最好。而今天,OnnxOCR直接定制了模型,让我们看看效果。
找到test_license_plate_ocr.py,我们可以先看看它的测试图片,然后执行它。
2026-05-26 10:18:59 | INFO | onnxocr.onnx_paddleocr:__init__:51 | Initializing plate recognition mode
2026-05-26 10:18:59 | INFO | onnxocr.inference_engine:create_session:162 | Creating ONNX session: D:\workspace\github\ocr\OnnxOCR\onnxocr\models\license_plate\car_plate_detect.onnx, providers=['CPUExecutionProvider']
2026-05-26 10:18:59 | INFO | onnxocr.inference_engine:create_session:162 | Creating ONNX session: D:\workspace\github\ocr\OnnxOCR\onnxocr\models\license_plate\plate_rec.onnx, providers=['CPUExecutionProvider']
2026-05-26 10:18:59 | INFO | onnxocr.license_plate:__init__:45 | License plate model loaded: detect=D:\workspace\github\ocr\OnnxOCR\onnxocr\models\license_plate\car_plate_detect.onnx, rec=D:\workspace\github\ocr\OnnxOCR\onnxocr\models\license_plate\plate_rec.onnx
plate OCR total time: 0.156
plate OCR result: [{'cls': 'plate', 'axis': [239, 508, 298, 574], 'score': 0.9027, 'plate': '浙B2V9L7', 'type': 'single_layer', 'landmarks': [[240.73, 509.77], [298.16, 536.68], [297.6, 573.88], [240.76, 546.85]]}, {'cls': 'plate', 'axis': [961, 363, 1014, 384], 'score': 0.8982, 'plate': '辽DU4356', 'type': 'single_layer', 'landmarks': [[962.09, 363.93], [1014.41, 366.82], [1013.92, 384.05], [961.62, 381.15]]}]
这张测试图片有两张车牌,浙B2V9L7和辽DU4356。它们并不是正面拍摄的,但是识别效果没得说。
7、其他
至于表格识别,它是集成自 RapidTable,复用通用 OCR 的文字检测和识别结果,再进行表格结构还原,输出 HTML、单元格框和逻辑行列坐标。
以及中英文版面分析,集成自 RapidLayout,用于定位文档图像中的标题、正文、表格、图片、页眉页脚等元素。
还有文档转 Markdown,集成自 RapidDoc,支持根据版面分析结果识别标题、段落、表格和图片等内容,并保存为 Markdown 文件。
我就不一一罗列了,总之一句话,OnnxOCR的成熟度已经可以做到拿来即用了。
如果你的项目是CS架构,可以通过它提供的API服务来使用;如果你想端侧部署,也可以使用它提供的模型和逻辑,自行在Windows桌面和移动端部署。
这样的开源项目,我赞了。
最后附上发票识别结果:
参考:
1、官网:https://github.com/jingsongliujOCR
2、模型:https://www.modelscope.cn/models/supersong/onnxocr_model/tree/master/models
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)