1 Star 0 Fork 254

李斌 / PaddleDetection_1

forked from PaddlePaddle / PaddleDetection 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
EXPORT_ONNX_MODEL.md 5.28 KB
一键复制 编辑 原始数据 按行查看 历史

PaddleDetection模型导出为ONNX格式教程

PaddleDetection模型支持保存为ONNX格式,目前测试支持的列表如下

模型 OP版本 备注
YOLOv3 11 仅支持batch=1推理;模型导出需固定shape
PP-YOLO 11 仅支持batch=1推理;MatrixNMS将被转换NMS,精度略有变化;模型导出需固定shape
PP-YOLOv2 11 仅支持batch=1推理;MatrixNMS将被转换NMS,精度略有变化;模型导出需固定shape
PP-YOLO Tiny 11 仅支持batch=1推理;模型导出需固定shape
PP-YOLOE 11 仅支持batch=1推理;模型导出需固定shape
PP-PicoDet 11 仅支持batch=1推理;模型导出需固定shape
FCOS 11 仅支持batch=1推理
PAFNet 11 -
TTFNet 11 -
SSD 11 仅支持batch=1推理
PP-TinyPose 11 -
Faster RCNN 16 仅支持batch=1推理, 依赖0.9.7及以上版本
Mask RCNN 16 仅支持batch=1推理, 依赖0.9.7及以上版本
Cascade RCNN 16 仅支持batch=1推理, 依赖0.9.7及以上版本
Cascade Mask RCNN 16 仅支持batch=1推理, 依赖0.9.7及以上版本

保存ONNX的功能由Paddle2ONNX提供,如在转换中有相关问题反馈,可在Paddle2ONNX的Github项目中通过ISSUE与工程师交流。

导出教程

步骤一、导出PaddlePaddle部署模型

导出步骤参考文档PaddleDetection部署模型导出教程, 导出示例如下

  • 非RCNN系列模型, 以YOLOv3为例
cd PaddleDetection
python tools/export_model.py -c configs/yolov3/yolov3_darknet53_270e_coco.yml \
                             -o weights=https://paddledet.bj.bcebos.com/models/yolov3_darknet53_270e_coco.pdparams \
                             TestReader.inputs_def.image_shape=[3,608,608] \
                             --output_dir inference_model

导出后的模型保存在inference_model/yolov3_darknet53_270e_coco/目录中,结构如下

yolov3_darknet
  ├── infer_cfg.yml          # 模型配置文件信息
  ├── model.pdiparams        # 静态图模型参数
  ├── model.pdiparams.info   # 参数额外信息,一般无需关注
  └── model.pdmodel          # 静态图模型文件

注意导出时的参数TestReader.inputs_def.image_shape,对于YOLO系列模型注意导出时指定该参数,否则无法转换成功

  • RCNN系列模型,以Faster RCNN为例

RCNN系列模型导出ONNX模型时,需要去除模型中的控制流,因此需要额外添加export_onnx=True 字段

cd PaddleDetection
python tools/export_model.py -c configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.yml \
                             -o weights=https://paddledet.bj.bcebos.com/models/faster_rcnn_r50_fpn_1x_coco.pdparams \
                             export_onnx=True \
                             --output_dir inference_model

导出的模型保存在inference_model/faster_rcnn_r50_fpn_1x_coco/目录中,结构如下

faster_rcnn_r50_fpn_1x_coco
  ├── infer_cfg.yml          # 模型配置文件信息
  ├── model.pdiparams        # 静态图模型参数
  ├── model.pdiparams.info   # 参数额外信息,一般无需关注
  └── model.pdmodel          # 静态图模型文件

步骤二、将部署模型转为ONNX格式

安装Paddle2ONNX(高于或等于0.9.7版本)

pip install paddle2onnx

使用如下命令转换

# YOLOv3
paddle2onnx --model_dir inference_model/yolov3_darknet53_270e_coco \
            --model_filename model.pdmodel \
            --params_filename model.pdiparams \
            --opset_version 11 \
            --save_file yolov3.onnx

# Faster RCNN
paddle2onnx --model_dir inference_model/faster_rcnn_r50_fpn_1x_coco \
            --model_filename model.pdmodel \
            --params_filename model.pdiparams \
            --opset_version 16 \
            --save_file faster_rcnn.onnx

转换后的模型即为在当前路径下的yolov3.onnxfaster_rcnn.onnx

步骤三、使用onnxruntime进行推理

安装onnxruntime

pip install onnxruntime

推理代码示例在deploy/third_engine/onnx

使用如下命令进行推理:

# YOLOv3
python deploy/third_engine/onnx/infer.py
            --infer_cfg inference_model/yolov3_darknet53_270e_coco/infer_cfg.yml \
            --onnx_file yolov3.onnx \
            --image_file demo/000000014439.jpg

# Faster RCNN
python deploy/third_engine/onnx/infer.py
            --infer_cfg inference_model/faster_rcnn_r50_fpn_1x_coco/infer_cfg.yml \
            --onnx_file faster_rcnn.onnx \
            --image_file demo/000000014439.jpg

TensorRT部署优化策略

Paddle2ONNX已经支持导出TensorRT DynamicBatchNMS插件。开发者在导出类似PPYOLOE+、PPYOLOE、YOLOv3、YOLOX、PicoDet等模型,Paddle2ONNX会自动将其中的NMS转成DynamicBatchNMS,从而实现GPU的后处理,大幅提升端到端的部署性能。

导出过程需要注意以下几点:

    1. 导出检测模型时,不要去除最后的NMS操作,不要添加--trt等参数,以确保NMS为模型的最后一个OP
    1. Paddle2ONNX版本高于或等于1.0.2,转换时添加参数--deploy_backend tensorrt

此方式导出的模型支持批量预测。

Python
1
https://gitee.com/atrium_idlers/PaddleDetection_1.git
git@gitee.com:atrium_idlers/PaddleDetection_1.git
atrium_idlers
PaddleDetection_1
PaddleDetection_1
release/2.5

搜索帮助