ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

安全帽手套检测数据集:5000张图VOC/COCO/YOLO三格式与YOLO训练教程

安全帽手套检测数据集:5000张图VOC/COCO/YOLO三格式与YOLO训练教程 简介本资源为面向目标检测初学者与工程实践者的YOLO安全帽手套检测数据集聚焦工地、工厂等真实作业场景下的安全穿戴合规检测需求可用于训练与验证YOLO系列模型。压缩包共约2000个文件以1987个xml标注文件为主另含少量txt、html与py脚本整体约421MB涵盖VOC、COCO与YOLO三种标签格式分别存放于不同目录可直接对接主流检测框架。资源同时提供数据集划分脚本与训练教程支持按需生成训练集、验证集与测试集并附有环境搭建与训练流程说明便于快速复现与二次开发。目前已有331人学习下载适合需要真实场景数据、完整标注与配套脚本的检测任务实践者参考使用。1. 从一批安全帽手套图片说起5000 张图 三套标签到底解决了什么工地、电力、制造车间里做安全帽和手套检测最卡脖子的从来不是模型结构而是数据。你手上可能有一堆现场抓拍图但标注格式五花八门有人给你 VOC 的 XML有人给你 COCO 的 JSON还有人直接甩一个 YOLO 的 txt训练脚本一跑就报路径找不到、类别对不上、框全错位。这个标题讲的正是这件事一个约 5000 张图片的安全帽手套检测数据集同时提供 VOC、COCO、YOLO 三种格式标签外加划分脚本和训练教程。它解决的是「拿到图之后怎么快速变成能喂进 YOLO 的训练集」这个落地问题适合刚接手检测项目、需要自己跑通 yolov8 训练自己数据集的算法工程师和现场落地同学。三种格式不是炫技是因为不同框架、不同标注工具、不同下游任务各认一套能一次给全省掉大量格式转换的玄学时间。2. 三种标签格式的取舍VOC、COCO、YOLO 各自在什么场景下用2.1 先搞清楚三种格式的坐标逻辑差异很多人格式转换翻车根子在于没弄清坐标系。VOC 的 XML 用的是绝对像素坐标xmin/ymin/xmax/ymax左上角为原点框的宽高要自己算。COCO 的 JSON 用的是绝对像素的[x, y, width, height]注意是左上角加宽高不是右下角。YOLO 的 txt 用的是归一化后的中心点坐标[x_center, y_center, width, height]四个值都在 0 到 1 之间除以的是图片的宽和高。这三套逻辑一旦混用最典型的现象就是训练 loss 一直不降、预测框全挤在左上角或者铺满整张图。我一般会先拿一张图把三种格式的数值都手算一遍对一下确认转换脚本没写反。安全帽手套这类目标通常框比较规整中心点归一化后很少贴边如果发现大量 0.99 这种值基本就是坐标算错了。2.2 什么任务该选哪种格式选型其实看下游。你要用 YOLOv5/v8/v11 系列训练直接吃 YOLO txt最省事一个images一个labels目录对应好就行。你要做 MMDetection、Detectron2 这类框架的实验COCO JSON 是标配因为它把图片信息、标注、类别都塞进一个文件方便按 index 取。你要做数据清洗、可视化检查、或者喂给一些老工具链VOC XML 最直观一个图一个文件肉眼能读。这个数据集三种都给实际用法是训练用 YOLO 格式做对比实验或者换框架时用 COCO做标注复核和抽检时用 VOC。别三套同时往一个训练流程里塞容易自己绕晕。2.3 目录结构怎么摆才不乱拿到压缩包解压后我习惯先整理成下面这种结构后面所有脚本都基于这个根目录跑dataset/ ├── images/ # 全部原图 │ ├── 000001.jpg │ └── ... ├── annotations_voc/ # VOC XML │ ├── 000001.xml │ └── ... ├── annotations_coco/ # COCO JSON │ └── instances.json ├── labels_yolo/ # YOLO txt │ ├── 000001.txt │ └── ... └── classes.txt # 类别名一行一个classes.txt很关键安全帽手套场景一般是helmet、glove两类也可能带person、no_helmet这种负类。类别顺序必须和后面data.yaml里的names完全一致差一个顺序训练出来的模型就会把安全帽认成手套这种坑我踩过不止一次。3. 用划分脚本把 5000 张图切成 train/val参数怎么设才不翻车3.1 划分脚本的核心逻辑5000 张图不能全拿去训练必须留一部分做验证否则你根本不知道模型是真学会了还是背下来了。常见做法是按 8:1:1 或 7:2:1 切 train/val/test。划分脚本要干的事就三件读全部图片名、随机打乱、按比例复制或软链到对应目录同时把 YOLO 标签一起搬过去。下面是我常用的一个划分脚本逻辑清晰改比例方便import os import random import shutil from pathlib import Path # 根目录按你实际解压路径改 ROOT Path(dataset) IMG_DIR ROOT / images LBL_DIR ROOT / labels_yolo OUT_DIR ROOT / split # 划分比例train:val:test RATIO (0.8, 0.1, 0.1) SEED 42 # 固定随机种子保证可复现 def main(): random.seed(SEED) imgs [p for p in IMG_DIR.iterdir() if p.suffix.lower() in (.jpg, .png, .jpeg)] random.shuffle(imgs) n len(imgs) n_train int(n * RATIO[0]) n_val int(n * RATIO[1]) splits { train: imgs[:n_train], val: imgs[n_train:n_train n_val], test: imgs[n_train n_val:], } for split, files in splits.items(): img_out OUT_DIR / split / images lbl_out OUT_DIR / split / labels img_out.mkdir(parentsTrue, exist_okTrue) lbl_out.mkdir(parentsTrue, exist_okTrue) for img in files: shutil.copy(img, img_out / img.name) lbl LBL_DIR / (img.stem .txt) if lbl.exists(): shutil.copy(lbl, lbl_out / lbl.name) else: print(f[warn] 缺标签: {img.name}) print(f{split}: {len(files)} 张) if __name__ __main__: main()逻辑说明先收集所有图片用固定种子打乱保证每次划分一致再按比例切片。复制时同步搬 YOLO 标签标签缺失会打印警告而不是静默跳过这点很重要5000 张里混进几张没标的图训练时 YOLO 会直接报错或者把空标签当负样本影响召回。参数说明RATIO三个数加起来必须是 1安全帽手套这种目标相对单一的场景8:1:1 够用如果类别不平衡严重比如手套样本远少于安全帽建议改成 7:2:1 并配合后面的类别统计。SEED别乱改改了就换了一套划分实验没法对比。3.2 划分完必须做的两项检查第一项统计每个 split 里两类目标的数量确认没有某个 split 里手套为 0。第二项抽 5 张图把 YOLO 标签画回原图上看框对不对。画框脚本很简单import cv2 from pathlib import Path img_path Path(dataset/split/train/images/000001.jpg) lbl_path Path(dataset/split/train/labels/000001.txt) img cv2.imread(str(img_path)) h, w img.shape[:2] for line in lbl_path.read_text().strip().splitlines(): cls, xc, yc, bw, bh map(float, line.split()) x1 int((xc - bw / 2) * w) y1 int((yc - bh / 2) * h) x2 int((xc bw / 2) * w) y2 int((yc bh / 2) * h) cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.putText(img, str(int(cls)), (x1, y1 - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255), 2) cv2.imwrite(check.jpg, img)如果框整体偏移、宽高反了、或者框跑到图外说明标签本身有问题别急着训练先回去查转换环节。这一步是后悔药能省掉你训半天发现 mAP 死活上不去的痛苦。4. 从零跑通 YOLO 训练data.yaml、环境与首轮参数4.1 环境配置和预训练权重训练前先把环境弄干净。我一般用 conda 建独立环境装 ultralytics 和 pytorch版本对应好别混装。yolo环境配置最常见的翻车是 CUDA 版本和 torch 不匹配跑起来报no kernel image is available这种就是重装 torch 的事别硬调代码。conda create -n yolo_helmet python3.10 -y conda activate yolo_helmet pip install ultralytics # 按你的显卡 CUDA 版本装对应 torch这里以 cu118 为例 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118预训练权重直接用官方发布的yolov8n.pt或yolov8s.pt安全帽手套这种两类目标n 或 s 足够别一上来就上 x显存吃不消还慢。权重文件放项目根目录训练时自动加载。4.2 data.yaml 怎么写这是训练能不能跑起来的关键文件路径和类别名错一个字就报错path: /abs/path/to/dataset/split train: train/images val: val/images test: test/images nc: 2 names: 0: helmet 1: glovepath建议写绝对路径相对路径在不同工作目录下跑容易找不到。nc是类别数names的顺序必须和classes.txt、标签里的类别 id 完全对应。我见过有人 names 写反训完模型把安全帽标成手套现场演示直接社死。4.3 首轮训练命令和参数含义yolo detect train \ modelyolov8s.pt \ datadata.yaml \ epochs100 \ imgsz640 \ batch16 \ lr00.01 \ patience20 \ projectruns/helmet \ nameexp1参数说明imgsz640是输入分辨率安全帽手套目标不算特别小640 够用显存紧张可以降到 512。batch16按显存调8G 显存跑 s 模型 640 大概能到 16爆显存就减半。lr00.01是初始学习率YOLOv8 默认就差不多这个量级别乱调大。patience20是早停20 轮验证指标不涨就停省时间。project和name决定结果存哪方便多组实验对比。首轮跑起来后重点看三样loss 是否稳定下降、验证集 mAP 是否上升、有没有出现nan。如果 loss 一开始就 nan多半是学习率太大或者标签里有非法值比如坐标超过 1。如果 mAP 一直 0先回去查 data.yaml 路径和类别。5. 训练安全帽手套模型最容易踩的坑排查清单5.1 现象训练报错找不到标签文件原因YOLO 默认按images同级找labels且要求图片和标签同名同相对路径。你划分时如果只复制了图没复制标签或者标签目录名不叫labels就会报这个。解决确认split/train/images和split/train/labels同级且000001.jpg对应000001.txt。用第 3 章的划分脚本能避免这个问题它同步搬了标签。5.2 现象mAP 一直很低框位置明显偏原因坐标格式搞混了。最常见的是把 VOC 的绝对坐标直接当 YOLO 归一化坐标用或者 COCO 的宽高和 VOC 的右下角混了。解决抽一张图用 3.2 的画框脚本验证。如果框整体缩小到左上角一小块就是没归一化如果框宽高反了就是 x/y 或 w/h 写反。回到转换环节逐字段核对。5.3 现象训练中途 loss 突然变 nan原因学习率过大、batch 太小导致 BN 层统计不稳或者数据里有异常标签坐标负值、超过 1、宽高为 0。yolo训练中 bn 崩溃是高频问题。解决先把lr0降到 0.001 试再把batch调大一点。同时写个脚本扫一遍所有标签把非法行揪出来删掉或修正。别指望模型自己扛过去。5.4 现象验证集指标好实际图片检测一塌糊涂原因训练集和验证集划分时没打乱或者验证集里全是简单样本模型过拟合了训练场景。也可能是类别不平衡手套样本太少被安全帽淹没。解决确认划分脚本用了随机种子打乱。统计两类样本数量如果差距超过 5 倍考虑对少样本类做增强或者调 loss 权重。实际部署前一定拿现场新图测别只看验证集数字。5.5 现象混淆矩阵总合对不上原因YOLO 的混淆矩阵统计的是预测框和真实框的匹配结果背景类、漏检、误检都会影响总数加上置信度阈值和 NMS 的影响总数不唯一是正常的。yolo混淆矩阵总合不唯一这个疑问很多人有。解决别纠结总数相等重点看对角线正确分类占比和两类之间的误判。如果 helmet 大量被判成 background说明召回不够回去查标注质量和训练轮数。6. 把 5000 张图用透类别平衡、增强与验证的进阶技巧数据集只有 5000 张两类目标想训出能上现场的模型光跑通还不够。我一般会先做一次类别分布统计把每类框的数量拉出来看。如果手套只有几百个框安全帽有上万直接训必然偏。这时候两个手段一是对少样本类做离线增强把含手套的图翻转、调亮度、加噪声复制几份二是训练时用copy_paste或者类别权重但权重别调太猛容易把另一类压死。增强参数上YOLOv8 默认开了 mosaic 和 HSV 抖动安全帽手套场景我建议保留 mosaic但把degrees旋转关小到 0 或 5因为工地场景里安全帽基本是正着的大角度旋转反而引入噪声。flipud0.5可以开fliplr0.5也开水平翻转对这类目标无害。验证阶段别只看 mAP50把 mAP50-95 和每类的 precision/recall 都拉出来。安全帽漏检的代价远大于误检所以 recall 优先。如果 recall 上不去先查标注有没有漏标再考虑降置信度阈值。部署时阈值我一般从 0.25 起调现场光照差就再降。最后说个习惯每次改完数据或参数把data.yaml、训练命令、关键指标记一行到实验日志里。我吃过亏同一批图跑了七八组实验回头分不清哪组对应哪个配置只能重跑。5000 张图不大但把格式、划分、训练、排查这条链路走顺换成更大的数据集也是同一套方法。希望帮到你。本文还有配套的精品资源点击获取
返回列表