Skip to content

[Other General Issues] How to export PicoDet ONNX without post-process / NMS for edge deployment? #9482

@imHuangke

Description

@imHuangke

问题描述

我在使用 PaddleDetection release/2.9 导出 PicoDet 的 ONNX,并尝试部署到 K230(通过 nncasekmodel)时,遇到了两个连续问题:

  1. 默认导出的 ONNX 含有后处理相关结构,不利于下游边缘部署工具链转换
  2. 即使我手动把 ONNX 裁成静态、单输入、pre-NMS 子图,下游工具链仍然难以接收

因此想请教:

PaddleDetectionPicoDet 是否有官方推荐的“无后处理 / 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 是双输入

输入为:

  • image
  • scale_factor

这对很多边缘侧转换工具链并不友好。

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]

而且确认图中已经没有:

  • NonMaxSuppression
  • TopK

这说明理论上 PicoDet 是可以只保留 pre-NMS 输出的。

想确认的问题

  1. PaddleDetection release/2.9 是否有官方支持的方式,直接导出 PicoDet pre-NMS ONNX
  2. export_post_process=false / export_nms=falsePicoDet 的 ONNX 导出是否应该生效?
  3. 如果当前版本不支持,官方是否推荐修改哪一层(architecture / head / export script)来导出更适合边缘部署的 ONNX?

期望

我希望能得到下面其中一种明确建议:

  • 官方推荐的 PicoDet pre-NMS 导出命令
  • 官方认可的源码修改点
  • 明确说明当前 release/2.9 暂不支持这类导出

如果需要,我也可以补充:

  • 生成的 ONNX 文件
  • 手工裁图方式
  • 下游工具链报错信息

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions