1. YOLOv5与RK3576开发板简介
YOLOv5作为当前最流行的目标检测算法之一,以其轻量高效的特性在边缘计算领域大放异彩。我去年在工业质检项目中第一次接触YOLOv5s模型,实测在1080p图像上能达到60FPS的推理速度,而模型大小仅有14MB。这种性能表现让它成为RK3576这类边缘计算芯片的理想搭档。
RK3576是瑞芯微推出的高性能AIoT芯片,搭载4核ARM Cortex-A55 CPU和3TOPS算力的NPU。最近帮客户部署过一个智能门禁系统,就是用这块开发板跑YOLOv5s模型,在720p视频流上实现了实时人脸检测。与树莓派等通用开发板相比,RK3576的专用AI加速器能让YOLOv5的推理速度提升3-5倍。
开发环境搭建有个小技巧:建议直接用Ubuntu 20.04系统,避免在Windows WSL下折腾驱动问题。我测试过在16GB内存的NUC上跑完整流程最稳定,如果只有8GB内存,训练时记得把batch_size调到32以下。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数据集准备实战
口罩检测是个不错的入门项目,数据集规模适中(约2000张标注图片),类别简单(戴口罩/不戴口罩/错误佩戴)。第一次尝试时我犯了个错误——直接用了网上的现成数据集,结果发现很多图片尺寸不统一,导致训练时loss震荡严重。后来自己用Roboflow工具做了标准化处理:
python复制# 图片统一缩放到640x640
import cv2
def resize_image(img_path):
img = cv2.imread(img_path)
return cv2.resize(img, (640, 640), interpolation=cv2.INTER_AREA)
数据增强方面,我推荐这些组合:
- Mosaic增强:提升小目标检测能力
- HSV色彩扰动:增强光照变化鲁棒性
- 随机旋转:±15度范围内效果最佳
记得用LabelImg检查标注质量时,我发现约5%的标注框存在偏移问题。手动修正后,mAP@0.5直接提升了3个百分点。
3. 模型训练技巧
克隆官方仓库后,重点修改这两个配置文件:
data/mask.yaml:将train/val路径改为绝对路径models/yolov5s.yaml:根据检测目标数量调整nc参数
训练命令我习惯加上这些参数:
bash复制python train.py --img 640 --batch 16 --epochs 100 --data mask.yaml \
--cfg yolov5s.yaml --weights "" --name mask_detection \
--cache ram # 使用内存缓存加速数据加载
几个容易踩的坑:
- 显存不足:batch_size大于16时需要至少6GB显存
- Loss不下降:检查学习率(建议初始3e-4)和数据标注质量
- 过拟合:添加--evolve参数进行超参数进化
训练完成后,用这段代码快速验证模型效果:
python复制from models.experimental import attempt_load
model = attempt_load('runs/train/exp/weights/best.pt')
stride = int(model.stride.max()) # 获取模型步长
print(f"Model stride: {stride}") # 输出应为32/64
4. 模型转换关键步骤
ONNX转换时特别注意:
bash复制python export.py --include onnx --weights best.pt --img 640 --batch 1 \
--simplify # 启用模型简化
RKNN转换的配置文件需要针对RK3576优化:
python复制rknn.config(
mean_values=[[0, 0, 0]],
std_values=[[255, 255, 255]],
quantized_dtype='asymmetric_quantized-8',
target_platform='rk3576') # 关键参数!
遇到转换失败时,先检查:
- ONNX模型是否包含动态维度(需固定为640x640)
- 是否缺少opset_version参数(建议设为12)
- NPU驱动版本是否匹配(v1.7.0以上)
5. 开发板部署实战
通过ADB部署时,推荐先用这个命令检查NPU状态:
bash复制adb shell cat /proc/version | grep rknpu
内存分配很重要,我在rk3576上测试的最佳配置:
c复制// rknn_init参数
rknn_init_context ctx;
ctx.target_mem_type = RKNN_MEM_TYPE_NBUF; // 使用专用内存
ctx.pool_size = 256 * 1024 * 1024; // 256MB缓存
实测性能数据(640x640输入):
- YOLOv5s:22ms/帧
- YOLOv5m:38ms/帧
- YOLOv5n:15ms/帧
最后分享一个调试技巧:用rknn_toolkit2里的性能分析工具生成时间线图,能清晰看到每个算子的耗时情况。曾经发现某个Conv2D层异常耗时,原来是输入通道数没对齐NPU的16字节要求,调整后速度直接翻倍。
