1. RKNN Demo运行全流程解析
作为一名长期在嵌入式AI领域摸爬滚打的开发者,我最近在Rockchip RV1106平台上完整跑通了YOLOv5的RKNN推理demo。整个过程看似简单,实则暗藏不少"坑点"。下面我将从环境准备到最终部署的完整流程拆解,重点分享那些官方文档没写的实操细节。
1.1 环境准备与模型获取
首先需要搭建RKNN-Toolkit2开发环境,这里推荐使用conda创建独立Python环境:
bash复制conda create -n RKNN-Toolkit2 python=3.8
conda activate RKNN-Toolkit2
pip install rknn-toolkit2
模型获取环节有个关键细节容易被忽略:官方提供的download_model.sh脚本下载的其实是yolov5s_relu.onnx而非yolov5s.onnx。这个差异会导致后续转换失败,正确的操作应该是:
bash复制cd rknn_model_zoo/examples/yolov5/model
chmod +x download_model.sh
./download_model.sh # 实际下载的是yolov5s_relu.onnx
注意:ReLU版模型相比原版在NPU上通常有更好的推理性能,这是Rockchip针对自家硬件做的优化版本。
1.2 模型转换关键参数
转换脚本的核心参数需要特别注意:
bash复制python3 convert.py ../model/yolov5s_relu.onnx rv1106 i8 ./output/yolov5.rknn
参数详解:
rv1106:指定目标平台为RV1106芯片i8:启用INT8量化(默认选项),能显著提升推理速度- 输出路径建议明确指定,避免与原始模型混淆
转换过程中常见的两个坑:
- 输入shape未自动识别时,需在convert.py中手动指定
input_size_list=[[1,3,640,640]] - 量化时需要准备约100张校准图片,否则精度损失严重
1.3 交叉编译实战细节
编译环节的环境变量设置至关重要:
bash复制export GCC_COMPILER=/path/to/toolchain/bin/arm-rockchip830-linux-uclibcgnueabihf
./build-linux.sh -t rv1106 -a armv7l -d yolov5
编译脚本执行后会产生install目录,其结构如下:
code复制install/
└── rv1106_linux_armv7l
└── rknn_yolov5_demo
├── lib
│ ├── librga.so
│ └── librknnrt.so
├── model
│ ├── yolov5.rknn
│ └── bus.jpg
└── rknn_yolov5_demo
关键技巧:如果遇到库文件缺失错误,检查CMakeLists.txt中的
CMAKE_INSTALL_RPATH设置,确保指向正确的lib路径。
2. 开发板部署全流程
2.1 文件传输与权限设置
建议使用rsync进行文件同步,保持开发板与主机文件一致:
bash复制rsync -avzP install/rv1106_linux_armv7l/rknn_yolov5_demo root@192.168.x.x:/root/
部署后需要特别注意文件权限:
bash复制chmod +x /root/rknn_yolov5_demo/rknn_yolov5_demo
chmod -R 755 /root/rknn_yolov5_demo/lib
2.2 运行时库路径问题
开发板运行时报错"library not found"是最常见的问题,解决方案有:
-
临时方案(测试用):
bash复制export LD_LIBRARY_PATH=/root/rknn_yolov5_demo/lib:$LD_LIBRARY_PATH -
永久方案(生产环境):
bash复制echo "/root/rknn_yolov5_demo/lib" >> /etc/ld.so.conf ldconfig
2.3 实际推理执行
运行命令的路径参数有讲究:
bash复制cd /root/rknn_yolov5_demo
./rknn_yolov5_demo model/yolov5.rknn model/bus.jpg
输出结果分析:
- 成功时会生成out.png
- 耗时信息打印在控制台(RV1106上典型耗时约120ms)
- 内存占用可通过
free -m观察
3. 常见问题排查指南
3.1 模型转换失败
现象:转换时出现"Unsupported ONNX opcode: xxx"
解决方案:
- 检查ONNX opset版本(应<=12)
- 使用onnx-simplifier简化模型:
python复制import onnxsim model = onnx.load("yolov5s_relu.onnx") model_simp, check = onnxsim.simplify(model) onnx.save(model_simp, "yolov5s_simp.onnx")
3.2 推理结果异常
现象:输出检测框错乱或置信度异常
排查步骤:
- 确认输入图片格式为RGB(非BGR)
- 检查模型输入归一化参数是否匹配(YOLOv5通常使用0-1归一化)
- 尝试关闭量化使用FP模式:
bash复制
python3 convert.py ../model/yolov5s_relu.onnx rv1106 fp
3.3 性能优化技巧
-
启用NPU硬件加速:
c复制rknn_config config; config.optimization_level = RKNN_OPT_LEVEL_HIGH; config.perf_debug = 1; rknn_init(&ctx, model_path, 0, 0, &config); -
多线程推理配置:
bash复制export RKNN_SERVER_NTHREADS=4
4. 进阶开发建议
对于需要自定义模型的开发者,建议:
-
模型结构优化:
- 使用Depthwise卷积替代标准卷积
- 激活函数优先选择ReLU6
- 输入尺寸保持640x640的倍数
-
量化校准技巧:
python复制rknn.config(mean_values=[[0, 0, 0]], std_values=[[255, 255, 255]]) rknn.build(do_quantization=True, dataset='./calib_images.txt') -
内存优化配置:
c复制rknn_set_internal_mem_pool(ctx, RKNN_MEM_TYPE_DMA, 256*1024*1024);
在实际部署中,我发现RV1106的NPU对YOLOv5s的推理效率可以稳定在8FPS左右,内存占用约150MB。如果遇到性能瓶颈,建议从以下方面入手优化:
- 调整模型输入尺寸(如320x320)
- 使用官方提供的量化校准工具
- 启用RKNN的异步推理模式
