paddle 文本检测识别模型转为onnx

命令行方式

默认使用 PP-OCRv5 模型

paddleocr ocr -i https://paddle-model-ecology.bj.bcebos.com/paddlex/imgs/demo_image/general_ocr_002.png

--use_doc_orientation_classify False

--use_doc_unwarping False

--use_textline_orientation False

--save_path ./output

--device gpu:0

Python脚本方式集成

命令行方式是为了快速体验查看效果,一般来说,在项目中,往往需要通过代码集成,您可以通过几行代码即可完成产线的快速推理,推理代码如下:

cpp 复制代码
from paddleocr import PaddleOCR

ocr = PaddleOCR(
    use_doc_orientation_classify=False, # 通过 use_doc_orientation_classify 参数指定不使用文档方向分类模型
    use_doc_unwarping=False, # 通过 use_doc_unwarping 参数指定不使用文本图像矫正模型
    use_textline_orientation=False, # 通过 use_textline_orientation 参数指定不使用文本行方向分类模型
)
# ocr = PaddleOCR(lang="en") # 通过 lang 参数来使用英文模型
# ocr = PaddleOCR(ocr_version="PP-OCRv4") # 通过 ocr_version 参数来使用 PP-OCR 其他版本
# ocr = PaddleOCR(device="gpu") # 通过 device 参数使得在模型推理时使用 GPU
# ocr = PaddleOCR(
#     text_detection_model_name="PP-OCRv5_server_det",
#     text_recognition_model_name="PP-OCRv5_server_rec",
#     use_doc_orientation_classify=False,
#     use_doc_unwarping=False,
#     use_textline_orientation=False,
# ) # 更换 PP-OCRv5_server 模型
result = ocr.predict("./general_ocr_002.png")
for res in result:
    res.print()
    res.save_to_img("output")
    res.save_to_json("output")

ONNX导出

PaddleOCR 官方提供了 Paddle2ONNX 工具支持将 PaddlePaddle 模型格式转化到 ONNX 模型格式

Paddle2ONNX

1 Paddle2ONNX 简介

Paddle2ONNX 支持将 PaddlePaddle 模型格式转化到 ONNX 模型格式。通过 ONNX 可以完成将 Paddle 模型到多种推理引擎的部署,包括 TensorRT/OpenVINO/MNN/TNN/NCNN,以及其它对 ONNX 开源格式进行支持的推理引擎或硬件。

2 Paddle2ONNX 环境依赖

Paddle2ONNX 依赖PaddlePaddle3.0,我们建议您在以下环境下使用 Paddle2ONNX :

  • PaddlePaddle == 3.0.0
  • onnxruntime >= 1.10.0

3 安装 Paddle2ONNX

如果您只是想要安装 Paddle2ONNX 且没有二次开发的需求,你可以通过执行以下代码来快速安装 Paddle2ONNX

复制代码
pip install paddle2onnx

如果你希望对 Paddle2ONNX 进行二次开发,请按照Github 源码安装方式编译Paddle2ONNX。

4 快速使用教程

4.1 获取PaddlePaddle部署模型

Paddle2ONNX 在导出模型时,需要传入部署模型格式,包括两个文件

  • model_name.json: 表示模型结构
  • model_name.pdiparams: 表示模型参数

4.2 调整Paddle模型

如果对Paddle模型的输入输出需要做调整,可以前往Paddle 相关工具查看教程。

4.3 使用命令行转换 PaddlePaddle 模型

你可以通过使用命令行并通过以下命令将Paddle模型转换为ONNX模型

bash 复制代码
paddle2onnx --model_dir model_dir \
            --model_filename model.json \
            --params_filename model.pdiparams \
            --save_file model.onnx

可调整的转换参数如下表:

参数 参数说明
--model_dir 配置包含 Paddle 模型的目录路径
--model_filename 可选 配置位于 --model_dir 下存储网络结构的文件名
--params_filename 可选 配置位于 --model_dir 下存储模型参数的文件名
--save_file 指定转换后的模型保存目录路径
--opset_version 可选 配置转换为ONNX的OpSet版本,目前支持7~19等多个版本,默认为 9
--enable_auto_update_opset 可选 是否开启opset version自动升级功能,当低版本opset无法转换时,自动选择更高版本的opset进行转换, 默认为 True
--enable_onnx_checker 可选 配置是否检查导出为 ONNX 模型的正确性, 建议打开此开关, 默认为 True
--enable_dist_prim_all 可选 是否开启组合算子拆解,默为 False
--optimize_tool 可选 ONNX模型优化工具,可选择onnxoptimizer、polygraphy、None, 默认为 onnxoptimizer
--enable_verbose 可选 是否打印更更详细的日志信息,默认为 False
--version 可选 查看 paddle2onnx 版本

4.4 裁剪ONNX

如果你需要调整 ONNX 模型,请参考 ONNX 相关工具

4.5 优化ONNX

如你对导出的 ONNX 模型有优化的需求,推荐使用 onnxslim 对模型进行优化:

bash 复制代码
pip install onnxslim
onnxslim model.onnx slim.onnx

导出后的onnx如图:

导出的 ONNX 存在一些问题,我们需要修改:

复制代码
宽高不动态
    宽高固定主要是方便 TensorRT 的推理
Conv 和 BN 层融合
    算子融合可以提高计算效率、减少操作数、降低延迟
输入输出节点名修改成 images 和 output 

tools/paddle下的文件可以处理宽高固定

bash 复制代码
python infer_paddle_model_shape.py --model_path models/det/inference --save_path models/det/new_inference --input_shape_dict="{'x':[-1,3,960,960]}"

pdaale2onnx的onnx文件夹中的rename_onnx_model.py可以修改节点名称:

bash 复制代码
python rename_onnx_model.py --model model.onnx --origin_names x1 y1  --new_names images output --save_file new_model.onnx

算子融合我们可以考虑利用 onnx-simplifier 来完成

相关推荐
死磕音视频7 小时前
让小模型做选择题:限定候选项并读取 logits 概率的入门实践(附 Python 代码)
开发语言·python·大模型·文本分类·transformers
顽疲10 小时前
Java vue 养老系统源码详解:月账单 care_month_bill 与 Quartz 扣费 Job 实践
java·开发语言·vue.js·vue养老·springboot养老·java养老
Wang's Blog10 小时前
Java 项目实战: 交友项目 - 安装开发工具与环境准备
java·开发语言·交友
程序喵大人12 小时前
【C++入门】编译链接模型 - 07 链接器怎样把符号对上号
开发语言·c++·编译器·编译链接·链接器
微三云 - 廖会灵 (私域系统开发)12 小时前
供应链系统实战:多渠道订单聚合与分布式库存一致性方案总结
开发语言·分布式·php
学逆向的12 小时前
C 数据溢出与精度丢失
c语言·开发语言·网络安全
霸道流氓气质13 小时前
AgentFlow 入门与实战:Task-Based 并发、EWMA 动态调度与四道门禁的 Java 生产级编排
java·开发语言
释厄62313 小时前
错误无误公理——错误正确本同源都迭代定律——逆转有价值
android·开发语言·kotlin
2601_9628857214 小时前
如何用 Python计算 CR能量指标(中间意愿指标)?
开发语言·python
临床数据科学和人工智能兴趣组14 小时前
在R语言的生态系统中,字符串处理一直是一个重要且复杂的任务
开发语言·正则表达式·r语言·r语言-4.2.1