mirror of
https://github.com/PaddlePaddle/FastDeploy.git
synced 2026-04-25 09:57:51 +08:00
0670dfc9d7
* 修复导出模型的文档 * 新增picodet模型导出文档 * 新增picodet模型导出文档
121 lines
4.2 KiB
Markdown
121 lines
4.2 KiB
Markdown
# PaddleDetection RKNPU2部署示例
|
|
|
|
## 支持模型列表
|
|
|
|
目前FastDeploy支持如下模型的部署
|
|
- [PicoDet系列模型](https://github.com/PaddlePaddle/PaddleDetection/tree/release/2.4/configs/picodet)
|
|
|
|
## 准备PaddleDetection部署模型以及转换模型
|
|
RKNPU部署模型前需要将Paddle模型转换成RKNN模型,具体步骤如下:
|
|
* Paddle动态图模型转换为ONNX模型,请参考[PaddleDetection导出模型](https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.4/deploy/EXPORT_MODEL.md)
|
|
,注意在转换时请设置**export.nms=True**.
|
|
* ONNX模型转换RKNN模型的过程,请参考[转换文档](../../../../../docs/cn/faq/rknpu2/export.md)进行转换。
|
|
|
|
|
|
## 模型转换example
|
|
以下步骤均在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/RK3568/picodet_s_416_coco_lcnet.yaml,来转换ONNX模型到RKNN模型。
|
|
|
|
**修改normalize参数**
|
|
|
|
如果你需要在NPU上执行normalize操作,请根据你的模型配置normalize参数,例如:
|
|
```yaml
|
|
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]]
|
|
std: [[0.229,0.224,0.225]]
|
|
outputs: ['tmp_17','p2o.Concat.9']
|
|
```
|
|
|
|
**修改outputs参数**
|
|
由于Paddle2ONNX版本的不同,转换模型的输出节点名称也有所不同,请使用[Netron](https://netron.app),并找到以下蓝色方框标记的NonMaxSuppression节点,红色方框的节点名称即为目标名称。
|
|
|
|
例如,使用Netron可视化后,得到以下图片:
|
|

|
|
|
|
找到蓝色方框标记的NonMaxSuppression节点,可以看到红色方框标记的两个节点名称为tmp_17和p2o.Concat.9,因此需要修改outputs参数,修改后如下:
|
|
```yaml
|
|
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']
|
|
```
|
|
|
|
### 转换模型
|
|
```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.yaml \
|
|
--target_platform rk3588
|
|
```
|
|
|
|
### 修改模型运行时的配置文件
|
|
|
|
配置文件中,我们只需要修改**Preprocess**下的**Normalize**和**Permute**.
|
|
|
|
**删除Permute**
|
|
|
|
RKNPU只支持NHWC的输入格式,因此需要删除Permute操作.删除后,配置文件Precess部分后如下:
|
|
```yaml
|
|
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部分如下:
|
|
```yaml
|
|
Preprocess:
|
|
- interp: 2
|
|
keep_ratio: false
|
|
target_size:
|
|
- 416
|
|
- 416
|
|
type: Resize
|
|
```
|
|
|
|
## 其他链接
|
|
- [Cpp部署](./cpp)
|
|
- [Python部署](./python)
|
|
- [视觉模型预测结果](../../../../../docs/api/vision_results/)
|