拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

轴承外观缺陷检测数据集实战:YOLOv5/v8/11训练与避坑指南

轴承外观缺陷检测数据集实战:YOLOv5/v8/11训练与避坑指南

简介:这份资源面向从事工业质检、机器视觉与目标检测的开发者及学生,提供轴承外观缺陷检测的YOLO格式数据集,可直接用于yolov5、yolov8、yolo11等模型的训练与验证。数据共标注1000余张图像,涵盖凹槽、凹陷、擦伤、划痕四个类别,并已按训练集、验证集、测试集划分完毕,附带data.yaml配置文件,开箱即用,省去自行采集与标注的成本。压缩包内共约2000个文件,以1111个txt标注文件和886张jpg图像为主,另有cache缓存与yaml配置,整体约460MB,目录结构清晰,便于快速接入训练流程。目前已有219人学习下载,适合需要真实工业缺陷样本做模型对比、调参或课程实验的读者参考使用。

1. 轴承外观缺陷检测数据集:1000 张 4 类别、开箱即用的 YOLO 训练起点

拿到一个「轴承外观缺陷检测数据集」,很多人第一反应是问:1000 多张够不够训 YOLOv5、YOLOv8 还是 YOLO11?答案不是够不够,而是你怎么用。轴承属于典型的工业小目标场景,缺陷往往是划痕、凹坑、锈斑、缺料这类低对比度区域,1000 张标注图如果类别均衡、划分干净,配合 data.yaml 直接开跑,完全能撑起一个可用的基线模型。这个数据集的价值在于省掉了最耗时的采集和标注环节,让你把精力放在模型选型、超参和部署上。它适合三类人:想快速跑通 YOLO 训练流程的新手、做工业质检毕业设计的学生、以及需要验证缺陷检测方案可行性的工程师。下面从数据组织讲到训练、排错和进阶,全部围绕这套 4 类别、已划分 train/val/test 的数据集展开。

2. 先看懂这套数据集的组织方式:目录、标签与 data.yaml

2.1 目录结构决定你能不能直接开跑

一套「开箱即用」的 YOLO 数据集,核心不是图片数量,而是目录和标签格式是否规范。常见做法是长这样:

bearing_defect/ ├── images/ │ ├── train/ # 训练集图片 │ ├── val/ # 验证集图片 │ └── test/ # 测试集图片 ├── labels/ │ ├── train/ # 与图片同名的 .txt 标签 │ ├── val/ │ └── test/ └── data.yaml # 数据集描述文件

图片和标签必须同名不同后缀,比如images/train/001.jpg对应labels/train/001.txt。如果标签目录里出现空文件,说明这张图是负样本(无缺陷),YOLO 允许保留,但比例别太高,否则模型会偏向「什么都检测不到」。轴承缺陷通常 4 类,假设是scratch(划痕)、dent(凹坑)、rust(锈斑)、missing(缺料),那么每个标签文件里每行是:

<class_id> <x_center> <y_center> <width> <height>

后四个值都是归一化到 0~1的相对坐标,不是像素值。这是新手最容易翻车的地方——直接拿标注工具的像素坐标填进去,训练时框会全部跑到左上角。

2.2 data.yaml 的四个关键字段

data.yaml是 YOLOv5/v8/11 通用的数据集入口,内容一般是这样:

path: /home/user/bearing_defect # 数据集根目录,绝对路径最稳 train: images/train # 相对 path 的训练集路径 val: images/val test: images/test nc: 4 # 类别数 names: ['scratch', 'dent', 'rust', 'missing'] # 类别名,顺序必须和 class_id 对应

参数说明:path用绝对路径能避免「找不到数据集」的玄学问题;train/val/test写相对路径时,YOLO 会自动拼到path后面;nc必须等于names的长度,写错会直接报维度不匹配;names的顺序就是标签里class_id的映射,0 对应第一个名字,改顺序等于把类别标签全打乱。我一般会在训练前跑一段脚本核对类别分布,确认没有某个类别只有个位数样本。

import os, collections label_dir = "bearing_defect/labels/train" counter = collections.Counter() for f in os.listdir(label_dir): if f.endswith(".txt"): with open(os.path.join(label_dir, f)) as fp: for line in fp: if line.strip(): counter[int(line.split()[0])] += 1 print("类别分布:", dict(sorted(counter.items())))

这段脚本统计训练集每个类别的框数量。如果发现rust只有 20 个框而scratch有 800 个,说明类别严重不均衡,后面训练要么加权重,要么做增强补齐。逻辑很简单:逐行读标签,取第一个字段作为类别 id 计数。参数上只需改label_dir指向你的实际路径。

3. 用 YOLOv8 在本地跑通第一轮训练:环境、命令与参数

3.1 环境配置:conda 隔离 + 按显卡选版本

YOLOv8 环境配置踩坑最多的是 PyTorch 和 CUDA 版本对不上。我一般用 conda 建独立环境,避免污染系统 Python:

conda create -n yolo8 python=3.10 -y conda activate yolo8 # 有 NVIDIA 显卡(如 gtx1660ti)时,按官方对应 CUDA 版本装 torch pip install torch torchvision --index-url https://download.pytorch.org/whl/cu121 pip install ultralytics

参数说明:python=3.10是当前兼容性最好的版本;cu121表示 CUDA 12.1,你要按nvidia-smi显示的驱动支持版本选,选高了会报no kernel image。如果是 CPU 版本(比如 Ubuntu 20.04 无显卡机器),直接pip install torch torchvision装 CPU 轮子即可,训练会慢但能跑通流程。装完用一行命令验证:

yolo checks

它会打印 ultralytics 版本、torch 版本、CUDA 是否可用。看到CUDA:0就说明 GPU 认到了。

3.2 训练命令与必调参数

数据集和 data.yaml 就绪后,一条命令就能开跑:

yolo detect train \ data=bearing_defect/data.yaml \ model=yolov8n.pt \ epochs=100 \ imgsz=640 \ batch=16 \ workers=4 \ project=runs/bearing \ name=exp1

参数逐个说:model=yolov8n.pt是 nano 版预训练权重,1000 张图从它微调最稳,别一上来用yolov8x,小数据集容易过拟合;epochs=100是上限,实际看早停;imgsz=640是输入分辨率,轴承缺陷偏小,如果显存够可以试imgsz=960,小目标召回会明显提升;batch=16按显存调,gtx1660ti 6G 跑 640 大概能到 16,爆显存就降到 8;workers=4是数据加载线程,Windows 上设太高反而卡,设 0 或 2 更稳。训练日志里重点看三个指标:box_loss是否稳定下降、mAP50是否在涨、val/box_loss有没有先降后升(过拟合信号)。

3.3 训练完怎么验证和推理

训练结束权重在runs/bearing/exp1/weights/best.pt。验证集评估:

yolo detect val model=runs/bearing/exp1/weights/best.pt data=bearing_defect/data.yaml

单张图推理看效果:

yolo detect predict model=runs/bearing/exp1/weights/best.pt source=test.jpg conf=0.25 save=True

conf=0.25是置信度阈值,轴承缺陷如果漏检多就降到 0.15,误检多就升到 0.4。推理结果图会存到runs/detect/predict,直接肉眼比对标注框和预测框,比看数字更直观。

4. YOLOv5、YOLOv8、YOLO11 在同一套数据上的选型差异

4.1 三个版本对数据格式的要求几乎一致

好消息是这套数据集的标签格式对 YOLOv5、YOLOv8、YOLO11 是通用的,都是归一化 txt + data.yaml。差异主要在训练入口和配置方式:YOLOv5 用train.py脚本加--data参数,YOLOv8/11 用yolo命令行或 Python API。YOLOv5 训练命令:

python train.py --data bearing_defect/data.yaml --weights yolov5s.pt \ --epochs 100 --img 640 --batch 16 --project runs/bearing --name exp1

YOLO11 则和 v8 命令几乎一样,只换模型名:

yolo detect train data=bearing_defect/data.yaml model=yolo11n.pt epochs=100 imgsz=640

选型建议:追求部署生态成熟、资料多,选 YOLOv8;想用更新的网络结构和更好的小目标表现,试 YOLO11;老项目或已有 YOLOv5 部署链路,继续用 v5 最省事。1000 张这个量级,三者差距不会天差地别,关键在超参和增强。

4.2 小目标场景下值得调的增强参数

轴承缺陷小,默认增强可能不够。YOLOv8/11 可以在训练命令里加:

yolo detect train data=bearing_defect/data.yaml model=yolov8n.pt \ epochs=150 imgsz=960 batch=8 \ mosaic=1.0 scale=0.5 degrees=10 fliplr=0.5

参数说明:mosaic=1.0是四图拼接增强,对小目标友好但训练后期可降到 0.5 避免过拟合;scale=0.5允许缩放抖动,模拟不同拍摄距离;degrees=10小幅旋转,轴承是圆形工件,旋转不变性有帮助;fliplr=0.5水平翻转。注意别开flipud(上下翻转),工业件安装方向往往有语义,翻了反而不合理。

5. 避坑与排查:轴承缺陷训练最常见的 5 个翻车现场

5.1 训练 loss 不降,mAP 一直是 0

现象:跑了几十轮,box_loss在 1.0 附近震荡,mAP50始终 0。原因九成是标签坐标没归一化,或者class_id从 1 开始编号(YOLO 要求从 0 开始)。解决:写脚本扫一遍所有标签,确认坐标都在 0~1 之间、类别 id 最大值等于nc-1。发现越界就重新导出标注。

5.2 报错「No labels found」

现象:启动训练直接提示找不到标签。原因通常是data.yaml里path写错,或图片和标签目录层级不对应。解决:把path改成绝对路径,并确认images/train和labels/train在同一父目录下。YOLO 是靠把路径里的images替换成labels找标签的,目录名不能乱改。

5.3 显存爆了(CUDA out of memory)

现象:训练几轮后突然 OOM。原因多为batch或imgsz太大,或workers太多导致内存泄漏。解决:先把batch减半,再把imgsz从 960 降到 640,workers设 2。如果还爆,加cache=False关闭内存缓存。

5.4 验证集 mAP 高但实际推理漏检严重

现象:mAP50有 0.9,拿现场图一测啥都检不到。原因是训练集和验证集同分布,但现场光照、角度差异大。解决:从现场补拍几十张图做测试集,别只看 val 指标;同时降低推理conf阈值,并考虑加亮度、对比度增强重训。

5.5 类别不均衡导致小类别全漏

现象:rust这类样本少的缺陷几乎检不出。原因就是框数量差距太大。解决:在data.yaml同级用cls权重,或对稀有类做复制增强;YOLOv8 也支持在训练时用fraction控制采样,但更直接的是补数据。

6. 把 1000 张用到极致:交叉验证与部署前的一次自检

1000 张不算多,想榨干它的价值,我一般做两件事。第一是交叉验证:把 train+val 合并后重新按 5 折划分,每折训一个模型,看 mAP 波动。如果 5 折 mAP 标准差超过 0.05,说明数据划分本身不稳定,单次结果不可信。YOLO 本身不带 K 折,需要自己写划分脚本:

import os, random, shutil src_img = "bearing_defect/images/train" src_lbl = "bearing_defect/labels/train" files = [f for f in os.listdir(src_img) if f.endswith(".jpg")] random.seed(42) random.shuffle(files) folds = [files[i::5] for i in range(5)] # 5 折 for k, fold in enumerate(folds): for split, data in [("val", fold), ("train", [f for f in files if f not in fold])]: img_dir = f"fold{k}/images/{split}" lbl_dir = f"fold{k}/labels/{split}" os.makedirs(img_dir, exist_ok=True) os.makedirs(lbl_dir, exist_ok=True) for f in data: shutil.copy(os.path.join(src_img, f), img_dir) lbl = f.replace(".jpg", ".txt") if os.path.exists(os.path.join(src_lbl, lbl)): shutil.copy(os.path.join(src_lbl, lbl), lbl_dir)

逻辑是按固定随机种子打乱后切片,保证可复现;每折生成独立的 images/labels 目录,再各写一份 data.yaml 指向它。参数上seed=42固定划分,换种子能验证划分敏感性。

第二是部署前自检:导出 ONNX 或 TensorRT 后,用同一批测试图对比 PyTorch 和导出模型的输出框,IoU 低于 0.9 的框数量如果超过 5%,说明导出有精度损失,要检查输入尺寸和归一化是否一致。这一步能挡掉大量「训练好好的,一上板子就废」的问题。

我自己踩过最深的坑,是早期图省事没做类别分布统计,训完发现模型对某一类完全无感,回头补数据又得重训一遍。后来养成习惯:拿到任何数据集,先跑分布脚本、先看几张标签可视化,再动训练命令。这套轴承数据集结构清晰,值得你按上面的流程完整走一遍,把基线跑稳再谈改进。希望帮到你。

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

返回列表