齿轮缺陷检测数据集划分与YOLO训练避坑指南

发布时间:2026/10/25 19:13:12
齿轮缺陷检测数据集划分与YOLO训练避坑指南 简介本资源为面向工业质检与深度学习实践的齿轮缺陷检测YOLO数据集适合从事目标检测算法训练、缺陷识别项目开发的学生与工程师使用。数据按YOLOv5标准目录组织可直接投入训练与验证流程标注采用YOLO相对坐标格式包含类别文件与对应标签覆盖孔洞、缺损、齿牙等7类缺陷。压缩包共1093个文件以546个txt标签、545张jpg图像为主另含1个py脚本与1个png说明图整体约183.48MB训练集约400张、验证集约100张划分清晰便于直接复现实验。已有344人学习下载读者可快速获得完整数据划分、类别定义与标注文件省去自行采集与标注成本用于模型训练、精度对比与缺陷检测方案验证。1. 齿轮缺陷检测数据集为什么“划分好的 YOLO 数据集”能省掉你三天返工拿到一个齿轮缺陷检测项目最耗时的往往不是调模型而是把散落的图片、XML、类别表整理成 YOLO 能直接吃的格式。标题里这套“划分好的数据集、标签、class 文件”本质是把数据准备阶段一次性做完图片按训练/验证/测试分好标签已经是 YOLO 要求的 txt 归一化坐标class 文件固定了缺陷类别顺序。它解决的是“数据管线不通模型再好也白搭”的问题适合刚接触 YOLO 数据集的新手也适合想快速验证齿轮缺陷检测方案是否值得投入的熟手。齿轮缺陷常见的有齿面磨损、点蚀、裂纹、缺齿几类缺陷区域小、对比度低标注质量直接决定 mAP 上限。这一章先把这套数据集的构成和选型逻辑讲清楚后面再动手跑通训练和推理。2. 拆开这套齿轮缺陷数据集目录结构、标签格式与 class 文件2.1 目录长什么样每个文件对应什么一套能直接喂给 YOLO 的齿轮缺陷数据集常见目录结构是这样的gear_defect_dataset/ ├── images/ │ ├── train/ # 训练集图片 │ ├── val/ # 验证集图片 │ └── test/ # 测试集图片 ├── labels/ │ ├── train/ # 与 train 图片同名的 txt 标签 │ ├── val/ │ └── test/ ├── classes.txt # 类别名一行一个 └── data.yaml # 数据集描述文件图片和标签必须同名只是扩展名不同。比如images/train/gear_001.jpg对应labels/train/gear_001.txt。如果标签目录里出现没有对应图片的 txt或者图片没有标签训练时不会报错但会静默跳过导致你误以为“数据都用了”。我一般会在训练前跑一遍配对检查后面章节会给脚本。classes.txt是类别顺序的唯一来源YOLO 标签里的数字就是它的行号从 0 开始。齿轮缺陷检测常见的类别定义0 wear # 齿面磨损 1 pitting # 点蚀 2 crack # 裂纹 3 missing # 缺齿顺序一旦定了就不能改。如果你把classes.txt重新排序所有标签的类别号都会错位模型学到的就是错的映射。这是血泪经验改类别顺序等于重做标签。2.2 YOLO 标签格式归一化坐标怎么算YOLO 的 txt 标签每行是class_id x_center y_center width height五个值用空格分隔后四个都是相对图片宽高的归一化值范围 0~1。假设一张齿轮图片宽 640、高 480缺陷框左上角 (120, 80)右下角 (280, 200)计算如下# 齿轮缺陷框转 YOLO 归一化坐标 img_w, img_h 640, 480 x1, y1, x2, y2 120, 80, 280, 200 x_center (x1 x2) / 2 / img_w # (120280)/2/640 0.3125 y_center (y1 y2) / 2 / img_h # (80200)/2/480 0.2917 width (x2 - x1) / img_w # (280-120)/640 0.25 height (y2 - y1) / img_h # (200-80)/480 0.25 print(f0 {x_center:.4f} {y_center:.4f} {width:.4f} {height:.4f}) # 输出: 0 0.3125 0.2917 0.2500 0.2500逻辑说明先算框中心点绝对坐标再分别除以图片宽高做归一化。参数说明x1,y1是左上角x2,y2是右下角顺序不能反否则宽高为负。归一化后模型不依赖输入分辨率训练时 resize 到 640 也不会让标签失效。注意如果原始标注是 XMLVOC 格式需要先转成 YOLO txt。XML 里xmin,ymin,xmax,ymax是绝对像素转换时同样按上面公式归一化并且要按classes.txt的顺序映射类别名到数字。2.3 data.yaml训练入口的四个关键字段data.yaml是 YOLO 训练时读取的配置常见内容path: ./gear_defect_dataset # 数据集根目录 train: images/train # 训练图片相对路径 val: images/val # 验证图片相对路径 test: images/test # 测试图片相对路径可选 nc: 4 # 类别数 names: [wear, pitting, crack, missing] # 类别名顺序同 classes.txtnc必须等于names长度也等于classes.txt行数。三者不一致时训练可能不报错但类别映射错乱。path用相对路径时是相对于你执行训练命令的工作目录不是相对于 yaml 文件位置这点容易翻车。稳妥做法是写绝对路径或者确认自己在数据集根目录的上一级执行命令。3. 用这套数据集跑通 YOLO 训练从环境到第一个权重3.1 环境准备与依赖安装我一般用 Python 3.9~3.11太新的版本某些依赖轮子还没跟上。创建虚拟环境后安装# 创建并激活虚拟环境 python -m venv yolo_env source yolo_env/bin/activate # Windows 用 yolo_env\Scripts\activate # 安装 ultralyticsYOLOv8/v11 通用入口 pip install ultralytics # 验证安装 yolo checksyolo checks会打印 Python 版本、PyTorch 版本、CUDA 是否可用。如果要用 GPU先确认torch.cuda.is_available()为 True。CPU 也能跑但齿轮缺陷检测图片若上千张训练时间会从小时级变成天级。参数上ultralytics会自动装匹配的 PyTorch若你已有 CUDA 环境建议手动装对应版本的 torch 再装 ultralytics避免版本冲突。3.2 训练前必做的数据配对检查在训练前跑这个脚本能避免“标签静默丢失”import os from pathlib import Path root Path(./gear_defect_dataset) for split in [train, val, test]: img_dir root / images / split lbl_dir root / labels / split if not img_dir.exists(): continue imgs {p.stem for p in img_dir.glob(*.*) if p.suffix.lower() in (.jpg, .png, .jpeg)} lbls {p.stem for p in lbl_dir.glob(*.txt)} if lbl_dir.exists() else set() only_img imgs - lbls only_lbl lbls - imgs print(f[{split}] 图片 {len(imgs)} 张, 标签 {len(lbls)} 个) if only_img: print(f 缺标签的图片: {list(only_img)[:5]}) if only_lbl: print(f 缺图片的标签: {list(only_lbl)[:5]})逻辑说明用文件名主干stem做集合差找出单边存在的文件。参数说明split遍历三个子集suffix过滤图片扩展名。输出里如果“缺标签的图片”不为空这些图训练时会被跳过如果“缺图片的标签”不为空说明有孤立标签可能是图片被误删。齿轮缺陷检测里缺齿样本往往少漏掉一张都心疼所以这一步别省。3.3 启动训练命令行与关键参数确认数据无误后用命令行启动yolo detect train \ data./gear_defect_dataset/data.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ device0 \ projectruns/gear \ nameexp1逻辑说明data指向 yamlmodel用预训练权重做迁移学习epochs是训练轮数imgsz是输入尺寸batch是批大小device0用第一块 GPUproject/name决定输出目录。参数说明齿轮缺陷目标小imgsz不建议低于 640batch受显存限制8G 显存用 16 比较稳爆显存就降到 8。yolov8n.pt是最小模型适合先跑通精度不够再换yolov8s.pt或yolov8m.pt。训练日志里重点看box_loss、cls_loss和mAP50box_loss不降说明标签框有问题cls_loss不降可能是类别不平衡。3.4 训练输出怎么看哪个权重能用训练结束后runs/gear/exp1/weights/下会有best.pt和last.pt。best.pt是验证集 mAP 最高的权重last.pt是最后一轮。我一般用best.pt做推理但如果验证集太小best.pt可能过拟合这时要看results.csv里 mAP 曲线是否震荡。齿轮缺陷检测的验证集如果只有几十张mAP 波动会很大建议至少留 15% 的图片做验证且每类缺陷都要有样本。4. 齿轮缺陷检测的避坑与排查5 个真实翻车记录4.1 现象训练 loss 正常下降但推理框全错位原因标签归一化时用错了图片尺寸。常见于先 resize 图片再标注但标签按原图算或者 XML 转换时把宽高写反。解决用 2.2 的公式重新核对几张图的标签把 txt 里的值和图片实际框对比。可以写脚本把 YOLO 标签画回图片上肉眼检查确认框位置正确再训练。4.2 现象mAP 一直是 0或类别全预测成同一类原因classes.txt、data.yaml的names、标签里的class_id三者顺序不一致。比如classes.txt是 wear/pitting/crack/missing但 yaml 里 names 写成了 pitting/wear/...标签数字含义就错位。解决以classes.txt为唯一基准逐行核对 yaml 的 names并抽查标签文件第一列数字是否在 0~nc-1 范围内。4.3 现象训练报 “No labels found” 或图片被大量跳过原因图片和标签目录层级不匹配或标签扩展名不是.txt。YOLO 默认在images同级找labels且要求同名。如果标签是.xml或放在annotations目录就会找不到。解决按 2.1 的结构整理跑 3.2 的配对检查脚本确认每个 split 下图片和标签数量一致。4.4 现象显存爆了batch 降到 1 还是 OOM原因imgsz太大或模型太大。齿轮缺陷检测用 640 通常够但如果图片本身是 4Kresize 到 640 后小缺陷可能只剩几个像素。解决先确认图片原始分辨率若缺陷极小可尝试imgsz1024但必须降 batch或者用切片推理SAHI思路把大图切块检测。显存不足时优先降 batch再考虑换更小模型。4.5 现象验证集 mAP 很高实际产线漏检严重原因训练集和验证集来自同一批图片分布太像模型没学到泛化特征。齿轮缺陷检测里不同光照、不同齿轮型号的缺陷外观差异大。解决划分数据集时按齿轮型号或拍摄批次分层确保验证集包含训练集没见过的型号。如果数据集已经划分好先检查 train 和 val 的图片是否来自同一批次必要时重新划分。5. 进阶技巧用混淆矩阵和单类阈值把齿轮缺陷检测调到可用训练完不是终点齿轮缺陷检测在产线上往往对某一类缺陷特别敏感比如裂纹漏检代价高而点蚀误检可以接受。这时全局 mAP 不够用要看混淆矩阵和单类阈值。YOLO 验证时会输出confusion_matrix.png在runs/gear/exp1/下。重点看裂纹那一行如果裂纹被预测成背景的比例高说明召回不足需要提高该类样本权重或增加裂纹样本。调整推理阈值是最快的手段。默认conf0.25对裂纹可以降到 0.15 提高召回yolo detect predict \ modelruns/gear/exp1/weights/best.pt \ source./gear_defect_dataset/images/test \ conf0.15 \ iou0.5 \ saveTrue \ projectruns/gear_predict \ nametest_crack逻辑说明conf是置信度阈值低于它的框被丢弃iou是 NMS 的 IoU 阈值控制重叠框合并。参数说明conf降低会增多框可能引入误检iou调低会合并更多重叠框适合缺陷密集场景。我一般对裂纹用conf0.15对磨损用conf0.3分开跑再合并结果。如果类别多可以写脚本按类别设不同阈值遍历预测结果过滤。另一个技巧是看results.csv里的metrics/mAP50-95和metrics/mAP50差距。差距大说明框定位不准齿轮缺陷框如果标注偏松模型学到的框会偏大这时可以收紧标注或加box损失权重。YOLO 训练参数里box默认 7.5定位差可以适当提高但别超过 10否则分类会退化。最后说个习惯每次改数据集或参数都在name里写清楚比如exp2_crack_conf015不然一周后你根本分不清哪个权重是哪个配置。齿轮缺陷检测这行数据比模型重要标签比参数重要希望帮到你。本文还有配套的精品资源点击获取