齿轮缺陷检测数据集与YOLO训练全流程:从标签格式到避坑指南

发布时间:2026/10/11 2:26:47
齿轮缺陷检测数据集与YOLO训练全流程:从标签格式到避坑指南
简介这份资源面向从事工业质检、机器视觉与深度学习缺陷检测的开发者与研究者提供了一套可直接用于YOLO训练的齿轮缺陷检测数据集帮助解决齿轮表面孔洞、缺损、齿牙异常等缺陷识别任务中数据采集与标注成本高的问题。压缩包共1093个文件包含545张jpg图像、546个txt标注文件以及1个py脚本和1个png说明图整体约183.48MB。数据按YOLOv5目录结构组织标注采用classes、x_centre、y_centre、w、h的相对坐标格式涵盖7个缺陷类别并已划分约400张训练集、100张验证集及测试集开箱即可投入训练与评估。目前已有344人学习下载。读者可直接获得划分完毕的图像与标签、类别定义文件及配套脚本省去数据清洗与格式转换环节快速复现检测流程并对比模型效果适合作为课程设计、竞赛项目或工业质检算法验证的实用数据基础。1. 齿轮缺陷检测数据集从一张齿面照片到可训练的 YOLO 标签产线上拿工业相机对着齿轮拍一张照齿面崩了一块、点蚀成片、或者齿根有裂纹这些缺陷在图像里往往只占几十个像素。想用 YOLO 把这几类缺陷框出来第一道坎从来不是模型结构而是数据集——你有没有一批划分好、标签对得上、类别文件写清楚的齿轮缺陷样本。这个标题讲的正是这件事一套已经划分好训练/验证/测试、带 YOLO 格式标签、附带 class 类别文件的齿轮缺陷检测数据集能让你跳过最耗时的数据整理阶段直接把精力放在训练和调参上。它适合两类人一类是想快速验证齿轮缺陷检测可行性的算法工程师另一类是做设备点检、想把视觉质检落地的现场技术人员。下面按「数据集长什么样 → 怎么接进 YOLO → 怎么训练 → 坑在哪」的顺序讲透。2. 齿轮缺陷数据集的结构与标签格式先看懂再动手2.1 一套划分好的 YOLO 数据集应该长什么样拿到一个齿轮缺陷检测数据集别急着写训练脚本先把目录结构摸清楚。常见的组织方式是按图像和标签分目录再按 train/val/test 三个子集切分。典型结构如下gear_defect_dataset/ ├── images/ │ ├── train/ # 训练集图像 │ ├── val/ # 验证集图像 │ └── test/ # 测试集图像 ├── labels/ │ ├── train/ # 训练集标签.txt │ ├── val/ │ └── test/ ├── classes.txt # 类别名称文件 └── data.yaml # 数据集配置文件这里有两个关键点。第一images和labels下的子目录名必须一一对应YOLO 训练时靠路径替换去找标签把图像路径里的images换成labels扩展名换成.txt。如果某一类图像没有对应标签文件训练时会被当成负样本或直接报错所以划分好的数据集里图像和标签数量必须严格相等。第二classes.txt和data.yaml里的类别顺序必须一致类别索引从 0 开始顺序错了模型学到的类别就是乱的。齿轮缺陷常见的类别划分一般是这几类齿面点蚀、齿面磨损、齿根裂纹、断齿、正常。具体几类以数据集自带的classes.txt为准不要自己臆造类别名否则标签里的数字索引对不上。2.2 YOLO 标签的五个数字到底怎么读YOLO 检测标签是每行一个目标格式为class_id x_center y_center width height五个值全部是归一化到 0~1 的浮点数前一个是整数类别索引后四个是边界框中心点和宽高相对于图像宽高的比例。举个例子一张 1280×1024 的齿轮图像里某个点蚀缺陷框左上角在 (320, 256)宽 128、高 102那么x_center (320 128/2) / 1280 0.3y_center (256 102/2) / 1024 0.3width 128 / 1280 0.1height 102 / 1024 0.0996写进标签文件就是0 0.300000 0.300000 0.100000 0.099609。这里最容易翻车的是坐标系YOLO 用的是归一化中心点坐标不是左上角绝对坐标。如果你手上是 VOC 的 XML 或者 LabelImg 导出的绝对坐标必须转换否则框会整体偏移。下面这段脚本用来校验标签是否合法训练前跑一遍能省很多事import os def check_labels(label_dir, img_dir, num_classes): 校验 YOLO 标签坐标范围、类别索引、图像标签配对 issues [] for txt in os.listdir(label_dir): if not txt.endswith(.txt): continue path os.path.join(label_dir, txt) with open(path) as f: for i, line in enumerate(f, 1): parts line.strip().split() if len(parts) ! 5: issues.append(f{txt}:{i} 字段数不是5) continue cls_id int(parts[0]) coords [float(x) for x in parts[1:]] # 类别索引越界检查 if cls_id 0 or cls_id num_classes: issues.append(f{txt}:{i} 类别索引 {cls_id} 越界) # 坐标必须在 0~1 之间 if any(c 0 or c 1 for c in coords): issues.append(f{txt}:{i} 坐标超出 0~1) # 宽高不能为 0 if coords[2] 0 or coords[3] 0: issues.append(f{txt}:{i} 宽或高为 0) # 图像与标签配对检查 img_name txt.replace(.txt, .jpg) if not os.path.exists(os.path.join(img_dir, img_name)): issues.append(f{txt} 没有对应图像) return issues if __name__ __main__: problems check_labels(gear_defect_dataset/labels/train, gear_defect_dataset/images/train, num_classes5) print(f发现 {len(problems)} 个问题) for p in problems[:20]: print(p)逻辑说明函数遍历标签目录下每个.txt逐行检查字段数、类别索引范围、坐标归一化范围、宽高是否为正最后检查图像是否存在。参数num_classes要和classes.txt的行数一致。跑完如果输出一堆坐标越界说明标签不是 YOLO 格式需要先转换。2.3 class 文件与 data.yaml 的对应关系classes.txt每行一个类别名顺序即类别索引。data.yaml则告诉 YOLO 去哪里找数据、有几类path: ./gear_defect_dataset train: images/train val: images/val test: images/test nc: 5 names: [pitting, wear, crack, broken, normal]nc必须等于names的长度也等于classes.txt的行数。三者不一致是新手最常见的报错来源训练一开始就抛IndexError或者类别数不匹配。改完 yaml 后建议用一行命令确认python -c import yaml; dyaml.safe_load(open(data.yaml)); print(d[nc], len(d[names]))两个数字相等才继续。3. 用 YOLO 训练齿轮缺陷检测模型从环境到第一轮结果3.1 环境搭建与依赖安装训练齿轮缺陷检测模型环境不用太复杂。以 Ultralytics 的 YOLO 实现为例Python 3.8 以上、PyTorch 对应 CUDA 版本即可。用 PyCharm 的话新建项目后直接在终端装依赖pip install ultralytics pip install pyyaml opencv-python装完验证一下yolo checks这条命令会打印 PyTorch、CUDA、设备信息。如果显示 CPU only 而你有显卡说明 CUDA 版本和 PyTorch 不匹配需要按官网对应关系重装。齿轮缺陷图像分辨率通常不低用 CPU 训练会慢到无法接受显卡是刚需。3.2 训练命令与关键参数怎么设数据配置好后训练就一行命令yolo detect train \ datagear_defect_dataset/data.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ device0 \ projectruns/gear \ nameexp1参数逐个说清楚modelyolov8n.pt从预训练权重起步。齿轮缺陷样本通常不多从头训练容易过拟合用 COCO 预训练权重做迁移学习收敛更快。n 是最小模型先跑通再换 s/m。imgsz640输入尺寸。齿轮缺陷目标小如果缺陷在 640 下只剩几个像素可以提到 1024但显存占用会明显上升。batch16批大小。显存不够就降到 8 或 4不要硬撑OOM 会直接中断训练。epochs100轮数。小数据集 100~300 轮常见配合早停。device0用第 0 号 GPU。训练过程中重点看三个指标box_loss是否稳定下降、mAP50是否上升、验证集 loss 是否在训练后期反弹。如果训练 loss 一直降但验证 mAP 不涨基本是过拟合需要加数据增强或减模型容量。3.3 数据增强针对齿轮缺陷怎么调YOLO 默认开启 mosaic、翻转、缩放等增强。齿轮缺陷检测有几个特殊点齿轮是旋转对称的随机旋转增强通常有益但要注意旋转后缺陷的形态是否还符合真实工况。缺陷区域小mosaic 拼接可能把缺陷缩得更小反而有害。可以适当降低 mosaic 概率。工业图像光照相对稳定颜色抖动hsv幅度不宜过大否则模型学到的是颜色而非缺陷纹理。在命令行里可以这样覆盖默认增强yolo detect train \ datagear_defect_dataset/data.yaml \ modelyolov8n.pt \ epochs150 \ imgsz1024 \ batch8 \ mosaic0.5 \ hsv_h0.01 hsv_s0.3 hsv_v0.2 \ degrees15 \ device0mosaic0.5表示一半概率做 mosaicdegrees15限制旋转角度避免缺陷被转到不真实的角度。这些值不是固定的跑完第一轮看验证集表现再微调。3.4 训练结果怎么看、模型怎么导出训练结束后runs/gear/exp1/下会有weights/best.pt和last.pt以及混淆矩阵、PR 曲线、验证集预测图。先看混淆矩阵如果「正常」类被大量误判成某类缺陷说明正常样本的特征和缺陷太接近需要补充难例。再看 PR 曲线各类 AP 差距大说明样本不均衡。验证单张图像yolo detect predict \ modelruns/gear/exp1/weights/best.pt \ sourcegear_defect_dataset/images/test \ conf0.25 \ saveTrueconf0.25是置信度阈值齿轮缺陷漏检代价高的话可以降到 0.15 看召回但误报会增多需要按产线容忍度权衡。导出 ONNX 用于部署yolo export modelruns/gear/exp1/weights/best.pt formatonnx imgsz1024导出后可以用 onnxruntime 在无 PyTorch 环境推理方便集成到产线软件里。4. 齿轮缺陷检测的避坑与排查那些让训练白跑的细节4.1 标签坐标越界导致 loss 变 NaN现象训练几个 epoch 后 loss 突然变成 NaN或者一开始就报坐标相关错误。 原因标签里存在大于 1 或小于 0 的坐标或者宽高为负。常见于从 VOC/COCO 转换时没做归一化或者手工标注时框拖出了图像边界。 解决训练前跑 2.2 节的校验脚本把所有越界标签找出来。对于框超出图像边界的裁剪到 [0,1] 范围对于宽高为负的检查标注工具是否把右下角和左上角搞反了。4.2 类别索引错位导致模型学混现象训练能跑但混淆矩阵里类别完全对不上比如点蚀被预测成裂纹。 原因classes.txt的顺序和标签里的class_id不一致。比如标注时用的是[crack,pitting,...]但 yaml 里写的是[pitting,crack,...]索引 0 和 1 就反了。 解决以标签文件里实际出现的class_id为准统计每个 id 对应的图像人工确认类别名然后统一classes.txt、data.yaml的names顺序。改完后重新训练不要指望模型自己纠正。4.3 图像与标签数量不匹配导致静默丢样本现象训练日志里显示的训练样本数比预期少或者某些类别 AP 异常低。 原因images/train下有图像但labels/train下没有对应.txtYOLO 会跳过或当负样本处理。齿轮缺陷数据集中正常样本可能故意没有标签文件但如果缺陷样本也缺标签就是数据整理出错。 解决写脚本对比两个目录的文件名集合找出差集。缺陷图像必须有标签正常图像可以没有标签但要在配置里明确处理方式。数量对不上就别开始训练。4.4 小目标缺陷在默认 imgsz 下消失现象模型对大面积断齿检测很好但点蚀、微小裂纹几乎检不出。 原因默认imgsz640下原图上几十像素的缺陷被缩放到几个像素特征在 backbone 下采样后基本丢失。 解决把imgsz提到 1024 或 1280同时batch相应调小。如果显存不够可以切图训练把大图裁成带重叠的小图缺陷在小图里占比更大。另外检查标签里小目标的宽高如果归一化后小于 0.01考虑合并或放大标注框到最小可检测尺寸。4.5 验证集 mAP 虚高但实测漏检现象验证集 mAP50 到 0.9但拿新拍的齿轮图像测试漏检严重。 原因训练集和验证集来自同一批图像、同一光照、同一相机分布太接近验证集不能反映真实泛化能力。齿轮缺陷数据集的划分如果是随机切分同一齿轮的不同角度可能同时出现在训练和验证集里造成数据泄漏。 解决按齿轮个体划分同一齿轮的图像只出现在一个子集里。另外留一批完全没参与训练的新工况图像做测试。如果数据集已经划分好先确认划分依据必要时重新切分。5. 把齿轮缺陷检测做扎实从跑通到可用的几个进阶技巧数据集跑通只是起点真正要落地到产线还得在几个地方下功夫。第一个技巧是难例挖掘训练完第一版模型后用它在验证集和现场图上推理把漏检和误检的图挑出来重新标注加入训练集再训一轮。齿轮缺陷的难点往往集中在某几种光照或某个齿面角度这批难例补进去mAP 提升比调参明显。第二个技巧是类别不均衡处理。齿轮缺陷数据里正常样本通常远多于缺陷样本直接训练会让模型偏向正常类。可以在data.yaml同级目录准备一个带权重的训练配置或者用 oversampling 把缺陷样本复制多份。更简单的做法是控制正常样本比例让每类缺陷至少有几百个实例。第三个技巧是推理后处理。产线检测往往要求「宁可误报不可漏检」这时候把conf降到 0.1~0.15再对同一齿轮的多张图像做结果融合同一个位置在多张图里都被检出才判定为缺陷。这样能压掉大部分随机误报。第四个技巧是模型轻量化与部署验证。齿轮检测常在边缘设备上跑把训练好的模型导出 ONNX 后用 onnxruntime 或 TensorRT 做推理测一下单张耗时。如果超过产线节拍换更小的输入尺寸或剪枝。部署前一定用现场相机实拍一批图做端到端验证别只看验证集指标。最后说个我自己的习惯每次改完数据集或训练参数先把classes.txt、data.yaml、标签校验脚本这三样过一遍再启动训练。齿轮缺陷检测翻车最多的不是模型而是数据本身。这套流程跑顺了换其他工业缺陷数据集也能直接套用。希望帮到你。本文还有配套的精品资源点击获取