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 来完成

相关推荐
leisoo80973 小时前
100GBA股股票数据怎么存ClickHouseRedisMySQLJSON完整对比
大数据·linux·服务器·开发语言·python
不会代码的小猴3 小时前
21. 泛型编程上
开发语言·c++·笔记·算法
一只旭宝4 小时前
细讲C加加【9】C++ std::function与std::bind详解|仿函数、绑定器、类成员绑定、占位符、成员偏移指针
开发语言·c++·算法
coder!mq6 小时前
说几个常见的语法糖?
java·开发语言·算法
gugucoding6 小时前
38. 【Java】Stream API(下):高级操作与性能
java·开发语言
Lhan.zzZ6 小时前
在 Visual Studio 2022 中打造可扩展的动态链接库模块:从零搭建到原理解析
开发语言·c++·visual studio
心平气和量大福大7 小时前
android-实例-蒲公英-更新与安装-5-签名与生成APK
android·java·开发语言
码哥DFS7 小时前
构造函数、实例对象、对象原型 ----三者关系
开发语言·javascript·原型模式
quantdash_cc7 小时前
告别自建 Requests/BS4 网页爬虫:基于 QuantDash 搭建零维保的高性能量化行情流水线
开发语言·爬虫·python·pandas·量化·quantdash
ydd1001008 小时前
寻找两个正序数组的中位数 Java 题解,二分分割详解
java·开发语言