Skip to content

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

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 文件
  • 手工裁图方式
  • 下游工具链报错信息

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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