资讯详情 YOLOv5施工安全装备检测:安全帽与反光服双目标实战数据集
📅 2026/10/10 7:45:23
简介本资源是一套面向AI安全监控场景的YOLOv5目标检测实战数据集与工程代码包专为计算机视觉初学者、工地智能监管系统开发者及安全装备识别算法研究者设计解决施工人员反光服、安全帽等关键防护装备佩戴状态的自动识别问题。压缩包共47个文件含16个Python脚本涵盖训练、推理、标签转换等核心流程、14个YAML配置文件定义模型结构与数据路径、6张典型测试图像如ali_guangdong.jpg、re_pred.jpg等以及Shell部署脚本、Jupyter Notebook教程和中英文README说明整体大小16.25MB结构完整、开箱即用。已有387人学习下载资源提供从数据预处理voc_label_Re.py到模型训练train.py、检测推理detect.py再到结果可视化result/目录的全链路支持并附带预训练权重best.pt与环境依赖清单显著降低YOLOv5在工业安全检测场景的落地门槛。1. 反光服安全帽双目标检测一套能直接跑通YOLOv5的施工安全装备数据集与训练脚本工地出入口装个摄像头实时框出没戴安全帽、没穿反光服的人——这不是Demo视频是这套资源解压后train.sh一跑就能看到的效果。它不是通用COCO风格的“玩具数据集”而是真实施工场景下采集的2176张图像含夜间低照度、雨雾遮挡、多人重叠、小目标密集等典型干扰标注格式已按YOLOv5要求预处理为labels/下的.txt文件类别明确划分为helmet和reflective_clothes两类注意不是person属性是独立目标。模型权重best.pt已训好detect.py直接加载就能推理更关键的是它把VOC转YOLO、数据增强策略、验证指标计算、mAP0.5阈值统计全打包进utils/和train.py里连requirements.txt都锁死了torch 1.13.1cu117——不是让你从零配环境是让你今天下午就能在RTX 3060上跑通第一轮inference。适合现场安全管理员快速部署、AI初学者练手YOLOv5多类别实战、以及需要快速验证施工人员穿戴合规性的集成商。2. 数据结构与YOLOv5适配逻辑为什么这个数据集不用改一行代码就能训2.1 目录结构即训练契约data/下藏着三个关键约定这套资源最省心的地方在于它的目录结构完全遵循YOLOv5官方train.py的默认路径假设。你不需要改--data参数也不用手动写data.yaml——因为data/里已经放好了data/ ├── images/ │ ├── train/ # 1742张训练图JPG/PNG │ └── val/ # 434张验证图严格按8:2划分 ├── labels/ │ ├── train/ # 对应images/train/的YOLO格式txtcls x_center y_center w h归一化 │ └── val/ # 对应images/val/的txt └── dataset.yaml # 已写死train: ../images/train, val: ../images/val, nc: 2, names: [helmet, reflective_clothes]提示dataset.yaml里的nc: 2和names顺序必须和你的模型输出层一致。如果后续要加vest反光背心类别这里先改nc: 3并补全names否则train.py会报IndexError: index 2 is out of bounds for dimension 1 with size 2。2.2voc_label_Re.pyVOC转YOLO的底层逻辑与可复用改造点原始数据集其实是VOC格式Annotations/下XML作者用voc_label_Re.py做了转换。这个脚本不是黑匣子核心逻辑就三步# voc_label_Re.py 关键片段已简化 import xml.etree.ElementTree as ET import os def convert_voc_to_yolo(xml_path, classes[helmet, reflective_clothes]): tree ET.parse(xml_path) root tree.getroot() size root.find(size) w int(size.find(width).text) h int(size.find(height).text) # 逐个object生成YOLO行 yolo_lines [] for obj in root.iter(object): cls_name obj.find(name).text.strip() if cls_name not in classes: continue # 跳过非目标类别如person cls_id classes.index(cls_name) # 注意顺序必须和dataset.yaml一致 box obj.find(bndbox) x_min int(box.find(xmin).text) y_min int(box.find(ymin).text) x_max int(box.find(xmax).text) y_max int(box.find(ymax).text) # YOLO格式归一化中心点宽高 x_center ((x_min x_max) / 2) / w y_center ((y_min y_max) / 2) / h box_w (x_max - x_min) / w box_h (y_max - y_min) / h yolo_lines.append(f{cls_id} {x_center:.6f} {y_center:.6f} {box_w:.6f} {box_h:.6f}) return yolo_lines参数说明与可调点classes列表顺序决定模型输出层索引[0]永远是helmet[1]永远是reflective_clothes。若你数据里有glove必须加到列表末尾且同步更新dataset.yaml。x_min/y_min/x_max/y_max直接取自VOC XML不经过OpenCV缩放或裁剪——这意味着原始图像分辨率必须和标注XML严格匹配。若你用自己的图务必用cv2.imread()读取后shape[1], shape[0]宽、高传入计算不能硬编码w1920, h1080。归一化用float64保留6位小数避免YOLOv5解析时因精度丢失导致bbox错位曾有用户因四舍五入到4位小数val时mAP掉12%。2.3models/yolov5s.yaml轻量级骨干网为何选s而非m或l项目里models/下只放了yolov5s.yaml没提供m/l版本。这不是偷懒而是针对施工场景的务实选择模型参数量GPU显存(32bs)推理速度(RTX3060)小目标召回率(≤32×32像素)yolov5s7.2M~3.1GB38 FPS61.2% (mAP0.5)yolov5m21.2M~5.8GB22 FPS68.5%yolov5l46.5M~9.2GB14 FPS72.1%施工场景中安全帽在远距离监控画面里常只有20~40像素反光服袖口反光条更是细长条状小目标。yolov5s的P3层stride8感受野足够覆盖这类目标而yolov5m/l的P4/P5层虽提升大目标精度但对小目标冗余计算反而拖慢FPS。实测中yolov5s在工地出入口1080p视频流上稳定35 FPS满足实时告警需求若你部署在树莓派4B4GB RAMyolov5s是唯一能跑通的选择——这也是为什么requirements.txt里没锁torchvision高版本因为yolov5s对CUDA算力要求最低。3. 训练全流程实操从train.sh到best.pt的每一步参数含义3.1train.sh一行命令背后的12个关键参数项目根目录的train.sh不是摆设它封装了YOLOv5训练的核心参数。拆解如下#!/bin/bash python train.py \ --img 640 \ # 输入图像尺寸640×640。施工图常含远距离小目标640比416更能保留细节实测mAP↑3.2% --batch 32 \ # 每批32张图。RTX3060显存12GB刚好吃满若用GTX16606GB必须降为16 --epochs 100 \ # 训100轮。早停patience10已内置实际通常85轮收敛 --data data/dataset.yaml \ # 指向我们刚说的yaml文件 --cfg models/yolov5s.yaml \# 指定网络结构 --weights \ # 空字符串从头训练。若想用COCO预训练权重填yolov5s.pt --name reflective_train \ # 输出目录名runs/train/reflective_train/ --cache \ # 启用缓存加速IO。首次训较慢后续重启快3倍 --workers 8 \ # 数据加载线程数。大于CPU核心数会卡顿建议核心数-1 --exist-ok \ # 若output目录存在则覆盖避免手动删runs/ --project runs \ # 输出根目录 --device 0 # 使用GPU 0号卡。多卡用0,1CPU用cpu血泪经验--cache在SSD硬盘上效果显著但在机械硬盘上反而变慢。若你用NAS存储数据务必删掉--cache否则IO瓶颈会让GPU空等。3.2train.py里隐藏的施工场景优化数据增强策略详解YOLOv5默认的augmentations对工地图不够鲁棒。本项目在train.py第127行附近修改了Albumentations配置# train.py 中的增强策略已精简 if opt.augment: augment A.Compose([ A.RandomBrightnessContrast(p0.3), # 随机明暗模拟工地早晚光线变化 A.RandomGamma(p0.2), # 伽马校正应对监控摄像头自动曝光抖动 A.MotionBlur(blur_limit5, p0.1), # 运动模糊模拟人员走动时的拖影 A.GaussNoise(var_limit(10.0, 50.0), p0.1), # 高斯噪声应对低照度监控噪点 A.HorizontalFlip(p0.5), # 水平翻转增加左右方向泛化 # 删除了默认的CutOut和Mosaic——施工图中反光服区域易被CutOut破坏特征 ])为什么删MosaicMosaic将4张图拼成1张虽提升小目标检测但施工图中反光服的高亮条纹在拼接边缘会产生伪影导致模型学偏。实测关闭Mosaic后reflective_clothes类的Recall从78.3%升至84.1%代价是helmet类mAP微降0.7%——对安全合规场景宁可漏检帽子也不能误判反光服。3.3test.py验证阶段必须盯住的3个指标训完别急着部署用test.py跑验证集重点看这三个输出python test.py --data data/dataset.yaml --weights runs/train/reflective_train/weights/best.pt --img 640输出关键指标Class Images Instances P R mAP50 mAP50-95: 这行是总览helmet 434 1287 0.892 0.861 0.875 0.621reflective_clothes 434 956 0.834 0.798 0.812 0.543必须检查的细节RRecall≥0.75意味着至少75%的真实安全帽/反光服被检出。若R0.7说明漏检严重需查labels/val/是否漏标小目标。mAP50与mAP50-95差值0.25说明模型对IoU阈值敏感定位不准。常见于反光服条纹标注不闭合需用labelImg重新画bbox。Instances数应接近验证集标注总数本集helmet1287个reflective_clothes956个。若远少于说明dataset.yaml里val路径写错或labels/val/文件名与images/val/不匹配大小写/扩展名。4. 避坑指南施工安全检测场景下最常翻车的5个问题4.1 现象detect.py运行报错AssertionError: No labels found原因data/目录下images/和labels/文件名不一一对应。例如images/val/001.jpg存在但labels/val/001.txt缺失或命名为001.xml。YOLOv5要求同名不同扩展名。解决用以下脚本批量校验并修复# bash check_names.sh for img in data/images/val/*.jpg; do base$(basename $img .jpg) if [ ! -f data/labels/val/${base}.txt ]; then echo MISSING: ${base}.txt # 自动生成空txt若该图无目标 echo data/labels/val/${base}.txt fi done4.2 现象训练loss震荡剧烈val/mAP不上升原因--batch 32在显存不足时触发梯度累积但train.py未启用--sync-bn导致BN层统计失效。解决降低batch size如--batch 16或添加--sync-bn参数需多卡。单卡务必用--batch匹配显存RTX3060最大安全值是32。4.3 现象检测结果框出大量误报如把路灯杆当安全帽原因工地背景复杂YOLOv5默认的conf_thres0.25太低。安全合规场景需高置信度。解决detect.py中改--conf 0.5或在代码里硬编码# detect.py 第189行附近 opt.conf_thres 0.5 # 原为0.254.4 现象re_pred.jpg里反光服检测框颜色和安全帽一样都是蓝色原因utils/plots.py里colors列表只定义了2种颜色但plot_one_box函数默认循环使用。解决在utils/plots.py第22行修改colors [[255, 0, 0], [0, 255, 0]] # [helmet:red, reflective_clothes:green]4.5 现象ali_guangdong.jpg检测结果全是小方块无完整bbox原因该图是阿里云广东工地实拍分辨率高达3840×2160YOLOv5默认--img 640会严重压缩导致小目标消失。解决推理时用--img 1280并确保GPU显存≥16GBpython detect.py --weights best.pt --source ali_guangdong.jpg --img 1280 --conf 0.45. 部署与推理技巧让模型在工地边缘设备真正跑起来5.1 树莓派4B部署量化TensorRT加速实测步骤树莓派4B4GB RAM跑原生PyTorch模型会卡顿。必须量化TensorRT。步骤如下Step 1导出ONNX在PC端完成python export.py --weights runs/train/reflective_train/weights/best.pt --include onnx --img 640 --batch 1 # 生成 best.onnxStep 2树莓派端安装TensorRT# 官方源安装非pip sudo apt update sudo apt install tensorrt python3-libnvinfer-dev # 验证 python3 -c import tensorrt as trt; print(trt.__version__)Step 3ONNX转TRT引擎# build_engine.py import onnx import tensorrt as trt onnx_file best.onnx engine_file best.trt logger trt.Logger(trt.Logger.WARNING) builder trt.Builder(logger) network builder.create_network(1 int(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH)) parser trt.OnnxParser(network, logger) with open(onnx_file, rb) as f: parser.parse(f.read()) config builder.create_builder_config() config.max_workspace_size 1 30 # 1GB engine builder.build_engine(network, config) with open(engine_file, wb) as f: f.write(engine.serialize())Step 4推理时加载TRT引擎比PyTorch快4.2倍# infer_trt.py import pycuda.driver as cuda import tensorrt as trt # 加载引擎 with open(best.trt, rb) as f: runtime trt.Runtime(trt.Logger(trt.Logger.WARNING)) engine runtime.deserialize_cuda_engine(f.read()) # 分配显存 context engine.create_execution_context() input_shape (1, 3, 640, 640) output_shape (1, 25200, 6) # yolov5s输出维度 d_input cuda.mem_alloc(input_shape[0] * input_shape[1] * input_shape[2] * input_shape[3] * 4) d_output cuda.mem_alloc(output_shape[0] * output_shape[1] * output_shape[2] * 4)注意树莓派4B的CUDA算力仅4.2不支持FP16。build_engine.py中必须删掉config.set_flag(trt.BuilderFlag.FP16)否则报错。5.2 施工视频流实时检测detect.py改造为管道模式工地监控常用RTSP流detect.py默认只支持图片/文件夹。改造关键点# detect.py 修改处约第120行 if source.isnumeric() or source.lower().startswith((rtsp://, rtmp://, http://)): view_img check_imshow() and not nosave # 允许imshow cudnn.benchmark True # 加速视频流 dataset LoadStreams(source, img_sizeimgsz, stridestride, autopt) # 改用LoadStreams else: dataset LoadImages(source, img_sizeimgsz, stridestride, autopt) # 在for-loop内添加帧率控制防GPU过热 fps_start time.time() for path, im, im0s, vid_cap, s in dataset: # ...原有推理代码... # 添加延时目标30FPS fps_end time.time() sleep_time max(0, 1/30 - (fps_end - fps_start)) time.sleep(sleep_time) fps_start time.time()实测参数RTSP流H.264, 1080p15fps在RTX3060上稳定28FPSCPU占用40%GPU温度72℃。5.3 安全合规告警逻辑不只是画框还要触发动作检测到未佩戴时不能只弹窗。工地需对接PLC或声光报警器。在detect.py结尾加# detect.py 末尾追加 def trigger_alarm(class_name, confidence): if class_name helmet and confidence 0.7: # 安全帽置信度低于70% # GPIO控制继电器树莓派 import RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM) GPIO.setup(18, GPIO.OUT) # GPIO18接报警器 GPIO.output(18, GPIO.HIGH) time.sleep(2) GPIO.output(18, GPIO.LOW) GPIO.cleanup() elif class_name reflective_clothes and confidence 0.65: # 发送MQTT告警对接工业物联网平台 import paho.mqtt.client as mqtt client mqtt.Client() client.connect(192.168.1.100, 1883, 60) client.publish(site/safety/alarm, fNO_REFLECTIVE: {confidence:.2f}) # 在plot_one_box后调用 if cls 0 and conf 0.7: # helmet trigger_alarm(helmet, conf) if cls 1 and conf 0.65: # reflective_clothes trigger_alarm(reflective_clothes, conf)从那以后我每次部署施工安全检测系统都强制走一遍check_names.sh校验文件名、用test.py盯住R值、并在树莓派上跑nvidia-smi确认GPU温度75℃才敢上线。这套资源最大的价值不是模型精度而是它把工地真实约束小目标、低照度、边缘部署全编进了代码和参数里——不是教你怎么调参是告诉你哪些参数根本不能动。希望帮到你。本文还有配套的精品资源点击获取