☰
齿轮缺陷检测数据集:7类500张YOLO格式,开箱即用
2026/10/11 2:40:08 网站建设 项目流程

简介:本资源为面向工业质检与深度学习实践的齿轮缺陷检测数据集,适合从事目标检测算法训练、缺陷识别项目开发的学生与工程师使用。数据按YOLOv5目录结构组织,可直接投入YOLO系列模型训练,标注采用classes与x_centre、y_centre、w、h的相对坐标格式,涵盖孔洞、缺损、齿牙等7个类别,具体类别可参考class文本文件。压缩包共1093个文件,以546个txt标签、545张jpg图像为主,另含1个py脚本与1个png文件,整体约183.48MB,其中训练集约400张、验证集约100张图片及对应标签,划分清晰便于直接开展实验。目前已有344人学习下载。读者可借此快速搭建齿轮缺陷检测训练与验证流程,省去数据采集与标注成本,并借助现成目录结构对照排查标注格式与类别配置问题。

1. 齿轮缺陷检测数据集:7 类缺陷、500 张图,拿到就能喂给 YOLO

工业质检里做齿轮缺陷检测,最耗时的往往不是调模型,而是攒数据。产线上拍到的齿轮图像,缺陷样本稀少、类别不均衡,自己标一遍少说几天。这份资源把这件事前置做完了:约 500 张齿轮图像,按 YOLO 标准目录组织,训练集 400 张左右、验证集 100 张左右,每张图配一份同名 txt 标签,标注格式是 YOLO 的相对坐标(class、x_centre、y_centre、w、h),类别共 7 类,涵盖孔洞、缺损、齿牙等常见齿轮缺陷,具体类别名以随包的 class 文本文件为准。它解决的是「从零标注」这个卡脖子环节,适合做工业视觉质检的算法同学、想跑通 YOLO 检测全流程的新手,以及需要快速验证缺陷检测方案可行性的团队。下面按「数据长什么样 → 怎么接进训练 → 坑在哪 → 怎么验证」的顺序拆开讲。

2. 拆开数据包:目录结构、标签格式与类别映射

拿到一个数据集,我第一件事不是急着训练,而是先把目录和标签翻一遍,确认它到底能不能直接用。这一步花十分钟,能省掉后面几小时的报错排查。

2.1 目录结构长什么样

资源说明里写的是「按照 YOLOV5 文件夹保存」,这是目前最通用的组织方式,YOLOv5、v8、v11 乃至 ultralytics 新版都能直接吃。典型结构如下:

gear_defect_dataset/ ├── images/ │ ├── train/ # 约 400 张 jpg │ │ ├── frame_0507_jpg.rf.c381a954....jpg │ │ └── ... │ └── val/ # 约 100 张 jpg │ └── ... ├── labels/ │ ├── train/ # 与 train 图片同名的 txt │ │ ├── frame_0507_jpg.rf.c381a954....txt │ │ └── ... │ └── val/ │ └── ... └── classes.txt # 7 个类别名,一行一个

从文件名frame_0507_jpg.rf.c381a954f59a3473ca087f7b1024cec9.jpg能看出,这是经过某标注平台导出后带哈希后缀的命名,frame_0507是原始帧号,.rf.后面那串是平台生成的唯一标识。这种命名不影响训练,但要注意:图片和标签必须严格同名,只差扩展名。如果标签目录里出现frame_0507.txt而图片是frame_0507_jpg.rf.c381a954....jpg,YOLO 就找不到标签,会当成背景图处理,训练直接跑偏。

2.2 标签格式:相对坐标怎么读

YOLO 的标签是纯文本,每行一个目标,格式固定为五个字段:

class_id x_center y_center width height

以齿轮缺陷为例,一行真实标签大概长这样:

0 0.5123 0.4876 0.1024 0.0953 2 0.3011 0.7205 0.0876 0.1132

含义拆开看:第一个0是类别索引,对应classes.txt里的第 0 行;后面四个都是归一化到 0~1 的相对坐标,x_center、y_center是框中心点相对整图宽高的比例,width、height是框宽高相对整图宽高的比例。这一点和 VOC 的绝对像素坐标(xmin、ymin、xmax、ymax)完全不同,也是新手最容易翻车的地方——把绝对坐标直接塞进 YOLO 标签,模型会学到一堆越界的框,loss 直接爆炸。

用一段脚本快速校验标签是否合法,比肉眼翻 txt 靠谱得多:

import os def check_labels(label_dir, img_dir): bad = [] for txt in os.listdir(label_dir): if not txt.endswith('.txt'): continue # 检查是否有同名图片 stem = txt[:-4] if not any(f.startswith(stem) and f.endswith(('.jpg', '.png')) for f in os.listdir(img_dir)): bad.append((txt, 'no matching image')) continue with open(os.path.join(label_dir, txt)) as f: for i, line in enumerate(f): parts = line.strip().split() if len(parts) != 5: bad.append((txt, f'line {i} field count {len(parts)}')) continue cls, x, y, w, h = parts vals = list(map(float, parts[1:])) # 相对坐标必须落在 0~1,且宽高大于 0 if not all(0 <= v <= 1 for v in vals) or vals[2] <= 0 or vals[3] <= 0: bad.append((txt, f'line {i} out of range {vals}')) return bad issues = check_labels('gear_defect_dataset/labels/train', 'gear_defect_dataset/images/train') print(f'发现 {len(issues)} 处问题') for t in issues[:10]: print(t)

这段脚本做三件事:确认每份标签有同名图片、确认每行是 5 个字段、确认后四个值在 0~1 之间且宽高为正。参数上,label_dir和img_dir要指向同一划分(train 对 train,val 对 val),别交叉传。跑完如果issues为空,说明这份数据在格式层面是干净的,可以进入下一步。

2.3 类别映射:class 文件是唯一真相

7 个类别(孔洞、缺损、齿牙等)的索引顺序,完全由classes.txt决定。这个文件里第几行,就是标签里 class_id 几。常见做法是训练前先打印一遍:

with open('gear_defect_dataset/classes.txt', encoding='utf-8') as f: names = [l.strip() for l in f if l.strip()] for i, n in enumerate(names): print(i, n)

输出类似0 孔洞、1 缺损、2 齿牙……训练配置里的names必须和这个顺序逐字一致,包括中英文、空格。我见过有人把classes.txt里的中文类别手动改成英文写进 yaml,结果索引对不上,模型把「孔洞」预测成「齿牙」,mAP 看着还行,实际全错位。类别名一旦确定,训练、推理、可视化三处都要用同一份,别各写各的。

3. 接进 YOLO 训练:data.yaml 配置与首轮跑通

数据格式确认无误后,下一步是把它接进训练框架。这里以 ultralytics 的 YOLOv8/v11 为主线,YOLOv5 的配置逻辑几乎一致,差异我会点出来。

3.1 写一份能跑的 data.yaml

YOLO 训练靠一个 yaml 文件告诉框架「图在哪、类有几类、叫什么」。针对这份数据,配置如下:

# gear_defect.yaml path: /abs/path/to/gear_defect_dataset # 数据集根目录,建议写绝对路径 train: images/train # 相对 path 的训练图目录 val: images/val # 相对 path 的验证图目录 nc: 7 # 类别数,与 classes.txt 行数一致 names: # 顺序必须与 classes.txt 完全对应 0: 孔洞 1: 缺损 2: 齿牙 # ... 其余类别按 classes.txt 补全

几个参数必须说清楚。path用绝对路径最稳,相对路径在不同工作目录下启动训练时经常找不到文件,这是血泪经验。train和val是相对path的子路径,YOLO 会自动去images/train找图,然后按约定去同级labels/train找标签——它不会读你 yaml 里写的 labels 路径,而是把images替换成labels。所以目录名必须是images和labels这对固定搭配,改成imgs、labs就得额外配train_labels,反而麻烦。nc和names的键值对数量必须相等,少一个多一个都会在启动时报 assert 错误。

3.2 启动首轮训练

配置写好,一条命令就能跑起来:

yolo detect train \ data=gear_defect.yaml \ model=yolov8n.pt \ epochs=100 \ imgsz=640 \ batch=16 \ project=runs/gear \ name=baseline

逐个参数解释:model=yolov8n.pt用 nano 版预训练权重,500 张图的小数据集上 nano 足够,先跑通再换 s/m;epochs=100是首轮基线,小数据集容易过拟合,100 轮后看验证曲线再决定加不加;imgsz=640是默认输入尺寸,齿轮缺陷目标通常不大,640 起步合适,若缺陷极小可提到 1024,但显存和速度要权衡;batch=16在 8G 显存上比较稳,爆显存就降到 8;project和name决定结果存到runs/gear/baseline/,方便多组实验对比。

YOLOv5 的话命令换成python train.py --data gear_defect.yaml --weights yolov5n.pt --epochs 100 --img 640 --batch 16,yaml 结构里nc、names一样,只是路径字段名略有差异(v5 用train、val直接写完整相对路径)。

3.3 训练时盯哪几个指标

启动后终端会刷一屏指标,新手容易看花眼。真正要盯的就三个:box_loss(框回归损失)、cls_loss(分类损失)、mAP50。前两个应该整体下降,如果震荡剧烈或突然飙到 nan,多半是学习率太大或标签有脏数据;mAP50在验证集上应该稳步爬升,100 轮后如果还趴在 0.1 以下,先别怀疑模型,回头查标签和类别映射。训练结束会在runs/gear/baseline/下生成results.csv、confusion_matrix.png、val_batch*.jpg,其中val_batch那几张预测可视化图最直观——直接看模型框出来的缺陷位置对不对,比盯数字快。

4. 避坑与排查:这份数据最容易翻车的五个点

数据集本身干净,不代表接进训练就一帆风顺。下面五条是我在类似工业缺陷数据上反复踩过的,按「现象 → 原因 → 解决」列出来。

现象一:训练启动即报No labels found。原因通常是目录名不匹配,YOLO 默认按images/xxx推labels/xxx,如果你的标签放在labels/train但图片在images/train之外的位置,或者标签目录叫label(少个 s),它就找不到。解决:严格用images/train+labels/train这对命名,用 2.2 的校验脚本先确认同名文件存在。

现象二:mAP 一直很低,但 loss 正常下降。大概率是类别索引错位。比如classes.txt里「孔洞」是第 0 类,但 yaml 的names里写成了第 1 位,模型学到的分类和评估时的类别对不上。解决:用 2.3 的脚本打印classes.txt,逐行核对 yaml 的names,顺序、文字一个都不能差。

现象三:验证集可视化里框全挤在图像左上角。这是把 VOC 绝对坐标当 YOLO 相对坐标用了。绝对坐标的 xmax 可能是 1280,远超 1,模型归一化后全挤到边界。解决:确认标签后四个值都在 0~1,用 2.2 脚本扫一遍,越界的行要么重新转换要么剔除。

现象四:训练中途 loss 变 nan。常见于标签里有宽高为 0 或负数的脏行,或者某张图标签文件为空但被当成有目标。解决:校验脚本里已经检查了宽高为正,空标签文件(0 字节)要么删掉对应图片,要么保留作为纯背景样本——但纯背景样本比例别太高,500 张里超过 10% 会拖累召回。

现象五:换到 YOLOv5 训练时提示nc不匹配。v5 对nc和names数量一致性检查更严,且部分版本要求names用列表而非字典。解决:v5 的 yaml 里names: ['孔洞','缺损','齿牙',...]写成列表形式,nc手动数一遍,别依赖自动推断。

提示:每次改完 yaml 或标签,先跑 2.2 的校验脚本再启动训练,比训练跑一半崩了再回头查省时间。

5. 验证与进阶:用混淆矩阵定位「哪类缺陷最难分」

训练跑通只是开始,真正决定这份数据能不能落地产线的,是搞清楚模型在哪一类缺陷上弱。500 张图、7 个类别,平均下来每类样本并不多,类别不均衡几乎必然存在,盲目调参不如先看混淆矩阵。

5.1 从混淆矩阵读出问题类别

训练结束后runs/gear/baseline/confusion_matrix.png是一张 7×7(加背景共 8×8)的热力图。横轴是预测类别,纵轴是真实类别,对角线越深越好。我一般重点看两处:一是对角线外的亮块,比如「孔洞」被大量预测成「缺损」,说明这两类在图像特征上太像,可能是标注边界模糊;二是最右侧的背景列,如果某类缺陷大量落到背景,说明该类目标太小或太少,模型根本没学到。

配合results.csv里的 per-class mAP,能定位到具体类别。假设「齿牙」类的 mAP 只有 0.3,其他类都在 0.7 以上,那问题就聚焦了:要么该类样本太少,要么该类缺陷形态差异大。常见做法是对该类做针对性补充——但这份数据是固定的,能做的转向数据增强。

5.2 小数据集上的增强策略

500 张图属于典型小样本,默认增强往往不够。在训练命令里加几个参数:

yolo detect train \ data=gear_defect.yaml \ model=yolov8n.pt \ epochs=150 \ imgsz=640 \ batch=16 \ mosaic=1.0 \ mixup=0.1 \ copy_paste=0.1 \ degrees=10 \ translate=0.1 \ scale=0.5

mosaic=1.0是 YOLO 默认的四图拼接增强,小数据集上非常有效,能显著提升小目标召回;mixup=0.1做图像混合,比例别太高,0.1~0.2 即可,太高会让缺陷边界糊掉;copy_paste=0.1对缺陷检测特别有用,它把目标抠出来粘贴到其他图上,等于凭空造样本,但要注意齿轮的纹理一致性,比例过高会引入不真实的拼接痕迹;degrees=10做小角度旋转,齿轮有旋转不变性,这个可以放心开;translate和scale控制平移和缩放幅度,别开太大,否则缺陷可能被移出画面。

5.3 一个我常用的验证习惯

调完增强、重训之后,我不只看 mAP 数字,一定会做一件事:从验证集里挑 10 张预测可视化图,逐张和原图对比,确认框的位置、类别、置信度都合理。数字会骗人,可视化不会。有一次 mAP 涨了 5 个点,结果看图发现模型把齿轮的正常齿牙也框成了「齿牙缺陷」,纯粹是过拟合到纹理上了——这种问题光看指标根本发现不了。

从那以后我每次训完工业缺陷模型,都强制走一遍「看 10 张预测图」的流程,再决定要不要上线。这份齿轮数据集结构规整、标签规范,是很好的起点,但真正让它产生价值的,还是后面这套验证和迭代的习惯。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询