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

发布时间:2026/11/5 16:58:16

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/11/4 21:33:43

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

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

2026/11/5 8:37:01

Locust高并发压测实战:从脚本设计到瓶颈定位

如果你也经历过那种凌晨两点被监控电话叫醒,打开面板看到CPU打满、数据库连接池耗尽、线上服务一个接一个雪崩的场景,你应该能理解“压力测试”这四个字的分量。系统跑得好不好,不是上线那一刻才确定的,而是取决于你有没有在上线之…

2026/11/5 16:51:33

EasyU优启通PE维护盘实战指南:制作、启动与核心操作全解析

1. 为什么一个PE维护盘值得单独拿出来聊装系统、修引导、救数据、清病毒,这些活儿但凡干过几次的人都知道,真正决定效率的往往不是你手速多快,而是手边那套PE环境靠不靠谱。EasyU(圈内习惯叫优启通)就是在这个场景下被…

2026/11/5 16:26:13

Rust原来很简单二:所有权系统

Part 2 核心篇 —— 所有权系统 本篇覆盖 第 6 ~ 10 章:所有权、借用与引用、生命周期、字符串与切片、内存模型。 ⚠️ 这是全书最重要的一篇。 把它吃透,Rust 从此“很简单”;跳过它,你会处处碰壁。请慢下来,动手敲每一段代码。 第 6 章 所有权:Rust 的第一性原理 6…

2026/11/5 15:00:49

基于Hadoop+Spark的民宿智能推荐系统设计与实现

1. 项目概述:大数据时代的民宿智能推荐这个毕业设计项目融合了当前大数据领域最主流的技术栈,构建了一个完整的民宿推荐系统解决方案。作为一名长期从事大数据系统开发的工程师,我认为这个选题非常贴合实际应用场景——随着旅游业的复苏和共享…

2026/11/5 14:10:30

ADS122U04IPWR+STM32F427ZI工业级温度测量信号链设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 14:10:30

UART接口24位ADC搭配RS485,解决远距离温度监控难题

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 14:10:30

UART接口24位ADC搭配PIC18F46K22的RTD与热电偶测温实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 15:39:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 0:02:07

多智能体协作系统架构设计与实践优化

1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中…

2026/11/5 0:02:07

大模型系统性入门实战指南:从原理到部署微调的全链路路线

提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#…

2026/11/5 0:02:07

鸿蒙文件系统沙箱机制解析与开发实践

1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的…

2026/11/5 15:39:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

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

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

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