[Model] Update PPDetection RKNPU2 (#1323)

* 更新docs

* 修正docs错误

* 更新docs

* 更新python example脚本和ppyoloe转换脚本
This commit is contained in:
Zheng-Bicheng
2023-02-14 17:34:41 +08:00
committed by GitHub
parent 41c5f2de5a
commit fc6edcc541
6 changed files with 99 additions and 126 deletions

View File

@@ -4,12 +4,14 @@
## 支持模型列表
目前FastDeploy使用RKNPU2支持如下PaddleDetection模型的部署:
在RKNPU2上已经通过测试的PaddleDetection模型如下:
- Picodet
- PPYOLOE
- PPYOLOE(int8)
- YOLOV8
如果你需要查看详细的速度信息,请查看[RKNPU2模型速度一览表](../../../../../docs/cn/faq/rknpu2/rknpu2.md)
## 准备PaddleDetection部署模型以及转换模型
RKNPU部署模型前需要将Paddle模型转换成RKNN模型具体步骤如下:
@@ -20,8 +22,79 @@ RKNPU部署模型前需要将Paddle模型转换成RKNN模型具体步骤如
## 模型转换example
- [Picodet RKNPU2模型转换文档](./picodet.md)
- [YOLOv8 RKNPU2模型转换文档](./yolov8.md)
### 注意点
PPDetection模型在RKNPU2上部署时要注意以下几点:
* 模型导出需要包含Decode
* 由于RKNPU2不支持NMS因此输出节点必须裁剪至NMS之前
* 由于RKNPU2 Div算子的限制模型的输出节点需要裁剪至Div算子之前
### Paddle模型转换为ONNX模型
由于Rockchip提供的rknn-toolkit2工具暂时不支持Paddle模型直接导出为RKNN模型因此需要先将Paddle模型导出为ONNX模型再将ONNX模型转为RKNN模型。
```bash
# 以Picodet为例
# 下载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]}"
```
### 编写yaml文件
**修改normalize参数**
如果你需要在NPU上执行normalize操作请根据你的模型配置normalize参数例如:
```yaml
mean:
-
- 123.675
- 116.28
- 103.53
std:
-
- 58.395
- 57.12
- 57.375
```
**修改outputs参数**
由于Paddle2ONNX版本的不同转换模型的输出节点名称也有所不同请使用[Netron](https://netron.app)对模型进行可视化并找到以下蓝色方框标记的NonMaxSuppression节点红色方框的节点名称即为目标名称。
例如使用Netron可视化后得到以下图片:
![](https://user-images.githubusercontent.com/58363586/212599781-e1952da7-6eae-4951-8ca7-bab7e6940692.png)
找到蓝色方框标记的NonMaxSuppression节点可以看到红色方框标记的两个节点名称为p2o.Div.79和p2o.Concat.9,因此需要修改outputs参数修改后如下:
```yaml
outputs_nodes:
- 'p2o.Mul.179'
- 'p2o.Concat.9'
```
### ONNX模型转RKNN模型
为了方便大家使用我们提供了python脚本通过我们预配置的config文件你将能够快速地转换ONNX模型到RKNN模型
```bash
python tools/rknpu2/export.py --config_path tools/rknpu2/config/picodet_s_416_coco_lcnet_unquantized.yaml \
--target_platform rk3588
```
## 其他链接

View File

@@ -1,68 +0,0 @@
# Picodet RKNPU2模型转换文档
以下步骤均在Ubuntu电脑上完成请参考配置文档完成转换模型环境配置。下面以Picodet-s为例子,教大家如何转换PaddleDetection模型到RKNN模型。
### 导出ONNX模型
```bash
# 下载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/picodet_s_416_coco_lcnet_unquantized.yaml来转换ONNX模型到RKNN模型。
**修改normalize参数**
如果你需要在NPU上执行normalize操作请根据你的模型配置normalize参数例如:
```yaml
mean:
-
- 127.5
- 127.5
- 127.5
std:
-
- 127.5
- 127.5
- 127.5
```
**修改outputs参数**
由于Paddle2ONNX版本的不同转换模型的输出节点名称也有所不同请使用[Netron](https://netron.app)对模型进行可视化并找到以下蓝色方框标记的NonMaxSuppression节点红色方框的节点名称即为目标名称。
例如使用Netron可视化后得到以下图片:
![](https://user-images.githubusercontent.com/58363586/212599781-e1952da7-6eae-4951-8ca7-bab7e6940692.png)
找到蓝色方框标记的NonMaxSuppression节点可以看到红色方框标记的两个节点名称为p2o.Div.79和p2o.Concat.9,因此需要修改outputs参数修改后如下:
```yaml
outputs_nodes: [ 'p2o.Div.79','p2o.Concat.9' ]
```
### 转换模型
```bash
# ONNX模型转RKNN模型
# 转换模型,模型将生成在picodet_s_320_coco_lcnet_non_postprocess目录下
python tools/rknpu2/export.py --config_path tools/rknpu2/config/picodet_s_416_coco_lcnet_unquantized.yaml \
--target_platform rk3588
```

View File

@@ -45,15 +45,16 @@ if __name__ == "__main__":
# 配置runtime加载模型
runtime_option = fd.RuntimeOption()
runtime_option.use_cpu()
runtime_option.use_rknpu2()
model = fd.vision.detection.PPYOLOE(
model_file,
params_file,
config_file,
runtime_option=runtime_option,
model_format=fd.ModelFormat.ONNX)
model_format=fd.ModelFormat.RKNN)
model.preprocessor.disable_normalize()
model.preprocessor.disable_permute()
model.postprocessor.apply_decode_and_nms()
# 预测图片分割结果

View File

@@ -1,50 +0,0 @@
# YOLOv8 RKNPU2模型转换文档
以下步骤均在Ubuntu电脑上完成请参考配置文档完成转换模型环境配置。下面以yolov8为例子,教大家如何转换PaddleDetection模型到RKNN模型。
### 导出ONNX模型
```bash
# 下载Paddle静态图模型并解压
# 静态图转ONNX模型注意这里的save_file请和压缩包名对齐
paddle2onnx --model_dir yolov8_n_500e_coco \
--model_filename model.pdmodel \
--params_filename model.pdiparams \
--save_file yolov8_n_500e_coco/yolov8_n_500e_coco.onnx \
--enable_dev_version True
# 固定shape
python -m paddle2onnx.optimize --input_model yolov8_n_500e_coco/yolov8_n_500e_coco.onnx \
--output_model yolov8_n_500e_coco/yolov8_n_500e_coco.onnx \
--input_shape_dict "{'image':[1,3,640,640],'scale_factor':[1,2]}"
```
### 编写模型导出配置文件
**修改outputs参数**
由于Paddle2ONNX版本的不同转换模型的输出节点名称也有所不同请使用[Netron](https://netron.app)对模型进行可视化并找到以下蓝色方框标记的NonMaxSuppression节点红色方框的节点名称即为目标名称。
例如使用Netron可视化后得到以下图片:
![](https://user-images.githubusercontent.com/58363586/212599658-8a2c4b79-f59a-40b5-ade7-f77c6fcfdf2a.png)
找到蓝色方框标记的NonMaxSuppression节点可以看到红色方框标记的两个节点名称为p2o.Div.1和p2o.Concat.9,因此需要修改outputs参数修改后如下:
```yaml
outputs_nodes: [ 'p2o.Div.1','p2o.Concat.49' ]
```
### 转换模型
```bash
# ONNX模型转RKNN模型
# 转换非全量化模型,模型将生成在yolov8_n目录下
python tools/rknpu2/export.py --config_path tools/rknpu2/config/yolov8_n_unquantized.yaml \
--target_platform rk3588
# 转换全量化模型,模型将生成在yolov8_n目录下
python tools/rknpu2/export.py --config_path tools/rknpu2/config/yolov8_n_quantized.yaml \
--target_platform rk3588
```

View File

@@ -10,7 +10,7 @@ std:
- 57.375
model_path: ./picodet_s_416_coco_lcnet/picodet_s_416_coco_lcnet.onnx
outputs_nodes:
- 'p2o.Div.79'
- 'p2o.Mul.179'
- 'p2o.Concat.9'
do_quantization: False
dataset:

View File

@@ -0,0 +1,17 @@
mean:
-
- 0
- 0
- 0
std:
-
- 255
- 255
- 255
model_path: ./ppyoloe_plus_crn_s_80e_coco/ppyoloe_plus_crn_s_80e_coco.onnx
outputs_nodes:
- 'p2o.Mul.224'
- 'p2o.Concat.29'
do_quantization: True
dataset: "./ppyoloe_plus_crn_s_80e_coco/dataset.txt"
output_folder: "./ppyoloe_plus_crn_s_80e_coco"