ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

安全帽检测数据集与YOLO11一键训练:从1000张图到三平台跑通

2026/10/5 5:57:36 拓冰建站 浏览量
安全帽检测数据集与YOLO11一键训练:从1000张图到三平台跑通 简介这份资源面向从事目标检测的算法工程师、学生与工地安防项目开发者提供一套真实场景安全帽检测数据集用于训练佩戴安全帽(helmet)与未佩戴(head)两类目标的检测模型。数据覆盖工地施工、建筑作业、视察、高空作业及遮挡、严重遮挡等多种场景采用labelimg标注质量较高并同步提供VOC(xml)、COCO(json)、YOLO(txt)三种主流格式可直接接入YOLO等算法训练。资源包共1个PDF文件约6.11MB内含数据集基本情况介绍与获取方式说明因数据本体较大托管于百度网盘。附赠YOLO11一键训练脚本支持GPU、CPU及Mac(M芯片)多平台方案并给出博主训练结果日志供参考。目前已有886人学习下载适合需要快速搭建安全帽检测基线、补充监控场景数据或验证多格式标签转换流程的读者参考使用。1. 安全帽检测数据集与 YOLO11 一键训练从 1000 张图到三平台跑通工地入口的摄像头拍到工人没戴安全帽后台却要等人工回看录像才能发现——这个场景催生了大量安全帽检测需求。但真正动手时卡住大多数人的不是模型结构而是数据集图片哪里来、标签怎么标、VOC/COCO/YOLO 三种格式怎么选、训练脚本在 Windows 和 Mac 上能不能跑。这个标题指向的正是一套完整方案1000 张安全帽图片配好 VOC、COCO、YOLO 三种格式标签再给一个支持 GPU、CPU、Mac 三平台的 YOLO11 一键训练脚本。它适合刚入门目标检测、想拿真实场景练手的工程师也适合需要快速验证安全帽检测可行性的项目负责人。下面按「数据集怎么用 → 格式怎么转 → 脚本怎么跑 → 坑在哪」的顺序拆开讲。2. 安全帽数据集的结构与三种标签格式选型2.1 1000 张图的数据集目录怎么组织拿到一个安全帽数据集第一件事不是急着训练而是把目录结构理清楚。常见做法是按images和labels分开再按train、val、test划分。1000 张图的规模不算大建议按 8:1:1 切分即 800 张训练、100 张验证、100 张测试。如果数据集中包含不同光照、不同角度、不同遮挡程度的图片切分时要保证每个子集都有这些变化否则验证集指标会虚高。一个可复现的目录结构如下helmet_dataset/ ├── images/ │ ├── train/ # 800 张 │ ├── val/ # 100 张 │ └── test/ # 100 张 ├── labels/ │ ├── train/ # 对应 YOLO 格式 txt │ ├── val/ │ └── test/ ├── annotations/ # VOC 格式 XML │ ├── train/ │ ├── val/ │ └── test/ └── coco/ # COCO 格式 json ├── train.json ├── val.json └── test.json这个结构的好处是三种格式共存但互不干扰。YOLO 训练直接读images和labelsVOC 格式用于需要 XML 解析的工具链COCO 格式方便接入 Detectron2 或 MMDetection 做对比实验。注意labels下的 txt 文件名必须和images下的图片名一一对应只是扩展名不同这是 YOLO 系列读取数据的基本约定。2.2 VOC、COCO、YOLO 三种格式的差异与选择三种格式的核心差异在标注信息的组织方式。VOC 用 XML每张图一个文件里面记录bndbox的xmin/ymin/xmax/ymax和类别名COCO 用一个大的 JSON包含images、annotations、categories三个主键坐标是[x, y, width, height]的绝对像素值YOLO 用每张图一个 txt每行是class_id x_center y_center width height且坐标全部归一化到 0~1。选型建议很直接如果只跑 YOLO11用 YOLO 格式最省事如果要和 MMDetection 或 Detectron2 对比准备 COCO 格式如果数据集要发给别人做标注复核VOC 格式最通用。安全帽检测通常只有两个类别——helmet和head或person类别数少三种格式转换的脚本都不复杂。格式文件形式坐标类型典型用途VOC每图一个 XML绝对像素 xmin/ymin/xmax/ymax标注工具导出、通用交换COCO单个 JSON绝对像素 x,y,w,hMMDetection、Detectron2YOLO每图一个 txt归一化中心点宽高YOLO 系列训练2.3 从 VOC 转 YOLO 的脚本与四个边界坑实际拿到的安全帽数据集标注大概率是 VOC 格式的 XML。转成 YOLO 格式时下面这个脚本可以直接抄import xml.etree.ElementTree as ET import os # 类别映射安全帽检测通常两类 classes [helmet, head] def voc_to_yolo(xml_path, txt_path, img_w, img_h): tree ET.parse(xml_path) root tree.getroot() lines [] for obj in root.iter(object): cls_name obj.find(name).text if cls_name not in classes: continue cls_id classes.index(cls_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) # 边界裁剪防止标注超出图像范围 xmin max(0, min(xmin, img_w)) ymin max(0, min(ymin, img_h)) xmax max(0, min(xmax, img_w)) ymax max(0, min(ymax, img_h)) # 归一化中心点坐标和宽高 x_center (xmin xmax) / 2.0 / img_w y_center (ymin ymax) / 2.0 / img_h w (xmax - xmin) / img_w h (ymax - ymin) / img_h lines.append(f{cls_id} {x_center:.6f} {y_center:.6f} {w:.6f} {h:.6f}) with open(txt_path, w) as f: f.write(\n.join(lines))这段代码的逻辑是解析 XML 中的每个object取类别名和边界框坐标先做边界裁剪再归一化。参数说明classes列表的顺序决定了class_id必须和训练时data.yaml里的names顺序一致img_w和img_h必须从对应图片读取不能硬编码因为安全帽数据集里图片尺寸可能不统一。四个边界坑第一XML 里可能出现xmin xmax的脏标注裁剪后宽高会变成负数需要在写入前加判断第二有些图片没有对应 XML转换时要跳过而不是报错中断第三类别名大小写不一致比如Helmet和helmet建议统一转小写再匹配第四归一化后的坐标如果等于 0 或 1YOLO 训练时可能报错建议限制在 0.001~0.999 之间。3. YOLO11 一键训练脚本的三平台适配3.1 脚本入口与参数设计一键训练脚本的核心是把环境检查、数据配置、模型加载、训练启动串起来。下面是一个支持 GPU、CPU、Mac 三平台的脚本框架import os import sys import torch from ultralytics import YOLO def get_device(): if torch.cuda.is_available(): return 0 # 使用第一块 GPU elif torch.backends.mps.is_available(): return mps # Mac M 系列芯片 else: return cpu # 纯 CPU def train(data_yaml, epochs100, imgsz640, batch16): device get_device() # CPU 训练时 batch 要调小否则内存爆 if device cpu: batch 4 model YOLO(yolo11n.pt) # 从预训练权重开始 model.train( datadata_yaml, epochsepochs, imgszimgsz, batchbatch, devicedevice, workers4 if device ! cpu else 0, projectruns/helmet, nameexp, exist_okTrue ) if __name__ __main__: train(data.yaml)逻辑说明get_device()按 CUDA、MPS、CPU 的优先级返回设备字符串这是三平台适配的关键。batch在 CPU 上强制降到 4因为 CPU 训练时内存是瓶颈默认 16 很容易触发 OOM。workers在 CPU 上设为 0避免多进程数据加载在 Windows 和 Mac 上的兼容问题。yolo11n.pt是 YOLO11 的 nano 版本1000 张图的安全帽数据集用 nano 或 small 就够不需要上 large。参数说明epochs默认 100安全帽检测这种简单场景通常 50~80 轮就能收敛imgsz默认 640如果图片里安全帽目标很小可以提到 1280但显存占用会翻倍project和name控制输出目录exist_okTrue避免重复运行时新建目录。3.2 data.yaml 的写法与类别顺序YOLO11 训练必须有一个data.yaml内容如下path: ./helmet_dataset train: images/train val: images/val test: images/test names: 0: helmet 1: headpath是数据集根目录train/val/test是相对路径。names的键值对顺序必须和转换脚本里的classes列表完全一致否则模型学到的类别会错位。安全帽检测常见做法是只保留helmet和head两类如果数据集里还有person建议单独处理不要混在一起训练因为person的边界框通常包含整个人体和head的框重叠严重会干扰模型。3.3 GPU、CPU、Mac 三平台的启动命令与差异三平台的启动方式略有不同。GPU 环境直接运行python train.py即可脚本会自动检测 CUDA。CPU 环境需要额外设置线程数避免和系统争抢资源# Linux/Mac 设置线程数 export OMP_NUM_THREADS4 python train.py# Windows PowerShell $env:OMP_NUM_THREADS4 python train.pyMac M 系列芯片走 MPS 后端需要 PyTorch 2.x 以上版本。实测 M1/M2 上训练 YOLO11n1000 张图 100 轮大约 40~60 分钟比 CPU 快但比 GPU 慢。GPU 上同样配置大约 5~10 分钟。如果 Mac 上 MPS 报错可以临时切回 CPU把get_device()里的 MPS 分支注释掉即可。提示CPU 训练时把imgsz降到 416 或 320能显著减少训练时间代价是小目标召回率下降。安全帽在画面中占比较大的场景可以这么干。4. 训练过程中的避坑与排查4.1 损失不下降或 mAP 为 0现象训练启动后box_loss和cls_loss一直不降验证集 mAP 始终为 0。原因通常是data.yaml里的路径写错或者labels目录下没有对应的 txt 文件。YOLO 在找不到标签时会静默跳过导致模型只学背景。解决在训练前用脚本检查每张图片是否有对应 txt且 txt 内容非空。另一个常见原因是类别顺序错位比如data.yaml里0: head、1: helmet但转换脚本里classes [helmet, head]模型学到的类别和验证时对不上。4.2 显存溢出与 batch 设置现象GPU 训练时报CUDA out of memory。原因不一定是 batch 太大也可能是imgsz太高或模型选得太大。安全帽检测用yolo11n或yolo11s足够imgsz640、batch16在 8GB 显存上通常没问题。如果溢出先把 batch 降到 8再降 imgsz 到 512。注意 YOLO11 的batch是全局 batch不是单卡 batch多卡训练时要除以卡数。4.3 Mac MPS 后端报错现象Mac 上运行时报Placeholder storage has not been allocated on MPS device。原因是某些 PyTorch 操作在 MPS 上尚未实现。解决升级 PyTorch 到最新稳定版或者在train()里把device强制设为cpu。实测 YOLO11 在 MPS 上的兼容性比 YOLOv8 好但数据加载部分仍可能回退到 CPU训练速度会打折扣。4.4 验证集指标虚高现象验证集 mAP 达到 0.95 以上但实际测试时漏检严重。原因通常是训练集和验证集来自同一段视频的连续帧画面高度相似模型过拟合。解决切分数据时按视频来源或时间段划分确保验证集和训练集来自不同场景。1000 张图如果全部来自同一个工地建议额外找 100~200 张其他场景的图做测试集。4.5 标签格式转换后坐标越界现象训练时警告corrupt label或non-normalized coordinates。原因是 VOC 转 YOLO 时没有做边界裁剪某些标注框的坐标超出了图片尺寸。解决在转换脚本里加max(0, min(x, img_w))的裁剪逻辑并在写入前检查宽高是否大于 0。另外YOLO 格式要求坐标在 0~1 之间如果归一化后出现 1.000000建议截断到 0.999999。5. 用验证集反推标注质量与模型选型技巧训练跑通只是第一步真正决定安全帽检测能不能落地的是验证集上的错误分析。我一般会做三件事第一把验证集预测结果用model.val()导出混淆矩阵看helmet和head之间有没有大量误判第二挑出置信度在 0.3~0.6 之间的预测框这些是模型的「犹豫区」往往对应遮挡、小目标或光照不足的样本第三把漏检的图片单独存一个文件夹人工看一遍判断是标注漏了还是模型能力不够。如果混淆矩阵显示head被大量预测成helmet说明两类在视觉上太接近常见于工人把安全帽拿在手里或戴在脑后。这时候有两个选择要么合并成一类person_with_helmet要么在数据集中补充这类难样本。1000 张图的规模补充 50~100 张难样本就能明显改善。模型选型上YOLO11n 在 1000 张图的安全帽数据集上通常能到 0.85~0.92 的 mAP0.5。如果追求更高精度可以换yolo11s或yolo11m但推理速度会下降。实际部署时还要考虑推理设备Jetson 系列用 TensorRT 加速x86 服务器用 ONNX RuntimeMac 上直接用 MPS 或 CoreML。导出命令如下# 导出 ONNX yolo export modelruns/helmet/exp/weights/best.pt formatonnx # 导出 TensorRT需要 GPU 环境 yolo export modelruns/helmet/exp/weights/best.pt formatengine halfTrue导出后建议用几张测试图跑一遍推理对比 PyTorch 和导出模型的输出是否一致。我踩过的坑是导出 ONNX 时没加dynamicTrue导致输入尺寸固定为 640部署时换分辨率就报错。另一个坑是 TensorRT 的halfTrue在部分老显卡上精度损失明显安全帽检测这种小目标场景建议先用 FP32 验证再决定是否开 FP16。最后说一个习惯每次训练完把data.yaml、转换脚本、训练命令和验证集指标一起存到一个experiment_log.md里。安全帽检测项目往往要迭代好几轮没有记录的话两周后就忘了当时为什么把 batch 设成 8。这个习惯帮我省了很多后悔药。希望帮到你。本文还有配套的精品资源点击获取