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以下。
口罩检测是个不错的入门项目,数据集规模适中(约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)
数据增强方面,我推荐这些组合:
记得用LabelImg检查标注质量时,我发现约5%的标注框存在偏移问题。手动修正后,mAP@0.5直接提升了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 # 使用内存缓存加速数据加载
几个容易踩的坑:
训练完成后,用这段代码快速验证模型效果:
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
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') # 关键参数!
遇到转换失败时,先检查:
通过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输入):
最后分享一个调试技巧:用rknn_toolkit2里的性能分析工具生成时间线图,能清晰看到每个算子的耗时情况。曾经发现某个Conv2D层异常耗时,原来是输入通道数没对齐NPU的16字节要求,调整后速度直接翻倍。