手套与徒手检测数据集:3893张图双格式标签,YOLO训练实战指南 简介本资源为面向目标检测任务的“手套与徒手”二分类数据集适用于YOLO系列算法的手部佩戴状态识别场景可服务于工业安全巡检、实验室规范操作监控、智能安防等需要判断人员是否戴手套的应用。数据集共3893张图像并附带标注已按训练与验证需求划分完毕同时提供data.yaml配置文件兼容YOLOv5、YOLOv7、YOLOv8、YOLOv9、YOLOv10及YOLO11等主流版本。压缩包内共2000个文件以VOC格式的xml标注文件为主另含YOLO格式的txt标签两种标注分别存放于独立文件夹便于按需选用YOLO标签采用类别索引与归一化中心点、宽高坐标可直接投入训练与测试。资源包整体约153.86MB目录结构清晰省去自行标注与格式转换的环节。目前已有89人学习下载适合希望快速验证手部检测方案或开展迁移学习的研究者与开发者参考使用。1. 手套与徒手检测数据集3893 张图带双格式标签拿到手就能开训工厂车间里工人戴没戴手套靠人盯摄像头基本等于碰运气——光线一变、角度一偏、手一遮挡肉眼就漏了。这类安全合规场景真正缺的不是算法而是一份标注干净、格式齐全、拿来就能喂进 YOLO 的数据集。这份资源就是干这个的3893 张图像全部带标签分「戴手套」和「徒手」两类目标同时提供 YOLO 格式的 txt 和 VOC 格式的 xml 两套标注还附了划分好的 data.yaml。它适合两类人一类是想快速跑通一个手部检测 demo 的算法工程师另一类是做工地、产线、后厨安全监控、需要拿真实数据验证模型落地效果的从业者。下面我按「这份数据长什么样 → 怎么接进 YOLO 训练 → 坑在哪 → 怎么验证训出来的模型」的顺序拆一遍能抄的步骤我都落成命令和代码。2. 数据集结构与双格式标签先搞清目录再动手2.1 目录布局与文件对应关系拿到压缩包解压后第一件事不是急着写训练脚本而是把目录结构摸清楚。这类「双格式标签」数据集常见的组织方式是图像放一个目录两套标签各放一个目录再配一个 data.yaml。你解压后大概率会看到类似这样的结构glove_dataset/ ├── images/ # 全部图像jpg/png 混排 │ ├── img_0896_621.jpg │ ├── img_0896_615.jpg │ └── ... ├── labels_yolo/ # YOLO 格式 txt与 images 同名 │ ├── img_0896_621.txt │ └── ... ├── labels_voc/ # VOC 格式 xml与 images 同名 │ ├── img_0896_621.xml │ └── ... └── data.yaml # 数据集配置文件关键点是同名对应images/img_0896_621.jpg对应labels_yolo/img_0896_621.txt也对应labels_voc/img_0896_621.xml。项目正文里列出的img_0896_621.xml、img_0896_2904.xml这些就是 VOC 侧的标注文件。训练时 YOLO 只认 txtxml 是给你做格式转换、复核标注、或者喂给其他框架用的备份。先跑一条命令确认图像和标签数量对得上对不上后面训练会静默丢样本# 统计图像数量 ls images/ | wc -l # 统计 yolo 标签数量 ls labels_yolo/ | wc -l # 找出有图无标签的样本这些图会被训练忽略 comm -23 (ls images/ | sed s/\.[^.]*$// | sort) \ (ls labels_yolo/ | sed s/\.txt$// | sort)comm -23输出的是「只在图像列表里、不在标签列表里」的名字也就是缺标签的图。数量对不上是常态别慌先确认是漏标还是命名不一致比如图像是.jpeg标签是.jpg。2.2 YOLO 格式与 VOC 格式的字段含义YOLO 的 txt 每行一个目标格式是class x_center y_center width height五个值空格分隔。class是类别索引从 0 开始后四个都是归一化到 0~1 的比例值不是像素。这一点是新手最容易翻车的地方——直接把像素坐标写进去训练 loss 会大得离谱或者根本不收敛。换算关系是x_center (x_min x_max) / 2 / img_width y_center (y_min y_max) / 2 / img_height width (x_max - x_min) / img_width height (y_max - y_min) / img_heightVOC 的 xml 则是绝对像素坐标结构长这样annotation filenameimg_0896_621.jpg/filename size width640/width height480/height depth3/depth /size object nameglove/name !-- 类别名不是索引 -- bndbox xmin112/xmin ymin88/ymin xmax240/xmax ymax301/ymax /bndbox /object /annotation两套格式的差别不只是坐标还有类别表达txt 里是数字索引xml 里是字符串类别名。所以从 xml 转 txt 时必须维护一张「类别名 → 索引」的映射表映射错了模型会把手套认成徒手而且 loss 看着还挺正常属于典型的玄学 bug。2.3 data.yaml 配置与类别索引对齐data.yaml 是 YOLO 训练的入口配置典型内容如下path: ./glove_dataset train: images/train val: images/val nc: 2 names: 0: glove 1: bare_handnc是类别数names是索引到类别名的映射。这里有个硬约束names 里的索引必须和 txt 里class的数字严格一致。如果 txt 里 0 代表徒手、1 代表手套而 yaml 里写反了模型训出来标签全错。核对方法很简单抽几个 txt 看第一列的数字分布# 统计所有标签里各类别出现的次数 cat labels_yolo/*.txt | awk {print $1} | sort | uniq -c输出会告诉你 0 类和 1 类各有多少个框。如果某一类数量为 0要么是这类样本没标要么是索引写错了。手套/徒手这种二分类两类样本量最好别差太多差 5 倍以上就得考虑加权或补样本。3. 接进 YOLOv5/v8/v11 训练从环境到首轮跑通3.1 环境准备与依赖安装这套数据适用 yolov5、yolov7、yolov8、yolov9、yolov10、yolo11 系列选哪个看你的部署目标。想快速验证就用 ultralytics 一套v8/v11 同源想跑老项目就 clone yolov5。以 ultralytics 为例# 建虚拟环境避免污染系统 python python -m venv yolo_env source yolo_env/bin/activate # Windows 用 yolo_env\Scripts\activate # 装 ultralytics会自动带 torch/torchvision pip install ultralytics # 验证 GPU 是否可用有卡的话 python -c import torch; print(torch.cuda.is_available(), torch.cuda.get_device_name(0))torch.cuda.is_available()返回 False 就说明要么没卡、要么驱动和 torch 版本不匹配。CPU 也能训但 3893 张图在 CPU 上跑一轮可能要几小时不划算。装完先别急着训用官方小模型确认环境通yolo predict modelyolov8n.pt sourcehttps://ultralytics.com/images/bus.jpg能出检测框图说明环境没问题再上自己的数据。3.2 划分训练验证集与路径修正数据集说「已经划分好」但不同打包方式差异很大有的在 images 下直接分 train/val 子目录有的只给一个总目录让你自己切。先确认ls images/ # 看有没有 train/val 子目录如果没有划分用脚本按 8:2 切注意图像和标签要同步移动import os, random, shutil random.seed(42) # 固定种子保证可复现 img_dir, lbl_dir images, labels_yolo train_img, val_img images/train, images/val train_lbl, val_lbl labels_yolo/train, labels_yolo/val for d in [train_img, val_img, train_lbl, val_lbl]: os.makedirs(d, exist_okTrue) imgs [f for f in os.listdir(img_dir) if f.lower().endswith((.jpg, .png, .jpeg))] random.shuffle(imgs) split int(len(imgs) * 0.8) # 80% 训练 for i, img in enumerate(imgs): stem os.path.splitext(img)[0] lbl stem .txt if i split: shutil.move(os.path.join(img_dir, img), os.path.join(train_img, img)) shutil.move(os.path.join(lbl_dir, lbl), os.path.join(train_lbl, lbl)) else: shutil.move(os.path.join(img_dir, img), os.path.join(val_img, img)) shutil.move(os.path.join(lbl_dir, lbl), os.path.join(val_lbl, lbl)) print(ftrain{split}, val{len(imgs)-split})random.seed(42)是为了每次划分结果一致方便复现实验。split控制比例数据量小可以调到 0.85。切完记得把 data.yaml 里的train/val路径改成images/train、images/val路径写错 YOLO 会直接报找不到文件。3.3 启动训练与关键参数设置路径对齐后就能开训。以 yolov8n 为例yolo detect train \ dataglove_dataset/data.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ lr00.01 \ patience20 \ projectruns/glove \ nameexp1参数逐个说imgsz640是输入分辨率手部目标通常不大640 够用显存紧张可以降到 416batch16按显存调8G 卡跑 640 一般能到 16爆显存就减半lr00.01是初始学习率小数据集别开太大0.01 是稳妥起点patience20表示 20 轮验证指标不涨就早停省时间。训练日志里重点盯三个数box_loss应该稳步下降mAP50应该往上走如果cls_loss一直不降八成是类别索引或标签格式有问题回到 2.3 节核对。3.4 用 VOC 格式做标注复核xml 不只是备份它最大的价值是复核。txt 是归一化比例值肉眼看不出来对不对xml 是像素坐标可以直接画框验证。写个小脚本把 xml 的框画到图上抽 20 张看看import xml.etree.ElementTree as ET import cv2, os for xml_file in os.listdir(labels_voc)[:20]: tree ET.parse(os.path.join(labels_voc, xml_file)) root tree.getroot() fname root.find(filename).text img cv2.imread(os.path.join(images, fname)) for obj in root.findall(object): name obj.find(name).text b obj.find(bndbox) x1, y1 int(b.find(xmin).text), int(b.find(ymin).text) x2, y2 int(b.find(xmax).text), int(b.find(ymax).text) cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.putText(img, name, (x1, y1-5), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0,255,0), 2) cv2.imwrite(fcheck_{fname}, img)跑完看check_*.jpg框贴不贴手、类别名对不对一目了然。这一步花十分钟能省掉训完发现标注错位再重训的几小时。4. 避坑与排查手套检测训练里最容易翻车的五件事4.1 现象训练 loss 正常但 mAP 一直是 0原因类别索引和 data.yaml 的 names 对不上或者 txt 第一列写成了类别名而不是数字。YOLO 读标签时如果第一列不是合法整数会静默跳过该行等于这张图没标签。解决跑cat labels_yolo/*.txt | awk {print $1} | sort -u输出应该只有0和1出现别的字符就是格式错了。4.2 现象验证集指标虚高实际推理一塌糊涂原因训练集和验证集划分时同一只手、同一场景的连续帧被分到了两边造成数据泄漏。视频抽帧的数据集尤其常见。解决划分前按场景或视频源分组同一组的帧要么全进训练、要么全进验证别随机打散。4.3 现象模型把手套和徒手混为一类原因两类目标外观接近都是手且标注时边界模糊——戴薄手套的手和徒手肉眼都难分。解决确认标注一致性同一批数据别一部分人标「手套」一部分标「glove」训练时适当增大imgsz到 640 以上给小目标更多像素。4.4 现象报错No labels found in ...原因data.yaml 里的路径是相对路径但训练时的工作目录不对YOLO 找不到 labels 目录。解决把 data.yaml 里的path写成绝对路径或者确保在数据集根目录下启动训练。相对路径的坑在于它相对的是「运行命令时所在的目录」不是 yaml 文件所在目录。4.5 现象显存爆了batch 降到 1 还是 OOM原因图像分辨率太高比如原图 4K 没缩放或者workers开太多导致内存里堆了大量图。解决先确认imgsz没设成原图尺寸640 是常规值再把workers从默认 8 降到 2~4数据加载的内存占用会明显下降。5. 训完怎么验证从指标到实拍推理的闭环5.1 看验证指标但别只看 mAP训练结束runs/glove/exp1/下会有results.csv和confusion_matrix.png。results.csv里重点看metrics/mAP50-95和metrics/precision、metrics/recall的组合。手套检测这种安全场景recall 比 precision 更重要——漏检一个没戴手套的工人比误报一次代价大得多。如果 recall 偏低可以在推理时把置信度阈值调低yolo detect predict \ modelruns/glove/exp1/weights/best.pt \ sourcetest_images/ \ conf0.25 \ saveTrueconf0.25是默认值安全场景可以降到 0.15 换更高召回代价是误报变多具体阈值要拿现场图试。5.2 用混淆矩阵定位类别混淆confusion_matrix.png能直接告诉你「手套被判成徒手」有多少次。如果这个数字很大说明两类特征区分度不够要么补更多难样本要么考虑加一个「手部区域」的预处理步骤先裁手再分类。矩阵里对角线越深越好非对角线的值就是你要优化的方向。5.3 实拍推理与阈值固化指标好看不代表现场能用。拿手机在真实工位拍几十张——不同光照、不同手套颜色、手被工具遮挡的情况——跑一遍推理把漏检和误检的图挑出来。这一步是血泪经验实验室 mAP 0.9 的模型换到逆光车间可能直接掉到 0.6。挑出来的难样本回补进训练集再训一轮通常比调参管用。最后把验证过的conf和iou阈值固化进部署脚本别每次上线现调。从那以后我每次拿到新数据集都强制先跑一遍「图像标签数量核对 抽 20 张画框复核 类别索引统计」这三步再动手训。这三步加起来不到二十分钟能挡掉后面几小时的无效训练。希望这份手套/徒手数据集和上面的流程能帮你把安全检测这件事真正跑起来。本文还有配套的精品资源点击获取