PaddleOCR 模型转 ONNX 与 ONNXRuntime 推理实战:Paddle2ONNX 转换、参数详解与源码级解析

发布时间:2026/9/10 1:16:04

PaddleOCR 模型转 ONNX 与 ONNXRuntime 推理实战:Paddle2ONNX 转换、参数详解与源码级解析 PaddleOCR 模型转 ONNX 与 ONNXRuntime 推理实战Paddle2ONNX 转换、参数详解与源码级解析【免费下载链接】PaddleOCRTurn any PDF or image document into structured data for your AI. A powerful, lightweight OCR toolkit that bridges the gap between images/PDFs and LLMs. Supports 100 languages.项目地址: https://gitcode.com/GitHub_Trending/pa/PaddleOCR本文以 Paddle2ONNX 部署文档 为主体系统讲解如何把 PaddleOCR 的静态图模型检测、识别、分类通过 Paddle2ONNX 转换为 ONNX 模型并基于 ONNXRuntime 完成端到端 OCR 预测。读完本篇你可以独立完成三件套模型的下载与转换含--opset_version、--enable_onnx_checker等参数含义、动态 shape 的必要性与调整方式、用 predict_system.py 切换 ONNXRuntime/Paddle Inference 双引擎推理以及理解 tools/infer/utility.py 中推理会话的创建逻辑。1. 流程总览从 Paddle 静态图到 ONNXRuntime 推理PaddleOCR 2.x 体系下一个可用的推理模型是「静态图三件套」inference.pdmodel网络结构inference.pdiparams权重 可选的inference.yml超参数。Paddle2ONNX 的作用就是把这套模型转换为 ONNX 格式的model.onnx之后即可脱离 Paddle 运行时用 ONNXRuntime 在 CPU/GPU 上推理。整体链路为准备环境PaddleOCR Paddle2ONNX ONNXRuntime获取 Paddle 静态图模型下载官方推理模型或从训练权重导出执行paddle2onnx转换命令输出model.onnx用python3 tools/infer/predict_system.py --use_onnxTrue完成 OCR 预测并可视化。2. 环境准备需要准备 PaddleOCR、Paddle2ONNX 模型转换环境、ONNXRuntime 推理环境三部分。2.1 安装 PaddleOCR克隆 PaddleOCR 仓库使用 main 分支并以可编辑模式安装git clone -b main https://gitcode.com/GitHub_Trending/pa/PaddleOCR.git cd PaddleOCR python3 -m pip install -e .说明原文档给出的是上游 GitHub 仓库地址在本仓库环境下等价于使用当前代码库。由于仓库较大克隆速度可能较慢。2.2 安装 Paddle2ONNX 与 ONNXRuntimePaddle2ONNX 支持将 PaddlePaddle 模型格式转换为 ONNX 模型格式。文档说明算子目前稳定支持导出 ONNX Opset 9~11部分 Paddle 算子支持更低 Opset 的转换中文文档中给出的支持范围写为 Opset 9~18两者差异源于 Paddle2ONNX 版本演进实际以所装版本的官方说明为准。python3 -m pip install paddle2onnx python3 -m pip install onnxruntime3. 获取 Paddle 静态图模型有两种方式获取 Paddle 静态图推理模型下载 PaddleOCR 官方提供的预测模型模型清单见 model_list参考仓库 2.x 模型导出说明 中「训练模型转 inference 模型」一节把训练好的权重inference.ymlmodel.pdparams转为 inference 静态图模型。以文档中的英文 OCR 示例PP-OCRv3 英文检测/识别 中文方向分类模型为例下载并解压wget -nc -P ./inference https://paddleocr.bj.bcebos.com/PP-OCRv3/english/en_PP-OCRv3_det_infer.tar cd ./inference tar xf en_PP-OCRv3_det_infer.tar cd .. wget -nc -P ./inference https://paddleocr.bj.bcebos.com/PP-OCRv3/english/en_PP-OCRv3_rec_infer.tar cd ./inference tar xf en_PP-OCRv3_rec_infer.tar cd .. wget -nc -P ./inference https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_infer.tar cd ./inference tar xf ch_ppocr_mobile_v2.0_cls_infer.tar cd ..中文版文档使用PP-OCRv3_mobile_det_infer、ch_PP-OCRv3_rec_infer与同一分类模型命令结构完全一致。4. 模型转换paddle2onnx 命令与参数详解使用 Paddle2ONNX 将 Paddle 静态图模型转换为 ONNX 模型格式检测、识别、分类三个模型分别执行paddle2onnx --model_dir ./inference/en_PP-OCRv3_det_infer \ --model_filename inference.pdmodel \ --params_filename inference.pdiparams \ --save_file ./inference/det_onnx/model.onnx \ --opset_version 11 \ --enable_onnx_checker True paddle2onnx --model_dir ./inference/en_PP-OCRv3_rec_infer \ --model_filename inference.pdmodel \ --params_filename inference.pdiparams \ --save_file ./inference/rec_onnx/model.onnx \ --opset_version 11 \ --enable_onnx_checker True paddle2onnx --model_dir ./inference/ch_ppocr_mobile_v2.0_cls_infer \ --model_filename inference.pdmodel \ --params_filename inference.pdiparams \ --save_file ./inference/cls_onnx/model.onnx \ --opset_version 11 \ --enable_onnx_checker True各参数含义参数说明--model_dir静态图模型所在目录包含inference.pdmodel/inference.pdiparams--model_filename模型结构文件名默认inference.pdmodel--params_filename权重文件名默认inference.pdiparams--save_file输出的 ONNX 文件路径如./inference/det_onnx/model.onnx--opset_version目标 ONNX Opset 版本文档示例使用 11--enable_onnx_checker转换后自动调用 ONNX checker 校验模型合法性建议开启执行完毕后ONNX 模型分别保存在./inference/det_onnx/、./inference/rec_onnx/、./inference/cls_onnx/路径下。4.1 关键注意事项务必遵守OCR 模型必须保持动态 shape对于 OCR 模型转换过程中必须采用动态 shape 的形式否则预测结果可能与直接使用 Paddle 预测有细微不同。这是因为检测/识别模型的输入分辨率随图像变化固定 shape 会导致推理时缩放逻辑与 Paddle 路径不一致。暂不支持转换的模型NRTR、SAR、RARE、SRN 这几类识别算法目前不支持转换为 ONNX 模型。--input_shape_dict已废弃当前 Paddle2ONNX 版本v1.2.3已默认支持动态 shape即float32[p2o.DynamicDimension.0,3,p2o.DynamicDimension.1,p2o.DynamicDimension.2]--input_shape_dict选项已废弃。如果有 shape 调整需求可使用如下命令对转换产物调整 Paddle 模型输入 shapepython3 -m paddle2onnx.optimize --input_model inference/det_onnx/model.onnx \ --output_model inference/det_onnx/model.onnx \ --input_shape_dict {x: [-1,3,-1,-1]}其中-1表示该维度为动态维度x为模型输入名需要与sess.get_inputs()中的实际输入名一致。5. 基于 ONNXRuntime 的预测5.1 推理命令以英文 OCR 模型为例使用ONNXRuntime预测python3 tools/infer/predict_system.py --use_gpuFalse --use_onnxTrue \ --det_model_dir./inference/det_onnx/model.onnx \ --rec_model_dir./inference/rec_onnx/model.onnx \ --cls_model_dir./inference/cls_onnx/model.onnx \ --image_dirdoc/imgs_en/img_12.jpg \ --rec_char_dict_pathppocr/utils/en_dict.txt对照实验——使用Paddle Inference预测同一批模型目录注意此处模型路径指向的是 Paddle 静态图目录而非 .onnx 文件python3 tools/infer/predict_system.py --use_gpuFalse \ --cls_model_dir./inference/ch_ppocr_mobile_v2.0_cls_infer \ --rec_model_dir./inference/en_PP-OCRv3_rec_infer \ --det_model_dir./inference/en_PP-OCRv3_det_infer \ --image_dirdoc/imgs_en/img_12.jpg \ --rec_char_dict_pathppocr/utils/en_dict.txt关键参数说明--use_onnxTrue切换到 ONNXRuntime 推理引擎。此时--*_model_dir参数直接指向.onnx文件--rec_char_dict_path识别字符字典英文模型需显式指定 en_dict.txt默认值是中文 ppocr_keys_v1.txt执行后终端会打印每行识别文本及置信度可视化结果保存在./inference_results/下。中文场景下文档给出的示例命令以 lite_demo.png 为输入python3 tools/infer/predict_system.py --use_gpuFalse --use_onnxTrue \ --det_model_dir./inference/det_onnx/model.onnx \ --rec_model_dir./inference/rec_onnx/model.onnx \ --cls_model_dir./inference/cls_onnx/model.onnx \ --image_dir./deploy/lite/imgs/lite_demo.pngONNXRuntime 推理可视化结果中英混合文档38 个文本框5.2 终端输出解读以英文模型ONNXRuntime为例文档记录的典型输出[2022-10-10 12:06:28] ppocr DEBUG: dt_boxes num : 11, elapse : 0.3568880558013916 [2022-10-10 12:06:31] ppocr DEBUG: rec_res num : 11, elapse : 2.6445000171661377 [2022-10-10 12:06:31] ppocr DEBUG: 0 Predict time of doc/imgs_en/img_12.jpg: 3.021s [2022-10-10 12:06:31] ppocr DEBUG: ACKNOWLEDGEMENTS, 0.997 [2022-10-10 12:06:31] ppocr DEBUG: We would like to thank all the designers and, 0.976 ... [2022-10-10 12:06:31] ppocr DEBUG: The visualized image saved in ./inference_results/img_12.jpg [2022-10-10 12:06:31] ppocr INFO: The predict total time is 3.2482550144195557可以读出三层信息dt_boxes num是检测出的文本框数量rec_res num是进入识别的文本行数量两者后面的elapse分别是检测与识别阶段耗时随后逐行输出「文本, 置信度」最后一行predict total time为整图端到端耗时。Paddle Inference 引擎下输出格式完全一致可直接对比同一图像的两种引擎结果。6. 源码解析--use_onnx背后的推理会话是如何创建的6.1 会话创建分支tools/infer/utility.pypredict_system.py通过 create_predictor 按模块det/cls/rec 等创建预测器。当args.use_onnx为真时走如下分支if args.use_onnx: import onnxruntime as ort model_file_path model_dir if not os.path.exists(model_file_path): raise ValueError(not find model file path {}.format(model_file_path)) ... if args.onnx_providers and len(args.onnx_providers) 0: sess ort.InferenceSession(model_file_path, providersargs.onnx_providers, sess_optionssess_options) elif args.use_gpu: sess ort.InferenceSession( model_file_path, providers[(CUDAExecutionProvider, {device_id: args.gpu_id, cudnn_conv_algo_search: HEURISTIC})], sess_optionssess_options) else: sess ort.InferenceSession(model_file_path, providers[CPUExecutionProvider], sess_optionssess_options) inputs sess.get_inputs() return (sess, inputs[0] if len(inputs) 1 else [vo.name for vo in inputs], None, None)从源码结构看执行提供器provider的优先级是显式传入的--onnx_providers可指定任意 provider 列表--use_gpuTrue时使用CUDAExecutionProvider并携带device_id与 cuDNN 卷积算法搜索策略HEURISTIC否则回落到CPUExecutionProvider。注意 ONNX 分支直接以「.onnx 文件路径」作为model_file_path并校验其存在性这解释了为什么--use_onnxTrue时--det_model_dir等参数必须指向.onnx文件而非目录而非 ONNX 分支则会在目录中查找inference.pdmodel/inference.pdiparams或.json。6.2 输入输出张量的差异create_predictor返回四元组(predictor, input_tensor, output_tensors, config)。ONNX 分支返回的是 ONNX Runtime 的InferenceSession且把输入定义为「输入名」单输入时取inputs[0]识别时的执行路径相应不同。以 predict_det.py 为例if self.use_onnx: input_dict {} input_dict[self.input_tensor.name] img outputs self.predictor.run(self.output_tensors, input_dict) else: self.input_tensor.copy_from_cpu(img) self.predictor.run() outputs [] for output_tensor in self.output_tensors: output output_tensor.copy_to_cpu() outputs.append(output)即 ONNX 路径用「输入名 → ndarray 字典」调用sess.run(output_names, input_dict)一次性取回所有输出Paddle 路径则是逐张量copy_from_cpu喂入、运行后逐张量copy_to_cpu取出。这也意味着 ONNX 分支的输入名必须与转换后model.onnx中实际的输入名一致——若用paddle2onnx.optimize调整过输入 shape/输入名需要保持两边匹配。6.3 命令行参数的完整定义--use_onnx及其配套参数在 init_args 中定义parser.add_argument(--use_onnx, typestr2bool, defaultFalse) parser.add_argument(--onnx_providers, nargs, typestr, defaultFalse) parser.add_argument(--onnx_sess_options, typelist, defaultFalse)其中str2bool会把true/yes/t/y/1解析为布尔值因此--use_onnxTrue的写法与测试脚本中的--use_onnxTrue一致。7. 仓库内的自动化验证test_tipc 测试链路PaddleOCR 仓库自带了针对该部署链路的回归测试主程序为 test_tipc/test_paddle2onnx.sh流程说明见 test_paddle2onnx.md运行bash test_tipc/prepare.sh config.txt paddle2onnx_infer准备数据与模型运行bash test_tipc/test_paddle2onnx.sh config.txt执行转换 推理结果日志写入test_tipc/output/{model_name}/paddle2onnx/目录汇总状态记录在results_paddle2onnx.log。脚本内部逻辑与本文第 4、5 节的手动流程一一对应先按模型类型拼装paddle2onnx --model_dir ... --model_filename ... --params_filename ... --save_file ... --opset_version ... --enable_onnx_checker ...转换命令对 ch_PP-OCRv2/v3、ch_ppocr_mobile/server_v2_0 等套件模型会依次转换 det 与 rec 两个模型再对 CPU/GPU 分别拼装python tools/infer/predict_det.py ... --use_onnxTrue推理命令并检查退出状态。测试覆盖的模型类型包括正常模型与量化模型、GPU 与 CPU 两种设备。一个真实配置样例 ch_PP-OCRv2_det 配置paddle2onnx_params model_name:ch_PP-OCRv2_det python:python3.7 2onnx: paddle2onnx --det_model_dir:./inference/ch_PP-OCRv2_det_infer/ --model_filename:inference.pdmodel --params_filename:inference.pdiparams --det_save_file:./inference/det_v2_onnx/model.onnx --opset_version:10 --enable_onnx_checker:True inference:tools/infer/predict_det.py --use_gpu:True|False --image_dir:./inference/ch_det_data_50/all-sum-510/可以看到配置中的--opset_version:10与文档正文示例的 11 均属于文档声明的稳定支持区间Opset 9~11说明单模块检测模型在 Opset 10 下同样可通过转换与 ONNXRuntime 推理校验。8. 小结与适用前提适用前提PaddleOCR 2.x 静态图模型 paddle2onnx≥ 1.2.3默认动态 shape 可安装onnxruntime的 Python 环境GPU 推理需 CUDA 版 onnxruntime。转换时牢记两点OCR 模型必须保持动态 shapeNRTR/SAR/RARE/SRN 暂不支持转换。验证转换正确性的最简路径同一输入图像分别用--use_onnxTrue与默认 Paddle Inference 跑predict_system.py对比终端识别文本与./inference_results/下的可视化图片是否一致。仓库内可继续深入的参考文件deploy/paddle2onnx/readme_ch.md中文版教程、tools/infer/predict_system.py、test_tipc/docs/test_paddle2onnx.md。【免费下载链接】PaddleOCRTurn any PDF or image document into structured data for your AI. A powerful, lightweight OCR toolkit that bridges the gap between images/PDFs and LLMs. Supports 100 languages.项目地址: https://gitcode.com/GitHub_Trending/pa/PaddleOCR创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/10 1:11:04

基于主从博弈的电热综合能源系统动态定价与能量管理Matlab实现

直接说结论:这套“基于主从博弈的电热综合能源系统动态定价与能量管理”项目,我做过完整复现和改造,今天把建模思路、求解细节、Matlab代码结构、还有调试中踩过的坑一次性整理出来。核心就一句话:运营商定电价和热价,…

2026/9/10 1:11:04

Spring Boot多环境配置实战:彻底解决开发与生产环境切换难题

做Java后端的朋友应该都经历过这种场景:本地代码跑得好好的,一提交到测试环境就报数据库连接超时,再一部署到生产环境,Redis地址不对、日志打不出来、文件上传路径找不到。大多数情况下,问题不是代码逻辑写错了&#x…

2026/9/10 2:06:11

618复盘别再手工对表了!2026年5款大促数据工具排行榜测评

618大促落幕之后,真正拉开差距的往往不是当天的销售额,而是复盘的质量。一场大促沉淀下来的订单、流量、投放、库存、售后数据,构成了下一场大促的决策底牌。市面上可用于大促复盘的数据工具,按产品形态大致可分为四类&#xff1a…

2026/9/10 2:06:11

FPGA实现AES-128加密算法:Verilog硬件设计与工程实践详解

简介:面向FPGA与硬件安全开发者的AES-128完整Verilog实现,基于Rijndael算法,覆盖密钥扩展、字节替换、行移位、列混淆等核心模块,并附带VHDL对照代码,适合用于学习对称加密算法的硬件加速、安全模块设计与芯片验证流程…

2026/9/10 2:01:11

CANN/ge图编译缓存功能

图编译缓存 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、TensorFlow 前端…

2026/9/9 13:11:35

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/8 7:15:15

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/9 16:31:09

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/10 0:00:55

目录对比去重实战:用哈希算法精准清理重复文件

我电脑里现在还有一块换了三次机的“数据墓地”硬盘,里面存着2016年以前所有旧笔记本的完整备份。平时不觉得有什么,直到前阵子想把它整理归档,发现同一个安装包、同一批照片、同一份论文草稿,在几个不同的备份目录里反复出现。更…

2026/9/10 0:00:55

Leaflet离线地图完整Demo合集:内网部署与坐标纠偏实战

简介:这是一份面向Web GIS开发者的LeafLet离线地图示例合集,帮助开发者快速掌握离线地图从搭建到交互的完整流程。压缩包共723个文件,大小14.06MB,以319个js脚本、175个html页面和29个css样式文件为主体,配合png/svg图…

2026/9/10 0:00:55

MATLAB读取Rinex 3.02观测文件:多系统GNSS数据解析实战

简介:基于MATLAB开发的Rinex3.02版观测文件(o文件)读取代码包,面向卫星定位导航方向的学习者与研究人员,用于解决新版观测文件的数据解析、历元提取与时间转换问题。压缩包共4个文件,包含两个m脚本、一个19…

2026/9/7 16:23:03

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/7 22:46:00

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/9 10:21:54

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码