简介本资源为面向工业质检与深度学习实践的齿轮缺陷检测数据集适合从事目标检测算法训练、缺陷识别项目开发的学生与工程师使用。数据按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....jpgYOLO 就找不到标签会当成背景图处理训练直接跑偏。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, fline {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, fline {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 对 trainval 对 val别交叉传。跑完如果issues为空说明这份数据在格式层面是干净的可以进入下一步。2.3 类别映射class 文件是唯一真相7 个类别孔洞、缺损、齿牙等的索引顺序完全由classes.txt决定。这个文件里第几行就是标签里 class_id 几。常见做法是训练前先打印一遍with open(gear_defect_dataset/classes.txt, encodingutf-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.yamlYOLO 训练靠一个 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 \ datagear_defect.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ projectruns/gear \ namebaseline逐个参数解释modelyolov8n.pt用 nano 版预训练权重500 张图的小数据集上 nano 足够先跑通再换 s/mepochs100是首轮基线小数据集容易过拟合100 轮后看验证曲线再决定加不加imgsz640是默认输入尺寸齿轮缺陷目标通常不大640 起步合适若缺陷极小可提到 1024但显存和速度要权衡batch16在 8G 显存上比较稳爆显存就降到 8project和name决定结果存到runs/gear/baseline/方便多组实验对比。YOLOv5 的话命令换成python train.py --data gear_defect.yaml --weights yolov5n.pt --epochs 100 --img 640 --batch 16yaml 结构里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/trainlabels/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 \ datagear_defect.yaml \ modelyolov8n.pt \ epochs150 \ imgsz640 \ batch16 \ mosaic1.0 \ mixup0.1 \ copy_paste0.1 \ degrees10 \ translate0.1 \ scale0.5mosaic1.0是 YOLO 默认的四图拼接增强小数据集上非常有效能显著提升小目标召回mixup0.1做图像混合比例别太高0.1~0.2 即可太高会让缺陷边界糊掉copy_paste0.1对缺陷检测特别有用它把目标抠出来粘贴到其他图上等于凭空造样本但要注意齿轮的纹理一致性比例过高会引入不真实的拼接痕迹degrees10做小角度旋转齿轮有旋转不变性这个可以放心开translate和scale控制平移和缩放幅度别开太大否则缺陷可能被移出画面。5.3 一个我常用的验证习惯调完增强、重训之后我不只看 mAP 数字一定会做一件事从验证集里挑 10 张预测可视化图逐张和原图对比确认框的位置、类别、置信度都合理。数字会骗人可视化不会。有一次 mAP 涨了 5 个点结果看图发现模型把齿轮的正常齿牙也框成了「齿牙缺陷」纯粹是过拟合到纹理上了——这种问题光看指标根本发现不了。从那以后我每次训完工业缺陷模型都强制走一遍「看 10 张预测图」的流程再决定要不要上线。这份齿轮数据集结构规整、标签规范是很好的起点但真正让它产生价值的还是后面这套验证和迭代的习惯。希望帮到你。本文还有配套的精品资源点击获取