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 模型转换
进入
rknn_model_zoo/examples/mobilenet/python
目录
cd rknn_model_zoo/examples/mobilenet/python
执行模型转换并进行图片推理
python mobilenet.py --model ../model/mobilenetv2-12.onnx --target rk3588
执行该命令后模型是在电脑模拟器上进行推理,转换后的模型默认保存路径为:
rknn_model_zoo/examples/mobilenet/model/mobilenet_v2.rknn
4.1.2 模型连板运行
进入
rknn_model_zoo/examples/mobilenet/python
目录
cd rknn_model_zoo/examples/mobilenet/python
执行模型连板运行
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 精度评估
进入
rknn_model_zoo/examples/mobilenet/python
目录
cd rknn_model_zoo/examples/mobilenet/python
执行模型连板精度分析
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 耗时评估
进入
rknn_model_zoo/examples/mobilenet/python
目录
cd rknn_model_zoo/examples/mobilenet/python
执行模型耗时评估
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 内存评估
进入
rknn_model_zoo/examples/mobilenet/python
目录
cd rknn_model_zoo/examples/mobilenet/python
执行模型内存评估
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 板端部署
在
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>。
编译模型相关文件
./build-linux.sh -t rk3588 -a aarch64 -d mobilenet
推送可执行文件到板端
adb root
adb remount
adb push install/rk3588_linux_aarch64/rknn_mobilenet_demo/ /userdata/
板端执行
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 模型转换
下载模型
cd rknn_model_zoo/examples/yolov5/model
./download_model.sh
执行模型转换
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 模型连板运行
进入
rknn_model_zoo/examples/yolov5/python
目录
cd rknn_model_zoo/examples/yolov5/python
执行模型连板运行
python yolov5.py --model_path ../model/yolov5s_relu.rknn --target rk3588 --img_show
默认输入图片是 model/bus.jpg
,结果图片如下所示:
4.2.3 板端部署运行
在
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
。
编译模型相关文件
cd rknn_model_zoo
./build-linux.sh -t rk3588 -a aarch64 -d yolov5
推送可执行文件到板端
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/
板端运行
adb shell
cd /userdata/rknn_yolov5_demo/
export LD_LIBRARY_PATH=./lib
./rknn_yolov5_demo model/yolov5s_relu.rknn model/bus.jpg
从板端拉取到本地查看
在本地电脑的终端中,执行以下命令:
adb pull /userdata/rknn_yolov5_demo/out.png .
输出结果图片如下所示: