尧图精选

齿轮缺陷检测数据集详解:YOLO训练格式、避坑与调参实战

🕒 发布时间:2026/9/28 9:10:41 📁 来源:尧图网络
简介YOLO齿轮缺陷检测数据集面向工业质检与目标检测学习者按YOLOv5标准目录整理图像与txt标注一一对应并已划分为训练集、验证集和测试集。训练集约400张图片、验证集约100张图片测试集图片也已预留标注格式为class、x_centre、y_centre、w、h的相对坐标共7个缺陷类别覆盖孔洞、缺损、齿牙等常见齿轮质量问题类别清单集中存放在class文件中替换数据路径后即可开始训练。压缩包共1093个文件主要包括546个txt标签、545个jpg图像另有1个py脚本和1张png图示整体大小183.48MBtxt标签由图像标注工具统一生成py脚本可辅助检查标签内容与格式。已有344人学习/下载这套数据能省去自行采集齿轮图像、绘制边界框和整理数据划分的重复劳动适合快速验证YOLOv5、YOLOv8等检测模型在缺陷场景下的性能也为后续部署到实际产线提供可靠训练样本。1. 齿轮缺陷检测为什么绕不开 YOLO这个数据集里到底有什么工业质检场景里齿轮缺陷检测是典型的「看着简单、做起来要命」的视觉任务。齿轮本身结构复杂齿面反光、倒角、油污和划痕混在一起传统算法写规则根本写不干净。这两年一线工厂落地最多的方案就是用 YOLO 做端到端检测把缺陷类型和位置一次性框出来推理速度快到能跟上产线节拍训练和部署链路又成熟上面的人愿意批预算。这个标题给的是一个已经划分好的齿轮缺陷检测数据集附带标签和 class 文件。也就是说你不用再从零开始采集图像、标注、清洗、划分拿过来就能直接喂给 YOLO 训练。适合两类人一是刚接触工业视觉、想快速跑通目标检测全流程的开发者二是已经在做质检项目、但手头缺一份规整数据来验证模型选型和超参的工程师。下文我会把数据集格式、训练配置、参数调节和踩坑点一次讲透照着做就行。2. 读懂 YOLO 数据集的三件套标签格式、class 文件与目录结构2.1 一份能直接训练的 YOLO 数据集长什么样YOLO 系列从 v5 到 v11包括 v8使用的数据集格式高度统一。拿到这个齿轮缺陷检测数据集你首先会看到三个核心部分图像文件夹、标签文件夹和一个 class 文件。图像文件夹里是原始齿轮图片标签文件夹里是与图片同名的 txt 文件class 文件则定义了缺陷类别的编号和名称。目录结构一般是这样的gear_defect_dataset/ ├── images/ │ ├── train/ │ │ ├── gear_001.jpg │ │ ├── gear_002.jpg │ │ └── ... │ ├── val/ │ └── test/ ├── labels/ │ ├── train/ │ │ ├── gear_001.txt │ │ ├── gear_002.txt │ │ └── ... │ ├── val/ │ └── test/ └── gear_defect.yaml注意 images 和 labels 下的 train、val、test 子目录必须同名且一一对应。每张 gear_001.jpg 对应一个 gear_001.txt文件名相同、扩展名不同。这是 YOLO 训练的硬性约定如果你后续要往数据集里追加自己的图片必须保持这个命名规则。gear_defect.yaml是数据集的描述文件训练时直接引用它就行。一个标准的 yaml 内容如下path: ./gear_defect_dataset train: images/train val: images/val test: images/test nc: 4 names: [scratch, chipped_gear, missing_tooth, burr]path填数据集根目录的绝对路径或相对路径train和val指向对应子目录nc是缺陷类别数量names是类别名称列表索引从 0 开始。这里我按常见的四类齿轮缺陷举例划痕scratch、崩齿chipped_gear、缺齿missing_tooth、毛刺burr。你的数据集如果类别不同以实际 class 文件为准。2.2 YOLO 标签格式每一行都是归一化坐标打开 labels/train 下的任意一个 txt 文件你会看到每行五个数字格式为class_id x_center y_center width height以gear_001.txt为例0 0.6210 0.4550 0.1200 0.0850 1 0.7800 0.7200 0.0900 0.0600每行代表一个缺陷框。第一个数字是类别 id对应 class 文件里 names 列表的索引。后面四个是框的中心点 x、y 和宽、高全部归一化到 01。归一化的意思是除以图片自身宽度和高度这样同一张图在不同分辨率下标签都有效。这个格式有两个容易忽略的地方。第一坐标必须归一化很多人从 LabelImg 导出 VOC 格式 XML 后忘了转换结果训练时 loss 变成 NaN。第二类别 id 从 0 开始不是从 1 开始。class 文件里第一个名字对应 0第二个对应 1以此类推。我见过有人把 LabelImg 里默认的类别编号 1 直接写进 txt导致所有缺陷被当成第二类mAP 一团糟。2.3 从 VOC 到 YOLO一份转换脚本作参考很多公开的齿轮缺陷原始数据是 VOC 格式XML 标注这个数据集已经帮你转好了但如果你要扩充数据转换这一步躲不掉。这里给一个最小可用的 Python 转换脚本import os import xml.etree.ElementTree as ET def convert_voc_to_yolo(xml_file, class_map, out_dir): tree ET.parse(xml_file) root tree.getroot() img_w int(root.find(size/width).text) img_h int(root.find(size/height).text) base_name os.path.splitext(os.path.basename(xml_file))[0] out_path os.path.join(out_dir, base_name .txt) with open(out_path, w) as f: for obj in root.iter(object): class_name obj.find(name).text if class_name not in class_map: continue class_id class_map[class_name] box obj.find(bndbox) x_min float(box.find(xmin).text) y_min float(box.find(ymin).text) x_max float(box.find(xmax).text) y_max float(box.find(ymax).text) x_center (x_min x_max) / 2 / img_w y_center (y_min y_max) / 2 / img_h width (x_max - x_min) / img_w height (y_max - y_min) / img_h f.write(f{class_id} {x_center:.6f} {y_center:.6f} {width:.6f} {height:.6f}\n) # 类别映射表和你的 class 文件保持一致 class_map { scratch: 0, chipped_gear: 1, missing_tooth: 2, burr: 3, } # 使用示例 convert_voc_to_yolo(gear_001.xml, class_map, labels/train)这段脚本把 VOC 的xmin, ymin, xmax, ymax转换成 YOLO 的归一化中心点格式。转换时注意两点如果 XML 里的坐标已经超出了图片宽高说明标注时标错了要过滤掉而不是硬写进 txt如果一张图里没有任何有效标注就不要生成空 txt否则 YOLO 会把这张图当背景处理影响类别学习。2.4 数据划分train / val / test 的比例与陷阱这个数据集已经划分好了但你得知道它的划分逻辑是否合理。常规工业缺陷检测场景我建议的划分比例是 8:1:1 或 7:2:1。注意不是随便随机切要按缺陷类型做分层抽样。假设你的崩齿样本本来就少随机划分大概率把崩齿都分到训练集里验证集里一个崩齿都没有验证 loss 看着很漂亮上线就翻车。判断划分是否合理的快速方法统计每个子集里各类别框的数量看比例是否接近。如果 val 里某种缺陷的框数是 0说明这个 val 没有验证价值。更重要的是检查同一个齿轮的不同角度照片是否被同时分进了 train 和 val。如果一张齿轮的多角度图既参与训练又参与验证模型实际上「见过」验证集目标评估结果会虚高。这是划分阶段最隐蔽的坑后文避坑章节会展开讲。3. 用划分好的数据集训练齿轮缺陷模型最小跑通流程与配置3.1 环境准备与预训练权重选择拿到数据集后第一步是准备训练环境。YOLO 的训练通常基于 PyTorch 和 ultralytics 库这是目前 YOLO 系列最常用的官方训练框架。安装命令如下pip install ultralytics torch torchvision如果你有 NVIDIA GPU建议装对应 CUDA 版本的 torch。没有 GPU 也能用 CPU 跑但齿轮缺陷数据集通常几千张图起步CPU 训练一个 epoch 可能就是十几分钟到半小时体感很差。预训练权重建议用 YOLOv8n 或 YOLOv8s。齿轮缺陷是典型的细小目标检测模型太大反而容易过拟合而且工厂部署对推理速度有硬要求。n 系列参数量最小、速度最快作为基线先跑通流程再根据精度需求换 s 或 m。建议从头开始训练的新手直接指定pretrainedTrue让模型加载在 COCO 上的权重作为初始值收敛会快很多。3.2 训练配置一份可以照抄的 YAML训练之前需要建一个数据配置文件指向数据集路径和类别信息。前面提到的gear_defect.yaml就是干这个的。新建一个gear_defect.yaml内容如下path: ./gear_defect_dataset train: images/train val: images/val test: images/test nc: 4 names: [scratch, chipped_gear, missing_tooth, burr]path字段建议写绝对路径或者保证你执行训练命令时的工作目录在数据集上级目录。train、val是相对于path的路径test可选没有独立测试集时可以直接删掉test行。nc必须和names列表长度一致不一致时 ultralytics 会直接报错。3.3 最小训练命令跑通一次完整训练训练命令只需要一行但参数必须搞清楚。下面是我们这种场景的最简训练命令yolo detect train \ modelyolov8n.pt \ datagear_defect.yaml \ epochs100 \ imgsz640 \ batch-1 \ project./runs \ namegear_defect_v1modelyolov8n.pt指定基础权重文件会自动下载到本地缓存data指向刚写的 yamlepochs100对工业缺陷数据集来说是一个合理起点imgsz640是输入分辨率YOLO 默认 640如果你的齿轮图像本身很大、缺陷较小后面可以调大到 1280batch-1让框架根据显存自动选择合适的 batch size。跑起来之后终端会输出每个 epoch 的box_loss、cls_loss、mAP50等指标。第一次跑通的目标不是拿到完美精度而是确认数据加载正确、loss 在下降、训练流程没报错。如果训练过程中 loss 出现 NaN 或者 mAP 一直为零先把 5.2 和 5.4 的避坑点看一遍大概率是数据格式或标注问题。3.4 验证训练结果用验证集快速评估训练结束后ultralytics 会在runs/gear_defect_v1/下保存weights/best.pt和weights/last.pt。best.pt是验证集上 mAP 最高的权重last.pt是最后一个 epoch 的权重部署时一律用best.pt。验证用这个命令yolo detect val \ model./runs/gear_defect_v1/weights/best.pt \ datagear_defect.yaml这会输出验证集上的 mAP50、mAP50-95、每类的 precision 和 recall。重点看每个类别的单独指标不要只看平均值——四类缺陷里毛刺可能非常好检崩齿可能几乎检不出来单独看才能定位短板。验证结果同时会生成一张混淆矩阵.png能直观看到哪类被误检成哪类排查阈值和样本问题都靠它。4. 让缺陷模型真正能上线必调参数与评估指标4.1 输入分辨率小目标检测的第一道坎齿轮缺陷里划痕和毛刺都属于小目标在 640x640 的输入下可能只有十几个像素。YOLO 对小于 8x8 像素的目标几乎无能为力因为 backbone 下采样到最后一层特征图时目标已经小于一个网格单元。调整输入分辨率是见效最快的手段。把imgsz从 640 调到 1280小目标的实际像素大小直接翻倍mAP50 通常能提升 515 个点。代价是训练时间大约变成原来的 4 倍、显存占用变大。如果你的产线摄像头拍出来的原图本身是 2000 万像素直接按原图比例缩放到 1280 通常比缩到 640 保留更多细节。还有一个折中技巧训练时用 640 或 768 起跑最后 20 个 epoch 用 1280 微调。这种「多尺度训练」策略在 ultralytics 里可以通过rectTrue配合imgsz实现能兼顾训练速度和小目标精度。4.2 类别不平衡崩齿样本少怎么办齿轮缺陷数据集里划痕和毛刺通常占绝大多数缺齿和崩齿因为出现频率低样本量可能只有前者的十分之一。YOLO 默认按均匀概率采样每个 batch少量类别在训练中「见到」的次数远少于多数类最终表现为少数类的 recall 极低。推荐的解决办法有两个。第一是用class_weight参数给少数类更高的损失权重。在训练正则里加class_weights[1.0, 3.0, 5.0, 3.0]这个列表按类别顺序指定多数类权重低、少数类权重高让模型在反向传播时更关注崩齿这类样本的梯度贡献。第二是数据增强手段对包含少数类的图片做随机复制粘贴——在标签层面把缺陷实例多复制几个到同一张图的空区域增加样本量。我不建议为了均衡直接随机删掉多数类样本。齿轮场景中划痕出现的频率本来就高削掉它会让模型在生产环境里对常见缺陷反而失守。保住多数类的样本量用权重和增强把少数类抬起来才是产线上更稳妥的做法。4.3 置信度阈值与 IoU 阈值部署时再调的旋钮训练完成后还远远没结束。模型输出的原始结果是每个框的类别概率到底把哪个框当作缺陷报出来取决于你在推理时设置的置信度阈值conf和 NMS 的 IoU 阈值iou。这两个值不调模型精度再高也白搭。yolo detect predict \ model./runs/gear_defect_v1/weights/best.pt \ source./test_images \ conf0.25 \ iou0.45conf默认 0.25意思是只有置信度超过 0.25 的框才会输出。太低了会疯狂误报把齿轮表面的油渍反光全标成划痕太高了会漏检把真正的崩齿漏过去。工业场景我一般从 0.3 起步在验证集上看 precision-recall 曲线找拐点。iou控制两个重叠框是否合并默认 0.45 对密集缺陷偏宽松如果你发现一个齿面上被打了四五个重叠框把iou调到 0.5 或 0.6 试试。4.4 评估指标怎么读mAP50 高不代表能上线产线上真正关心的是精确率和召回率而不是 mAP。mAP50 是验证集上所有类别的平均精度但它是「所有置信度阈值下的积分」不代表实际部署时那个阈值下的表现。只看 mAP50你可能在 0.5 阈值下有 90 的 mAP实际跑到 0.25 置信度时误报多到现场没法用。我给自己定的验收标准是每类缺陷的 recall 不低于 90%precision 不低于 85%。还有一个容易忽略的点是「报警及时性」——缺齿这种缺陷一旦漏检就是直接装到变速箱里召回率比精确率重要得多宁可多报几个错检让人工复判。所以调参时我会为崩齿单独设一个更低的置信度阈值比如 0.15其他类别维持 0.3。ultralytics 支持在推理时按类别设置阈值避免用一个全局阈值拖累所有类别。5. 齿轮缺陷数据集避坑记录五个最容易翻车的细节5.1 类别文件里的顺序和训练时的顺序不一致现象训练能正常跑mAP 看起来也正常但可视化验证时发现模型输出的类别名张冠李戴——划痕被标成了毛刺崩齿被标成了缺齿。原因gear_defect.yaml里names列表的顺序必须和标签 txt 里的class_id完全对应。如果验证集或测试集的标签来自另一个批次而那个批次的 class 文件顺序不同id 就会错位。标题里的数据集已经替你统一好了但你在扩充数据时很容易从不同来源拷贝标签顺序一乱整个模型就废了。解决训练前写一个脚本扫描所有标签 txt 里的最大 class id确保它小于nc。同时抽样可视化一批标注框你要亲眼看到框和类别名是匹配的这一步不要省。5.2 坐标归一化过头或越界现象训练时 box_loss 降不下去验证时输出框大面积偏到图像边缘。原因标签 txt 里的坐标不在 01 范围内。常见情况是 VOC 转 YOLO 时忘了除以图片宽高或者图片被预处理裁剪过但标签没有跟着裁。坐标值超过 1 说明标注框比原图大训练时模型学到的是错误的目标位置。解决用下面脚本扫描所有标签import os label_dir labels/train for file in os.listdir(label_dir): if not file.endswith(.txt): continue with open(os.path.join(label_dir, file)) as f: for line in f: parts line.strip().split() if len(parts) ! 5: print(f{file} 行格式错误: {line}) continue vals [float(x) for x in parts[1:]] if any(v 1.0 or v 0.0 for v in vals): print(f{file} 坐标越界: {line})5.3 训练集里有标签噪声漏标和错标现象模型训练完val 的 mAP 数字不低但拿到产线实际图上一测大量缺陷漏检而且漏检的往往是某个特定类别。原因这个数据集虽然划分好了不代表标注完美。齿轮缺陷的边界模糊尤其是微小的毛刺和划痕标注员很容易漏标或框偏。如果训练集里标注的缺陷框偏移超过目标尺寸的一半模型学到的定位就是歪的。解决训练前随机抽 200 张图做标注质量审计用可视化脚本把标签画到图上肉眼检查边界框与缺陷边缘的对齐程度。如果某类缺陷的框普遍偏大、把背景也包进去了建议先修正再训练不要指望模型自己学会「纠偏」。5.4 训练时 loss 变成 NaN现象训练到第几个 epoch 后box_loss 和 cls_loss 突然变成nan验证也完全失效。原因最常见的有两类。一是数据里有损坏的图片比如 JPEG 解码失败或全黑的图片框架读进来算出异常梯度二是标签坐标出现了 0 值或负数导致 log 运算直接炸掉。齿轮图像如果有油污反光过曝的图也可能造成输入数据的高斯噪声区间过大。解决训练前做一次数据清洗删除所有打不开的图片和对应的空标签文件同时让脚本把含有 0 坐标或宽度高度为 0 的标签行直接过滤。如果清洗后仍然 NaN把batch调小、lr0从默认 0.01 降到 0.001 再试少数情况是学习率过大导致梯度爆炸。5.5 验证集划分得太「干净」评估结果虚高现象验证集 mAP 非常高但部署到产线实测精度断崖式下跌。原因这是数据集划分阶段埋的雷。齿轮同一型号产品的图片往往相似度很高如果验证集和训练集混入了同一批次甚至同一型号齿轮的照片模型相当于「背题」了。更难察觉的是同一个齿轮不同角度拍摄的多张图被切到不同集合里模型等于提前见过目标。解决按产品型号或批次做分组划分而不是按单张图片随机划分。确保同一个齿轮实体的所有图像都进同一个集合。这个数据集如果已经提前划好了建议先检查 image 文件名里是否有编号规律发现同 id 被拆到 train 和 val 两组就自己重新划一次别迷信现成的划分。6. 用预训练权重与迁移学习把检测精度再顶上去6.1 从 COCO 权重起步而不是随机初始化这个数据集已经给了训练必需的原料但训练时选哪个起点权重直接关系到最后精度和收敛速度。我见过不少人把model直接指定为yolov8n.yaml随机初始化训练 300 个 epoch 后 mAP 还是上不去。换成yolov8n.pt预训练权重同样数据 100 个 epoch 就能超过前者最终的指标。原因不复杂COCO 上预训练的权重已经学会了通用的边缘、纹理、形状特征齿轮缺陷里的划痕本质上是边缘特征崩齿本质上是形状特征迁移过来的特征提取器稍作微调就能适配。这个数据集规模不大几百到几千张图远不够从头训练一个深层网络预训练权重相当于帮你免费拿到了「通用视觉常识」。6.2 冻结 backbone 微调 vs 全量微调怎么选拿到预训练权重后有两种微调策略。冻结 backbone 只训练检测头适合数据集很小几百张图且和 COCO 场景差异大的情况全量微调适合数据集较大或缺陷形态与自然图像差异明显的场景。齿轮缺陷属于后者——齿轮的金属反光表面在 COCO 里几乎没有同类结构只微调检测头会学不到齿轮专有的纹理特征。我的习惯做法是分两阶段前 50 个 epoch 冻结 backbone 训练让检测头先适应齿轮缺陷的框分布后 50 个 epoch 解冻 backbone 全量微调用低学习率0.0001 左右避免破坏预训练特征。ultralytics 里冻结层可以用freeze参数实现yolo detect train \ modelyolov8n.pt \ datagear_defect.yaml \ epochs100 \ freeze10 \ lr00.005 \ patience20freeze10表示冻结前 10 层backbone 主干patience20表示连续 20 个 epoch 没有改善就提前停止这个参数在我实际项目中能省下一半的无效训练时间。6.3 TTA 与模型集成验证上限不一定上线用最后一个验证技巧用 TTA测试时增强评估当前权重的真实上限。推理时对输入做多尺度缩放和翻转把多个预测结果融合能让你知道「数据没问题、模型还有多少余量」。命令是加一个augmentTrueyolo detect predict \ model./runs/gear_defect_v1/weights/best.pt \ source./test_images \ augmentTrue \ conf0.3TTA 打开后如果 mAP 比正常推理高出一大截说明模型的鲁棒性还不够产线上一遇到光照变化就会掉点这时候去补数据增强或采集更多样化的现场图而不是继续调参。TTA 本身推理速度慢好几倍不适合直接部署它在我这里永远是评估工具不是上线手段。用过几套齿轮质检项目后我养成了一个习惯动手训练前先花一小时把标签可视化、把划分逻辑审一遍数据没问题再碰训练命令。这份现成的数据集帮你省了最脏最累的采集和标注环节但数据质量的最终责任永远在训练者的肩上。希望以上这些流程和参数能帮你少走几趟弯路一次就把齿轮缺陷模型跑到能上线的水平。本文还有配套的精品资源点击获取
上一篇/下一篇内容由系统自动关联 返回资讯列表 →