保姆级教程:在Ubuntu 20.04上从零搞定YOLOv5模型到RK3588 NPU的完整部署流程
保姆级教程在Ubuntu 20.04上从零搞定YOLOv5模型到RK3588 NPU的完整部署流程RK3588芯片凭借其强大的NPU算力正在成为边缘计算领域的热门选择。但对于刚接触嵌入式AI开发的工程师来说从模型训练到NPU部署的全流程往往充满挑战。本文将手把手带你完成YOLOv5模型在RK3588平台上的完整部署涵盖从Ubuntu环境配置、模型转换优化到板端推理加速的每个技术细节。1. 开发环境搭建与工具链配置1.1 基础环境准备首先确保你的Ubuntu 20.04系统已更新到最新状态sudo apt update sudo apt upgrade -y sudo apt install -y git wget unzip adb接下来创建专用的Python隔离环境推荐使用Python 3.8conda create -n rknn_deploy python3.8 -y conda activate rknn_deploy1.2 RKNN-Toolkit2安装RKNN-Toolkit2是Rockchip官方提供的模型转换工具当前稳定版本为1.5.2wget https://github.com/rockchip-linux/rknn-toolkit2/archive/refs/tags/v1.5.2.zip unzip v1.5.2.zip cd rknn-toolkit2-1.5.2安装依赖时建议使用清华源加速pip install -r doc/requirements_cp38-1.5.2.txt -i https://pypi.tuna.tsinghua.edu.cn/simple pip install packages/rknn_toolkit2-1.5.2*.whl注意如果遇到libGL.so缺失错误需执行sudo apt install libgl1-mesa-glx2. YOLOv5模型准备与关键修改2.1 模型获取与训练推荐使用YOLOv5 v5.0版本以保证兼容性git clone -b v5.0 https://github.com/ultralytics/yolov5.git cd yolov5 pip install -r requirements.txt训练完成后需要对models/yolo.py进行关键修改# 修改Detect类的forward方法 def forward(self, x): z [] for i in range(self.nl): if os.getenv(RKNN_model_hack, 0) ! 0: z.append(torch.sigmoid(self.m[i](x[i]))) continue # 原始实现... return x if self.training else (torch.cat(z, 1),)2.2 模型导出为ONNX使用官方export脚本转换时需添加--grid参数python export.py --weights best.pt --img 640 --batch 1 --grid验证ONNX模型有效性python -c import onnx model onnx.load(best.onnx) onnx.checker.check_model(model) print(ONNX check passed) 3. ONNX到RKNN模型转换3.1 转换脚本配置复制YOLOv5示例并修改测试脚本cp -r rknn-toolkit2-1.5.2/examples/onnx/yolov5 ./yolov5_rknn cd yolov5_rknn修改test.py关键参数ONNX_MODEL best.onnx RKNN_MODEL yolov5s.rknn DATASET ./dataset.txt TARGET_PLATFORM rk3588 # 必须指定目标平台3.2 量化数据集准备创建dataset.txt文件指定量化样本./1.jpg ./2.jpg ./3.jpg执行转换命令python test.py转换成功后会输出类似日志-- Building model I NPUTransfer: Transfer started... I NPUTransfer: Transfer complete (0.003s) -- Export RKNN model: yolov5s.rknn Export RKNN model done!4. RK3588板端环境部署4.1 开发板连接配置通过USB-C连接开发板后验证ADB连接adb devices # 应显示类似输出 List of devices attached 1234567890abcdef device4.2 NPU运行时部署从Rockchip官方仓库获取NPU运行时git clone https://github.com/rockchip-linux/rknpu2推送关键文件到开发板adb push rknpu2/runtime/RK3588/Linux/rknn_server/aarch64/usr/bin/rknn_server /usr/bin/ adb push rknpu2/runtime/RK3588/Linux/librknn_api/aarch64/librknnrt.so /usr/lib/ adb push rknpu2/runtime/RK3588/Linux/librknn_api/aarch64/librknn_api.so /usr/lib/启动NPU服务adb shell chmod x /usr/bin/rknn_server rknn_server 5. 板端推理测试与优化5.1 部署YOLOv5演示程序编译官方demo程序cd rknpu2/examples/rknn_yolov5_demo bash build-linux_RK3588.sh推送程序到开发板adb push install/rknn_yolov5_demo_Linux /data5.2 执行NPU加速推理在开发板上运行adb shell cd /data/rknn_yolov5_demo_Linux ./rknn_yolov5_demo model/RK3588/yolov5s.rknn model/bus.jpg典型性能对比硬件平台推理延迟 (640x640)能效比CPU1200ms1xGPU35ms34xNPU70ms17x5.3 常见问题排查问题1模型转换失败检查YOLOv5版本是否为v5.0确认yolo.py修改正确尝试降低ONNX opset版本--opset 12问题2推理结果异常在test.py中启用量化感知训练(QAT)增加量化样本数量(建议≥100张)检查dataset.txt中图片路径是否正确问题3NPU服务启动失败确认librknnrt.so版本匹配检查内核日志adb shell dmesg | grep npu尝试重启NPU服务killall rknn_server rknn_server 6. 生产环境优化建议6.1 模型量化策略对于部署场景建议采用混合量化# 在test.py中添加量化配置 rknn.config( quantized_dtypeasymmetric_quantized-8, quantized_algorithmnormal, quantized_methodchannel )6.2 多线程推理实现修改demo程序支持批量处理// 在main.cpp中添加 pthread_t threads[NUM_THREADS]; for (int i 0; i NUM_THREADS; i) { pthread_create(threads[i], NULL, inference_thread, (void*)thread_args[i]); }6.3 内存优化技巧通过共享内存减少数据传输adb shell mkdir -p /dev/shm/npu_cache export RKNN_SHARED_MEMORY1在实际项目中我们发现合理设置NPU频率可以提升能效比# 查看NPU频率 adb shell cat /sys/class/devfreq/fdab0000.npu/available_frequencies # 设置频率 adb shell echo 1000000000 /sys/class/devfreq/fdab0000.npu/userspace/set_freq