
简介本资源面向计算机视觉入门与进阶开发者、安全帽佩戴检测项目实践者提供一套真实场景下的YOLO安全帽佩戴目标检测数据集可直接用于YOLO系列模型训练与验证。数据采用labelimg标注标注框质量高场景丰富并同时提供voc、coco和yolo三种格式标签分别存放于不同文件夹便于适配不同检测框架。压缩包共2000个文件以1000个xml标注、990个txt标签为主另含少量html教程、py脚本与yaml配置文件整体约33.1MB。资源附赠YOLO环境搭建、训练案例教程及数据集划分脚本可按需自行划分训练集、验证集与测试集帮助读者快速跑通训练流程并复现检测效果。目前已有557人学习下载适合需要快速获取高质量标注数据、搭建安全帽检测基线模型的学习者与工程人员。1. 拆开这个安全帽数据集1000 张图、三套标签、一个划分脚本工地现场做安全帽佩戴检测最卡脖子的从来不是模型结构而是数据。你手上可能有一堆现场截图但标注格式五花八门VOC 的 XML、COCO 的 JSON、YOLO 的 txt 各来一套训练脚本一跑就报路径错、类别错、坐标越界。这个资源包解决的就是这个前置问题1000 张安全帽佩戴场景图片已经配好了 VOC、COCO、YOLO 三种格式的标签外加一份数据集划分脚本和训练教程。它适合两类人——刚接触目标检测、想跑通第一个安全帽检测模型的新手以及手头有业务需求、需要快速验证方案可行性的工程师。你不用再从零标注、写转换脚本解压后按划分脚本切分就能直接喂给 YOLO 训练。下面我按实际拆包和复现的顺序把这份资源怎么用、参数怎么设、哪里容易翻车讲清楚。2. 三种标签格式的对应关系与选型逻辑2.1 VOC、COCO、YOLO 到底差在哪同一张图三种格式描述的是同一件事但组织方式完全不同。VOC 是每张图一个 XML里面用bndbox存xmin/ymin/xmax/ymax的绝对像素坐标类别名写在name里。COCO 是一个大的 JSON所有图片、标注、类别都塞在images、annotations、categories三个数组里坐标是[x, y, width, height]的绝对像素且category_id从 1 开始。YOLO 是每张图一个 txt每行class_id x_center y_center width height全部归一化到 0 到 1 之间class_id从 0 开始。选型上如果你用 Ultralytics 的 YOLOv5/v8/v11直接拿 YOLO 格式最省事不用转。如果你要接 MMDetection 或者做 COCO 指标评估COCO 格式更顺。VOC 格式现在更多是中间态很多老脚本和标注工具默认导出它。这个包三套都给意味着你不管走哪条技术路线都能找到入口不用自己写转换。2.2 目录结构怎么摆才不报错解压后常见做法是保持三套标签分目录存放图片共用一份。我一般会整理成下面这样避免训练时路径找不到dataset/ ├── images/ # 1000 张 jpg/png 原图 ├── labels_yolo/ # YOLO txt与 images 同名 ├── annotations_voc/ # VOC xml ├── annotations_coco/ # COCO json └── split_dataset.py # 划分脚本YOLO 训练时images和labels的目录结构要对应比如images/train/xxx.jpg对应labels/train/xxx.txt。如果直接把labels_yolo和images平级放需要在 data.yaml 里写清楚路径否则 Ultralytics 会按默认规则去找找不到就报No labels found。2.3 类别定义与 id 映射安全帽检测通常就两类helmet和head或者person。这个包的具体类别名以你解压后看到的classes.txt或 data.yaml 为准。关键点是YOLO 的class_id必须和 data.yaml 里names列表的顺序严格一致。常见翻车是 VOC 里类别写的是hatYOLO 里写的是helmet训练时类别对不上模型学出来全是错位。转换或使用前先统一类别名和 id这一步不能省。3. 用划分脚本切分数据集并跑通训练3.1 划分脚本怎么用、参数怎么改包里的划分脚本一般做两件事按比例把图片分成 train/val/test同时把对应的 YOLO 标签复制到对应目录。常见写法是读images目录随机打乱后按 8:1:1 或 7:2:1 切。下面是一个我常用的结构你可以对照包里的脚本改import os import random import shutil # 原始图片和标签目录 img_dir dataset/images label_dir dataset/labels_yolo # 输出目录 out_img dataset/split/images out_label dataset/split/labels # 划分比例 train_ratio, val_ratio 0.8, 0.1 random.seed(42) # 固定随机种子保证可复现 files [f for f in os.listdir(img_dir) if f.endswith((.jpg, .png))] random.shuffle(files) n len(files) train_files files[:int(n * train_ratio)] val_files files[int(n * train_ratio):int(n * (train_ratio val_ratio))] test_files files[int(n * (train_ratio val_ratio)):] for split, split_files in [(train, train_files), (val, val_files), (test, test_files)]: os.makedirs(os.path.join(out_img, split), exist_okTrue) os.makedirs(os.path.join(out_label, split), exist_okTrue) for f in split_files: shutil.copy(os.path.join(img_dir, f), os.path.join(out_img, split, f)) txt os.path.splitext(f)[0] .txt src_label os.path.join(label_dir, txt) if os.path.exists(src_label): shutil.copy(src_label, os.path.join(out_label, split, txt))逻辑说明random.seed(42)是为了每次划分结果一致方便复现实验。train_ratio和val_ratio按需改1000 张图建议至少留 100 张做验证否则指标波动大。复制而不是移动是为了保留原始标签切错了还能重来。如果包里的脚本用的是splitfolders库逻辑类似参数名可能是ratio(0.8, 0.1, 0.1)。3.2 data.yaml 怎么写YOLO 训练靠 data.yaml 找数据。切分完成后在数据集根目录建一个helmet.yamlpath: ./dataset/split train: images/train val: images/val test: images/test nc: 2 names: [helmet, head]path是数据集根目录train/val/test是相对路径。nc是类别数names顺序必须和标签里的class_id对应。如果只有一类安全帽nc: 1names: [helmet]。写错nc会导致训练时索引越界报IndexError或AssertionError。3.3 启动训练与关键参数用 Ultralytics 的 YOLOv8 举例一条命令就能跑yolo detect train \ datahelmet.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ device0 \ projectruns/helmet \ nameexp1modelyolov8n.pt是预训练权重小模型适合快速验证。imgsz640是输入尺寸1000 张图不算多640 够用。batch16看显存8G 显存跑 640 一般能到 16不够就降到 8。device0指定第一块 GPU没 GPU 就写cpu但会慢很多。训练完在runs/helmet/exp1/weights/best.pt拿到最优权重。3.4 验证与推理训练结束后用验证集看指标yolo detect val \ modelruns/helmet/exp1/weights/best.pt \ datahelmet.yaml \ imgsz640重点看mAP50和mAP50-95。安全帽检测场景如果标注质量过关mAP50 通常能到 0.85 以上。推理单张图yolo detect predict \ modelruns/helmet/exp1/weights/best.pt \ sourcetest.jpg \ conf0.25 \ saveTrueconf0.25是置信度阈值漏检多就降到 0.15误检多就升到 0.4。这个参数没有绝对标准按现场光照和遮挡情况调。4. 避坑与常见问题排查4.1 训练报 No labels found现象启动训练后直接报No labels found in ...或者WARNING: No labels found。原因通常是 data.yaml 里的train路径写错或者 YOLO 标签目录结构和图片不匹配。Ultralytics 默认会把images替换成labels去找如果你把标签放在labels_yolo它找不到。解决要么把标签目录改名成labels要么在 data.yaml 里用绝对路径或者手动确认images/train同级有labels/train。4.2 类别 id 越界或全错现象训练不报错但推理出来框的位置对、类别全错或者报IndexError: index 2 is out of bounds。原因标签里的class_id超过了nc-1或者names顺序和标注时不一致。解决先统计所有 YOLO txt 里第一列的最大值确认最大 id 小于nc。再检查names列表比如标注时 0 是head、1 是helmet你写反了模型学出来就是反的。4.3 坐标归一化错误导致框乱飞现象训练 loss 不降或者推理框跑到图像外面。原因YOLO 格式要求x_center/y_center/width/height都是 0 到 1 的归一化值。如果转换脚本忘了除以图像宽高坐标就是像素值训练直接崩。解决抽查几个 txt数值应该在 0 到 1 之间。如果看到几百的数值说明没归一化回去改转换脚本除以img_width和img_height。4.4 验证集指标异常高或异常低现象mAP 接近 1.0 或者接近 0。原因接近 1.0 可能是训练集和验证集有重叠图片划分脚本没打乱或者复制错了。接近 0 可能是验证集标签路径不对或者类别映射错了。解决检查 train 和 val 的文件名有没有交集确认划分时用了random.shuffle。再看 val 的标签是不是和 train 同一套类别定义。4.5 显存不够或训练中断现象报CUDA out of memory或者训练到一半进程被杀。原因batch或imgsz太大1000 张图虽然不多但 640 分辨率下 batch 16 对 8G 显存有压力。解决先把batch降到 8 或 4或者把imgsz降到 416。还可以开ampTrue混合精度Ultralytics 默认开能省显存。如果还不行用yolov8n而不是yolov8m/l。5. 进阶技巧用 COCO 标签做指标对比与模型选型5.1 为什么还要留一套 COCO 标签YOLO 格式训练方便但 COCO 格式在评估时更通用。很多论文和对比实验用 COCO 的AP[.5:.95]指标如果你要写报告或者对比不同模型COCO 标签能直接接pycocotools算指标。这个包同时给了 COCO 标签省得你从 YOLO 反转。常见做法是用 YOLO 格式训练拿到best.pt后用 COCO 格式的验证集跑一遍pycocotools得到更细的 AP 曲线。5.2 用 COCO 标签验证模型输出Ultralytics 的val默认按 YOLO 的 mAP 算如果你想看 COCO 指标可以导出预测结果再评估。简单做法是用yolo detect val时加save_jsonTrue它会生成 COCO 格式的预测 JSON然后和 COCO 标签的annotations对比。下面是一个用pycocotools算 AP 的片段from pycocotools.coco import COCO from pycocotools.cocoeval import COCOeval # 真实标签和预测结果 ann_file annotations_coco/instances_val.json pred_file runs/helmet/exp1/predictions.json coco_gt COCO(ann_file) coco_dt coco_gt.loadRes(pred_file) evaluator COCOeval(coco_gt, coco_dt, bbox) evaluator.evaluate() evaluator.accumulate() evaluator.summarize()ann_file是 COCO 格式的验证集标注pred_file是模型预测导出的 JSON。evaluator.summarize()会打印AP、AP50、AP75等。注意预测 JSON 里的category_id要和真实标签一致否则评估结果全零。5.3 模型选型的一个实用习惯1000 张图属于小数据集我一般会先跑yolov8n和yolov8s两个规模看验证集 mAP 差多少。如果n和s差距在 2 个点以内直接上n推理快、部署省资源。如果差距大再考虑m。另外安全帽检测对遮挡和小目标敏感训练时可以把imgsz从 640 提到 768 试一组但显存和速度要权衡。从那以后我每次拿到新数据集都强制先跑一遍划分脚本的随机种子检查确认 train/val 没有同名文件再开始训练。希望帮到你。本文还有配套的精品资源点击获取