1. 环境准备与数据标注在RK3588/RK356x开发板上部署YOLOv5安全帽检测模型第一步需要搞定两件事准备好标注数据和搭建训练环境。先说数据标注安全帽检测属于典型的目标检测任务需要标注每张图片中安全帽的位置和类别。我常用的标注工具是LabelImg它支持Pascal VOC和YOLO格式操作简单适合新手。标注时要注意几点安全帽必须完整出现在画面中才标注多人场景下每个佩戴安全帽的头部都需要单独标注遮挡超过50%的物体建议舍弃。对于没有标注经验的朋友这里分享个偷懒技巧可以使用Roboflow这样的在线平台它提供自动预标注功能能节省80%的标注时间。我去年做工地安全监测项目时用200张标注数据配合它的增强功能最终生成了2000训练样本。数据集目录建议按如下结构组织dataset/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ └── labels/ ├── train/ ├── val/ └── test/2. 模型训练实战技巧拿到标注数据后接下来就是在PC端训练YOLOv5模型。虽然RK3588也能跑训练但效率太低建议还是在NVIDIA显卡上完成。我测试过RTX 3060训练yolov5s模型500张图片训练100轮大约需要2小时。训练时有几个关键配置需要注意首先是修改data/coco128-helmet.yaml文件这个文件相当于项目的地图。我通常会把类别数量nc改为1只检测安全帽然后按7:2:1的比例划分训练集、验证集和测试集。有个坑要注意路径要用绝对路径相对路径在转换时容易出错。然后是train.py的关键参数调整python train.py \ --data data/coco128-helmet.yaml \ --weights yolov5s.pt \ --img 640 \ --batch-size 16 \ --epochs 100 \ --device 0这里img尺寸建议保持640x640太大虽然精度高但会影响板端推理速度。batch-size根据显卡内存调整我的经验是显存占用控制在80%左右最稳定。训练过程中可以用TensorBoard监控指标重点看mAP0.5和损失曲线。3. 模型格式转换详解训练得到的.pt模型需要转换成RKNN格式才能在开发板上运行这个过程我踩过不少坑。首先是转ONNX格式python export.py \ --weights runs/train/exp/weights/best.pt \ --include onnx \ --opset 12 \ --simplify这里opset版本很关键RKNN-Toolkit2目前支持到opset12用更高版本会报错。转换成功后建议用Netron查看网络结构确保最后的Detect层输出正常。接下来是在开发板上转换RKNN格式这里有个大坑必须使用板载NPU的驱动版本匹配的RKNN-Toolkit。以RK3588为例需要rknn-toolkit2版本1.4.0。转换脚本主要修改这几个参数rknn.config( mean_values[[0, 0, 0]], std_values[[255, 255, 255]], quantized_dtypeasymmetric_quantized-8, quantized_algorithmnormal, quantized_methodchannel )量化方式建议选channel比layer精度更高实测在安全帽检测场景能提升3%左右的mAP。4. 板端部署与性能优化模型转换完成后就可以在开发板上部署了。RK3588的NPU性能确实强悍实测yolov5s模型在1080p输入下能跑到35FPS。部署时要注意内存分配建议修改rknn.config中的rknn.config( target_platformrk3588, optimization_level3, core_maskRKNN.NPU_CORE_0_1_2 # 使用三核加速 )对于视频流处理我封装了个高效处理管道使用OpenCV的V4L2后端获取摄像头数据将解码和推理分到不同线程采用双缓冲机制减少等待时间 关键代码片段ret, frame cap.read() if ret: # 前处理 img cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) img letterbox(img, new_shape(640, 640))[0] # 推理 outputs rknn.inference(inputs[img]) # 后处理 boxes non_max_suppression(outputs)性能优化方面有三个实用技巧开启NPU的INT8量化能提升30%速度使用多核并行处理RK3588的3个NPU核心可以负载均衡降低输入分辨率到480p能在保持精度的前提下提升帧率5. 业务场景落地实践在实际部署中单纯检测安全帽往往不够需要结合业务逻辑。我总结了几种常见场景方案工地入口监控方案采用RTSP协议接入网络摄像头检测到未佩戴安全帽时触发声光报警通过MQTT协议上报违规事件到管理平台关键代码if not has_helmet: GPIO.output(BUZZER_PIN, GPIO.HIGH) client.publish(safety/alert, json.dumps(alert_data))移动端巡检系统开发板摄像头模组做成便携设备使用PyQt开发简易UI界面检测结果本地存储并支持4G回传功耗优化到5W以下可电池供电有个容易忽视的问题不同工地安全帽颜色可能代表不同工种这时需要修改模型输出头建议在标注阶段就用不同类别区分。我处理过最复杂的场景需要同时检测安全帽、反光衣、安全带三种防护装备这时建议用yolov5m模型保证精度。6. 常见问题排查指南在项目落地过程中这些坑我基本都踩过模型转换失败现象onnx转rknn时卡死在量化阶段排查检查输入尺寸是否为正方形非正方形输入需要先padding解决在export.py中添加--img参数确保与训练时一致推理结果异常现象检测框全部偏移或尺寸不对排查检查letterbox处理是否与训练时一致解决保持前后处理的归一化方式相同NPU利用率低现象rk3588的NPU负载只有30%排查查看是否启用多核数据传输是否成为瓶颈解决使用rknn.config的core_mask参数激活多核内存泄漏也是常见问题建议在Python代码中加入资源监控import psutil print(fMemory usage: {psutil.Process().memory_info().rss / 1024 / 1024:.2f}MB)最后分享个实用技巧在工地等强光环境下建议在摄像头加装偏振镜能显著减少反光导致的误检。有次项目验收时正午阳光直射检测准确率从95%暴跌到60%后来加了偏振镜才解决问题。
从零到一:在RK3588/RK356x国产开发板上部署YOLOv5安全帽检测模型
1. 环境准备与数据标注在RK3588/RK356x开发板上部署YOLOv5安全帽检测模型第一步需要搞定两件事准备好标注数据和搭建训练环境。先说数据标注安全帽检测属于典型的目标检测任务需要标注每张图片中安全帽的位置和类别。我常用的标注工具是LabelImg它支持Pascal VOC和YOLO格式操作简单适合新手。标注时要注意几点安全帽必须完整出现在画面中才标注多人场景下每个佩戴安全帽的头部都需要单独标注遮挡超过50%的物体建议舍弃。对于没有标注经验的朋友这里分享个偷懒技巧可以使用Roboflow这样的在线平台它提供自动预标注功能能节省80%的标注时间。我去年做工地安全监测项目时用200张标注数据配合它的增强功能最终生成了2000训练样本。数据集目录建议按如下结构组织dataset/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ └── labels/ ├── train/ ├── val/ └── test/2. 模型训练实战技巧拿到标注数据后接下来就是在PC端训练YOLOv5模型。虽然RK3588也能跑训练但效率太低建议还是在NVIDIA显卡上完成。我测试过RTX 3060训练yolov5s模型500张图片训练100轮大约需要2小时。训练时有几个关键配置需要注意首先是修改data/coco128-helmet.yaml文件这个文件相当于项目的地图。我通常会把类别数量nc改为1只检测安全帽然后按7:2:1的比例划分训练集、验证集和测试集。有个坑要注意路径要用绝对路径相对路径在转换时容易出错。然后是train.py的关键参数调整python train.py \ --data data/coco128-helmet.yaml \ --weights yolov5s.pt \ --img 640 \ --batch-size 16 \ --epochs 100 \ --device 0这里img尺寸建议保持640x640太大虽然精度高但会影响板端推理速度。batch-size根据显卡内存调整我的经验是显存占用控制在80%左右最稳定。训练过程中可以用TensorBoard监控指标重点看mAP0.5和损失曲线。3. 模型格式转换详解训练得到的.pt模型需要转换成RKNN格式才能在开发板上运行这个过程我踩过不少坑。首先是转ONNX格式python export.py \ --weights runs/train/exp/weights/best.pt \ --include onnx \ --opset 12 \ --simplify这里opset版本很关键RKNN-Toolkit2目前支持到opset12用更高版本会报错。转换成功后建议用Netron查看网络结构确保最后的Detect层输出正常。接下来是在开发板上转换RKNN格式这里有个大坑必须使用板载NPU的驱动版本匹配的RKNN-Toolkit。以RK3588为例需要rknn-toolkit2版本1.4.0。转换脚本主要修改这几个参数rknn.config( mean_values[[0, 0, 0]], std_values[[255, 255, 255]], quantized_dtypeasymmetric_quantized-8, quantized_algorithmnormal, quantized_methodchannel )量化方式建议选channel比layer精度更高实测在安全帽检测场景能提升3%左右的mAP。4. 板端部署与性能优化模型转换完成后就可以在开发板上部署了。RK3588的NPU性能确实强悍实测yolov5s模型在1080p输入下能跑到35FPS。部署时要注意内存分配建议修改rknn.config中的rknn.config( target_platformrk3588, optimization_level3, core_maskRKNN.NPU_CORE_0_1_2 # 使用三核加速 )对于视频流处理我封装了个高效处理管道使用OpenCV的V4L2后端获取摄像头数据将解码和推理分到不同线程采用双缓冲机制减少等待时间 关键代码片段ret, frame cap.read() if ret: # 前处理 img cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) img letterbox(img, new_shape(640, 640))[0] # 推理 outputs rknn.inference(inputs[img]) # 后处理 boxes non_max_suppression(outputs)性能优化方面有三个实用技巧开启NPU的INT8量化能提升30%速度使用多核并行处理RK3588的3个NPU核心可以负载均衡降低输入分辨率到480p能在保持精度的前提下提升帧率5. 业务场景落地实践在实际部署中单纯检测安全帽往往不够需要结合业务逻辑。我总结了几种常见场景方案工地入口监控方案采用RTSP协议接入网络摄像头检测到未佩戴安全帽时触发声光报警通过MQTT协议上报违规事件到管理平台关键代码if not has_helmet: GPIO.output(BUZZER_PIN, GPIO.HIGH) client.publish(safety/alert, json.dumps(alert_data))移动端巡检系统开发板摄像头模组做成便携设备使用PyQt开发简易UI界面检测结果本地存储并支持4G回传功耗优化到5W以下可电池供电有个容易忽视的问题不同工地安全帽颜色可能代表不同工种这时需要修改模型输出头建议在标注阶段就用不同类别区分。我处理过最复杂的场景需要同时检测安全帽、反光衣、安全带三种防护装备这时建议用yolov5m模型保证精度。6. 常见问题排查指南在项目落地过程中这些坑我基本都踩过模型转换失败现象onnx转rknn时卡死在量化阶段排查检查输入尺寸是否为正方形非正方形输入需要先padding解决在export.py中添加--img参数确保与训练时一致推理结果异常现象检测框全部偏移或尺寸不对排查检查letterbox处理是否与训练时一致解决保持前后处理的归一化方式相同NPU利用率低现象rk3588的NPU负载只有30%排查查看是否启用多核数据传输是否成为瓶颈解决使用rknn.config的core_mask参数激活多核内存泄漏也是常见问题建议在Python代码中加入资源监控import psutil print(fMemory usage: {psutil.Process().memory_info().rss / 1024 / 1024:.2f}MB)最后分享个实用技巧在工地等强光环境下建议在摄像头加装偏振镜能显著减少反光导致的误检。有次项目验收时正午阳光直射检测准确率从95%暴跌到60%后来加了偏振镜才解决问题。