多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

YOLOv8手套检测实战:400张带标签数据集训练全流程解析

YOLOv8手套检测实战:400张带标签数据集训练全流程解析 简介面向YOLO系列算法实战训练的手套检测数据集共400张已标注图像覆盖多样场景免去自行采集和标注的繁琐下载后可直接用于模型训练、验证与测试。包内已划分好数据集并附带data.yaml配置文件适配YOLOv5/v7/v8/v9/v10/v11等版本。资源共1201个文件压缩包17.75MB包含400个jpg图像、400个txt标签YOLO格式classx_centery_centerwidthheight、400个xml标签VOC格式以及1个yaml配置文件两种标签格式分文件夹存放方便对比学习和格式转换。已有92人下载学习适合目标检测入门及算法对比实验。使用时可基于txt与xml熟悉不同标注规范也可直接调用yaml开始训练是快速验证YOLO系列模型效果的实用资源。1. yolo算法-手套数据集-400张图像带标签-.zip 到底能做什么车间监控的画面里工人有没有按规定戴手套单靠人眼盯十几路摄像头根本不现实。你手上这份“yolo算法-手套数据集-400张图像带标签-.zip”拆开就是400张图像和对应的YOLO格式txt标签正好拿来训练一个手套检测模型输入一张画面输出每个手套框和置信度。这包数据最适合三类人想跑通yolov8训练全流程但缺数据的新手、需要给PPE穿戴检测做Demo验证的算法工程师、以及毕业论文里需要一个真实目标检测任务的在校生。但我得把丑话说在前面——400张带标签只能让你把流程跑通、把模型练到“能用但不能直接上正式验收”的程度。想把漏检率降下来后面需要自己补现场数据和做增强。2. 拆开zip先别急着训练目录结构、标签格式与数据健康检查很多人拿到压缩包第一件事就是解压然后开训练结果损失函数要么不降要么预测框满屏乱飞。我一般会先花十分钟把数据和标签盘一遍至少能排除一半的翻车原因。2.1 标准的images/labels目录长什么样和“带标签”有什么关系一个规范的YOLO数据集压缩包解压后的常见目录结构是gloves_dataset/ ├── images/ │ ├── train/ │ │ ├── img_0001.jpg │ │ ├── img_0002.jpg │ │ └── ... │ └── val/ │ ├── img_0401.jpg │ └── ... └── labels/ ├── train/ │ ├── img_0001.txt │ ├── img_0002.txt │ └── ... └── val/ └── img_0401.txt所谓“带标签”指的就是每个图像文件有个同名txt文件躺在labels目录里。img_0001.jpg对应img_0001.txt文件名必须完全一致后缀无所谓大小写但主名对不上训练时这张图就会被跳过。为什么要分成train和val因为训练过程和考试一样——train是习题集val是模拟考。只用一份数据既训练又验证你无法判断模型到底是学会了还是背答案了。如果压缩包内不分子目录所有图像混在一起常见做法是手动按9:1或者8:2比例拆成train和val保证同场景的图不要同时出现在两边否则验证集就失去了意义。2.2 txt标签逐行拆解class、归一化中心点、宽高YOLO格式的每个txt文件一行描述一个目标框标准格式是五个数字0 0.502343 0.447265 0.183593 0.217187这五个字段分别代表类别id、目标框中心点x坐标归一化、中心点y坐标归一化、框宽度归一化、框高度归一化。归一化是什么意思就是真实像素坐标除以图像宽高把数值压缩到0到1之间。比如图像宽1280框中心x为643那归一化x就是643/1280≈0.5023。这个设计让标签跟图像分辨率解耦——训练时输入缩放到640x640框的相对位置不变。手套数据集通常只有一个类别也就是“手套”本身所以类别id理想情况下全都是0。如果txt里出现了1、2这类数字说明标注工具导出的类别索引不是从0开始的或者压缩包里混了其他数据训练的时候类别数量配置不对就会直接报错。打开几个txt看一眼再对照一下文件名是否和图像一一对应这一步花不了两分钟但能省下后面一整天的排查时间——和CCPD车牌数据集类似这类标注文件一旦出错模型白跑一轮是常有的事。2.3 训练前先跑一遍数据健康检查脚本我习惯在拿到任何带标签数据集后先跑一段Python脚本做体检。别嫌麻烦格式错误通常不会在加载阶段暴露而是在训练loss曲线和验证mAP上慢慢体现到时候再回头查成本就高了import os from pathlib import Path from collections import Counter dataset Path(gloves_dataset) imgs list(dataset.rglob(*.jpg)) list(dataset.rglob(*.png)) dist Counter() errors [] for img in imgs: txt dataset / labels / img.relative_to(dataset / images).with_suffix(.txt) if not txt.exists(): errors.append(fmissing label: {txt}) continue for line in txt.read_text().strip().splitlines(): parts line.split() if len(parts) ! 5: errors.append(fbad line format: {txt}: {line}) continue cls, xc, yc, w, h int(parts[0]), *map(float, parts[1:]) if cls ! 0: errors.append(fclass out of range: {txt}: {cls}) if not (0 xc 1 and 0 yc 1 and 0 w 1 and 0 h 1): errors.append(fcoord out of range: {txt}: {line}) if xc - w/2 0 or xc w/2 1 or yc - h/2 0 or yc h/2 1: errors.append(fbox overflow: {txt}: {line}) dist[cls] 1 print(class distribution:, dict(dist)) print(error count:, len(errors)) for e in errors[:30]: print(e)脚本逻辑分四层先找同名txt找不到说明标签缺失再检查每行是否恰好5个数值然后判断类别id是否为0最后验证坐标是否都在0到1区间内并且目标框有没有超出图像边界。参数上类别范围根据本数据集实际类别数来改——如果以后你换成一个多类别数据集就把cls ! 0改成cls num_classes。框越界的样本需要标注软件里修正或者按越界部分直接裁剪掉留着训练会让模型对边缘目标的预测产生偏移。400张图像跑完这个脚本一般不会超过5秒错误列表为空再进下一步。3. 用YOLOv8训练这份手套数据集yaml、命令与6个关键参数现在数据检查通过进入正题。这个标题带“yolo算法”而当前从业者训练自己的数据集时YOLOv8是最常见的起点——官方库开箱即用预训练权重齐全对新手和工程落地都友好。这一章我会把数据配置文件、训练命令和参数逐项拆开讲。3.1 写gloves.yaml路径、类别数、names缺一不可YOLOv8训练前需要一个数据配置文件告诉训练器数据集在哪、哪份是训练集哪份是验证集、类别叫啥。用文本编辑器新建一个gloves.yaml# 改成你解压后的绝对路径Windows注意用 / 或双反斜杠 path: D:/datasets/gloves_dataset train: images/train val: images/val # 如果压缩包没拆train/val可以统一指向images目录 # train: images # val: images names: 0: glove这里最容易被忽略的是path字段。YOLOv5里train/val是完整路径v8改成了相对path拼接新手常犯的错是把train写成绝对路径或者path末尾多打一个斜杠结果报错找不到图片目录。names的类别索引必须跟标签txt里的第一个数字一致。本数据集只有一类names只需要写0: glove。如果你后面自己扩充类别比如同时检测安全帽、反光衣就要把names列表补全并保证标签文件里出现的序号都覆盖到。train: images/train这种写法的意思是path加相对路径拼出实际目录所以解压后不要随便移动子目录搬过位置就同步改path。3.2 训练命令与6个关键参数weights、epochs、batch、imgsz、patience、device环境装好ultralytics库后一行命令就能开训yolo detect train datagloves.yaml modelyolov8n.pt epochs100 imgsz640 batch16 device0 patience30也可以写在Python脚本里便于在训练前后插入自定义逻辑from ultralytics import YOLO model YOLO(yolov8n.pt) model.train(datagloves.yaml, epochs100, imgsz640, batch16, device0, patience30)参数建议值调整思路modelyolov8n.pt400张小数据优先用nano若显卡显存富余且手套目标偏小换yolov8s.ptepochs100小数据集100轮足够观察收敛不够再加不建议一上来就300batch166GB显存跑nano这个值比较稳显存紧张降到8不推荐1batch太小BN层不稳定imgsz640默认值如果手套在画面中占比较大可降到416提速目标小则保持640或上1280patience30验证集指标连续30轮不提升就停止防止过拟合device0用GPU没有GPU就devicecpu训练时间会拉长几倍但能跑如果训练时出现CUDA out of memory优先把batch从16降到8还不行就换yolov8n的权重或者调imgsz到480。不要一遇到显存不足就换模型——先动batch影响最小。训练结束后看runs/detect/train目录weights/best.pt是验证集指标最好的权重weights/last.pt是最后一轮的权重。部署时默认选best.pt但如果训练后期过拟合明显last有时反而泛化更好两个都留着你都试一下。3.3 400张图像为什么必须借预训练权重迁移学习的选择从零初始化一个检测模型的反向传播需要海量数据400张图连杯水车薪都算不上。YOLOv8官方提供的yolov8n.pt是在COCO数据集上预训练过的权重它已经学会了边缘、纹理、颜色渐变这些底层特征还见过大量手的形状——这对手套检测极有价值。我们只需要在新的小数据集上微调finetune它的高层语义训练很快就能收敛而且不那么容易过拟合。常见做法是直接加载一个同系列的预训练权重文件让trainer自己做迁移。如果你发现训练早期loss下降慢可以尝试冻结backbone前几层只训练检测头做法是在train调用里加freeze10数字表示冻结前多少层。我个人的使用习惯是数据量小几百张先不冻结让全部层参与微调如果跑出来的验证集结果明显不稳定再开freeze对比一轮。模型越小越依赖预训练权重所以这里坚持用yolov8n.pt起步而不是自己从头设计网络——即使你有能力也是浪费时间。4. 训练手套检测模型最容易踩的5个坑从数据到训练全程排查清单400张图像这个量级几乎把小型数据集训练会遇到的坑都占全了。我按现象到原因再到解决方法的顺序把最高频的5个问题列出来你训练时遇到哪个都能对号入座。4.1 标签越界和类别从1开始loss迟迟不收敛现象训练早期loss正常下降但到第20轮左右开始震荡验证集几乎检不出任何手套框或者预测框全部重叠在图像角落。原因最常见的是两个。一是标签坐标是像素值没做归一化比如0 320 240 100 80直接当成归一化值用那模型学到的框位置全是乱的。二是标注软件按“第1类”导出类别id为1而数据配置里names只有0号类别训练时类别索引对不上相当于标签整体错位。鸟类目标检测数据集经常出现这种问题因为标注时用了多个工具链格式转换时把索引搞错。解决跑一遍2.3的健康检查脚本重点关注“coord out of range”和“class out of range”两类输出。如果坐标是像素值可以写脚本把每行除以图像宽高做归一化如果类别从1开始要么改txt里的数字为0要么在yaml的names里把第0个名字占位、第1个写glove。修完重新跑健康检查确认零错误再开训练。4.2 手套目标太小mAP50-95上不去现象mAP50还行比如0.85但mAP50-95明显偏低甚至不到0.5远距离或画面边缘的手套漏检。原因手套本身不是大目标在监控画面里往往只占几十乘几十像素。输入缩放到640后小目标的特征在下采样过程中进一步丢失。和鸟类目标检测的数据集类似这类“小而关键”的目标对小目标的召回能力要求极高YOLOv8n的特征金字塔对小目标的表达力有限。解决第一选择是把imgsz调到1280让目标在输入图中多占像素代价是显存占用翻倍和推理速度下降第二选择是换yolov8s或m的权重模型容量大了特征表达能力更强第三选择是训练时把mosaic关闭或调小因为mosaic把四张图拼一起小目标被切分得更碎细节直接丢失。如果项目允许离线推理SAHI切片推理是最后的兜底手段——把大图切成小图分块检测再合并但这个方案不适合实时系统。4.3 类别不平衡只有正样本框背景占比过高现象训练loss看着很低但预测时经常在背景上乱出框尤其容易把深色的机器外壳、反光材质误检成手套。原因负样本的定义不只是“没有手套的图像”还包括图像里被当作背景的大量非手套区域。YOLO系列的损失函数会在每个特征图位置产生大量候选框如果训练集里手套框只占图像面积很小比例模型会倾向于学“都是背景”对正样本的区分度不足。这就是PPE检测任务里的常见陷阱——背景越多误检越凶。解决一是利用YOLO自身的focal loss机制它对难分类样本更敏感官方默认开启不用手动调二是数据层面如果压缩包里有没戴手套的负样本图一定保留在训练集里不用标注模型需要知道“没有手套”长什么样三是如果手套框在画面中占比都很小适当加大hsv增强里的饱和度抖动让模型不要把颜色当唯一依据。四百张里如果负样本图太少我一般会单独补拍几十张空场景图只放images不放labels防止全局偏向背景。4.4 验证集虚高现场换光线就翻车现象验证集mAP到了0.9把模型部署到现场傍晚或灯光不足的环境里漏检一大片。原因这是“同源分布”问题。400张图很可能全部来自同一个摄像头、同一个时间段、同一个光照条件train和val只是从里面随机抽出来的本质上还是同一场戏的排练和演出。模型背诵了光影特征而不是学会“手套”这个概念。解决动手训练之前就分出一部分图做test集建议30张以上训练全程不看test——等训完再拿test集测一次。如果test结果比val明显低说明过拟合了。另外在数据增强时把hsv亮度抖动打开我习惯配hsv_v: 0.6以上让模型见过更宽的亮度范围。训练结束后用不同光线的现场照片单独跑一遍预测别只看val指标就以为完工了。4.5 zip解压报错和COCO/VOC标签混入怎么处理现象解压时提示“could not find eocd”或者解压后labels目录里躺着的是xml/json文件而不是txt。原因eocd是zip压缩包的结尾记录报这个错说明压缩包本身不完整通常是传输中断造成的——文件在服务端已经损坏你下载到的只是残片。标签混入xml/json则是标注工具导出格式不一致标注软件默认导出VOC或COCO格式有人改了后缀名就当作YOLO标签发出来里面的内容完全不是五数字格式。解决zip报eocd错误用7-Zip打开并选择“修复压缩包”修不了就重新下载别在损坏包上浪费时间。文件是VOC的xml或COCO的json时需要先转换成YOLO txt格式——xml每个object节点对应一个框json里是annotations数组里的bbox字段注意COCO的bbox是“左上角x、左上角y、宽、高”转成YOLO时要先算出中心点再除以图像宽高归一化。转完所有文件重新跑2.3的健康检查脚本确认每个txt都是五列数字。5. 把400张图像变成能上线的模型增强策略、评测指标与导出细节数据量不够增强来凑但增强不是无脑堆开关得按目标尺寸和场景特点来设置。这一章讲清楚增强参数怎么配、训练结果怎么判读、模型导出时最容易丢分的地方在哪。5.1 在线增强为主离线增强为辅小数据集的最佳组合400张图离工业落地还很远但通过训练时的在线增强每个epoch模型看到的都是经过随机扰动的新图像等效训练数据量会放大几十倍。离线增强比如把原图做翻转后另存为新图有两个问题一是文件体积膨胀标注要跟着复制管理成本高二是复制出来的样本高度相似模型容易对特定样本过拟合。所以我的做法是在线增强开够量离线增强只用来补充极端样本。比如现场有强烈的正午顶光但数据集里全是上午拍的那我就把少量正午照片做离线亮度调整后补进训练集而不是把所有图都翻几遍。记住一个原则在线增强负责多样性离线增强负责补齐场景盲区按图施工。5.2 用Ultralytics的超参数控制增强强度在训练命令里通过hyp参数指定一个增强配置文件或者直接在Python训练调用里传常用的一组配置如下# data_aug.yaml搭配 yolo detect train datagloves.yaml modelyolov8n.pt hypdata_aug.yaml hsv_h: 0.02 # 色相抖动幅度 hsv_s: 0.7 # 饱和度抖动 hsv_v: 0.6 # 亮度抖动应对现场光照变化 fliplr: 0.5 # 水平翻转概率 mosaic: 0.5 # mosaic概率小目标数据建议从1.0降到0.5 mixup: 0.2 # 样本混合增强 scale: 0.5 # 尺度抖动范围每个参数的调整逻辑手套检测对颜色相对敏感所以饱和度抖动0.7能帮助模型泛化到不同颜色手套亮度抖动0.6是为了让模型不依赖固定曝光条件。mosaic是双刃剑——它对中等目标效果显著但小目标被四分五裂后更容易丢失所以我把默认1.0降到0.5。mixup对小目标相对温和0.2是个稳妥值。如果跑了100轮发现val指标还在缓慢爬升但train已经收敛说明增强强度可能偏高把mosaic调到0.3再试。训练日志里每个epoch都有增强参数汇总翻翻就知道实际作用了多少次。5.3 用mAP50、混淆矩阵和PR曲线决定阈值训练结束后runs/detect/train目录下会生成results.png、confusion_matrix.png和一堆曲线图。不要只看一个mAP就下结论。三个指标配合着读mAP50指的是IoU阈值0.5下的平均精度这个值对“框大概在哪”更敏感mAP50-95则是从0.5到0.95每隔0.05算一次平均对框的精确贴合度要求更高。手套检测属于工业合规场景我们更关心“手套区域有没有被覆盖”所以mAP50是主要参考mAP50-95只要不掉队就行。混淆矩阵里关注Background那一行和那一列。如果Background列有值说明很多背景区域被当成了手套对应误报多如果Background行有值说明有真实手套被漏掉了对应漏检多。PR曲线帮你选置信度阈值曲线越靠近右上角模型越好在曲线上找一个点确认它的precision和recall组合满足业务需求。我一般是选recall更高的点作为报警阈值——漏检比误报更危险宁可偶尔误报不能放过没戴手套的人。5.4 导出ONNX/TensorRT先保住preprocess一致性训练完成后部署到端侧通常需要导出成ONNX或TensorRT引擎from ultralytics import YOLO model YOLO(runs/detect/train/weights/best.pt) model.export(formatonnx, imgsz640, dynamicTrue)命令行等价写法yolo export modelruns/detect/train/weights/best.pt formatonnx imgsz640dynamicTrue允许ONNX模型接受动态输入尺寸部署更灵活但某些推理框架对动态尺寸支持一般如果遇到报错就改成固定640。导出后务必验证一件事训练时YOLO内部默认带letterbox预处理推理端如果直接用cv2.resize把图改成方形会导致图像变形、坐标偏移——轻则框不准重则小目标手套全漏。这一步翻车率极高属于典型的“训练没问题、部署掉链子”。验证方式很简单拿训练时的某张val图原图和letterbox后的图分别推理一次检查输出框在还原坐标后是否重叠一致。6. 部署前最后一步坐标还原、ROI限定与多帧投票模型训练和导出的终点是落地上线。就算你前面每一步都做对了到了推理端还要处理两个工程问题letterbox坐标还原以及如何用“人手套”的联合逻辑降低误报。6.1 letterbox坐标还原推理与训练必须同款预处理训练时图像被letterbox成640x640模型输出的框坐标都是在这个“加了黑边”的画布上算的。推理时如果直接画回原始图像上框会整体偏移。还原逻辑是把黑边裁掉再除以缩放比例import cv2 import numpy as np def letterbox(img, new_shape640): h, w img.shape[:2] r min(new_shape / h, new_shape / w) nh, nw int(round(h * r)), int(round(w * r)) resized cv2.resize(img, (nw, nh)) dw, dh (new_shape - nw) // 2, (new_shape - nh) // 2 canvas np.full((new_shape, new_shape, 3), 114, dtypenp.uint8) canvas[dh:dh nh, dw:dw nw] resized return canvas, r, (dw, dh) # 推理拿到每个框的x1, y1, x2, y2后 # 它们是letterbox画布上的坐标还原到原图 x1_orig int((x1 - dw) / r) y1_orig int((y1 - dh) / r) x2_orig int((x2 - dw) / r) y2_orig int((y2 - dh) / r)这里的r和(dw, dh)必须和训练时保持一致。如果你在推理端换了别的缩放方式比如直接resize到640x640而不是letterbox那么所有框都要重算否则直接翻车。这也是为什么导出ONNX时很多人推荐imgsz用固定值就是为了让预处理链路在训练和推理两端固定成一模一样的。6.2 多帧投票与ROI限定让阈值判断更稳定单帧检测结果直接拿来做合规判断容易被运动模糊、反光和瞬间遮挡干扰。我的工程习惯是如果检测用途是“人是否戴手套”先跑一个人头或人体检测器把手套检测限定在人框附近区域再对连续多帧做投票。比如连续10帧中至少有8帧检测到手套才判定该人戴了手套连续10帧都没有检测到才判为未戴并触发告警。这样能过滤掉工人抬手喝水、转身之类的单帧误判。“手套检测”这类PPE模型的指标好坏一半在训练另一半在推理策略。你要是拿400张白天图训练完直接部署到夜班现场下半夜的漏检率会让你怀疑人生——我见过同事这么干过后来补抽了两小时现场视频关键帧做增强才救回来。所以拿到这个数据集第一件事不是急着跑训练而是确认它的拍摄场景离你的真实场景有多远场地光线、手套颜色、摄像机俯仰角都不一样就要有补数据的准备。把这些想清楚再动手训练、评测、部署一条线走下来会顺很多。希望帮到你。本文还有配套的精品资源点击获取
返回列表