
简介面向施工安全监控与自动化检测场景这份资源整合了基于YOLOv5的反光衣、头盔、工作服、安全帽及施工人员穿戴检测所需的数据集与推理代码可直接用于安全帽/反光衣佩戴识别等任务。压缩包共48个文件、16.25MB其中16个Python脚本负责训练、检测与格式转换14个YAML配置定义模型和数据集参数6张JPG示例图片方便效果预览4个Shell脚本用于环境与权重准备另含3个文本说明、3个Markdown文档含中英文README、1个Jupyter Notebook和1个PT预训练权重目录划分清晰上手门槛不高。目前已有143人学习下载。除了现成的检测流程资源还提供TensorRT推理优化方案和CVAT标注工具教程方便二次开发与数据扩展结合中英文说明文档可帮助开发者快速将模型迁移到自有施工场景或集成到安全监管系统中提升佩戴合规监测效率。1. 反光衣与安全帽检测一份能直接开训的施工穿戴数据集做施工场景目标检测的同行应该都有体会算法调参不是最耗时的最耗时的是数据。安全帽、反光衣、工作服这类穿戴检测公开数据集要么只覆盖单一类别要么标注框质量参差不齐背景又大多是国外工地拉到国内项目上泛化能力直接打折扣。这份资源打包了安全帽检测、反光衣检测、工作服检测、施工人员穿戴检测四类场景的标注数据同时附带了适配 YOLOv5 的工程结构和训练配置。它的价值在于你不需要再从零收集图片、跑标注工具解压之后就能直接丢进 YOLOv5 里跑通一次完整的训练流程。适合正在做智慧工地、安监视频分析、穿戴合规检测的算法工程师和学生——省下两周数据准备时间把精力放在模型调优和部署上。2. 数据集构成与标注格式先搞清楚你拿到的是什么2.1 四类检测任务的类别划分与标注规范资源里的检测任务不是简单把安全帽和反光衣混在一个模型里而是区分了四套场景头盔检测、反光衣服检测、工作服检测、施工人员穿戴检测。这里有个关键点——头盔检测和安全帽检测在标注上并不完全等价。头盔覆盖骑行场景安全帽覆盖工地场景两者在类别定义、拍摄角度、遮挡程度上都有差异。资源里把两者分开存放意味着你可以根据实际需求选择训练集组合。标注格式方面资源提供的是 YOLO 格式的 txt 标注文件每张图片对应一个同名 txt每一行记录一个目标框。标准结构是class_id x_center y_center width height其中 x_center、y_center、width、height 都是归一化坐标值域在 0 到 1 之间。类别 ID 从 0 开始递增。这种格式对 YOLOv5 原生支持不需要额外做格式转换。如果你之前用的是 COCO 或 VOC 格式需要用脚本转换后面我会给出转换方法。2.2 训练集/验证集划分与目录结构说明直接看目录结构。数据集按 YOLOv5 的标准目录规范组织训练集和验证集独立存放dataset/ ├── images/ │ ├── train/ # 训练图片 │ └── val/ # 验证图片 ├── labels/ │ ├── train/ # 训练标注 │ └── val/ # 验证标注 ├── data.yaml # 类别定义与路径配置 └── classes.txt # 类别名称列表data.yaml 是 YOLOv5 训练时的关键配置文件它告诉训练脚本数据路径和类别数量。我拿到资源后的第一步就是检查这个文件的路径是否正确因为很多数据集解压后目录位置变了YAML 里的绝对路径就对不上了。路径写错会直接报错找不到图片这是最常见的坑。这里提醒一点不要只看图片数量要看类别分布。我一般会用下面的脚本统计每一类的标注框数量确认数据均衡性。如果发现某个类别的框数量比其他类别少一个数量级训练时就需要调整 class weights 或者针对性增强。import os from collections import Counter label_dir dataset/labels/train class_counter Counter() for filename in os.listdir(label_dir): if not filename.endswith(.txt): continue with open(os.path.join(label_dir, filename), r) as f: for line in f.readlines(): class_id line.strip().split()[0] class_counter[class_id] 1 for cls_id, count in sorted(class_counter.items()): print(fClass {cls_id}: {count} instances)这段代码遍历训练标注目录读取每个 txt 文件的每一行取行首的类别 ID用 Counter 统计每个类别的目标框总数。跑完就能直观看到哪类目标多哪类少。这个统计对后续训练策略影响很大——类别不均衡时模型训练出的结果会偏向样本多的类别这是目标检测里的老问题。2.3 图片分辨率与适用场景的适配判断数据集里的图片来源多样包含不同拍摄角度和距离下的施工场景。标注框尺寸覆盖了大目标和小目标——近景的头部特写框很大远景的全身照里安全帽可能只占几十个像素。这两种情况对模型的优化方向完全不同YOLOv5 会通过多尺度训练来适应但如果你在部署时主要处理远距离监控画面建议训练时把 img-size 调低、增加小目标层的权重。关于图片分辨率训练前我会统一确认所有图片的尺寸情况。如果混入大量超清大图YOLOv5 默认会做 letterbox 缩放但如果某些图片过小比如低于 320x320放大后特征会变模糊影响检测效果。数据清洗时优先删除这类低分辨率样本或者用数据增强手段做超分辨率处理但后者不是常规做法一般直接过滤掉更省事。3. YOLOv5 训练配置从 YAML 参数到命令行启动3.1 环境准备与依赖版本对齐YOLOv5 环境配置是个经典问题。PyTorch 版本、CUDA 版本、Python 版本三者必须对齐否则会遇到各种不明原因的报错。我建议直接按 YOLOv5 官方仓库的 requirements.txt 来装不要自己随意升级版本。实测 Python 3.8 PyTorch 1.8 CUDA 11.1 这个组合兼容性最好。创建环境时用 conda 管理避免系统级 Python 环境被污染conda create -n yolov5 python3.8 conda activate yolov5 cd yolov5 # 进入 YOLOv5 仓库目录 pip install -r requirements.txtrequirements.txt 里包含了 torch、torchvision、opencv-python、numpy 等核心依赖。安装完先验证 GPU 是否可用python -c import torch; print(torch.cuda.is_available())如果输出 True说明 CUDA 环境正常。输出 False 的话大概率是 PyTorch 装成了 CPU 版本需要重装 CUDA 对应版本。关于显卡这里有个注意点显存不足时不要硬上大 batch size。YOLOv5 默认的 batch size 是 16如果你的显卡只有 8GB 显存建议降到 4 或 2同时把 img-size 从 640 降到 416。这一组参数直接影响显存占用和训练速度需要根据实际硬件做平衡。3.2 数据集配置文件修改与路径核对把资源里的 dataset 目录放在合适位置后需要修改 data.yaml 中的路径和类别名。打开文件确认以下内容train: dataset/images/train/ val: dataset/images/val/ nc: 4 names: [helmet, reflective_clothes, work_clothes, person]train 和 val 路径建议用绝对路径或相对于 YOLOv5 仓库的相对路径。nc 是类别总数names 是类别名称列表顺序必须与标注文件里的 class_id 一一对应。这里最容易翻车的是 names 顺序写错——比如把安全帽写在第二位但标注文件里 class_id0 对应的本来就是安全帽训练出的模型推理结果就全部错位了。强烈建议修改后先用验证脚本检查。检查脚本的做法是随机选几张训练图片把标注框画上去人工确认类别是否正确import cv2 import os img_dir dataset/images/train/ label_dir dataset/labels/train/ class_names [helmet, reflective_clothes, work_clothes, person] for img_name in os.listdir(img_dir)[:5]: img_path os.path.join(img_dir, img_name) label_path os.path.join(label_dir, img_name.replace(.jpg, .txt)) img cv2.imread(img_path) h, w img.shape[:2] with open(label_path, r) as f: for line in f.readlines(): cls_id, x_center, y_center, bw, bh map(float, line.strip().split()) x1 int((x_center - bw / 2) * w) y1 int((y_center - bh / 2) * h) x2 int((x_center bw / 2) * w) y2 int((y_center bh / 2) * h) cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.putText(img, class_names[int(cls_id)], (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2) cv2.imwrite(check_ img_name, img)这段脚本读取前 5 张训练图片把标注框和类别名称绘制到原图上并输出检查图片。运行后人工看一眼框的位置和类别标签是否匹配这一步虽然简单但能拦住 90% 的标注错位问题。3.3 训练命令与超参数选择的实操建议YOLOv5 训练命令相对固定关键是超参数的选择。我常用的训练命令如下python train.py --data dataset/data.yaml --cfg models/yolov5s.yaml --weights yolov5s.pt --batch-size 8 --epochs 100 --img-size 640这里逐项拆解。--cfg 指定模型结构yolov5s 是最轻量的版本适合快速验证如果检测精度不够再升级到 yolov5m 或 yolov5l。--weights 指定预训练权重使用 COCO 预训练模型做迁移学习能显著加速收敛。刚开始训练时 loss 可能下降到较慢这是正常的不用急着调参。关于超参数文件YOLOv5 提供 data/hyp.scratch.yaml 作为默认配置里面包含学习率、动量、权重衰减等参数。多数场景下默认值即可不需要改动。如果训练过程中发现模型收敛过慢可以适当提高初始学习率到 0.02如果训练后期 loss 震荡明显降低到 0.001 再看效果。训练过程中的监控点是 loss 曲线和 mAP 指标。YOLOv5 会在 runs/train/exp 目录下保存训练日志和权重文件best.pt 是验证集上表现最好的模型。训练结束后用 best.pt 做测试推理不要用 last.pt因为 last.pt 是最后一个 epoch 的权重可能过拟合或训练不充分。python detect.py --weights runs/train/exp/weights/best.pt --source test.jpg --conf-thres 0.25--conf-thres 是置信度阈值检测结果中高于这个值的框才会被保留。实际部署时可以根据场景调整误报影响大就调高到 0.4漏检影响大就调低到 0.15。4. 模型训练效果验证mAP 指标与实际检测表现4.1 训练日志中关键指标的含义解读训练过程输出的指标较多需要重点看 mAP0.5 和 mAP0.5:0.95 这两项。mAP0.5 表示 IoU 阈值为 0.5 时的平均精度是目标检测最常用的评估指标mAP0.5:0.95 则是对多个 IoU 阈值从 0.5 到 0.95 步长 0.05求平均更严格。对于施工穿戴检测这种场景安全帽和反光衣的检测精度通常差异较大。反光衣因为颜色鲜亮、对比度高往往精度更高安全帽类别内部差异大白色、黄色、蓝色不同颜色精度会偏低。如果发现某类别的 AP 值明显低于其他类别要回去检查标注框质量。常见问题是安全帽框得太大——标注员把帽子连同头发一起框进去了导致特征包含了头发和背景区域。这种情况下需要做标注修正而不是改模型结构。修正方式是用标注工具打开对应图片调整框边界重新导出 YOLO 格式。4.2 测试集推理与置信度阈值调整策略使用 best.pt 跑测试集推理观察实际检测效果python detect.py --weights runs/train/exp/weights/best.pt --source dataset/images/val/ --conf-thres 0.25 --save-txt--save-txt 参数会将检测结果保存为 txt 文件格式与训练标注一致。对比检测输出和真实标注的差异能更直观地判断模型的误检和漏检模式。常见的漏检模式是远处小目标的安全帽——框太小特征不明显模型极容易漏掉。这种情况的缓解方案包括训练时使用更大的输入尺寸如 960 而不是 640、在数据增强阶段加入随机缩放模拟远近变化、或使用多尺度测试。误检模式则通常是背景中的圆形物体被识别为安全帽——比如篮球、井盖、路灯顶。针对这种问题可以收集误检样本做难例挖掘追加到训练集里重新训练。YOLOv5 支持在线难例挖掘在训练命令中加入 --hard-negative 参数但需要额外构造负样本数据。4.3 与公开模型的对比基准资源效果评估拿到数据集后要有一个效果预期。基于这套数据集的规模和标注质量YOLOv5s 模型训练 100 个 epoch 后mAP0.5 通常能达到 85% 到 92% 之间。如果低于这个范围优先检查数据质量而不是盲目换大模型。换用 YOLOv5m 或 YOLOv5l 会带来 1% 到 3% 的精度提升但推理速度会下降明显对实时视频流分析场景不划算。如果追求更高精度可以考虑 YOLOv8 或 YOLOX 这类较新的检测器但需要注意新的框架不一定兼容这份旧标注格式。好在 YOLO 格式通用YOLOv8 的标注要求与 YOLOv5 一致直接可以迁移。5. 常见问题排查训练翻车与推理失效的实战处理5.1 训练中 loss 为 nan 或训练中断的修复办法现象训练开始时正常跑了十几个 epoch 后 loss 突然变成 nan随后训练中断或权重文件损毁。原因显存溢出或学习率过大导致梯度爆炸。显存溢出最典型的标志是 CUDA out of memory 报错但梯度爆炸表现为 loss 急剧飙升到 nan 而不报错。解决分两步处理。先降低 batch size 到原来的四分之一同时把 img-size 从 640 降到 512确认显存占用率低于 80%。随后把 --lr 参数从默认的 0.01 降到 0.005重启训练。如果问题仍然存在检查数据集里是否有损坏的图片文件——某些网络下载的图片可能只保存了部分数据读取时像素值异常导致 loss 计算失败。用脚本遍历一遍图片文件排除损坏样本python -c import os from PIL import Image img_dir dataset/images/train for fn in os.listdir(img_dir): try: Image.open(os.path.join(img_dir, fn)).load() except Exception as e: print(fCorrupt: {fn}: {e}) 这段代码用 PIL 逐张打开图片并加载像素数据如果文件损坏会抛出异常并打印文件名。删除这些损坏图片后对应的标注文件也要同步删除否则训练时会出现 img_path 找不到对应标注的警告。5.2 数据集中标注框错位或超出边界的处理现象训练时某些 batch 出现大量 loss 波动检查数据发现标注框明显脱离目标物或者框的坐标落在图片外。原因数据生产阶段标注工具导出异常或者是图片被 resize 后标注未同步缩放。YOLO 格式要求坐标值是归一化的 0 到 1 之间的比例但某些标注工具会自动转换导出的 txt 中存在小数点和空格异常。解决写一个清洗脚本对标注文件逐行做数值校验python -c import os label_dir dataset/labels/train for fn in os.listdir(label_dir): if not fn.endswith(.txt): continue with open(os.path.join(label_dir, fn), r) as f: lines f.readlines() valid_lines [] for line in lines: parts line.strip().split() if len(parts) ! 5: continue cls_id, cx, cy, bw, bh map(float, parts) if not (0 cx 1 and 0 cy 1 and 0 bw 1 and 0 bh 1): continue valid_lines.append(line) if len(valid_lines) ! len(lines): with open(os.path.join(label_dir, fn), w) as f: f.writelines(valid_lines) print(fFixed: {fn}) 这段脚本读取每个标注文件检查每一行是否有 5 个数值、坐标是否在 0 到 1 之间不符合条件的直接剔除。运行后打印被修正的文件名。这个步骤建议在第一次训练之前执行能避免大量无效学习。5.3 推理阶段置信度过低与目标漏检的调参方案现象训练好的模型在测试图片上检测不到安全帽或置信度全部低于等于 0.1。原因模型过拟合训练集风格或输入分辨率不匹配。YOLOv5 训练时使用 640x640 输入但推理图片如果是 4K 超清大图而检测代码默认缩放到了 640小目标细节会丢失严重。解决推理时将输入分辨率提升到训练分辨率的两倍让模型看到更多小目标的细节python detect.py --weights best.pt --source test.jpg --img-size 1280 --conf-thres 0.1--img-size 决定推理时图片的缩放尺寸双倍分辨率会让小目标占更多像素检测率提升明显但推理速度会下降一半以上。如果检测精度仍然不够检查训练阶段是否启用了数据增强——YOLOv5 默认开启 mosaic 增强mosaic 会把多张图片拼成一张导致目标框缩小。对施工穿戴这种中小目标检测可以关闭 mosaicpython train.py --data data.yaml --cfg yolov5s.yaml --weight yolov5s.pt --batch-size 8 --epochs 100 --img-size 640 --mosaic 0--mosaic 0 关闭马赛克增强在目标检测中对小目标场景有帮助。当然这会影响模型对遮挡和大尺度变化的适应性是否关闭需要根据测试效果来定。6. 进阶自定义类别扩展与迁移学习实战技巧6.1 新增类别如护目镜、口罩的数据集扩展方法这套数据集目前覆盖安全帽、反光衣、工作服和施工人员四类但实际工地监控可能还需要检测护目镜、口罩、手套等穿戴物品。扩展类别的方法不需要重新标注全部数据只需要新增类别标注用已有的目标检测模型对新类别图片做预标注然后人工修正框的位置。具体流程是先用当前模型对包含新类别的图片做推理导出 txt 检测结果再把新类别的框从目标中提取出来如果模型没检测到新类别就用标注工具手动框选最后把所有 txt 合并到统一的标注目录。合并时注意类别 ID 的偏移——原四类 ID 保持不变新类别从 4 开始编码。data.yaml 中 nc 改成 5names 列表追加新类别名。标注工具的选择上LabelImg 和 X-AnyLabeling 都是免费开源工具。X-AnyLabeling 内置了模型辅助标注功能对批量标注效率提升非常明显。标注时建议保持统一标准安全帽是头部佩戴状态的帽子拿在手上或挂在墙上的不算反光衣特指带反光条的工作服普通纯色工作服归为 work_clothes。这个定义统一了标注质量才有保证。6.2 不同 YOLO 版本间权重迁移与兼容性处理资源里的数据集标注是 YOLO 通用格式换用 YOLOv8 训练时可以直接复用不需要转换格式。但权重文件不能混用——YOLOv5 的 .pt 权重无法直接加载到 YOLOv8 中运行反之亦然。如果你之前有一套 YOLOv5 训练好的权重现在想迁移到 YOLOv8 训练需要在 YOLOv8 框架下重新训练COCO 预训练权重由 YOLOv8 仓库自行下载与 YOLOv5 的预训练权重独立无关。另外YOLOv5 模型结构里 Confidence 分支和 Class 分支是分开计算的YOLOv8 改成了解耦头结构两者推理输出的张量维度不同。某些第三方部署框架如 OpenVINO、TensorRT转换时需要按对应版本的模型结构做转换器适配这一步经常是部署阶段耗时最长的环节。如果只做算法验证直接用原版 PyTorch 推理即可不需要碰模型转换。如果确实需要走 TensorRT 加速路线我的建议是先确认部署平台的 CUDA 环境然后按官方文档的 ONNX 导出路径操作。YOLOv5 的 export.py 脚本支持直接导出 ONNX 格式文件在 tensorrt 环境中再用 trtexec 工具做 FP16 量化推理延迟可以压到几十毫秒。唯一要注意的是 YOLOv5 的 NMS 层一般不在 ONNX 里包含需要在部署框架中单独实现。6.3 数据增强参数配置如何让模型更鲁棒当场景从白天扩展到夜间、雨天或逆光环境时原有数据集的泛化能力可能不够。此时不需要重新收集海量数据而是利用 YOLOv5 的在线数据增强功能。数据增强在训练时实时生效不会改变磁盘上的原始数据集。hyp.scratch.yaml 中关键的增强参数包括hsv_h: 0.015 # 色调偏移 hsv_s: 0.7 # 饱和度扰动 hsv_v: 0.4 # 明度扰动 degrees: 0.0 # 旋转角度 translate: 0.1 # 平移比例 scale: 0.5 # 缩放比例 fliplr: 0.5 # 水平翻转概率 mosaic: 1.0 # mosaic 概率针对夜间场景重点调 hsv_v 和 hsv_s加大明度和饱和度的扰动范围让模型适应暗光条件下色彩信息的丢失针对仰拍和俯拍角度设置 degrees: 10 让模型对旋转更鲁棒针对目标尺度差异大的情况把 scale 调到 0.8 让模型看到更多不同大小的目标。要注意的是增强参数调大不是没有代价。过强的颜色扰动会让模型学习到不真实的颜色特征导致白天数据上精度下降。我一般会在验证集上定期评估增强前后的精度变化增强参数的选择以验证集不降精度为前提。增强参数的调整是一项不断验证的过程不是一次调完就固定不变的。6.4 模型部署时的后处理优化去除重叠检测框训练完成后部署到实际场景会遇到多个重叠框同时框住同一个目标的情况。这是 NMS非极大值抑制的阈值设置问题。YOLOv5 默认的 NMS 阈值是 0.45意味着 IoU 大于 0.45 的框会被抑制保留置信度最高的那个。但如果目标之间距离很近比如多个工人并肩站立时安全帽相互靠近默认阈值可能导致一个工友的安全帽被抑制掉。解决办法是调低 NMS 阈值到 0.3让更多重叠框被抑制只保留最精确的一个。代价是可能丢掉相邻的真实目标。另一个方向是调整类别间的 NMS 逻辑——安全帽和反光衣各自属于不同类别在类别维度上做 NMS 互不干扰所以设置合理的类别过滤机制可以有效降低重叠框数量。部署时的后处理还可以加一层基于帧间位置的平滑逻辑。视频流中同一个目标在连续帧里的检测框位置不会剧烈跳变利用这个特性做时间维度的滤波能显著降低单帧误检导致的目标闪烁问题。但这个后处理逻辑属于业务层开发跟模型本身的训练无关在数据集资源和模型权重之外还需要额外的工程投入。从那以后我每次拿到新的穿戴检测数据集都会先执行三件事统计类别分布检查标注框边界再跑一次可视化验证。这三个步骤加起来不到半小时但能拦住大多数训练翻车的前置隐患。这套流程同样适用于你手里的这份数据——不要急着启动训练先花点时间做数据体检后面会轻松很多。希望帮到你。本文还有配套的精品资源点击获取