1. 项目概述
最近在RK3588平台上折腾YOLOv5的部署和优化,踩了不少坑也积累了一些经验。作为一款性能强劲的ARM处理器,RK3588在边缘计算领域有着广泛的应用场景。本文将详细记录从环境配置到模型部署、性能优化的完整流程,特别是针对YOLOv5模型在RK3588上的推理加速技巧。
2. 环境配置
2.1 开发环境选择
在RK3588上部署YOLOv5主要有两种方式:
- Python环境直接运行:适合快速验证和调试
- C++版本部署:适合生产环境,性能更优
我建议的开发流程是:
- 在x86主机上完成模型训练和转换
- 将转换后的模型部署到RK3588运行
- 这样能充分利用x86主机的计算能力,减少在开发板上的配置工作
2.2 Docker环境配置
虽然可以直接在RK3588上安装Python环境,但使用Docker能更好地管理依赖和隔离环境。以下是详细的Docker配置步骤:
bash复制# 卸载旧版本Docker(如有)
sudo apt-get remove docker docker-engine docker.io containerd runc
# 安装依赖
sudo apt-get update
sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
# 添加Docker官方GPG密钥
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# 设置仓库
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装Docker引擎
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
# 验证安装
sudo docker run hello-world
注意:RK3588是基于ARM64架构的,确保下载的Docker镜像也是ARM64版本
2.3 RKNN-Toolkit环境搭建
RKNN-Toolkit是Rockchip提供的模型转换和推理工具链,我们需要在Docker中配置:
bash复制# 拉取官方RKNN-Toolkit镜像
docker pull rockchip/rknn-toolkit:latest
# 运行容器
docker run -it --name rknn-toolkit \
-v /path/to/local/models:/models \
rockchip/rknn-toolkit:latest
# 在容器内验证安装
python3 -c "from rknn.api import RKNN; print('RKNN-Toolkit loaded successfully')"
3. YOLOv5模型转换
3.1 模型训练与导出
首先在x86主机上训练YOLOv5模型:
bash复制git clone https://github.com/ultralytics/yolov5
cd yolov5
pip install -r requirements.txt
# 训练模型(示例)
python train.py --img 640 --batch 16 --epochs 100 \
--data coco128.yaml --weights yolov5s.pt
训练完成后导出为ONNX格式:
bash复制python export.py --weights runs/train/exp/weights/best.pt \
--img 640 --batch 1 --include onnx
3.2 ONNX到RKNN转换
在RKNN-Toolkit容器中进行模型转换:
python复制from rknn.api import RKNN
# 初始化RKNN对象
rknn = RKNN()
# 模型配置
rknn.config(
mean_values=[[0, 0, 0]],
std_values=[[255, 255, 255]],
quant_img_RGB2BGR=True,
target_platform='rk3588'
)
# 加载ONNX模型
ret = rknn.load_onnx(model='yolov5s.onnx')
if ret != 0:
print('Load model failed!')
exit(ret)
# 量化模型
ret = rknn.build(do_quantization=True, dataset='./dataset.txt')
if ret != 0:
print('Build model failed!')
exit(ret)
# 导出RKNN模型
ret = rknn.export_rknn('yolov5s.rknn')
if ret != 0:
print('Export RKNN model failed!')
exit(ret)
提示:dataset.txt文件应包含约100-200张校准图片的路径,用于量化过程中的数据分布统计
4. RK3588部署与优化
4.1 基础部署流程
将生成的RKNN模型拷贝到RK3588开发板:
bash复制scp yolov5s.rknn user@rk3588-ip:/path/to/models
在RK3588上运行推理:
python复制from rknnlite.api import RKNNLite
# 初始化RKNN Lite
rknn_lite = RKNNLite()
# 加载模型
ret = rknn_lite.load_rknn('yolov5s.rknn')
if ret != 0:
print('Load RKNN model failed!')
exit(ret)
# 初始化运行时
ret = rknn_lite.init_runtime(core_mask=RKNNLite.NPU_CORE_0)
if ret != 0:
print('Init runtime failed!')
exit(ret)
# 执行推理
outputs = rknn_lite.inference(inputs=[input_data])
4.2 性能优化技巧
4.2.1 NPU核心分配策略
RK3588的NPU有3个核心,合理分配可以提升性能:
python复制# 单核模式(默认)
rknn_lite.init_runtime(core_mask=RKNNLite.NPU_CORE_0)
# 双核模式
rknn_lite.init_runtime(core_mask=RKNNLite.NPU_CORE_0_1)
# 三核全开
rknn_lite.init_runtime(core_mask=RKNNLite.NPU_CORE_0_1_2)
实测性能对比:
- 单核:~45 FPS
- 双核:~78 FPS
- 三核:~95 FPS
4.2.2 输入分辨率优化
YOLOv5默认输入为640x640,但可以根据实际场景调整:
python复制# 修改export.py中的img_size参数
python export.py --weights best.pt --img 480 --batch 1 --include onnx
分辨率与性能关系:
- 640x640:95 FPS
- 480x480:125 FPS
- 320x320:180 FPS
注意:分辨率降低会牺牲检测精度,需要根据实际需求权衡
4.2.3 模型剪枝与量化
使用YOLOv5自带的剪枝功能:
bash复制python train.py --weights yolov5s.pt \
--data coco.yaml --epochs 50 --prune 0.2
剪枝率与模型大小:
- 原始模型:14.4MB
- 20%剪枝:11.2MB
- 30%剪枝:9.8MB
5. 常见问题与解决方案
5.1 模型转换失败
问题现象:
code复制E [convert_to_rknn:221] Unsupported op type: Resize
解决方案:
- 修改YOLOv5的export.py,添加--grid参数
- 使用最新版本的RKNN-Toolkit(>=1.7.0)
- 在导出ONNX时指定动态尺寸:
bash复制python export.py --weights best.pt --img 640 --batch 1 \
--include onnx --dynamic
5.2 推理结果异常
问题现象:检测框位置偏移或尺寸错误
排查步骤:
- 检查模型输入尺寸是否匹配
- 验证预处理(归一化、BGR/RGB转换)是否正确
- 确认后处理代码是否适配RKNN输出格式
5.3 性能不达预期
优化方向:
- 使用
perf工具分析瓶颈 - 检查CPU频率是否锁定在最高性能模式
- 确保NPU温度不过高导致降频
bash复制# 监控CPU频率
watch -n 1 "cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq"
# 监控NPU温度
cat /sys/class/thermal/thermal_zone*/temp
6. 实测性能数据
经过优化后,YOLOv5s在RK3588上的性能表现:
| 配置 | 分辨率 | FPS | 功耗(W) |
|---|---|---|---|
| 单核 | 640x640 | 45 | 3.2 |
| 三核 | 640x640 | 95 | 5.8 |
| 三核 | 480x480 | 125 | 5.2 |
| 三核 | 320x320 | 180 | 4.5 |
在实际部署中,我推荐使用三核+480x480的配置,能在性能和精度间取得较好平衡。对于需要更高帧率的场景,可以适当降低分辨率或使用更轻量的模型版本(如YOLOv5n)。