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

相关推荐
LDR00615 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术15 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript
码云数智-园园15 天前
C++20 Modules 模块详解
java·开发语言·spring
swordbob15 天前
NIO的channel中什么是 fd(File Descriptor,文件描述符)
java·开发语言·nio
源分享15 天前
Java线程同步的多种实现方法(非常详细)
java·开发语言·jvm
Luminous.15 天前
C语言--day30
c语言·开发语言
何以解忧,唯有..15 天前
Go语言循环语句详解:for、range与循环控制
开发语言·算法·golang
謓泽15 天前
C语言不是语法,是通往机器的地图。
c语言·开发语言
云水一下15 天前
从零开始学 PHP 系列(一):PHP 的前世今生与开发环境搭建
开发语言·php
飞天狗11115 天前
零基础JavaWeb入门——第五课第二小节:九大内置对象 · 第2个:response(响应对象)
java·开发语言