
简介这份资源面向从事工地与公共场所监控安全帽检测的算法工程师、学生及项目开发者提供一套真实场景目标检测数据集覆盖佩戴安全帽helmet与未佩戴安全帽head两类目标场景包含建筑干活、视察、高空作业及遮挡、严重遮挡等复杂情况可作为通用安全帽检测项目的数据补充。资源包为1个PDF文件约6.11MB内附数据集基本情况介绍与获取方式并说明VOCxml、COCOjson、YOLOtxt三种标签格式的用途均采用labelimg标注质量较高可直接用于YOLO等算法训练。随附YOLO11一键训练脚本支持GPU、CPU及MacM芯片多平台方案并提供博主训练结果日志供参考。目前已有886人学习下载适合需要快速搭建安全帽检测训练流程、对照多格式标签与多平台脚本进行实践的中高级读者。1. 安全帽检测数据集落地1000 张真实场景图与三格式标签怎么用工地监控项目里最头疼的往往不是模型结构而是拿不到贴合现场的数据。这份安全帽检测数据集给了 1000 张真实场景图覆盖工地行人佩戴、建筑干活、视察、高空作业、遮挡和严重遮挡等场景标签分helmet佩戴和head未佩戴两类。它同时提供 VOC(xml)、COCO(json)、YOLO(txt) 三种格式意味着你不管走 Ultralytics 的 YOLO11 还是自己搭的检测框架都能直接接上。附带的 YOLO11 一键训练脚本还区分了 GPU、CPU、Mac(M 芯片) 三平台对没有独显的开发者比较友好。这篇笔记按「数据长什么样 → 三种格式怎么切 → 脚本怎么跑 → 坑在哪」的顺序拆一遍适合正在做工地或公共场所安全帽检测、想快速把数据跑通的人。2. 三种标签格式的差异与转换VOC、COCO、YOLO 到底该选哪个拿到一个数据集第一件事不是急着训练而是先确认标签格式和你的训练框架对不对得上。这份资源同时给了 VOC、COCO、YOLO 三套标签看起来省事但如果选错格式轻则训练时读不到框重则类别索引错位、模型学出个「玄学」结果。下面先把三种格式的坐标体系和目录结构讲清楚再给可直接抄的转换与校验脚本。2.1 VOC、COCO、YOLO 的坐标与目录差异VOC 格式用 XML 存单张图的标注坐标是左上角xmin,ymin和右下角xmax,ymax的绝对像素值类别写在name里。它的目录一般是Annotations/放 xml、JPEGImages/放图、ImageSets/Main/放训练验证划分。COCO 格式把所有图的标注塞进一个 jsonimages、annotations、categories三个字段互相用 id 关联坐标是[x,y,width,height]的绝对像素。YOLO 格式每张图一个 txt每行class cx cy w h全部是相对图像宽高的归一化值范围 0~1。这三种格式里YOLO 训练最省事因为 Ultralytics 直接吃 txtCOCO 常用于评估和跨框架迁移VOC 是很多老工具链的默认输入。这份数据集两类目标helmet和head在 YOLO 里通常映射成0和1顺序一旦定下来训练、推理、评估必须全程一致否则会出现「明明戴了帽子却报未佩戴」的翻车。格式坐标类型存储方式典型用途VOC绝对像素 xmin/ymin/xmax/ymax每图一个 xml老工具链、labelImg 原生COCO绝对像素 x/y/w/h单个 json评估、跨框架迁移YOLO归一化 cx/cy/w/h每图一个 txtUltralytics 训练2.2 用脚本在三种格式间转换实际项目里经常遇到「只有 VOC 但要用 YOLO 训」的情况手写转换容易在归一化和类别映射上出错。下面这段脚本把 VOC 的 xml 批量转成 YOLO 的 txt同时生成classes.txt逻辑是读 xml 里的size拿到宽高再把绝对坐标归一化。import os import xml.etree.ElementTree as ET # 类别顺序必须和训练配置一致helmet0, head1 CLASSES [helmet, head] VOC_DIR Annotations # xml 所在目录 OUT_DIR labels_yolo # 输出 txt 目录 os.makedirs(OUT_DIR, exist_okTrue) for xml_file in os.listdir(VOC_DIR): if not xml_file.endswith(.xml): continue tree ET.parse(os.path.join(VOC_DIR, xml_file)) root tree.getroot() size root.find(size) w int(size.find(width).text) h int(size.find(height).text) lines [] for obj in root.iter(object): name obj.find(name).text if name not in CLASSES: continue cls_id CLASSES.index(name) bbox obj.find(bndbox) xmin float(bbox.find(xmin).text) ymin float(bbox.find(ymin).text) xmax float(bbox.find(xmax).text) ymax float(bbox.find(ymax).text) # 归一化并转成中心点宽高 cx (xmin xmax) / 2.0 / w cy (ymin ymax) / 2.0 / h bw (xmax - xmin) / w bh (ymax - ymin) / h lines.append(f{cls_id} {cx:.6f} {cy:.6f} {bw:.6f} {bh:.6f}) out_name os.path.splitext(xml_file)[0] .txt with open(os.path.join(OUT_DIR, out_name), w) as f: f.write(\n.join(lines))这段脚本的关键参数有三个CLASSES决定类别索引写反了模型会把两类搞混VOC_DIR和OUT_DIR是输入输出路径归一化保留 6 位小数足够 YOLO 使用。跑完后建议抽查几张图用可视化脚本把框画回去确认没有越界或错位。常见做法是转换后统计一下每类框的数量如果head数量远少于helmet说明数据本身有类别不均衡训练时要考虑加权或过采样。2.3 转换后的完整性校验转换完不能直接开训先做一次校验检查每张图是否有对应 txt、txt 里坐标是否都在 0~1、类别 id 是否越界。下面这段校验脚本能一次性把这些查出来。import os IMG_DIR images LBL_DIR labels_yolo CLASSES [helmet, head] bad [] for img in os.listdir(IMG_DIR): stem os.path.splitext(img)[0] lbl os.path.join(LBL_DIR, stem .txt) if not os.path.exists(lbl): bad.append((img, missing label)) continue with open(lbl) as f: for i, line in enumerate(f): parts line.strip().split() if len(parts) ! 5: bad.append((img, fline {i} field count)) continue cid int(parts[0]) vals [float(v) for v in parts[1:]] if cid len(CLASSES): bad.append((img, fclass id {cid} out of range)) if any(v 0 or v 1 for v in vals): bad.append((img, fline {i} coord out of range)) print(fchecked done, bad{len(bad)}) for b in bad[:20]: print(b)校验脚本输出bad0才算干净。如果出现missing label多半是图片和标签文件名没对齐比如多了后缀或空格coord out of range通常是原 xml 里框超出了图像边界需要裁剪或丢弃。这一步花几分钟能省掉训练到一半 loss 不降的排查时间。3. YOLO11 一键训练脚本GPU、CPU、Mac 三平台怎么跑数据格式理顺之后就进入训练环节。这份资源附带的 YOLO11 一键训练脚本主打多平台GPU、CPU、Mac(M 芯片) 都能跑。不同平台的差别主要在设备参数和依赖安装脚本本身把数据配置和超参封装好了你只需要改路径和 batch。下面按平台拆开讲并给出数据 yaml 的写法。3.1 数据配置文件 data.yaml 怎么写Ultralytics 训练靠一个 yaml 描述数据路径和类别。这份数据集两类nc: 2names顺序必须和标签里的 class id 对应。路径建议用绝对路径避免相对路径在不同工作目录下找不到。# data.yaml path: /abs/path/to/helmet_dataset # 数据集根目录 train: images/train # 训练图相对 path 的路径 val: images/val # 验证图相对 path 的路径 nc: 2 # 类别数 names: 0: helmet 1: headpath是根train和val是相对根的子路径Ultralytics 会自动把images替换成labels去找对应 txt。如果你的目录不是images/labels结构要么改目录要么在 yaml 里显式写train: /abs/train/images。类别顺序写反是高频错误训练前用上一节的校验脚本确认一遍最稳。3.2 GPU 与 CPU 平台的训练命令有 NVIDIA 显卡的机器先确认 CUDA 和 PyTorch 版本匹配再跑训练。脚本一般会封装成一行命令核心参数是model、data、epochs、batch、device。# GPU 训练device0 表示第一块卡 yolo detect train \ modelyolo11n.pt \ datadata.yaml \ epochs100 \ imgsz640 \ batch16 \ device0 \ projectruns/helmet \ namegpu_runmodelyolo11n.pt是预训练权重n 是最小号工地这种两类任务够用imgsz640是输入分辨率显存不够就降到 416 或 320batch16按显存调8G 显存跑 640 一般能到 16爆显存就减半。CPU 训练把device改成cpu同时把batch降到 4 或 8workers设小一点否则数据加载会拖慢。# CPU 训练速度慢但能跑通 yolo detect train \ modelyolo11n.pt \ datadata.yaml \ epochs50 \ imgsz416 \ batch4 \ devicecpu \ workers2CPU 训练 1000 张图跑 50 轮可能要几个小时甚至更久适合先验证流程通不通正式训练还是建议上 GPU。3.3 Mac(M 芯片) 平台的 MPS 加速Mac 的 M 系列芯片可以用 MPS 后端加速Ultralytics 支持devicemps。前提是 PyTorch 版本要够新老版本对 MPS 支持不完整容易报算子不支持。# Mac M 芯片训练 yolo detect train \ modelyolo11n.pt \ datadata.yaml \ epochs100 \ imgsz640 \ batch8 \ devicemps \ workers4MPS 的坑在于部分算子会回退到 CPU速度不如预期而且 batch 太大容易内存不足。建议从batch8起步观察内存占用再调。如果报MPS backend out of memory先降imgsz再降batch。另外 Mac 上路径区分大小写data.yaml里的路径大小写要和实际目录一致否则会报找不到文件。3.4 训练日志与结果怎么看训练跑起来后runs/helmet/下会生成权重和日志。重点看results.csv里的metrics/mAP50和train/box_loss。mAP50 在前几轮快速上升是正常的如果 20 轮后还在 0.1 附近晃多半是标签或类别映射出了问题回头查上一节的校验。box_loss不降反升常见原因是学习率太大或 batch 太小导致梯度不稳可以调lr0或加warmup。资源里附带的训练结果日志可以作为对照看你的曲线和参考曲线趋势是否一致偏差大就优先怀疑数据。4. 安全帽检测避坑与排查五条血泪经验数据集和脚本都跑通不代表项目就顺了实际落地时踩的坑往往在数据和评估环节。下面五条是这类安全帽检测项目里高频出现的问题按「现象 → 原因 → 解决」整理照着排查能省不少时间。4.1 训练 loss 正常但 mAP 极低现象box_loss稳步下降但mAP50一直在 0.05 以下。原因通常是类别索引错位标签里helmet是 0、head是 1但data.yaml里names写反了模型学到的和评估对不上。解决核对data.yaml的names顺序和转换脚本里的CLASSES是否完全一致用校验脚本重新确认 class id 分布。4.2 验证集报找不到标签现象训练启动时报No labels found或验证阶段直接跳过。原因是data.yaml里val路径指向的目录下没有对应的labels子目录或者图片和标签文件名不一致。解决确认目录结构是images/val和labels/val并列且同名文件一一对应。Ultralytics 靠替换路径里的images为labels找标签目录名写错就找不到。4.3 遮挡场景漏检严重现象模型对正常佩戴检测不错但严重遮挡的行人经常漏检。原因是这份数据里遮挡样本占比有限模型对遮挡特征学习不足。解决训练时开启mosaic和mixup增强提高遮挡鲁棒性如果漏检集中在某一类检查该类样本数量必要时对head类做过采样。常见做法是把mosaic1.0保持默认close_mosaic设 10最后几轮关掉增强让模型收敛到真实分布。4.4 Mac 上训练中途崩溃现象Mac M 芯片训练到一半报内存错误或进程被杀。原因是 MPS 后端显存和内存共享batch或imgsz太大直接吃满。解决降batch到 4~8imgsz降到 416workers设 2~4。如果还崩检查是否有其他大内存程序占用Mac 统一内存被占满时系统会直接杀进程。4.5 推理时框重叠或类别抖动现象同一顶安全帽被检出多个框或同一帧里类别在helmet和head之间跳。原因是 NMS 阈值和置信度阈值没调好或者模型对边界样本不确定。解决推理时调conf和iouconf0.25、iou0.45是常用起点类别抖动明显时提高conf到 0.4 以上牺牲一点召回换稳定。如果框重叠严重降iou到 0.4 以下加强抑制。5. 从训练到部署的验证技巧用混淆矩阵和单图推理定位问题训练完拿到best.pt只是开始真正判断模型能不能上工地得看它在具体场景下的表现。我一般会走两步先用验证集跑一次混淆矩阵看两类之间的误判方向再挑几张遮挡和高空作业的图做单图推理肉眼确认框的位置和类别。混淆矩阵能告诉你模型是把head误判成helmet多还是反过来这直接决定你后续补哪类数据。# 在验证集上评估生成混淆矩阵和 PR 曲线 yolo detect val \ modelruns/helmet/gpu_run/weights/best.pt \ datadata.yaml \ imgsz640 \ device0 \ plotsTrueplotsTrue会在输出目录生成confusion_matrix.png和PR_curve.png。看混淆矩阵时重点看对角线如果head那一行大量落到helmet列说明模型倾向于把未佩戴判成佩戴这在工地场景是危险方向必须补head样本或提高该类权重。反过来如果helmet误判成head误报会多影响体验但相对安全。单图推理用来做定性检查命令如下yolo detect predict \ modelruns/helmet/gpu_run/weights/best.pt \ sourcesamples/ \ conf0.3 \ iou0.45 \ saveTruesamples/里放几张你关心的场景图比如高空作业和严重遮挡。conf0.3比默认 0.25 稍高减少低置信度误报iou0.45控制重叠框抑制。跑完看runs/detect/predict/下的可视化结果如果遮挡场景漏检回到训练阶段加增强如果小目标远处的人漏检考虑提高imgsz到 960 再训一版。还有一个容易被忽略的点验证集划分。1000 张图如果随机划分可能出现同一场景的相似图同时进训练和验证导致指标虚高。我一般会按场景分层划分保证遮挡、高空、视察这几类在训练和验证里都有分布。划分完再跑一次 val指标会比随机划分低一些但更接近真实部署表现。从那以后我每次拿到新数据集都强制先跑一遍格式校验和类别分布统计再开始训练宁可前期多花二十分钟也不想到训练到一半才发现标签对不上。希望帮到你。本文还有配套的精品资源点击获取