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的安装
下载源代码:
gitclone https://github.com/jingsongliujing/OnnxOCR.git创建虚拟环境:
cdOnnxOCR python-mvenv .venv\.venv\Scripts\Activate.ps1安装依赖:
python>=3.8# 确保使用Python 3.8及以上版本但要小于3.13版本pipinstall-ihttps://pypi.tuna.tsinghua.edu.cn/simple-rrequirements.txt避坑指南
我用了python 3.13,安装依赖时就报错了,只能删掉重来。
deactivate# 退出虚拟环境rmdir-r.venv重新创建虚拟环境,安装依赖,再试一次。
这次我不厚道的使用了conda来创建虚拟环境。一切顺利。
模型下载:
国内还是使用魔塔,如果没有先安装它:
pipinstallmodelscopepython 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-2521: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-2521:37:02|INFO|onnxocr.predict_det:__init__:54|Detection model loaded: D:\workspace\github\ocr\OnnxOCR\onnxocr\models\ppocrv5\det\det.onnx2026-05-2521: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-2521:37:03|INFO|onnxocr.predict_rec:__init__:28|Recognition model loaded: D:\workspace\github\ocr\OnnxOCR\onnxocr\models\ppocrv5\rec\rec.onnx2026-05-2521:37:03|INFO|onnxocr.onnx_paddleocr:__init__:80|OCR model initialized:det=True,cls=False,rec=True general OCR total time:0.250general 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.onnx2026-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.onnx2026-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.074general 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)runninginFallback mode. May be extremely slow.不知道大家有没有遇到这个问题。我搜集了一些信息,说这是模型中的某些卷积层无法在当前 CUDA 执行提供器(Execution Provider)下高效运行,因此被降级到 CPU 上执行。
这就导致了GPU推理的性能问题。
2026-05-2610: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-2610:01:33|INFO|onnxocr.predict_det:__init__:54|Detection model loaded:../onnxocr/models/ppocrv5/det/ch_PP-OCRv5_det_server.onnx2026-05-2610: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-2610: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.688general 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-2610:18:59|INFO|onnxocr.onnx_paddleocr:__init__:51|Initializing plate recognition mode2026-05-2610: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-2610: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-2610: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.156plate 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