Files
FastDeploy/examples/vision/detection/paddledetection/rknpu2
Zheng_Bicheng 3e1fc69a0c [Model] Add Picodet RKNPU2 (#635)
* * 更新picodet cpp代码

* * 更新文档
* 更新picodet cpp example

* * 删除无用的debug代码
* 新增python example

* * 修改c++代码

* * 修改python代码

* * 修改postprocess代码

* 修复没有scale_factor导致的bug

* 修复错误

* 更正代码格式

* 更正代码格式
2022-11-21 13:44:34 +08:00
..
2022-11-21 13:44:34 +08:00
2022-11-21 13:44:34 +08:00
2022-11-21 13:44:34 +08:00

PaddleDetection RKNPU2部署示例

支持模型列表

目前FastDeploy支持如下模型的部署

准备PaddleDetection部署模型以及转换模型

RKNPU部署模型前需要将Paddle模型转换成RKNN模型具体步骤如下:

  • Paddle动态图模型转换为ONNX模型请参考PaddleDetection导出模型 ,注意在转换时请设置export.nms=True.
  • ONNX模型转换RKNN模型的过程请参考转换文档进行转换。

模型转换example

以下步骤均在Ubuntu电脑上完成请参考配置文档完成转换模型环境配置。下面以Picodet-s为例子,教大家如何转换PaddleDetection模型到RKNN模型。

导出ONNX模型

# 下载Paddle静态图模型并解压
wget https://paddledet.bj.bcebos.com/deploy/Inference/picodet_s_416_coco_lcnet.tar
tar xvf picodet_s_416_coco_lcnet.tar

# 静态图转ONNX模型注意这里的save_file请和压缩包名对齐
paddle2onnx --model_dir picodet_s_416_coco_lcnet \
            --model_filename model.pdmodel \
            --params_filename model.pdiparams \
            --save_file picodet_s_416_coco_lcnet/picodet_s_416_coco_lcnet.onnx \
            --enable_dev_version True

# 固定shape
python -m paddle2onnx.optimize --input_model picodet_s_416_coco_lcnet/picodet_s_416_coco_lcnet.onnx \
                                --output_model picodet_s_416_coco_lcnet/picodet_s_416_coco_lcnet.onnx \
                                --input_shape_dict "{'image':[1,3,416,416]}"

编写模型导出配置文件

以转化RK3568的RKNN模型为例子我们需要编辑tools/rknpu2/config/RK3568/picodet_s_416_coco_lcnet.yaml来转换ONNX模型到RKNN模型。

修改normalize参数

如果你需要在NPU上执行normalize操作请根据你的模型配置normalize参数例如:

model_path: ./picodet_s_416_coco_lcnet/picodet_s_416_coco_lcnet.onnx
output_folder: ./picodet_s_416_coco_lcnet
target_platform: RK3568
normalize:
  mean: [[0.485,0.456,0.406],[0,0,0]]
  std: [[0.229,0.224,0.225],[0.003921,0.003921]]
outputs: ['tmp_17','p2o.Concat.9']

修改outputs参数 由于Paddle2ONNX版本的不同转换模型的输出节点名称也有所不同请使用Netron并找到以下蓝色方框标记的NonMaxSuppression节点红色方框的节点名称即为目标名称。

例如使用Netron可视化后得到以下图片:

找到蓝色方框标记的NonMaxSuppression节点可以看到红色方框标记的两个节点名称为tmp_17和p2o.Concat.9,因此需要修改outputs参数修改后如下:

model_path: ./picodet_s_416_coco_lcnet/picodet_s_416_coco_lcnet.onnx
output_folder: ./picodet_s_416_coco_lcnet
target_platform: RK3568
normalize: None
outputs: ['tmp_17','p2o.Concat.9']

转换模型


# ONNX模型转RKNN模型
# 转换模型,模型将生成在picodet_s_320_coco_lcnet_non_postprocess目录下
python tools/rknpu2/export.py --config_path tools/rknpu2/config/RK3568/picodet_s_416_coco_lcnet.yaml

修改模型运行时的配置文件

配置文件中,我们只需要修改Preprocess下的NormalizePermute.

删除Permute

RKNPU只支持NHWC的输入格式因此需要删除Permute操作.删除后配置文件Precess部分后如下:

Preprocess:
- interp: 2
  keep_ratio: false
  target_size:
  - 416
  - 416
  type: Resize
- is_scale: true
  mean:
  - 0.485
  - 0.456
  - 0.406
  std:
  - 0.229
  - 0.224
  - 0.225
  type: NormalizeImage

根据模型转换文件决定是否删除Normalize

RKNPU支持使用NPU进行Normalize操作如果你在导出模型时配置了Normalize参数请删除Normalize.删除后配置文件Precess部分如下:

Preprocess:
- interp: 2
  keep_ratio: false
  target_size:
  - 416
  - 416
  type: Resize