EXPORT_ONNX_MODEL.md 5.3 KB
Newer Older
1 2 3 4 5 6
# PaddleDetection模型导出为ONNX格式教程

PaddleDetection模型支持保存为ONNX格式,目前测试支持的列表如下
| 模型  | OP版本 | 备注 |
| :---- | :----- | :--- |
| YOLOv3 |  11   |  仅支持batch=1推理;模型导出需固定shape |
W
wangguanzhong 已提交
7 8 9 10 11
| 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 |
12 13 14 15
| FCOS | 11 |仅支持batch=1推理 |
| PAFNet | 11 |- |
| TTFNet | 11 |-|
| SSD | 11 |仅支持batch=1推理 |
W
wangguanzhong 已提交
16 17 18 19 20
| 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及以上版本|
21 22 23 24 25 26

保存ONNX的功能由[Paddle2ONNX](https://github.com/PaddlePaddle/Paddle2ONNX)提供,如在转换中有相关问题反馈,可在Paddle2ONNX的Github项目中通过[ISSUE](https://github.com/PaddlePaddle/Paddle2ONNX/issues)与工程师交流。

## 导出教程

### 步骤一、导出PaddlePaddle部署模型
W
wangguanzhong 已提交
27 28 29 30 31


导出步骤参考文档[PaddleDetection部署模型导出教程](./EXPORT_MODEL.md), 导出示例如下

- 非RCNN系列模型, 以YOLOv3为例
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
```
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系列模型注意导出时指定该参数,否则无法转换成功

W
wangguanzhong 已提交
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
- 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          # 静态图模型文件
```

69
### 步骤二、将部署模型转为ONNX格式
W
wangguanzhong 已提交
70
安装Paddle2ONNX(高于或等于0.9.7版本)
71 72 73 74 75
```
pip install paddle2onnx
```
使用如下命令转换
```
W
wangguanzhong 已提交
76
# YOLOv3
77 78 79 80 81
paddle2onnx --model_dir inference_model/yolov3_darknet53_270e_coco \
            --model_filename model.pdmodel \
            --params_filename model.pdiparams \
            --opset_version 11 \
            --save_file yolov3.onnx
W
wangguanzhong 已提交
82 83 84 85 86 87 88

# 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
89
```
W
wangguanzhong 已提交
90
转换后的模型即为在当前路径下的`yolov3.onnx``faster_rcnn.onnx`
S
shangliang Xu 已提交
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112

### 步骤三、使用onnxruntime进行推理
安装onnxruntime
```
pip install onnxruntime
```
推理代码示例在[deploy/third_engine/onnx](./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
```
113 114 115 116 117 118 119 120 121 122

## TensorRT部署优化策略

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

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

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