
PaddleOCR 模型转 ONNX 格式与 ONNXRuntime 部署推理实战【免费下载链接】PaddleOCR飞桨多语言OCR工具包实用超轻量OCR系统支持80种语言识别提供数据标注与合成工具支持服务器、移动端、嵌入式及IoT设备端的训练与部署 Awesome multilingual OCR toolkits based on PaddlePaddle (practical ultra lightweight OCR system, support 80 languages recognition, provide data annotation and synthesis tools, support training and deployment among server, mobile, embedded and IoT devices)项目地址: https://gitcode.com/paddlepaddle/PaddleOCR本篇技术指南以 PaddleOCR 仓库中的 Paddle2ONNX 模型转化与预测文档 为核心系统讲解如何将 PaddleOCR 的 Paddle 静态图推理模型通过 Paddle2ONNX 转换为标准 ONNX 模型并基于 ONNXRuntime 引擎完成检测、识别、方向分类三阶段的全流程预测。读完本文你将掌握从环境准备、模型获取与导出、paddle2onnx命令行转换到predict_system.py使用--use_onnx参数进行跨引擎部署的完整实操链路并理解仓库源码中 ONNX 推理分支的实现原理。1. 整体流程与技术背景PaddleOCR 的默认部署链路基于 Paddle Inference 引擎而本指南介绍的是另一条部署路径Paddle 静态图模型 → Paddle2ONNX → ONNX 模型 → ONNXRuntime 引擎预测。Paddle 静态图模型即推理模型通常包含inference.pdmodel网络结构与inference.pdiparams权重参数两个文件由官方发布或通过tools/export_model.py导出。Paddle2ONNX负责将 PaddlePaddle 模型格式转化为 ONNXOpen Neural Network Exchange模型格式算子目前稳定支持导出 ONNX Opset 9~18部分 Paddle 算子支持更低 Opset 的转换。ONNXRuntime微软开源的跨平台推理引擎直接加载model.onnx文件执行预测无需安装 Paddle 推理库便于在非 Paddle 生态的 C / Python / 移动端 / 服务端环境中复用同一份模型。流程可概括为Paddle 静态图推理模型 (inference.pdmodel inference.pdiparams) │ paddle2onnx 转换 ▼ ONNX 模型 (model.onnx, 动态 shape) │ onnxruntime.InferenceSession 加载 ▼ ONNXRuntime 预测检测 → 方向分类 → 识别这一方案的核心价值在于模型格式的开放性与推理引擎的可替换性转换后的 ONNX 模型可被 ONNXRuntime、TensorRT、OpenVINO 等多种运行时加载为跨平台、跨框架部署提供了统一入口。2. 环境准备整体需要准备三类环境PaddleOCR提供推理脚本与模型仓库、Paddle2ONNX模型转换、ONNXRuntime预测执行。2.1 安装 PaddleOCR克隆 PaddleOCR 仓库main分支并以可编辑模式安装。由于仓库体积较大克隆耗时可能较长git clone -b main https://gitcode.com/paddlepaddle/PaddleOCR.git cd PaddleOCR python3 -m pip install -e .依赖安装完毕后仓库内的推理脚本位于tools/infer/目录模型配置位于configs/目录预测模型与训练说明可参见 模型列表。2.2 安装 Paddle2ONNXpython3 -m pip install paddle2onnx安装完成后可直接使用paddle2onnx命令行工具。Paddle2ONNX 负责将 Paddle 算子逐一映射为 ONNX 算子并以--opset_version指定目标 Opset 版本。2.3 安装 ONNXRuntimepython3 -m pip install onnxruntime若需要在 GPU 上执行 ONNXRuntime 推理则安装对应 CUDA 版本的onnxruntime-gpu并在预测时通过--onnx_providers或--use_gpuTrue指定执行提供方详见第 5 节源码分析。3. 获取 Paddle 静态图模型有两种方式获取可被 Paddle2ONNX 消费的 Paddle 静态图模型在 模型列表 中直接下载 PaddleOCR 官方发布的预测模型*_infer.tar参考 模型导出说明将训练好的动态图权重通过tools/export_model.py导出为推理模型inference模型。3.1 方式一下载官方预测模型以下以 PP-OCRv3 中文检测、识别、分类模型为例将压缩包下载并解压到./inference目录wget -nc -P ./inference https://paddle-model-ecology.bj.bcebos.com/paddlex/official_inference_model/paddle3.0.0/PP-OCRv3_mobile_det_infer.tar cd ./inference tar xf PP-OCRv3_mobile_det_infer.tar cd .. wget -nc -P ./inference https://paddleocr.bj.bcebos.com/PP-OCRv3/chinese/ch_PP-OCRv3_rec_infer.tar cd ./inference tar xf ch_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 ..解压后的每个推理模型目录如./inference/PP-OCRv3_mobile_det_infer/通常包含三个文件文件作用inference.pdmodel网络结构文件静态图结构供--model_filename指定inference.pdiparams权重参数文件供--params_filename指定inference.yml模型配置说明记录预处理、字典路径等信息供推理脚本参考3.2 方式二从训练模型导出推理模型若使用自己训练的权重可先下载动态图预训练模型再通过tools/export_model.py结合对应算法配置如 PP-OCRv4 检测配置、PP-OCRv4 识别配置导出静态图推理模型python3 tools/export_model.py -c configs/det/PP-OCRv4/PP-OCRv4_mobile_det.yml \ -o Global.pretrained_model./pretrained/PP-OCRv4_mobile_det_pretrained \ Global.save_inference_dir./inference/PP-OCRv4_mobile_det_infer/其中Global.pretrained_model指定训练权重路径不含.pdparams后缀Global.save_inference_dir指定推理模型输出目录。导出的目录结构同 3.1 节包含inference.pdmodel与inference.pdiparams。4. 使用 Paddle2ONNX 转换模型4.1 命令行参数详解paddle2onnx命令行工具的核心参数如下参数说明示例值--model_dirPaddle 静态图模型所在目录./inference/PP-OCRv3_mobile_det_infer--model_filename网络结构文件名inference.pdmodel--params_filename权重参数文件名inference.pdiparams--save_file输出 ONNX 模型保存路径./inference/det_onnx/model.onnx--opset_version目标 ONNX Opset 版本稳定支持 9~1811--enable_onnx_checker转换后是否用 ONNX 官方 checker 校验模型True更多参数如算子版本开关、Paddle 算子回退策略等可运行paddle2onnx --help查看。4.2 检测、识别、分类模型转换命令以第 3 节下载的三套中文模型为例依次执行转换paddle2onnx --model_dir ./inference/PP-OCRv3_mobile_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/ch_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执行完毕后ONNX 模型会被分别保存在./inference/det_onnx/、./inference/rec_onnx/、./inference/cls_onnx/路径下。4.3 转换要点与限制必须使用动态 shape对于 OCR 模型转化过程中必须采用动态 shape 形式否则预测结果可能与直接使用 Paddle 预测存在细微不同。动态 shape 意味着模型输入维度中的宽高以及 batch 维在转换时不被固定以便推理时适配不同尺寸的输入图片。暂不支持转换的识别算法以下几个模型暂不支持转换为 ONNX 模型NRTRSARRARESRN从源码看这一限制也与tools/infer/predict_rec.py的实现吻合SAR、SRN、RobustScanner、CAN 等算法在推理时需要额外的非图像输入如valid_ratios、位置编码等其 ONNX 分支仅以图像为输入运行因此对不支持的多输入算法会存在转换或精度风险。Opset 与 shape 调整当前 Paddle2ONNX 版本v1.2.3已默认支持动态 shape即输入声明为float32[p2o.DynamicDimension.0,3,p2o.DynamicDimension.1,p2o.DynamicDimension.2]原选项--input_shape_dict已废弃。如果确有 shape 调整需求可使用paddle2onnx.optimize模块对已转换的 ONNX 模型进行输入 shape 调整python3 -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]}上述命令将输入名x的 shape 固定为 batch、通道为-1, 3、宽高保持动态-1表示动态维度。5. 基于 ONNXRuntime 推理预测5.1 全流程预测命令ONNXRuntime转换完成后使用仓库的统一预测脚本tools/infer/predict_system.py通过--use_onnxTrue切换推理引擎并将--det_model_dir、--rec_model_dir、--cls_model_dir指向转换出的model.onnx文件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.png其中--image_dir可指向单张图片、图片目录或 PDF/GIF脚本会自动处理示例图片使用仓库自带的 lite_demo.png。5.2 关键参数说明predict_system.py通过 tools/infer/utility.py 解析参数与本主题相关的关键参数包括参数默认值说明--use_onnxFalse是否使用 ONNXRuntime 引擎True时模型路径指向.onnx文件--use_gpuFalse是否使用 GPU与--use_onnx组合时决定 ONNX 的执行提供方--onnx_providersFalse显式指定 ONNXRuntime providers如CUDAExecutionProvider--onnx_sess_optionsFalse可选 Session 配置--det_model_dir/--rec_model_dir/--cls_model_dir无各子模型路径ONNX 模式下指向model.onnx--image_dir无输入图片路径或目录--draw_img_save_dir./inference_results可视化结果保存目录这些参数在 utility.py 中定义--use_onnx默认False、--onnx_providers支持多个 provider。5.3 源码级原理ONNX 推理分支create_predictor函数tools/infer/utility.py在args.use_onnx为真时走 ONNXRuntime 路径直接以model_dir作为 ONNX 文件路径加载onnxruntime.InferenceSessionprovider 的选择规则为显式传入--onnx_providers时优先使用否则在--use_gpuTrue时使用CUDAExecutionProvider可通过--gpu_id指定设备否则回退到CPUExecutionProvider返回的input_tensor为 Session 首个输入节点的元信息name、shape、dtype。在各子模型预测器中ONNX 分支的调用方式一致以检测模型为例predict_det.pyif self.use_onnx: input_dict {} input_dict[self.input_tensor.name] img outputs self.predictor.run(self.output_tensors, input_dict)即将预处理后的图片以字典形式喂给InferenceSession.run。识别模型predict_rec.py在 CTCLoss、Attention、SAR、SRN、CAN、LaTeXOCR 等算法的执行分支中均内置了use_onnx判断走同样的run调用。此外检测模型初始化时predict_det.py会读取 ONNX 模型的输入 shape若 ONNX 输入为动态维度img_h/img_w为字符串或空则保持动态预处理若为固定 shape则将DetResizeForTest的image_shape对齐到模型输入确保预处理尺寸与模型期望一致——这也正是第 4.3 节强调动态 shape 转换的源码侧印证。5.4 Paddle Inference 对照预测同样的模型与图片使用 Paddle Inference 引擎默认路径--model_dir指向解压目录执行python3 tools/infer/predict_system.py --use_gpuFalse \ --cls_model_dir./inference/ch_ppocr_mobile_v2.0_cls_infer \ --rec_model_dir./inference/ch_PP-OCRv3_rec_infer \ --det_model_dir./inference/PP-OCRv3_mobile_det_infer \ --image_dir./deploy/lite/imgs/lite_demo.png两条命令的差异仅在于引擎切换ONNX 模式须加--use_onnxTrue且模型路径指向.onnx文件Paddle 模式指向*_infer目录。5.5 输出与可视化执行命令后终端会打印每张图片的检测框数量、识别文本及置信度并在./inference_results/下保存可视化结果默认输出目录由--draw_img_save_dir控制默认值为./inference_results见 utility.py。6. 执行效果对比6.1 ONNXRuntime 执行效果6.2 Paddle Inference 执行效果两张结果图展示了同一输入图片在两种引擎下的文本检测框与识别文本内容保持一致验证了转换后模型输出的正确性。6.3 终端日志解读ONNXRuntime 预测时的终端输出示例节选自原文档[2022/02/22 17:48:27] root DEBUG: dt_boxes num : 38, elapse : 0.043187856674194336 [2022/02/22 17:48:27] root DEBUG: rec_res num : 38, elapse : 0.592170000076294 [2022/02/22 17:48:27] root DEBUG: 0 Predict time of ./deploy/lite/imgs/lite_demo.png: 0.642s [2022/02/22 17:48:27] root DEBUG: The, 0.984 [2022/02/22 17:48:27] root DEBUG: visualized, 0.882 [2022/02/22 17:48:27] root DEBUG: etect18片, 0.720 [2022/02/22 17:48:27] root DEBUG: image saved in./vis.jpg, 0.947 [2022/02/22 17:48:27] root DEBUG: 纯臻营养护发素0.993604, 0.996 [2022/02/22 17:48:27] root DEBUG: 产品信息/参数, 0.922 [2022/02/22 17:48:27] root DEBUG: 45元每公斤100公斤起订, 0.926 [2022/02/22 17:48:27] root DEBUG: 每瓶22元1000瓶起订0.993976, 0.962 [2022/02/22 17:48:27] root DEBUG: 【品牌】代加工方式/0EMODM, 0.945 [2022/02/22 17:48:27] root DEBUG: 【品名】纯臻营养护发素, 0.921 [2022/02/22 17:48:27] root DEBUG: 【产品编号】YM-X-30110.96899, 0.955 [2022/02/22 17:48:27] root DEBUG: 【净含量】220ml, 0.943 [2022/02/22 17:48:27] root DEBUG: 【适用人群】适合所有肤质, 0.913 [2022/02/22 17:48:27] root DEBUG: 【主要成分】鲸蜡硬脂醇、燕麦B-葡聚, 0.883 [2022/02/22 17:48:27] root DEBUG: 10, 0.812 [2022/02/22 17:48:27] root DEBUG: 糖、椰油酰胺丙基甜菜碱、泛醒, 0.866 [2022/02/22 17:48:27] root DEBUG: 成品包材, 0.974 [2022/02/22 17:48:27] root DEBUG: 【主要功能】可紧致头发磷层从而达到, 0.936 [2022/02/22 17:48:27] root DEBUG: 13, 0.998 [2022/02/22 17:48:27] root DEBUG: 即时持久改善头发光泽的效果给干燥的头, 0.994 [2022/02/22 17:48:27] root DEBUG: 14, 0.977 [2022/02/22 17:48:27] root DEBUG: 发足够的滋养, 0.991 [2022/02/22 17:48:27] root DEBUG: 花费了0.457335秒, 0.901 [2022/02/22 17:48:27] root DEBUG: The visualized image saved in ./inference_results/lite_demo.png [2022/02/22 17:48:27] root INFO: The predict total time is 0.7003889083862305日志关键字段含义dt_boxes num检测出的文本框数量rec_res num识别出的文本行数量Predict time of 图片单张图片从检测到识别的总耗时文本, 置信度每行识别结果及其置信度如The, 0.984The visualized image saved in ...可视化结果保存路径The predict total time整体预测总耗时。Paddle Inference 预测时的终端输出与 ONNXRuntime 在识别内容上完全一致区别仅在于各阶段耗时与总耗时Paddle 示例中该图为2.746s级ONNXRuntime 示例中为0.642s。需要说明的是该耗时对比仅来自文档示例的特定环境记录不同机器、模型与 ONNX 优化配置下耗时差异不同不能据此断言引擎性能优劣。7. 常见问题与部署建议转换后结果与 Paddle 有细微差异优先确认转换时是否使用了动态 shape。固定 shape 的 ONNX 模型在输入尺寸不匹配时预处理如DetResizeForTest会强行对齐到模型输入可能导致精度变化按第 4.3 节方式重新转换或调整 shape 即可。ONNX 模型加载失败检查--save_file路径是否为.onnx文件本身而非目录并确保--enable_onnx_checker True转换校验通过不同 Opset 对算子支持不同可尝试在 9~18 范围内调整--opset_version。GPU 推理如何指定设备安装onnxruntime-gpu后可在--use_onnxTrue基础上加--use_gpuTrue自动使用CUDAExecutionProvider或通过--onnx_providers CUDAExecutionProvider显式指定执行提供方。只部署单个子模型仓库在 tools/infer/ 下同时提供单模型预测脚本predict_det.py、predict_rec.py、predict_cls.py均支持--use_onnxTrue可单独加载转换后的单个 ONNX 模型。识别字典对齐中文识别默认使用ppocr/utils/ppocr_keys_v1.txt若使用多语言或其他字典的识别模型请在预测时通过--rec_char_dict_path指定与模型训练一致的字典文件。模型产物管理建议将转换出的 ONNX 模型与inference.pdmodel/inference.pdiparams分开目录存放如本文的det_onnx/、rec_onnx/、cls_onnx/便于两套引擎并行使用与版本管理。以上即 PaddleOCR 模型经 Paddle2ONNX 转换并在 ONNXRuntime 上完成全流程预测的完整实战方案相关推理脚本源码tools/infer/utility.py、tools/infer/predict_system.py可进一步查阅以支持在自有项目中按需裁剪与集成。【免费下载链接】PaddleOCR飞桨多语言OCR工具包实用超轻量OCR系统支持80种语言识别提供数据标注与合成工具支持服务器、移动端、嵌入式及IoT设备端的训练与部署 Awesome multilingual OCR toolkits based on PaddlePaddle (practical ultra lightweight OCR system, support 80 languages recognition, provide data annotation and synthesis tools, support training and deployment among server, mobile, embedded and IoT devices)项目地址: https://gitcode.com/paddlepaddle/PaddleOCR创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考