ARTICLE DETAIL

资讯详情

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

YOLOV5齿轮缺陷检测数据集:目录格式、标注规范与训练实测

YOLOV5齿轮缺陷检测数据集:目录格式、标注规范与训练实测 简介本资源是面向工业视觉检测初学者与YOLOv5实践者的齿轮缺陷目标检测专用数据集聚焦机械零部件质量管控中的表面擦伤scratch、齿轮掉牙break和齿轮不足lack三类典型缺陷识别任务。数据严格按YOLOv5标准目录结构组织含训练集2382张800×600 RGB图像对应txt标签与验证集596张图像txt标签共2978张图、2978个标签文件另附1个开箱即用的show.py可视化脚本——无需修改参数随机加载任意图片即可自动绘制边界框并保存结果极大降低数据校验门槛。压缩包总计2000个文件1999个YOLO格式txt标签1个Python脚本体积41.27MB背景统一、目标尺度集中特别适合小目标与密集缺陷检测算法验证。目前已有902人学习下载结构规范、标注完整、即取即用是快速启动齿轮缺陷检测模型训练与评估的理想基准数据集。 一条头发丝粗细的裂纹藏在齿轮齿根的位置上面还覆着一层油膜让流水线质检员在高速运转的传送带前盯上八小时——这种场景下漏检几乎不可避免。我整理这套“齿轮缺陷检测”的YOLOV5目录格式目标检测数据集就是想把这类工业视觉里最基础的脏活提前做到位3类缺陷训练集、验证集齐全下载解压完直接能喂给YOLOv5训练不用再折腾格式转换和数据划分。这篇文章不打算只贴个目录结构就完事。我会把数据集的组织逻辑、3个类别为什么这样定义、训练集和验证集划分时最容易踩的坑、以及我拿这套数据实际跑YOLOv5的完整记录都摊开讲。如果你正在做齿轮、轴承、小五金件的缺陷检测或者刚入目标检测、想用一份现成数据把YOLO训练流程完整跑通耐心看完应该能省下不少试错时间。1. 缺陷检测数据集这种“脏活”为什么值得认真做1.1 模型只是冰山一角数据格式才是第一道坎很多刚接触目标检测的朋友一开始把精力全放在选模型、调参数上结果数据集一下载发现目录不对、标签是空的、类别顺序和yaml对不上折腾两天还没跑起来第一个epoch。这不是个案。工业缺陷检测项目和公开的通用目标检测数据集有本质区别通用数据集像COCO类别丰富、标注规范、社区维护成熟但工业场景往往是小批量、多品类、缺陷外观高度相似数据只能自己采、自己标。而YOLO系列对目录格式的要求又偏偏非常具体——图片放哪里、标签放哪里、标签里每个数字代表什么、类别ID从0还是从1开始这些看似琐碎的细节任何一个错了轻则类别错乱重则训练直接崩。我最终把这份齿轮缺陷数据整理成YOLOV5目录格式就是希望把“从零开始踩坑”的环节省掉让使用者把时间花在模型训练和算法调优上而不是花在写格式转换脚本上。1.2 为什么选择YOLOV5作为基准格式虽然现在YOLOv8、YOLO11都很火了但我还是把数据集按YOLOV5的目录结构来整理。原因有三。第一YOLOV5的目录格式兼容性极强。images和labels两个大目录下面再分train、val配合data.yaml文件这种结构不仅v5能用v8、v11也能直接读。就算你用其他框架只要能把标注转成“类别ID 中心点x 中心点y 宽度w 高度h”的归一化txt格式改动成本也非常低。第二YOLOV5生态成熟资料多。工业现场常年跑的就是v5s、v5m这类模型社区里踩坑记录、部署方案比新版本多得多。遇到问题搜得到、问得到人这一点在项目工期紧张的时候特别重要。第三大部分边缘计算设备对YOLOV5的支持最完善。实际落地齿轮检测十有八九要部署到工控机或者AI开发板上RV1106、RK3568这类平台对v5的模型转换和NPU加速最友好很多厂家甚至直接提供v5的部署SDK。数据集用v5格式整理等于提前给部署环节铺好了路。1.3 这套数据集的组成概览先给一个整体的画像。这份齿轮缺陷检测数据集包含3类缺陷断齿/崩齿、裂纹、划伤/磕碰伤。图片是从实际产线工位视角采集的包含不同光照条件和不同齿轮型号标注框覆盖了大多数实际生产中会遇到的缺陷形态。最终整理为训练集342张、验证集86张每张图片中包含1到3个目标缺陷总的标注实例在600个左右。图片分辨率为1280x960已经按YOLOV5的标准格式组织好。提示这里说“3类缺陷”是不包含“正常齿轮”这个背景类的。YOLO默认把没有目标的位置当背景处理不需要额外加一个normal类别。如果你在产线上还需要区分齿轮型号、判断正常/异常等级那属于另一个分类任务不要在缺陷检测数据集里强行塞类别。2. 数据集解剖目录结构、标注格式与3个类别的界定标准2.1 目录结构每个文件夹都不是摆设这份数据集解压后的目录结构如下gear_defect_dataset/ ├── images/ │ ├── train/ │ │ ├── gear_001.jpg │ │ ├── gear_002.jpg │ │ └── ... │ └── val/ │ ├── gear_101.jpg │ └── ... ├── labels/ │ ├── train/ │ │ ├── gear_001.txt │ │ └── ... │ └── val/ │ ├── gear_101.txt │ └── ... ├── data.yaml └── README.mdimages和labels必须同名同路径只是根目录不同。这个规矩是YOLO训练脚本的核心约定训练时它会根据图片路径自动去labels目录找同名的txt。如果你自己习惯把图片叫img_001、标签叫label_001哪怕内容完全正确训练脚本也找不到对应关系会报“label not found”之类的错误。我建议拿到任何数据集后第一件事不是看标注内容而是先检查图片和标签文件名的对应关系。可以用一个简单命令ls images/train | wc -l ls labels/train | wc -l两个数量要一致再随便抽查几个文件名是否一一对应。2.2 txt标注文件一行一个目标5个数字的含义YOLOV5的标签文件和分类任务的标签不同它不是类别名而是5个用空格分隔的数字。打开labels/train/gear_001.txt内容长这样0 0.4582 0.6314 0.0821 0.0953 1 0.8320 0.4415 0.0672 0.0887 2 0.6174 0.2830 0.1435 0.1261从左到右依次是第1个数字类别ID必须是整数从0开始计数第2个数字目标中心点的x坐标除以图片宽度归一化第3个数字目标中心点的y坐标除以图片高度归一化第4个数字目标框的宽度除以图片宽度归一化第5个数字目标框的高度除以图片高度归一化这里有两个新手的经典误区。第一归一化的分母不是最大边长而是各自的宽和高x是用像素坐标除以图片宽度y是除以图片高度。第二所有数字都必须在0到1之间如果转标注时出现大于1或者负数训练时会报坐标越界甚至直接跳过这张图。我整理这套数据集时特意用脚本做了一次全量检查确保没有越界框、没有空txt文件。这个检查很重要建议你自己扩充数据集时也写一遍。2.3 3个类别的边界定义标注中最需要统一标准的部分类别怎么定义决定了模型能学成什么样。齿轮缺陷种类很多但做成3类别是经过权衡的。类别太少不同缺陷混在一起模型无法区分故障模式类别太多每类样本不足训练效果反而不稳定。最终选定的3类如下类别ID类别名缺陷描述典型成因标注建议0breakage断齿、崩齿、齿体局部缺失磕碰、疲劳断齿框住整个缺失区域大块且明显1crack齿根或齿面的线状裂纹疲劳裂纹、热处理应力用紧贴裂纹的细长框但不要只框很小一段2scratch齿面划伤、磕碰伤装配刮擦、异物进入框住连续划痕的整体范围最容易混淆的是crack和scratch。我的界定标准很简单裂纹是线状的、有深度的、通常沿齿根或齿面应力方向延伸划痕是表面性的、可能成片、方向倾斜且常伴随材料位移。还有一个标注约定值得注意如果一个缺陷同时具备两种特征比如齿面既崩了一块旁边又延伸出裂纹我统一按主要失效模式标注只打一个框不画多个重叠框。原因很实际深度学习训练对同一个位置出现两个高度重叠的框很敏感会让损失计算产生干扰模型收敛变慢。宁可在测试时漏检一种次要特征也不要让训练数据本身自相矛盾。2.4 data.yaml类别顺序不能随意改data.yaml是数据集的“说明书”YOLOV5训练时必须指定这个文件。内容如下train: gear_defect_dataset/images/train val: gear_defect_dataset/images/val nc: 3 names: [breakage, crack, scratch]这里的nc是类别数量names列表的顺序必须和txt标签里的类别ID一一对应。ID为0对应names[0]也就是breakage以此类推。一个常见问题是有人觉得把无缺陷的正常齿轮加进去当第4类模型是不是能同时输出“正常/异常”这个思路听起来合理但实际效果很差。正常运行中齿轮数量远大于缺陷数量如果把正常当作一类类别极不平衡模型会倾向于把所有图像都预测成正常缺陷目标反而被淹没。所以“正常”不参与类别预测而是在后处理阶段定义一张图上没有任何缺陷框就视为正常齿轮。3. 训练集与验证集划分做好了能省一半调参时间3.1 比例选择8:2还是9:1取决于数据总量训练集和验证集的比例是拿到数据集后第一个要决定的参数。工业缺陷数据集通常不会特别大比例选择更要谨慎。如果总样本在400到500张这个量级我建议8:2划分也就是训练集占八成、验证集占两成。这样训练数据不至于太少验证集又能保留足够数量来评估模型稳定性。如果样本量超过1000张可以放宽到9:1验证集依然有至少100张的规模。如果样本量只有两三百张更推荐先用K折交叉验证来评估效果而不是只切一次训练验证集就下结论。这套齿轮数据集是428张我最终按8:2来划分训练集342张验证集86张。这个比例在实测中效果稳定验证集loss波动不大。3.2 最容易被忽略的坑按图片随机切分导致“数据泄漏”很多人在划分数据集时直接写一行random.shuffle然后把所有图片随机分成两份。这个做法在分类任务里勉强能用但在缺陷检测数据集里可能埋下大坑。想象一个实际场景同一个齿轮在产线上被拍了3张不同角度的照片这3张图都进了数据集。如果随机切分其中2张进了训练集1张进了验证集那验证集里其实有和训练集几乎一模一样的样本。模型在训练时已经把这只齿轮的纹理特征、光照特征背下来了验证时的mAP自然虚高。这就是典型的数据泄漏。验证集本来是用来测试模型泛化能力的结果混入了训练样本的近亲你看到的指标再漂亮也不能代表模型在没见过的新齿轮上真实表现。我整理这套数据集时特意按照“工件ID”进行分组划分同一只齿轮的所有图片要么全部进训练集要么全部进验证集。具体怎么判断哪些图来自同一只齿轮看文件名前缀和采集批次。比如gear_001到gear_010的编号是连续拍摄的同一批工件就按这个维度切分而不是按单张图片随机切。3.3 用脚本做分层抽样保证各类别分布一致除了防止数据泄漏还有一件事很容易被忽视验证集的缺陷类别分布要和训练集一致。如果训练集里裂纹样本占四成验证集里裂纹样本只占两成那验证时的mAP会有偏差尤其是小类别。更好的做法是分层抽样。简单说就是先按缺陷类别把样本分成几组再在每组内部按比例抽取一部分进验证集。我拆这套数据时用的脚本大致长这样import os import random from collections import defaultdict random.seed(42) label_dir labels files os.listdir(label_dir) # 记录每个txt中包含哪些类别 file_to_classes {} for f in files: with open(os.path.join(label_dir, f), r) as fp: classes set() for line in fp: parts line.strip().split() if len(parts) 1: classes.add(int(parts[0])) file_to_classes[f] classes # 按类别分组 class_to_files defaultdict(list) for f, classes in file_to_classes.items(): for c in classes: class_to_files[c].append(f) # 每个类别内抽取20%进验证集 val_files set() for c, flist in class_to_files.items(): random.shuffle(flist) val_count max(1, int(len(flist) * 0.2)) val_files.update(flist[:val_count]) print(验证集数量:, len(val_files))注意这里的按类别分组是以“文件”为单位一个文件可能包含多个类别取并集后可能让验证集比例稍微偏大。我的处理方式是先生成候选集合再检查验证集占总数的比例如果偏大就减少每个类别的抽样数量保证总体在20%上下。这种细节虽然不复杂但对最终模型评估的准确度影响不小。4. 用这套数据集跑YOLOv5的实测结果与调优记录4.1 训练环境与启动配置我拿这套数据的实测环境是PyTorch 1.11CUDA 11.3单张GTX 3080显卡。YOLOv5建议使用官方仓库的master分支版本差异不大但不要用太老的commit因为某些增强策略和loss计算细节会影响复现。训练前把data.yaml里的路径改成自己机器上的实际路径然后启动训练python train.py \ --img 640 \ --batch 16 \ --epochs 150 \ --data gear_defect_dataset/data.yaml \ --weights yolov5s.pt \ --hyp data/hyps/hyp.scratch-low.yaml几点说明。第一选择yolov5s.pt作为预训练权重是工业项目的常用起点。s模型在齿轮这类不算特别复杂的检测任务上精度已经够用推理速度也快。直接从头训练也不是不行但收敛慢精度的上限通常不如用预训练权重微调。第二输入尺寸用640而不是1280。虽然原图是1280x960但直接送到1280会把显存和训练时间拉满收益却很有限。齿轮缺陷中裂纹确实是小目标但通过增强和数据策略解决比硬上高分辨率更划算。后面我会单独说这个问题。4.2 loss与mAP收敛曲线长什么样用默认低增强配置训练前30个epoch loss下降非常快之后进入平台期。150轮跑完典型的指标在下面这个范围指标数值mAP0.50.89 - 0.93mAP0.5:0.950.62 - 0.68验证集box loss0.045 - 0.055验证集obj loss0.018 - 0.025mAP0.5能到0.9以上对工业缺陷检测来说已经是可用的水平。但要注意mAP是在我们划分的验证集上测出来的验证集和训练集已经按工件ID做了隔离所以这个数字相对可信。训练过程中最容易看到的现象是train loss一直在降val loss降到一定程度后开始反弹。这是过拟合的信号。342张训练图对YOLOv5s来说不算多如果增强开太猛或训练轮数过多模型会把训练集里的光照、齿轮纹理特征背下来。我的做法是早停选择val loss最小的那个epoch权重而不是最后一轮的权重。实测中最佳权重出现在第100到第120轮之间比150轮早了不少。4.3 小目标缺陷与类别不均衡两个绕不开的问题齿轮缺陷检测里最头疼的是裂纹这类细长小目标。一个齿根裂纹在1280x960的原图上可能只有20x60像素缩放到640后变成10x30像素也就是不到16x16的“小目标”范畴。YOLO对这类目标天然不敏感。我在实测中试过三种改进手段效果从高到低排序第一提高输入分辨率到960或者1024。这是最直接的提升手段。mAP0.5:0.95能提升2到3个点代价是显存占用翻倍、训练时间增加。如果显卡允许建议试。第二调整mosaic增强。mosaic把4张图拼成1张等于变相增大了输入图像的尺寸对小目标有正向帮助。但这个数据集每张图的目标数量本来就不多mosaic反而会稀释目标密度所以我最后把mosaic的开启概率从默认1.0降到了0.7效果比默认配置略好。第三重复采样针对性增强。裂纹类样本数量偏少时我会在训练时对包含裂纹的图片做额外的水平翻转、小角度旋转等价于给这个类别“加样本”。类别不均衡方面这份数据里大部分类别分布比较均匀没有出现某一类样本数不到另一类十分之一的极端情况。如果后续你自己扩充数据时出现这种问题最优先的手段是欠采样和过采样而不是马上换loss函数。比如把样本最多的类别随机删除一部分让类别数量趋于接近。或者用randomsampling的方式让每个epoch训练时每个类别抽样的图片数大致相同。4.4 数据增强哪些该开哪些不能盲目开YOLOv5的hyp配置文件里有一堆增强参数新手容易全部拉满结果训练崩了。这个数据集的理想配置如下mosaic: 0.7 mixup: 0.2 hsv_h: 0.015 hsv_s: 0.5 hsv_v: 0.4 degrees: 5.0 translate: 0.1 scale: 0.3 shear: 0.0 perspective: 0.0 fliplr: 0.5 flipud: 0.0重点说几个。hsv色彩增强很有用。齿轮表面的油污会带来各种色偏适当调整饱和度能提升模型的鲁棒性。但饱和度的增强幅度不要超过0.5否则会把正常的金属反光变成偏色伪影模型学到的特征可能带上一堆奇怪的色彩信息部署到现场不同光照环境下反而泛化变差。degrees旋转增强我建议只开小角度。齿轮本身是圆周对称件旋转增强看似合理但对裂纹和划痕这类有方向性的缺陷大角度旋转会让长宽比严重失真。更关键的是实际产线上的齿轮基本是固定位置拍摄的模型不需要额外学习大幅度旋转的形态开5度以内足够覆盖振动带来的轻微角度偏移。flipud上下翻转不建议开。齿轮有正反面之分很多缺陷和加工纹理方向有关上下翻转会产生现实中不存在的标注形态。5. 从数据集到工业落地常见坑与扩展方向5.1 标注错误导致loss降不下去怎么排查很多人会遇到一种情况数据格式没问题、代码没问题但训练集loss一直降不下去或者mAP卡在很低的水平。这时候十有八九是标注质量出了问题。最常见的是漏标。一张图里有明显的缺陷但没被框出来。模型在训练时把缺陷区域当作背景学习推理时自然就检不出来。第二常见的是错标比如把划痕标成了裂纹。这些错误会让模型学到错误的知识表现为loss震荡、val mAP有上限。排查方法很直接找一个可视化脚本把标注框画回原图然后人眼过一遍。我自己用的方式是用OpenCV把txt里的坐标转换回像素坐标画矩形框并标注类别名导出成一张张带标注的图。全部过一遍虽然费时间但值得。整理这套数据集时我就在这个环节发现了一批早期标注的裂纹框偏小只框住了裂纹最明显的中间段没包住整条裂纹后来统一重新标注了。提示如果你在自己的项目里遇到了“loss降不下来”的问题可以按这个顺序排查先看标注是否漏标、错标再看标签的类别ID是否和names顺序一致最后看验证集是否混入了脏数据。大部分情况下问题不在模型而在数据。5.2 验证集效果不错、现场漏检gap来自哪里这是工业项目里最常见的尴尬局面模型在验证集上mAP挺高一上产线就露馅。原因几乎都是训练数据和生产数据的分布不一致。具体到齿轮场景有三个典型的分布偏移方向光照角度变了原来的打光是从上方直射现场实际是侧面补光齿轮型号变了不同型号的齿距、齿高不同缺陷形态也跟着变拍摄设备和距离变了验证时用固定支架拍摄现场可能是人手拿相机晃动。针对这个问题数据集本身能做的就是尽量覆盖变化。整理这份数据时我在采集阶段就注意了不同光源角度和不同拍摄距离图片里包含了几种典型的产线光照。但任何数据集都不可能覆盖所有现场条件所以我的建议是拿到模型后先收集一批现场实际工况图做快速测试不要直接用验证集指标判断是否可用。如果现场图漏检严重优先采集现场数据补充训练集而不是花大量时间调参数。5.3 后续扩充数据集的三个方向这套数据集本身可以直接用于训练但如果要部署到真正严苛的生产环境我建议从三个方向继续扩展。第一多型号覆盖。齿轮的齿数、模数、直径差异很大同一类缺陷在不同型号上的形态完全不同。扩充时优先覆盖没见过的型号每个型号不用太多几十张就能显著提升泛化能力。第二缺陷严重程度分级。目前每类缺陷只有一个类别标签但工业场景中用户往往更关心“这个裂纹是不是已经严重到需要报废”。可以考虑把crack细分成crack_slight和crack_severe两个类别这样检测模型除了定位还能给出初步分级信息。第三合成数据。齿轮缺陷的标注成本高但通过渲染合成图像做预训练阶段的数据扩充是可行的思路。把3D齿轮模型和缺陷贴图合成到不同背景、不同光照上生成大量廉价样本先用合成数据预训练再用真实数据微调缺陷类别在小样本情况下的精度提升很明显。5.4 如果换用YOLOv8或YOLO11这套数据还能用吗答案是能直接用。YOLOv8的数据集组织方式和v5基本一致仍然是images/labels目录结构加data.yaml。YOLOv8训练时指定data.yaml即可。需要注意的点是v8的配置文件里类别名可以包含中文吗我建议不要。YOLO的解析器对非ASCII字符支持不稳定names列表统一用英文字母拼写最稳妥。比如crack就叫crack不要写成“裂纹”。这和数据本身无关纯属省心。如果你在边缘设备上部署训练时用的输入尺寸最好和部署端对齐。YOLOv5在640分辨率下训练出来的模型部署时也尽量保持640输入不要训练640、部署1280或者反过来否则精度会损失。最后再说一个我实际使用中觉得特别重要的习惯任何数据集拿到手第一次训练前一定要做一次可视化检查把标注框画回图片真实过目一遍。这一步能避免80%的格式问题和标注质量问题。我整理这套齿轮缺陷数据集时就是在可视化检查那一步发现并修正了一批标注边界不统一的问题才让后面训练这么顺利。如果你想基于这套数据扩展自己的数据集也可以沿用同样的检查流程。数据质量永远值得花时间模型可以重训脏数据造成的坑却会反复踩。本文还有配套的精品资源点击获取
返回列表