4. 应用示例

RKNN提供了不同模型的参考示例,包括MobileNet图像分类、YOLOv5目标检测等,代码工程位于https://github.com/airockchip/rknn_model_zoo/tree/main/examples目录下。

本章节以如下环境为例介绍如何运行参考示例:

  • PC端:操作系统为Ubuntu 22.04,Python环境为Miniforge创建的Python3.8环境;

  • 开发板为RK3588 Linux平台为例。

可以参考第二章准备开发环境,其他平台的部署流程可参考<Rockchip_RKNPU_Quick_Start_RKNN_SDK>文档。

4.1 MobileNet模型部署示例

本章节以MobileNet模型部署为例,介绍如何快速上手模型转换、模型连板运行、模型评估和模型板端部署。

4.1.1 模型转换

  1. 进入 rknn_model_zoo/examples/mobilenet/python 目录

cd rknn_model_zoo/examples/mobilenet/python
  1. 执行模型转换并进行图片推理

python mobilenet.py --model ../model/mobilenetv2-12.onnx --target rk3588

执行该命令后模型是在电脑模拟器上进行推理,转换后的模型默认保存路径为:

rknn_model_zoo/examples/mobilenet/model/mobilenet_v2.rknn

4.1.2 模型连板运行

  1. 进入 rknn_model_zoo/examples/mobilenet/python 目录

cd rknn_model_zoo/examples/mobilenet/python
  1. 执行模型连板运行

python mobilenet.py --target rk3588 --npu_device_test

执行该命令后模型通过连板的方式在板端上进行推理。输出结果如下:

-----TOP 5----
[494] score=0.99 class="n03017168 chime, bell, gong"
[469] score=0.00 class="n02939185 caldron, cauldron"
[653] score=0.00 class="n03764736 milk can"
[747] score=0.00 class="n04023962 punching bag, punch bag, punching ball, punchball"
[505] score=0.00 class="n03063689 coffeepot"

4.1.3 模型评估

RKNN提供(模拟器和板端)精度评估、耗时评估和内存评估的功能,辅助RKNN模型的优化和部署

4.1.3.1 精度评估

  1. 进入 rknn_model_zoo/examples/mobilenet/python 目录

cd rknn_model_zoo/examples/mobilenet/python
  1. 执行模型连板精度分析

python mobilenet.py --target rk3588 --accuracy_analysis --npu_device_test

模型连板精度分析的输出结果如下:

# simulator_error: calculate the output error of each layer of the simulator (compared to the 'golden' value).
#     entire: output error of each layer between 'golden' and 'simulator', these errors will accumulate layer by layer.
#     single: single-layer output error between 'golden' and 'simulator', can better reflect the single-layer accuracy of the simulator.
             simulator_error
layer_name    entire        single     
             cos   euc     cos    euc
-----------------------------------------
...
[Conv] 464        0.99202 | 4.1079    0.99998 | 0.1981
[Conv] output_conv    0.99308 | 13.235    0.99992 | 1.4133
[Reshape] output_int8    0.99308 | 13.235    0.99993 | 1.3043
[exDataConvert] output    0.99308 | 13.235    0.99993 | 1.3043

# runtime_error: calculate the output error of each layer of the runtime.
#     entire: output error of each layer between 'golden' and 'runtime', these errors will accumulate layer by layer.
#     single_sim: single-layer output error between 'simulator' and 'runtime', can better reflect the single-layer accuracy of runtime.
             runtime_error
layer_name    entire        single_sim     
             cos   euc     cos    euc
-----------------------------------------
...
[Conv] 464        0.99210 | 4.2718    1.00000 | 0.0
[Conv] output_conv    0.99203 | 14.847    1.00000 | 0.2007
[Reshape] output_int8        1.00000 | 0.0
[exDataConvert] output    0.99203 | 14.847    1.00000 | 0.0

4.1.3.2 耗时评估

  1. 进入 rknn_model_zoo/examples/mobilenet/python 目录

cd rknn_model_zoo/examples/mobilenet/python
  1. 执行模型耗时评估

python mobilenet.py --target rk3588 --eval_perf

模型耗时评估的输出结果如下:

---------------------------------
        Network Layer Information Table
---------------------------------
ID  OpType          DataType    Target  Time(us) ...
---------------------------------
1   InputOperator   UINT8       CPU     17
2   ConvClip        UINT8       NPU     331
3   ConvClip        INT8        NPU     429
4   Conv            INT8        NPU     292
...
55  Conv            INT8        NPU     374
56  Reshape         INT8        CPU     61
57  OutputOperator  INT8        CPU     11
---------------------------------
Total Operator Elapsed Per Frame Time(us): 12631
Total Memory Read/Write Per Frame Size(KB): 10563
---------------------------------

---------------------------------
        Operator Time Consuming Ranking Table
---------------------------------
OpType      CallNumber ... NPUtime(us) TotalTime(us) TimeRatio(%)
---------------------------------
ConvClip    35        ... 8436        8436          66.79%
Conv        9         ... 2093        2093          16.57%
ConvAdd     10        ... 2013        2013          15.94%
Reshape     1         ... 0           61            0.48%
InputOperator 1       ... 0           17            0.13%
OutputOperator 1      ... 0           11            0.09%
---------------------------------

4.1.3.3 内存评估

  1. 进入 rknn_model_zoo/examples/mobilenet/python 目录

cd rknn_model_zoo/examples/mobilenet/python
  1. 执行模型内存评估

python mobilenet.py --target rk3588 --eval_memory

模型内存评估的输出结果如下:

### Memory Profile Info Dump  

#### NPU model memory detail(bytes):  
- Weight Memory: 3.53 MiB  
- Internal Tensor Memory: 1.53 MiB  
- Other Memory: 377.19 KiB  
- Total Memory: 5.43 MiB  

#### INFO:  
When evaluating memory usage, we need consider the size of model, current model size is: 3.98 MiB   

4.1.4 板端部署

  1. rknn_model_zoo 工程下的 build-linsx.sh 脚本中指定 gcc 交叉编译器路径

GCC_COMPILER=~/opts/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu

有关 gcc 交叉编译器的下载和安装方法可参考<Rockchip_RKNPU_Quick_Start_RKNN_SDK>。

  1. 编译模型相关文件

./build-linux.sh -t rk3588 -a aarch64 -d mobilenet
  1. 推送可执行文件到板端

adb root
adb remount
adb push install/rk3588_linux_aarch64/rknn_mobilenet_demo/ /userdata/
  1. 板端执行

adb shell
cd /userdata/rknn_mobilenet_demo/
export LD_LIBRARY_PATH=./lib
./rknn_mobilenet_demo model/mobilenet_v2.rknn model/bell.jpg

输出结果如下:

-----TOP 5----
[494] score=0.99 class="n03017168 chime, bell, gong"
[469] score=0.00 class="n02939185 caldron, cauldron"
[653] score=0.00 class="n03764736 milk can"
[747] score=0.00 class="n04023962 punching bag, punch bag"
[505] score=0.00 class="n03063689 coffeepot"

4.2 YOLOv5模型部署示例

4.2.1 模型转换

  1. 下载模型

cd rknn_model_zoo/examples/yolov5/model
./download_model.sh
  1. 执行模型转换

cd rknn_model_zoo/examples/yolov5/python
python convert.py ../model/yolov5s_relu.onnx rk3588 18 ../model/yolov5s_relu.rknn

转换后的模型保存路径为 rknn_model_zoo/examples/yolov5/model/yolov5s_relu.rknn

4.2.1 模型连板运行

  1. 进入 rknn_model_zoo/examples/yolov5/python 目录

cd rknn_model_zoo/examples/yolov5/python
  1. 执行模型连板运行

python yolov5.py --model_path ../model/yolov5s_relu.rknn --target rk3588 --img_show

默认输入图片是 model/bus.jpg,结果图片如下所示:
RKNN Python Demo可视化结果

4.2.3 板端部署运行

  1. rknn_model_zoo 工程下的 build-linx.sh 脚本中指定 gcc 交叉编译器路径

GCC_COMPILER=~/opts/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu

有关 gcc 交叉编译器的下载和安装方法可参考 Rockchip_RKNPU_Quick_Start_RKNN_SDK

  1. 编译模型相关文件

cd rknn_model_zoo
./build-linux.sh -t rk3588 -a aarch64 -d yolov5
  1. 推送可执行文件到板端

adb root
adb remount
adb push install/rk3588_linux_aarch64/rknn_yolov5_demo/ /userdata/
adb push examples/yolov5/model/yolov5s_relu.rknn /userdata/rknn_yolov5_demo/model/
  1. 板端运行

adb shell
cd /userdata/rknn_yolov5_demo/
export LD_LIBRARY_PATH=./lib
./rknn_yolov5_demo model/yolov5s_relu.rknn model/bus.jpg
  1. 从板端拉取到本地查看
    在本地电脑的终端中,执行以下命令:

adb pull /userdata/rknn_yolov5_demo/out.png .

输出结果图片如下所示:
RKNN C demo可视化结果