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安装依赖python3.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()方法中的读取图片路径imgcv2.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:detTrue,clsFalse,recTrue 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()方法中修改如下代码modelONNXPaddleOcr(use_angle_clsFalse,use_gpuFalse,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:detTrue,clsFalse,recTrue 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_gpuTrue就可以用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:detectD:\workspace\github\ocr\OnnxOCR\onnxocr\models\license_plate\car_plate_detect.onnx,recD:\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/jingsongliujOCR2、模型https://www.modelscope.cn/models/supersong/onnxocr_model/tree/master/models
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的安装下载源代码gitclone https://github.com/jingsongliujing/OnnxOCR.git创建虚拟环境cdOnnxOCR python-mvenv .venv\.venv\Scripts\Activate.ps1安装依赖python3.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()方法中的读取图片路径imgcv2.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:detTrue,clsFalse,recTrue 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()方法中修改如下代码modelONNXPaddleOcr(use_angle_clsFalse,use_gpuFalse,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:detTrue,clsFalse,recTrue 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_gpuTrue就可以用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:detectD:\workspace\github\ocr\OnnxOCR\onnxocr\models\license_plate\car_plate_detect.onnx,recD:\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/jingsongliujOCR2、模型https://www.modelscope.cn/models/supersong/onnxocr_model/tree/master/models