ARTICLE DETAIL

资讯详情

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

基于YOLO的轴承缺陷检测:568张小样本数据集实战与调优

基于YOLO的轴承缺陷检测:568张小样本数据集实战与调优 简介这份资源面向工业视觉检测方向的开发者与深度学习入门者提供一套基于YOLO的轴承生产缺陷检测完整数据集用于训练和验证目标检测模型解决轴承裂纹、划痕、腐蚀等常见缺陷的自动识别问题。压缩包共1772个文件包含624张jpg图像、568个xml标注文件、577个txt标签文件以及2个Python脚本和1个yaml配置文件整体约755.12MB覆盖从原始图片、标注数据到训练配置的完整流程。目前已有336人学习下载。读者可借助该数据集直接开展YOLO模型训练理解边界框标注与类别ID定义方式并结合Python与OpenCV、PyTorch等工具完成数据预处理、模型迭代与可视化检测为工业质检场景下的缺陷检测项目提供可复用的数据基础与排错参考。1. 568 张轴承图、3 类缺陷这份 YOLO 数据集到底能跑出什么产线上拿气动卡盘夹着轴承外圈转一圈工业相机连拍十几张人工盯着屏幕找裂纹和划痕——这种活干过的人都知道眼睛撑不过两小时。这份资源就是冲这个场景来的568 张轴承生产缺陷图标好 3 类缺陷直接喂给 YOLO 系列训练。它不是那种几万张的公开大集规模偏小但胜在场景聚焦、类别干净适合拿来验证「小样本工业缺陷检测到底能不能落地」这件事。适合谁一是手上正好有轴承或类似环形金属件检测需求、想先拿现成数据跑通全流程的工程师二是学生或转行者想找一个真实工业数据集练 YOLO 训练、验证、可视化一整套动作。568 张不算多但正因为少你才会被迫去认真处理数据增强、类别不平衡和过拟合这些才是工业检测里真正卡人的地方。下面从数据怎么读、环境怎么搭、训练怎么调、坑在哪一层层拆开。2. 数据集结构与标注格式先把 568 张图的账算清楚拿到一个数据集我第一件事不是急着train.py而是先把目录结构和标注格式摸清楚。格式不对后面训练全是玄学报错。这份资源是典型的 YOLO 检测数据集图片和标签分离存放3 个类别对应 3 个 class id。2.1 目录长什么样、类别怎么映射常见做法是images/和labels/两个平行目录各自再分train/val。标签是.txt每行一个目标格式为class_id x_center y_center width height坐标全部归一化到 0~1。这里有个血泪经验归一化坐标一旦算错训练 loss 会正常下降但框全飘你盯着 loss 曲线根本看不出来。先写个脚本把数据集的账盘一遍确认图片数、标签数、类别分布import os from collections import Counter IMG_DIR dataset/images/train LBL_DIR dataset/labels/train img_files [f for f in os.listdir(IMG_DIR) if f.endswith((.jpg, .png))] cls_counter Counter() missing_label [] for img in img_files: stem os.path.splitext(img)[0] lbl_path os.path.join(LBL_DIR, stem .txt) if not os.path.exists(lbl_path): missing_label.append(img) # 图片没有对应标签训练时会报错 continue with open(lbl_path) as f: for line in f: line line.strip() if not line: continue cls_id int(line.split()[0]) cls_counter[cls_id] 1 print(图片总数:, len(img_files)) print(缺标签的图片:, len(missing_label)) print(各类别目标数:, dict(cls_counter))这段逻辑很直白遍历图片找同名.txt统计每个 class id 出现次数。missing_label是关键——YOLO 训练时如果图片没有标签文件有的版本直接跳过有的版本报错先揪出来心里有底。cls_counter告诉你三类缺陷是否均衡如果某一类只有几十个目标后面就得靠增强补。2.2 三类缺陷的 class id 与 data.yamlYOLOv5/v8 都靠一个data.yaml描述数据集路径和类别名。类别顺序必须和标注里的 class id 严格对应错一位就是「把裂纹认成划痕」这种翻车。假设三类是裂纹、划痕、腐蚀# data.yaml path: ./dataset train: images/train val: images/val nc: 3 names: 0: crack # 裂纹 1: scratch # 划痕 2: corrosion # 腐蚀nc是类别数必须等于names的条目数。path用相对路径时注意它是相对你执行训练命令的工作目录不是相对 yaml 文件本身——这个坑我在不同版本上踩过不止一次路径写错直接FileNotFoundError。改完 yaml建议先跑一次官方自带的check或直接 dry-run 一个 epoch确认数据能被正确加载再正式开训。3. 环境搭建与训练从 Anaconda 到第一个 epoch环境这块YOLOv8 是目前最省心的选择ultralytics一个包把训练、验证、导出全包了。但显卡驱动、CUDA、PyTorch 版本三者对不上是新手最容易卡住的地方。3.1 Anaconda 建环境与依赖安装我一般用 conda 隔离环境避免和系统里的包打架。下面这套流程在带 NVIDIA 显卡的机器上通用# 创建独立环境python 版本选 3.9~3.10 兼容性最好 conda create -n bearing_yolo python3.10 -y conda activate bearing_yolo # 先装 pytorchcu118 对应 CUDA 11.8按自己驱动版本调整 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 # 再装 ultralytics它会带上 opencv、numpy 等依赖 pip install ultralytics # 验证 GPU 是否可用这一步千万别跳过 python -c import torch; print(torch.cuda.is_available(), torch.cuda.get_device_name(0))torch.cuda.is_available()返回False就别往下走了先解决驱动。常见原因是驱动版本低于 CUDA 要求或者装成了 CPU 版 torch。get_device_name(0)能打印出显卡型号确认没认错卡。这一步过了后面训练才有意义。3.2 启动训练与关键参数怎么设环境通了一条命令就能开训。但参数不能照抄默认值568 张小集子尤其要调yolo detect train \ datadata.yaml \ modelyolov8n.pt \ epochs150 \ imgsz640 \ batch16 \ lr00.01 \ patience30 \ augmentTrue \ projectruns/bearing \ nameexp1逐个说清楚。modelyolov8n.pt用 nano 版预训练权重小数据集上大模型极易过拟合nano 反而稳。epochs150配合patience30意思是 30 轮验证指标不涨就早停省得白跑。imgsz640是输入分辨率轴承缺陷往往很小如果裂纹在图上只占几十像素可以提到 960 甚至 1280但显存和速度要权衡。batch16按显存调8G 显存跑 640 一般能到 16。lr00.01是初始学习率小数据集别设太大否则 loss 震荡。augmentTrue打开内置增强包括 mosaic、翻转、HSV 抖动。对工业缺陷来说mosaic 要谨慎——它把四张图拼一起可能让缺陷出现在不合逻辑的位置但小数据集又确实需要它撑样本量。我的做法是先开着跑看验证集表现如果 mAP 上不去再关掉对比。3.3 训练过程看什么指标训练日志里重点盯三个box_loss、cls_loss、mAP50。box_loss 管框回归cls_loss 管分类两个都该平稳下降。如果 box_loss 降但 mAP 不涨多半是标注框质量有问题。mAP50是 IoU0.5 时的平均精度工业检测里这个值能到 0.85 以上才算能用。训练完在runs/bearing/exp1/下会生成results.png、confusion_matrix.png混淆矩阵能直接看出哪两类缺陷被互相认错——裂纹和划痕在灰度图上确实容易混这是数据本身的难点。4. 推理、验证与可视化把模型拉出来遛遛训练完不等于能用得拿验证集和真实图片过一遍看框画得对不对、置信度门限设多少合适。4.1 用验证集算指标yolo detect val \ modelruns/bearing/exp1/weights/best.pt \ datadata.yaml \ imgsz640 \ conf0.25 \ iou0.5conf0.25是置信度门限低于它的框直接丢。iou0.5是 NMS 的 IoU 阈值控制重叠框合并。验证完会输出每类的 P、R、mAP50、mAP50-95。如果某一类召回率特别低说明漏检多要么该类样本太少要么门限太高。4.2 单张图推理与结果保存from ultralytics import YOLO model YOLO(runs/bearing/exp1/weights/best.pt) results model.predict( sourcetest_images/, conf0.25, # 置信度门限调低召回高但误检多 iou0.45, # NMS 阈值 saveTrue, # 保存带框结果图 save_txtTrue, # 同时导出 txt 标注 projectruns/predict, namebearing_test ) for r in results: print(r.path, 检测到目标数:, len(r.boxes))source可以是单张图、目录或视频。save_txtTrue会把预测框按 YOLO 格式导出方便你拿去做二次分析或和真值对比。len(r.boxes)打印每张图检出的目标数如果一张明显有缺陷的图检出 0 个就是漏检得回头查训练数据里这类缺陷够不够。4.3 置信度门限怎么定门限不是拍脑袋定的。工业场景里漏检把坏件判成好件代价远大于误检把好件判成坏件人工复检即可。所以宁可门限低一点、多报几个也别放过缺陷。我一般会画一条 P-R 曲线找召回率还能接受时对应的门限。conf0.25是通用起点实际部署时按你的漏检容忍度往下调到 0.15 甚至 0.1 都正常。5. 避坑与常见问题排查568 张小集子的五个真实翻车点小数据集训练坑比大数据集多得多。下面五条是我和身边人真踩过的按「现象 → 原因 → 解决」写清楚。现象一训练 loss 正常下降但验证 mAP 一直是 0 或极低。原因data.yaml里names顺序和标注 class id 对不上或者path路径写错导致加载了空标签。 解决先用第 2 章的统计脚本确认每类目标数非零再核对 yaml 的names顺序路径统一用绝对路径最保险。现象二模型只认一类缺陷另外两类几乎检不出。原因类别严重不平衡某一类目标数远少于其他类模型偏向多数类。 解决统计各类目标数对少样本类做定向增强旋转、复制粘贴或在损失里给少样本类加权。别指望默认配置自动平衡。现象三验证集 mAP 很高但拿新拍的图一测全是误检。原因训练集和验证集来自同一批拍摄条件模型过拟合了背景和光照泛化差。 解决划分验证集时按拍摄批次或角度分别随机分。新场景的图先做和训练集一致的预处理再测。现象四显存爆了报 CUDA out of memory。原因imgsz或batch设太大或workers开太多导致内存泄漏。 解决先把batch降到 8 或 4再考虑降imgsz。workers在 Windows 上设 0 或 2多了容易卡死。现象五训练到一半 loss 突然变 NaN。原因学习率太大或某张图的标注坐标超出 0~1 范围。 解决lr0降到 0.001 重跑同时用脚本扫一遍所有标签把坐标不在 [0,1] 的行揪出来修正。提示每次改完数据或配置先跑 1~2 个 epoch 做冒烟测试确认能正常加载和反向传播再开长训练。省下的时间远比你想的多。6. 小样本提效技巧把 568 张用出 2000 张的效果568 张要撑起一个能用的检测模型核心思路就一个字榨。但榨要有章法乱增强只会引入噪声。我一般从三个方向下手。第一是离线增强补样本。YOLO 内置增强是每个 epoch 动态做的但有些变换它不做比如针对金属反光的亮度扰动、针对环形件的随机旋转。用 OpenCV 离线生成一批增强图连同标签一起写回数据集能实打实扩充样本量import cv2 import numpy as np import os def augment_image(img, boxes): # 随机亮度扰动模拟产线光照波动 factor np.random.uniform(0.7, 1.3) img np.clip(img.astype(np.float32) * factor, 0, 255).astype(np.uint8) # 随机旋转 90 度的整数倍环形件旋转后缺陷位置合理 k np.random.randint(0, 4) img np.rot90(img, k) # 旋转后框坐标也要跟着转这里省略具体坐标变换逻辑 return img, boxes src_dir dataset/images/train for fname in os.listdir(src_dir): if not fname.endswith(.jpg): continue img cv2.imread(os.path.join(src_dir, fname)) aug, _ augment_image(img, None) cv2.imwrite(os.path.join(src_dir, aug_ fname), aug)这段只演示了亮度和旋转实际用的时候框坐标必须同步变换否则标签全错。旋转 90 度整数倍的好处是坐标变换简单不用处理插值带来的框偏移。亮度扰动范围 0.7~1.3 是我试出来的经验值再大就失真了。第二是迁移学习用足预训练权重。yolov8n.pt是在 COCO 上训过的底层特征提取器已经会认边缘和纹理你只需要微调。所以lr0别设太大冻结 backbone 先训几轮再解冻是小数据集的标准打法。第三是验证策略要严。568 张里划验证集别随机划按缺陷类型分层划保证验证集里三类都有。我习惯留 15% 做验证剩下的训练。验证集太小指标会抖太大又不够训15% 是个平衡点。最后说个习惯每次训完我都会把best.pt在一批从没参与训练的图上跑一遍人工看框。指标再好看框画歪了就是不能用。从那以后我每次交付模型前都强制走一遍「新图人工抽检」这一步指标只是参考眼睛才是最后一道关。希望帮到你。本文还有配套的精品资源点击获取
返回列表