问题描述
我在使用 PaddleDetection release/2.9 导出 PicoDet 的 ONNX,并尝试部署到 K230(通过 nncase 转 kmodel)时,遇到了两个连续问题:
- 默认导出的 ONNX 含有后处理相关结构,不利于下游边缘部署工具链转换
- 即使我手动把 ONNX 裁成静态、单输入、pre-NMS 子图,下游工具链仍然难以接收
因此想请教:
PaddleDetection 对 PicoDet 是否有官方推荐的“无后处理 / pre-NMS / edge-friendly”导出方式?
使用环境
- PaddleDetection:
release/2.9
- 模型:
picodet_l_320_coco_lcnet
- PaddlePaddle:
2.6.1 CPU
- Paddle2ONNX:
1.3.1
- Windows
当前导出方式
我参考的是:
deploy/EXPORT_ONNX_MODEL.md
使用命令类似:
python tools/export_model.py -c configs/picodet/picodet_l_320_coco_lcnet.yml \
-o use_gpu=false \
weights=picodet_l_320_coco_lcnet.pdparams \
--output_dir inference_model
paddle2onnx --model_dir inference_model/picodet_l_320_coco_lcnet \
--model_filename model.pdmodel \
--params_filename model.pdiparams \
--opset_version 11 \
--save_file picodet_l_320_coco_lcnet.onnx
Paddle2ONNX 实际会自动升到 opset 14,提示 hard_swish 需要更高版本。
遇到的问题
1. 默认导出的 ONNX 是双输入
输入为:
这对很多边缘侧转换工具链并不友好。
2. 默认导出的 ONNX 含有后处理图
图中包含例如:
NonMaxSuppression
TopK
Shape
Gather
Slice
这导致下游工具链在转换时很容易失败。
3. 尝试关闭后处理导出,但似乎没有完全生效
我尝试过:
python tools/export_model.py -c configs/picodet/picodet_l_320_coco_lcnet.yml \
-o use_gpu=false \
export_post_process=false \
export_nms=false \
weights=picodet_l_320_coco_lcnet.pdparams \
--output_dir inference_model
但后续转 ONNX 后,图中仍然出现了 NMS 相关结构。
从源码上看:
ppdet/modeling/architectures/picodet.py
中 PicoDet 的 _forward() 确实依赖:
self.export_post_process
self.export_nms
但当前流程里我还没有找到一种稳定方式,能得到真正只保留原始 head 输出的 ONNX。
我手动裁出来的 pre-NMS 子图
我最终通过手工裁图得到了一个 pre-NMS ONNX,输入输出如下:
- input:
image [1, 3, 320, 320]
- outputs:
Div.1 [1, 2125, 4]
Concat.9 [1, 80, 2125]
而且确认图中已经没有:
这说明理论上 PicoDet 是可以只保留 pre-NMS 输出的。
想确认的问题
PaddleDetection release/2.9 是否有官方支持的方式,直接导出 PicoDet pre-NMS ONNX?
export_post_process=false / export_nms=false 对 PicoDet 的 ONNX 导出是否应该生效?
- 如果当前版本不支持,官方是否推荐修改哪一层(architecture / head / export script)来导出更适合边缘部署的 ONNX?
期望
我希望能得到下面其中一种明确建议:
- 官方推荐的 PicoDet pre-NMS 导出命令
- 官方认可的源码修改点
- 明确说明当前 release/2.9 暂不支持这类导出
如果需要,我也可以补充:
- 生成的 ONNX 文件
- 手工裁图方式
- 下游工具链报错信息
问题描述
我在使用
PaddleDetection release/2.9导出PicoDet的 ONNX,并尝试部署到 K230(通过nncase转kmodel)时,遇到了两个连续问题:因此想请教:
PaddleDetection对PicoDet是否有官方推荐的“无后处理 / pre-NMS / edge-friendly”导出方式?使用环境
release/2.9picodet_l_320_coco_lcnet2.6.1CPU1.3.1当前导出方式
我参考的是:
deploy/EXPORT_ONNX_MODEL.md使用命令类似:
python tools/export_model.py -c configs/picodet/picodet_l_320_coco_lcnet.yml \ -o use_gpu=false \ weights=picodet_l_320_coco_lcnet.pdparams \ --output_dir inference_model paddle2onnx --model_dir inference_model/picodet_l_320_coco_lcnet \ --model_filename model.pdmodel \ --params_filename model.pdiparams \ --opset_version 11 \ --save_file picodet_l_320_coco_lcnet.onnxPaddle2ONNX实际会自动升到opset 14,提示hard_swish需要更高版本。遇到的问题
1. 默认导出的 ONNX 是双输入
输入为:
imagescale_factor这对很多边缘侧转换工具链并不友好。
2. 默认导出的 ONNX 含有后处理图
图中包含例如:
NonMaxSuppressionTopKShapeGatherSlice这导致下游工具链在转换时很容易失败。
3. 尝试关闭后处理导出,但似乎没有完全生效
我尝试过:
python tools/export_model.py -c configs/picodet/picodet_l_320_coco_lcnet.yml \ -o use_gpu=false \ export_post_process=false \ export_nms=false \ weights=picodet_l_320_coco_lcnet.pdparams \ --output_dir inference_model但后续转 ONNX 后,图中仍然出现了 NMS 相关结构。
从源码上看:
ppdet/modeling/architectures/picodet.py中
PicoDet的_forward()确实依赖:self.export_post_processself.export_nms但当前流程里我还没有找到一种稳定方式,能得到真正只保留原始 head 输出的 ONNX。
我手动裁出来的 pre-NMS 子图
我最终通过手工裁图得到了一个 pre-NMS ONNX,输入输出如下:
image[1, 3, 320, 320]Div.1[1, 2125, 4]Concat.9[1, 80, 2125]而且确认图中已经没有:
NonMaxSuppressionTopK这说明理论上
PicoDet是可以只保留 pre-NMS 输出的。想确认的问题
PaddleDetection release/2.9是否有官方支持的方式,直接导出 PicoDet pre-NMS ONNX?export_post_process=false/export_nms=false对PicoDet的 ONNX 导出是否应该生效?期望
我希望能得到下面其中一种明确建议:
如果需要,我也可以补充: