
简介这份资源是面向目标检测学习者的手套与徒手识别数据集适用于YOLO系列算法训练与验证可解决手部佩戴手套状态检测的样本获取问题适合具备一定深度学习基础、正在做安全防护或工业场景检测的开发者。压缩包共2000个文件以xml标注文件为主同时提供YOLO格式txt与VOC格式xml两套标签分别存放于独立文件夹并附带data.yaml配置文件兼容yolov5、yolov8、yolov9、yolov7、yolov10及yolo11等版本整体约153.86MB。数据集已按训练与验证划分图像与标签一一对应YOLO标签采用归一化中心点与宽高比例可直接投入模型训练。目前已有89人学习下载读者可快速完成数据加载、类别映射与模型微调省去自行标注与格式转换的环节将精力集中在网络结构调优与检测效果评估上。1. 手套与徒手检测3893 张带标签图像能撑起什么场景产线安全帽检测做完之后下一个被提上来的需求往往就是手部。冲压车间要判断工人有没有戴防护手套食品加工线要确认操作工没有徒手接触原料实验室要核查是否按规范佩戴。这类需求听起来和通用目标检测没区别但真正动手才发现手部目标小、姿态多变、遮挡严重而且戴手套和徒手这两类在像素层面差异极小——一只白色棉手套和一只浅肤色手掌在低分辨率工业相机下几乎同色。这正是yolo算法-手套和徒手数据集-3893张图像带标签-手戴手套检测这个标题要解决的核心问题它提供的不是通用手部检测数据而是一个专门区分戴手套与徒手两类状态的二分类检测数据集3893 张图像全部带标注直接可用于 YOLO 系列训练。这个数据集适合谁如果你正在做工地安全合规、食品卫生监管、工业产线操作规范核查或者单纯想跑通一个手部状态二分类的 YOLO 基线它都能省掉最耗时的标注环节。3893 张的规模不算大但对于二分类任务、且场景相对固定的工业应用来说是一个能快速验证可行性的起点。需要提前说清楚的是它不是通用手部关键点数据集也不做手势识别它的标签只回答一个问题——这只手戴没戴手套。理解这个边界后面的选型、增强和部署才不会跑偏。2. 拆开这个数据集标注格式、类别定义与 YOLO 适配拿到一个带标签数据集第一件事不是急着训练而是搞清楚它的标注格式和类别定义。这一步做错后面 loss 不下降你会以为是模型问题其实是标签根本没读对。手套/徒手数据集常见的标注格式有 VOC XML、COCO JSON 和 YOLO txt 三种不同来源差异很大必须先确认再动手。2.1 先确认标注格式VOC、COCO 还是 YOLO txt判断方法很直接看标签文件的后缀和内容。如果每张图对应一个同名.xml里面是bndbox带xmin/ymin/xmax/ymax那就是 VOC 格式如果是一个大的.json里面有images、annotations、categories三个字段那是 COCO如果每张图对应一个.txt每行是class_id cx cy w h五个归一化到 0~1 的数那就是 YOLO 原生格式。对于这个数据集类别大概率只有两个glove戴手套和bare_hand徒手。有些版本会把它做成单类检测——只标手再用一个额外属性区分状态但那种做法对 YOLO 不友好因为 YOLO 的类别是互斥的。所以更常见的做法是直接做成两个类别class_id为 0 和 1。下面这段脚本用来快速统计一个 YOLO 格式数据集的类别分布和框的尺寸分布这是判断数据集是否可用的第一步import os import glob from collections import Counter label_dir labels/train class_counter Counter() box_areas [] for txt in glob.glob(os.path.join(label_dir, *.txt)): with open(txt, r) as f: for line in f: parts line.strip().split() if len(parts) ! 5: continue cid int(parts[0]) cx, cy, w, h map(float, parts[1:]) class_counter[cid] 1 box_areas.append(w * h) # 归一化面积 print(类别分布:, dict(class_counter)) if box_areas: box_areas.sort() n len(box_areas) print(f框数量: {n}) print(f面积中位数: {box_areas[n//2]:.5f}) print(f面积 P10: {box_areas[n//10]:.5f}) print(f面积 P90: {box_areas[n*9//10]:.5f})逻辑说明遍历所有标签文件统计每个类别的框数量同时收集归一化面积。参数说明label_dir指向你的标签目录YOLO 格式下标签和图像通常分开放。输出里如果两个类别数量严重失衡比如 9:1训练时就要考虑类别权重或者过采样如果面积中位数低于 0.01说明目标非常小需要调小 anchor 或者提高输入分辨率。2.2 类别不平衡与手套颜色陷阱手套和徒手这两类在实际场景里往往是不平衡的——工人大部分时间戴手套徒手样本少。3893 张里如果徒手只占一两成直接训练会让模型倾向于全预测成手套。处理方式有三种在 loss 里给少数类加权、对少数类做复制过采样、或者用 mosaic 增强时偏向采样少数类。我一般先用加权改起来最快。另一个坑是手套颜色。白色手套、蓝色丁腈手套、黄色橡胶手套和不同肤色手掌混在一起模型很容易学到颜色这个捷径而不是形状。如果训练集里手套颜色单一换一个车间就翻车。缓解办法是在增强里加入 HSV 抖动尤其是色调和饱和度让模型不能只靠颜色区分。2.3 从 VOC/COCO 转成 YOLO txt 的转换脚本如果拿到的不是 YOLO 原生格式需要先转换。下面是从 VOC XML 转 YOLO txt 的脚本COCO 转 YOLO 思路类似只是读取字段不同import os import glob import xml.etree.ElementTree as ET # 类别名到 id 的映射顺序必须和训练时的 data.yaml 一致 class_map {glove: 0, bare_hand: 1} def convert_voc_to_yolo(xml_path, img_w, img_h, out_dir): tree ET.parse(xml_path) root tree.getroot() lines [] for obj in root.findall(object): name obj.find(name).text if name not in class_map: continue 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 / img_w cy (ymin ymax) / 2.0 / img_h w (xmax - xmin) / img_w h (ymax - ymin) / img_h # 裁剪到 [0,1]防止标注越界 cx, cy min(max(cx, 0), 1), min(max(cy, 0), 1) w, h min(max(w, 0), 1), min(max(h, 0), 1) lines.append(f{class_map[name]} {cx:.6f} {cy:.6f} {w:.6f} {h:.6f}) out_path os.path.join(out_dir, os.path.basename(xml_path).replace(.xml, .txt)) with open(out_path, w) as f: f.write(\n.join(lines)) # 使用示例需要自己传入每张图的宽高 # 实际项目中通常用 PIL 或 cv2 读取图像尺寸逻辑说明解析 XML 里的每个 object取 bbox 坐标转成 YOLO 需要的中心点加宽高并归一化。参数说明class_map必须和data.yaml里的names顺序严格一致否则类别会错位img_w、img_h是原图尺寸不能写死要逐图读取。转换后建议抽查几张用可视化脚本把框画回图上确认没偏。3. 用 YOLOv8 跑通手套检测基线配置、训练与验证格式确认、类别对齐之后就可以搭训练管线了。这一章以 YOLOv8 为例因为它的工程化程度高、配置文件清晰适合快速验证数据集可用性。如果你用 YOLOv5 或 YOLO11流程基本一致差异在配置字段名和部分超参默认值。3.1 data.yaml 怎么写路径、类别与验证集划分YOLO 训练的第一步是写data.yaml它告诉框架去哪里找图、去哪里找标签、有几个类别。一个典型配置如下path: /data/glove_dataset # 数据集根目录 train: images/train # 训练集图像相对路径 val: images/val # 验证集图像相对路径 test: images/test # 测试集可选 nc: 2 # 类别数 names: # 类别名顺序即 class_id 0: glove 1: bare_hand参数说明path是根目录train/val是相对它的子路径YOLO 会自动把images替换成labels去找标签所以目录结构必须是images/train和labels/train平行。nc和names必须和转换脚本里的class_map完全对应。验证集划分建议按 8:1:1 或 7:2:1如果图像来自连续视频帧要按视频段划分而不是随机划分否则相邻帧泄漏会让验证指标虚高。3.2 训练命令与关键超参imgsz、batch、epochs 怎么定配置写好之后训练命令很简洁yolo detect train \ data/data/glove_dataset/data.yaml \ modelyolov8n.pt \ imgsz640 \ epochs100 \ batch16 \ lr00.01 \ patience20 \ projectruns/glove \ namebaseline逻辑说明用 YOLOv8 nano 预训练权重做迁移学习输入 640训练 100 轮学习率初始 0.0120 轮无提升就早停。参数说明imgsz是关键手部目标小的话可以提到 960 或 1280但显存和速度会成倍变化batch根据显存调16 是 8G 显存的保守值lr0对迁移学习来说 0.01 偏大如果 loss 震荡可以降到 0.001patience设 20 是为了避免过拟合小数据集上尤其重要。3.3 验证指标怎么看mAP50 之外还要盯什么训练完看results.csv和confusion_matrix.png。mAP50 是常规指标但手套检测这个任务里我更关注两件事一是混淆矩阵里bare_hand被误判成glove的比例这直接对应漏检徒手的安全风险二是小目标的 recall因为远距离的手往往只有几十像素。如果 mAP50 到 0.9 但实际部署漏检多通常是验证集和实际场景分布不一致。这时候要做的是拿现场图做一次独立测试而不是继续调训练超参。下面这段脚本用来在自定义图像上跑推理并保存结果from ultralytics import YOLO model YOLO(runs/glove/baseline/weights/best.pt) results model.predict( sourcetest_images/, conf0.25, # 置信度阈值安全场景可降到 0.15 提高召回 iou0.5, # NMS 的 IoU 阈值 imgsz640, saveTrue )逻辑说明加载训练好的权重对测试目录批量推理。参数说明conf是置信度阈值安全合规场景宁可误报不可漏报可以降到 0.15~0.2iou控制 NMS 合并程度手部密集时适当调低避免框被吞。4. 手套检测的避坑与排查从标注到部署的 5 个翻车点这个任务看起来简单但实际做下来翻车点不少。下面 5 条是我和身边同行踩过的按现象 → 原因 → 解决写清楚。现象一训练 loss 正常下降但验证 mAP 一直卡在 0.3 左右。原因通常是标签类别错位——转换脚本里的class_map和data.yaml的names顺序不一致导致模型学的是反的。解决写一个可视化脚本把标签框和类别画回图上人工抽查 20 张确认glove框真的落在手套上。现象二模型在训练集上表现很好换一个车间就大面积误判。原因是过拟合到背景和颜色。手套颜色单一、背景固定时模型会走捷径。解决增强里加 HSV 抖动、随机裁剪、mosaic并且尽量收集多场景数据。如果只有单一场景数据至少把亮度、对比度、色调的抖动范围开大。现象三远距离的手完全检测不到。原因是输入分辨率不够小目标在 640 下被下采样没了。解决把imgsz提到 960 或 1280或者用切片推理SAHI把大图切块再检测。代价是速度下降需要根据帧率要求权衡。现象四戴手套和徒手两类混淆严重尤其白色手套和浅肤色。原因是两类在颜色空间上太接近模型没学到形状特征。解决除了 HSV 增强可以在损失函数上做文章用 focal loss 让模型关注难样本另外检查标注是否一致有些标注员会把半戴手套标成两类中的随机一类这种噪声要清理。现象五部署后帧率不达标。原因是模型选大了或者没做推理优化。解决先换更小的模型nano 或 small再用 TensorRT 或 ONNX Runtime 加速。640 分辨率下YOLOv8n 在主流 GPU 上单卡跑几百路是理论值实际要考虑预处理和后处理开销通常按理论值的 1/3 到 1/2 估算。提示标注一致性比标注数量更重要。3893 张里如果有 10% 的标注边界模糊对二分类任务的影响远大于再加 1000 张干净数据。5. 小数据集提效增强策略、半监督与难例挖掘的实战技巧3893 张对于二分类检测不算充裕尤其是徒手样本可能只有几百张。这一章讲几个在小数据集上真正有效的提效手段都是我在实际项目里验证过的。5.1 增强不是越多越好哪些增强对手套检测真正有用YOLO 默认的增强里mosaic 和 mixup 对小数据集帮助最大因为它们能合成新样本。但手套检测有个特殊性mosaic 把四张图拼在一起手部目标会变得更小更碎如果原本目标就小mosaic 反而有害。我的做法是前期用 mosaic 快速收敛后期最后 10~20 轮关掉 mosaic让模型在真实分布上微调。HSV 增强要开大尤其是hsv_h色调和hsv_s饱和度因为手套颜色是主要干扰因素。随机翻转可以用但要注意左右手语义——如果任务不区分左右手翻转没问题如果区分翻转会引入错误标签。5.2 用半监督把未标注的现场图利用起来现场最容易拿到的是未标注视频帧标注成本高。半监督的思路是先用 3893 张训练一个基线模型用它给未标注图打伪标签筛选高置信度的加入训练集迭代几轮。关键在筛选阈值——太低会引入噪声太高则样本太少。我一般从 0.7 开始每轮看伪标签的类别分布是否和真实分布接近。下面是一个伪标签筛选的简化流程from ultralytics import YOLO import os model YOLO(runs/glove/baseline/weights/best.pt) unlabeled_dir unlabeled_frames/ pseudo_label_dir pseudo_labels/ results model.predict(sourceunlabeled_dir, conf0.7, save_txtTrue, save_confTrue) # save_txt 会在 runs/detect/predict/labels 下生成 YOLO 格式标签 # 人工抽查后把高置信度标签和对应图像复制到训练集逻辑说明用基线模型对未标注图推理只保留置信度高于 0.7 的框作为伪标签。参数说明conf0.7是筛选阈值可根据伪标签质量调整save_confTrue会保存置信度方便后续按置信度分层筛选。伪标签一定要人工抽查尤其是少数类否则错误会被放大。5.3 难例挖掘把误判样本挑出来重训模型上线后把误判的图收集起来人工修正标签加入训练集重新训练。这个闭环比任何增强都有效因为它直接针对模型的弱点。具体做法是部署时保存低置信度和高置信度误判的图定期回流。手套检测里难例往往是遮挡的手、运动模糊的手、以及手套和背景同色的情况。一个实用的习惯是每次训练前先看上一版模型的confusion_matrix.png找出混淆最多的类别对然后针对性地补这类样本。这比盲目加数据高效得多。5.4 验证方法用现场视频而不是测试集做最终验收测试集 mAP 高不代表能用。最终验收一定要用现场视频跑一遍统计漏检率和误报率。漏检率对应安全风险误报率对应工人是否会被频繁打扰。这两个指标要分开看不能只看 mAP。我一般会要求漏检率低于某个阈值比如 1%误报率可以放宽因为误报的代价通常只是多看一眼。最后说个我自己的教训早期做手套检测时我花了两周调模型结构mAP 从 0.88 提到 0.91结果现场验收还是不过。后来发现问题出在标注——有几百张图里标注员把手在画面边缘只露出一部分的情况标成了完整框导致模型学到的框偏大。重新清理这批标注后mAP 没变多少但现场漏检率降了一半。数据质量永远比模型结构重要这个习惯我一直保持到现在。希望帮到你。本文还有配套的精品资源点击获取