ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

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

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),仅供参考
返回列表