
简介本资源为面向目标检测学习者的YOLO安全帽与手套检测数据集适用于工地安全监控、工业场景违规穿戴识别等实际项目也适合作为课程设计、毕业设计或算法练手的训练素材。压缩包共约2000个文件以1987个xml标注文件为主另含少量txt列表、html教程与py脚本整体约421MB涵盖真实场景采集的高质量图片标注框由labelimg完成质量较高。数据同时提供voc、coco和yolo三种格式标签分别存放于不同文件夹可直接接入YOLO系列模型训练。资源还附赠数据集划分脚本可按需生成训练集、验证集与测试集并配有环境搭建与训练教程帮助读者快速跑通从数据准备到模型训练的完整流程。目前已有331人学习下载适合希望快速获得规范标注数据、减少数据清洗成本的中初级检测任务开发者。1. 从一张工地抓拍说起这套安全帽手套检测数据集到底能干什么工地入口的摄像头抓拍一张图画面里十几号人有人戴了安全帽有人没戴有人手上套着劳保手套有人光着手。要把这些目标一个个框出来、分好类靠人眼盯屏幕是不现实的得靠目标检测模型。而模型能不能训出来八成取决于你手里有没有一批标注质量过关、格式对得上、场景够杂的数据。这套 YOLO 安全帽手套检测数据集就是冲着这个需求来的5000 张真实场景图片用 labelImg 标注同时给了 VOC 的 xml、COCO 的 json、YOLO 的 txt 三种标签格式还配了训练教程和划分脚本。它适合两类人——一类是刚接触 YOLO、想拿一个完整数据集跑通训练流程的新手另一类是手头有工地、厂区安防项目需要快速验证检测方案可行性的从业者。下面我按自己拆包复现的顺序把这份资源从结构到落地讲清楚。2. 拆开压缩包先看什么三种标签格式与目录结构拿到一个数据集压缩包我一般不会急着跑训练先把目录结构和标签格式摸清楚。因为格式对不上后面训练脚本报的错会让你怀疑人生。这套资源的核心价值之一就是它把 VOC、COCO、YOLO 三种格式都备齐了省掉了自己写转换脚本的功夫。2.1 三种标签格式的差异与选用理由VOC 格式是每张图对应一个 xml 文件里面用object节点记录每个目标的类别名和边界框的左上角、右下角坐标。它的可读性最好用文本编辑器打开就能看懂labelImg 默认就存这个格式。COCO 格式是一个大的 json 文件把所有图片的标注信息集中管理包含 images、annotations、categories 三个主键坐标是左上角 x、y 加宽高。YOLO 格式则是每张图一个 txt每行一个目标格式是类别索引 中心x 中心y 宽 高而且这些值全部归一化到 0 到 1 之间。为什么三种都要留因为不同训练框架吃不同格式。YOLOv5、YOLOv8 官方训练脚本默认读 YOLO 格式的 txt有些老项目或者 mmdetection 系的工作流更习惯 COCO json而 VOC xml 是标注和二次转换的中间态最通用。这份资源把三种都给了意味着你不管走哪条技术路线都不用回头重新标注。格式文件形态坐标表示典型用途VOC每图一个 xml左上右下绝对像素labelImg 标注、格式转换源COCO单个 json左上角加宽高绝对像素mmdetection、COCO 系评估YOLO每图一个 txt中心点加宽高归一化YOLOv5/v8 直接训练2.2 目录结构核对与文件完整性检查解压之后先确认图片和标签是不是一一对应。常见做法是图片放images或JPEGImages标签放labels或Annotations然后按训练集、验证集、测试集分文件夹。这套资源里带了划分脚本说明原始数据大概率是混在一起的需要你自己跑脚本切分。核对完整性我一般用一段 Python 快速过一遍看有没有图片缺标签、标签缺图片的情况import os img_dir images # 图片目录 label_dir labels # YOLO 标签目录 imgs {os.path.splitext(f)[0] for f in os.listdir(img_dir) if f.endswith((.jpg, .png))} labels {os.path.splitext(f)[0] for f in os.listdir(label_dir) if f.endswith(.txt)} only_img imgs - labels # 有图无标签 only_label labels - imgs # 有标签无图 print(图片总数:, len(imgs)) print(标签总数:, len(labels)) print(有图无标签:, len(only_img), list(only_img)[:5]) print(有标签无图:, len(only_label), list(only_label)[:5])这段代码的逻辑很直白把图片文件名和标签文件名各自去掉扩展名做成两个集合然后做差集。only_img非空说明有图片没标注训练时这些图会被当成背景或者直接报错only_label非空说明有孤立的标签文件通常是删图时忘了删标签。参数上唯一要注意的是扩展名如果你的图片是.jpeg或者.bmp得把endswith里的判断补全。跑完这一步心里就有底了。提示如果差集数量超过总数的百分之五建议先别训练回头查一下是不是解压不完整或者目录指错了。3. 用划分脚本切分数据集从原始混放到 train/val/test数据集划分看着简单其实是个容易翻车的地方。图片和标签必须同步移动类别分布还得尽量均衡否则验证集指标会飘得厉害。这套资源给了三个划分脚本分别对应不同的划分需求我逐个说清楚怎么用、参数怎么改。3.1 三个划分脚本的分工与调用方式从文件名看三个脚本的定位是这样的训练集、验证集、测试集划分脚本负责切三份训练集、验证集划分脚本只切两份split_train_val生成ImageSets下txt文件划分脚本走的是 VOC 那套 ImageSets 索引文件的思路生成train_list.txt、trainval_list.txt这类清单。前两个是直接拷贝文件到新文件夹第三个是生成索引清单训练时按清单读。我一般优先用直接拷贝文件的那种因为路径清晰出问题好排查。调用方式通常是命令行传参或者改脚本顶部的变量# 三份划分按 8:1:1 切 python 训练集、验证集、测试集划分脚本.py \ --images_dir ./images \ --labels_dir ./labels \ --output_dir ./dataset_split \ --train_ratio 0.8 \ --val_ratio 0.1 \ --test_ratio 0.1参数说明images_dir和labels_dir是原始图片和标签目录output_dir是切分后的输出根目录脚本会在里面建train、val、test三个子目录每个子目录下再分images和labels三个 ratio 加起来必须等于 1否则脚本要么报错要么按默认值走。这里有个细节脚本内部一般用random.shuffle打乱后再切所以每次跑结果不一样。如果你要复现某次实验记得在脚本里固定随机种子常见做法是加一行random.seed(42)。3.2 划分比例怎么定与类别均衡的检查8:1:1 是通用起点但不是万能。5000 张图如果安全帽和手套两个类别的样本量差距大比如戴手套的只占一成那验证集里可能就几十张有手套的图指标波动会很大。这种情况下我一般把验证集比例提到 0.15测试集压到 0.05保证验证集里每个类别都有足够样本。切完之后建议统计一下每个子集里各类别的目标数量确认没有某个类别在验证集里几乎消失import os from collections import Counter def count_classes(label_dir): counter Counter() for f in os.listdir(label_dir): if not f.endswith(.txt): continue with open(os.path.join(label_dir, f)) as fp: for line in fp: cls line.split()[0] # YOLO 格式第一列是类别索引 counter[cls] 1 return counter for split in [train, val, test]: c count_classes(fdataset_split/{split}/labels) print(split, dict(c))这段代码遍历每个子集的标签目录按行读第一列的类别索引做计数。跑完你会看到类似train {0: 3200, 1: 800}、val {0: 400, 1: 100}的输出。如果某个类别在 val 里的数量是个位数那就得调整划分比例或者做分层抽样。分层抽样的思路是先把图片按「包含哪些类别」分组再在每组内按比例切这样能保证稀有类别在验证集里也有代表。资源里的脚本不一定带分层功能需要自己补但这是值得花十分钟做的事。注意划分脚本直接拷贝文件如果原始目录里图片和标签命名不一致比如图片是001.jpg标签是001.txt脚本靠文件名匹配命名对不上就会漏拷。跑完务必用 2.2 节的完整性检查再验一遍。4. 环境搭建与训练启动从显卡驱动到第一个 epoch数据切好了接下来是环境和训练。这套资源里带了 YOLO 环境搭建的 html 教程覆盖了 GPU 显卡驱动版本这块还有 Ubuntu 安装教程。我按自己的实操顺序把关键节点拎出来重点讲容易卡住的地方。4.1 GPU 驱动、CUDA 与 PyTorch 的版本对齐YOLO 训练要 GPUGPU 要驱动驱动版本决定了你能装哪个版本的 CUDACUDA 版本又决定了 PyTorch 装哪个。这条链子任何一环对不上轻则跑 CPU 慢十倍重则直接报CUDA error。常见做法是先nvidia-smi看驱动支持的 CUDA 上限再去 PyTorch 官网找对应版本的安装命令。# 第一步看驱动和 CUDA 上限 nvidia-smi # 第二步按输出里的 CUDA Version 选 PyTorch # 假设显示 CUDA Version: 12.1就装 cu121 版本 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu121 # 第三步验证 GPU 是否可用 python -c import torch; print(torch.cuda.is_available(), torch.cuda.get_device_name(0))nvidia-smi右上角那个 CUDA Version 是驱动能支持的最高版本不是你当前装的版本。装 PyTorch 时选的 cu 版本只要不超过这个上限就行。第三步输出True和显卡型号说明链路通了。如果输出False先别急着重装检查一下是不是装成了 CPU 版的 torch用pip list | grep torch看看版本号后面有没有cu后缀。4.2 用自带教程改配置训练自己的数据集资源里的训练教程是「根据案例修改训练自己的数据集」这个思路这比从零写训练脚本务实得多。以 YOLOv5 为例核心是改两个 yaml 文件一个是数据集配置一个是模型配置。数据集配置data/helmet_glove.yaml长这样path: ../dataset_split # 数据集根目录 train: train/images # 训练集图片相对路径 val: val/images # 验证集图片相对路径 test: test/images # 测试集图片相对路径 nc: 2 # 类别数安全帽和手套 names: [helmet, glove] # 类别名顺序要和标签索引对应nc必须等于names的长度而且names的顺序要和标注时类别索引一致。labelImg 标注时如果先标 helmet 后标 glove那索引 0 就是 helmet1 是 glove这里就不能写反。写反了模型能训但预测时框的类别名会张冠李戴这种错误不看可视化结果很难发现。模型配置选yolov5s.yaml起步把nc改成 2。然后启动训练python train.py \ --data data/helmet_glove.yaml \ --cfg models/yolov5s.yaml \ --weights yolov5s.pt \ --epochs 100 \ --batch-size 16 \ --img-size 640参数上weights用预训练权重能明显加快收敛yolo预训练模型下载这个热搜词对应的就是这一步官方仓库的 release 页面能下到yolov5s.pt。batch-size看显存8G 显存跑 640 尺寸一般能上 16爆显存就往下调到 8。epochs100 是起点看验证集 mAP 曲线如果 50 轮就平了可以早停。提示训练日志里关注mAP0.5和mAP0.5:0.95两个指标。安全帽这种大目标mAP0.5 通常能上 0.9手套目标小、遮挡多能到 0.7 以上就算不错。5. 训练过程避坑从 BN 崩溃到混淆矩阵对不上训练跑起来不代表就顺了。我在复现这类数据集时踩过的坑集中在这几个地方按「现象 → 原因 → 解决」列出来你对号入座。5.1 常见问题排查清单现象一训练几个 epoch 后 loss 变成 nan报 BN 相关错误。原因通常是 batch size 太小BatchNorm 层在统计量不足时数值不稳定或者学习率设太大导致梯度爆炸。解决方法是把 batch size 提到 8 以上学习率从 0.01 降到 0.001或者在模型配置里把 BN 换成 GroupNorm。yolo训练中bn崩溃这个热搜词说的就是这类问题。现象二验证集 mAP 一直是 0但 loss 在降。原因多半是标签路径或类别索引对不上。检查datayaml 里的val路径是不是指向了val/images以及标签文件是不是和图片同名同目录。还有一种可能是标签里的类别索引超出了nc范围比如nc: 2但标签里出现了2模型会直接忽略这类目标。现象三混淆矩阵总和和验证集图片数对不上。这是yolo混淆矩阵总合不唯一热搜词对应的场景。原因通常是验证集里有图片没有对应标签被当成纯背景图处理或者一张图里有多个目标矩阵统计的是目标数不是图片数。解决方法是先跑一遍 2.2 节的完整性检查确认图片标签一一对应再理解混淆矩阵统计的是检测框数量。现象四训练完推理框的位置整体偏移。原因一般是标签格式搞混了把 VOC 的绝对坐标当成 YOLO 的归一化坐标用了。YOLO 格式要求中心点和宽高都除以图片宽高归一化到 0 到 1如果直接拿像素值训练框会飞到画面外。核对方法是打开一个 txt看数值是不是都在 0 到 1 之间。现象五显存够但训练速度异常慢。常见原因是数据加载的workers设成了 0或者图片尺寸被隐式放大。把--workers设成 4 或 8确认--img-size和图片实际尺寸的比例关系。另外如果数据集放在机械硬盘上IO 也会成为瓶颈挪到固态盘能快不少。5.2 训练日志与指标的正确读法YOLO 训练输出的日志里box_loss、obj_loss、cls_loss三条曲线要分开看。box_loss降不下去说明框回归有问题可能是学习率或 anchor 不匹配cls_loss高说明分类难安全帽和手套如果外观相近比如都是深色分类头需要更多数据或更强的主干。验证阶段的P、R、mAP0.5里R低说明漏检多P低说明误检多根据业务场景决定优先保哪个。工地安防通常宁可误报也别漏报那就关注R。6. 进阶技巧用 COCO 格式标签做交叉验证与格式互转三种格式都给了最容易被浪费的就是 COCO json。很多人只拿 YOLO txt 训练把 json 晾在一边。其实 COCO json 有个好处它能直接喂给 pycocotools 做标准的 COCO 评估算出来的 AP 指标和论文里可比。我一般会用它做一次交叉验证确认 YOLO 格式的标签没有在转换过程中丢信息。具体做法是写一个格式互转的校验脚本把 YOLO txt 转回 COCO json再和原始 json 对比标注数量import json import os def yolo_to_coco(img_dir, label_dir, class_names): images, annotations [], [] ann_id 1 for idx, f in enumerate(os.listdir(img_dir)): if not f.endswith((.jpg, .png)): continue # 读取图片尺寸这里用 PIL实际按需替换 from PIL import Image w, h Image.open(os.path.join(img_dir, f)).size images.append({id: idx, file_name: f, width: w, height: h}) label_path os.path.join(label_dir, os.path.splitext(f)[0] .txt) if not os.path.exists(label_path): continue with open(label_path) as fp: for line in fp: cls, cx, cy, bw, bh map(float, line.split()) # 归一化坐标转绝对像素 x (cx - bw / 2) * w y (cy - bh / 2) * h annotations.append({ id: ann_id, image_id: idx, category_id: int(cls) 1, bbox: [x, y, bw * w, bh * h], area: bw * w * bh * h, iscrowd: 0 }) ann_id 1 return {images: images, annotations: annotations, categories: [{id: i 1, name: n} for i, n in enumerate(class_names)]} coco yolo_to_coco(dataset_split/val/images, dataset_split/val/labels, [helmet, glove]) with open(val_converted.json, w) as fp: json.dump(coco, fp) print(转换完成标注数:, len(coco[annotations]))这段代码的关键在坐标转换那两行YOLO 的中心点坐标减去宽高的一半得到左上角再乘以图片宽高还原成像素。category_id从 1 开始是因为 COCO 的类别 id 惯例从 1 起而 YOLO 从 0 起这个偏移量忘了加评估时类别全错。转完之后把val_converted.json和原始 COCO json 的annotations长度比一下数量一致说明转换无损。另一个进阶用法是拿 COCO json 直接跑pycocotools的评估得到标准 AP。这样你手里就有两套指标YOLO 训练日志里的 mAP 和 COCO 标准的 AP两者互相印证哪个环节出问题都能定位。我一般还会把测试集也转一遍确认三个子集的标注质量一致。从那以后我每次拿到新数据集都强制先跑一遍格式互转校验再开始训练。这一步花不了二十分钟但能挡掉后面几小时的无效训练。希望帮到你。本文还有配套的精品资源点击获取