☰
齿轮缺陷检测数据集划分与YOLO训练避坑指南
2026/10/25 19:12:39 网站建设 项目流程

简介:本资源为面向工业质检与深度学习实践的齿轮缺陷检测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 # (120+280)/2/640 = 0.3125 y_center = (y1 + y2) / 2 / img_h # (80+200)/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(f"0 {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 也不会让标签失效。

注意:如果原始标注是 XML(VOC 格式),需要先转成 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.txt

nc必须等于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 # 安装 ultralytics(YOLOv8/v11 通用入口) pip install ultralytics # 验证安装 yolo checks

yolo 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 \ model=yolov8n.pt \ epochs=100 \ imgsz=640 \ batch=16 \ device=0 \ project=runs/gear \ name=exp1

逻辑说明:data指向 yaml,model用预训练权重做迁移学习,epochs是训练轮数,imgsz是输入尺寸,batch是批大小,device=0用第一块 GPU,project/name决定输出目录。参数说明:齿轮缺陷目标小,imgsz不建议低于 640;batch受显存限制,8G 显存用 16 比较稳,爆显存就降到 8。yolov8n.pt是最小模型,适合先跑通;精度不够再换yolov8s.pt或yolov8m.pt。训练日志里重点看box_loss、cls_loss和mAP50,box_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 通常够,但如果图片本身是 4K,resize 到 640 后小缺陷可能只剩几个像素。解决:先确认图片原始分辨率,若缺陷极小,可尝试imgsz=1024但必须降 batch;或者用切片推理(SAHI)思路,把大图切块检测。显存不足时优先降 batch,再考虑换更小模型。

4.5 现象:验证集 mAP 很高,实际产线漏检严重

原因:训练集和验证集来自同一批图片,分布太像,模型没学到泛化特征。齿轮缺陷检测里,不同光照、不同齿轮型号的缺陷外观差异大。解决:划分数据集时按齿轮型号或拍摄批次分层,确保验证集包含训练集没见过的型号。如果数据集已经划分好,先检查 train 和 val 的图片是否来自同一批次,必要时重新划分。

5. 进阶技巧:用混淆矩阵和单类阈值把齿轮缺陷检测调到可用

训练完不是终点,齿轮缺陷检测在产线上往往对某一类缺陷特别敏感,比如裂纹漏检代价高,而点蚀误检可以接受。这时全局 mAP 不够用,要看混淆矩阵和单类阈值。YOLO 验证时会输出confusion_matrix.png,在runs/gear/exp1/下。重点看裂纹那一行:如果裂纹被预测成背景的比例高,说明召回不足,需要提高该类样本权重或增加裂纹样本。

调整推理阈值是最快的手段。默认conf=0.25,对裂纹可以降到 0.15 提高召回:

yolo detect predict \ model=runs/gear/exp1/weights/best.pt \ source=./gear_defect_dataset/images/test \ conf=0.15 \ iou=0.5 \ save=True \ project=runs/gear_predict \ name=test_crack

逻辑说明:conf是置信度阈值,低于它的框被丢弃;iou是 NMS 的 IoU 阈值,控制重叠框合并。参数说明:conf降低会增多框,可能引入误检;iou调低会合并更多重叠框,适合缺陷密集场景。我一般对裂纹用conf=0.15,对磨损用conf=0.3,分开跑再合并结果。如果类别多,可以写脚本按类别设不同阈值,遍历预测结果过滤。

另一个技巧是看results.csv里的metrics/mAP50-95和metrics/mAP50差距。差距大说明框定位不准,齿轮缺陷框如果标注偏松,模型学到的框会偏大,这时可以收紧标注或加box损失权重。YOLO 训练参数里box默认 7.5,定位差可以适当提高,但别超过 10,否则分类会退化。

最后说个习惯:每次改数据集或参数,都在name里写清楚,比如exp2_crack_conf015,不然一周后你根本分不清哪个权重是哪个配置。齿轮缺陷检测这行,数据比模型重要,标签比参数重要,希望帮到你。

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

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

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

立即咨询