简介:轴承外壳轴目标检测数据集面向工业视觉质检、智能制造与机械工程方向的开发者与研究人员,聚焦轴承、外壳、轴三类核心机械组件的识别与定位需求。资源共510张工业场景实拍图片,按训练集287张、验证集123张、测试集100张划分,全部采用YOLO格式归一化边界框标注,类别标签经双重校验,可直接加载至YOLOv5、YOLOv8等主流框架,无需格式转换。压缩包内共1022个文件,以510个jpg图像与510个txt标注文件为主,另含1个yaml数据配置和1份docx说明文档,整体约16.43MB,结构清晰便于快速接入训练流程。该数据集覆盖复杂背景下的多角度样本,除目标检测外还可迁移至零件分类、异常检测等衍生任务,适用于产线监控、设备故障诊断与机器人抓取引导等场景。目前已有209人学习关注,适合需要快速验证工业检测模型的中高级读者参考使用。
1. 轴承外壳轴目标检测数据集:从工业质检场景切入的一份可直接训练的资源
产线上做轴承外壳外观质检的兄弟大概率都遇到过这个场景:传送带速度拉到 1.2 m/s,相机帧率 30 fps,单帧里同时出现三到五个轴承外壳,有的正放、有的侧翻、有的被机械爪挡住一半,传统模板匹配和边缘检测在这种姿态变化面前基本就是玄学。你要做的第一件事不是调算法,而是先有一份能覆盖这些真实工况的标注数据。这份「轴承外壳轴目标检测数据集」就是冲着这个需求来的——它面向工业目标检测场景,标注对象是轴承外壳轴这一类零件,格式适配 YOLO 系列训练流程,拿来就能接 ultralytics 的 yolov8 / yolov11 / yolov12 训练管线。适合谁?做工业质检落地的算法工程师、带学生做课题的高校研究者、以及想拿真实工业数据练手目标检测的新手。它解决的不是「有没有数据」的问题,而是「数据能不能直接进训练脚本、标注质量能不能撑住 mAP 评估」的问题。
2. 数据集结构与 YOLO 标注格式:先搞懂目录再动手
2.1 工业目标检测数据集的典型目录布局
拿到一个目标检测数据集压缩包,第一件事不是急着解压进训练脚本,而是先看清楚它的目录组织。工业场景的数据集和 COCO、VOC 那类通用数据集不一样,它往往按「采集批次 + 缺陷/目标类型」来分文件夹,而不是按 train/val 分。常见做法是解压后先跑一遍tree或者find,把结构摸清楚再决定怎么切分。
一份合格的 YOLO 格式轴承外壳数据集,解压后大概率长这样:
# 查看数据集目录结构,先摸清楚再动手 unzip 轴承外壳轴目标检测数据集.zip -d bearing_dataset cd bearing_dataset find . -maxdepth 2 -type d | sort # 典型输出: # ./images # ./images/train # ./images/val # ./labels # ./labels/train # ./labels/val # ./data.yaml如果解压出来是images和labels平铺在一起、没有 train/val 划分,那说明这是一份「原始标注集」,切分脚本得你自己写。这两种情况都正常,关键是别假设它一定已经分好了。
2.2 YOLO txt 标注格式逐字段拆解
YOLO 系列的标注文件是每张图对应一个同名.txt,每行一个目标,格式是:
<class_id> <x_center> <y_center> <width> <height>五个字段全部归一化到 0~1 之间。这里有几个新手最容易翻车的点:x_center和y_center是框中心点坐标除以图像宽高,不是左上角;width和height也是除以图像宽高后的比例值,不是像素。工业数据集里如果标注工具导出的是 VOC 的xmin ymin xmax ymax绝对像素坐标,直接喂给 YOLO 训练会得到一堆越界框,loss 直接炸。
写个校验脚本先扫一遍,这一步我每次拿到新数据集都强制走:
import os import glob def check_yolo_labels(label_dir, img_dir): """校验 YOLO 标注文件是否存在越界、格式错误""" bad_files = [] for txt_path in glob.glob(os.path.join(label_dir, "*.txt")): with open(txt_path, "r") as f: lines = f.readlines() for i, line in enumerate(lines): parts = line.strip().split() # YOLO 格式必须是 5 个字段 if len(parts) != 5: bad_files.append((txt_path, i, "字段数不对")) continue cls_id, xc, yc, w, h = parts vals = [float(xc), float(yc), float(w), float(h)] # 归一化坐标必须落在 0~1 if any(v < 0 or v > 1 for v in vals): bad_files.append((txt_path, i, f"坐标越界: {vals}")) # 宽高不能为 0 if float(w) <= 0 or float(h) <= 0: bad_files.append((txt_path, i, "宽高为0")) return bad_files bad = check_yolo_labels("bearing_dataset/labels/train", "bearing_dataset/images/train") print(f"发现 {len(bad)} 处问题") for b in bad[:10]: print(b)这段脚本干三件事:检查每行是不是 5 个字段、检查归一化坐标有没有越界、检查宽高有没有为 0。参数上label_dir传标注目录,img_dir传图像目录(当前版本没用到图像尺寸,但如果你的标注是像素坐标需要转归一化,就得读图像宽高来除)。跑完如果bad_files为空,说明标注格式干净,可以进下一步。
2.3 data.yaml 配置与类别映射
YOLO 训练靠一个data.yaml把图像路径、类别数、类别名串起来。工业数据集常见的问题是类别名写的是中文或者带空格,训练时 ultralytics 解析会出问题。标准写法:
# data.yaml path: ./bearing_dataset # 数据集根目录 train: images/train # 相对 path 的训练图路径 val: images/val nc: 1 # 类别数,轴承外壳轴通常是单类 names: 0: bearing_housing # 类别名用英文,别用中文和空格nc和names的键必须对得上,names的键从 0 开始连续。如果数据集里轴承外壳轴分了「正放」「侧放」多个子类,nc就要改成对应数量,names逐个列。这里有个坑:很多人改完nc忘了改names,训练能跑起来但类别索引错位,评估时 mAP 看着还行,实际预测框全标错类。
2.4 训练/验证集切分策略
如果数据集没预先切分,你得自己按比例分。工业数据集的切分不能纯随机——同一批次、同一光照条件下拍的图如果被随机分到 train 和 val,验证集 mAP 会虚高,因为模型见过几乎一样的图。常见做法是按采集批次切,或者至少保证 val 里有不同姿态、不同遮挡程度的样本。
import os, random, shutil def split_dataset(img_dir, label_dir, out_dir, val_ratio=0.2, seed=42): """按比例切分,保证图像和标注同步移动""" random.seed(seed) imgs = [f for f in os.listdir(img_dir) if f.endswith(('.jpg', '.png'))] random.shuffle(imgs) n_val = int(len(imgs) * val_ratio) val_imgs = imgs[:n_val] train_imgs = imgs[n_val:] for split, files in [("train", train_imgs), ("val", val_imgs)]: os.makedirs(f"{out_dir}/images/{split}", exist_ok=True) os.makedirs(f"{out_dir}/labels/{split}", exist_ok=True) for img in files: shutil.copy(os.path.join(img_dir, img), f"{out_dir}/images/{split}/{img}") # 标注文件名和图像同名,只换后缀 txt = os.path.splitext(img)[0] + ".txt" src_txt = os.path.join(label_dir, txt) if os.path.exists(src_txt): shutil.copy(src_txt, f"{out_dir}/labels/{split}/{txt}") split_dataset("bearing_dataset/images", "bearing_dataset/labels", "bearing_split")val_ratio控制验证集比例,工业小数据集一般 0.15~0.2 就够;seed固定住保证每次切分结果一致,方便复现。切完记得再跑一遍 2.2 的校验脚本,确认标注跟着图像一起搬过去了,别出现有图没标注的情况。
3. 用 ultralytics 跑通 yolov8/yolov11 训练:从环境到首轮 mAP
3.1 环境配置与依赖版本
ultralytics 这套框架版本迭代快,yolov8 和 yolov11 的 API 基本兼容,但依赖版本对不上照样报错。我一般用 conda 建独立环境,避免和系统里的 torch 打架:
conda create -n bearing_yolo python=3.10 -y conda activate bearing_yolo # 装 pytorch,按自己 CUDA 版本选,这里以 cu118 为例 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 pip install ultralytics opencv-python # 验证装好了 yolo checksyolo checks会打印出 ultralytics 版本、torch 版本、CUDA 是否可用。如果 CUDA 显示不可用但你确实有卡,八成是 torch 装成了 CPU 版,重装对应 CUDA 版本的 wheel 就行。Python 版本建议 3.9~3.11,3.12 有些依赖还没跟上。
3.2 训练命令与关键参数
环境通了直接上训练命令。yolov8 和 yolov11 的调用方式一样,换个模型权重文件就行:
# yolov8n 轻量版,适合先跑通流程 yolo detect train \ data=bearing_split/data.yaml \ model=yolov8n.pt \ epochs=100 \ imgsz=640 \ batch=16 \ lr0=0.01 \ patience=20 \ project=runs/bearing \ name=yolov8n_baseline参数逐个说:data指向 2.3 写的 yaml;model用预训练权重做迁移学习,工业小数据集千万别从零训,yolov8n.pt会自动下载;epochs100 轮起步,小数据集容易过拟合,配合patience=20做早停;imgsz=640是输入分辨率,如果轴承外壳在图中占比很小,可以提到 960 或 1280,但显存占用会涨;batch按显存调,16 是 8G 卡的保守值;lr0初始学习率,迁移学习场景 0.01 比较稳。
想换 yolov11 就把model=yolov8n.pt改成model=yolo11n.pt,其余参数不动。yolov12 目前生态还在跟进,如果数据集要跑 yolov12,建议先确认 ultralytics 版本是否支持,别硬上。
3.3 训练过程监控与首轮 mAP 解读
训练跑起来后,runs/bearing/yolov8n_baseline/下会生成results.csv、weights/、各种曲线图。重点看三个指标:metrics/mAP50、metrics/mAP50-95、train/box_loss。
mAP50 是 IoU 阈值 0.5 时的平均精度,工业质检场景一般要求 0.9 以上才算能用;mAP50-95 更严格,0.6~0.7 算不错。如果 mAP50 上不去但 loss 在降,大概率是标注框和实际目标对不齐,回去查 2.2 的校验结果。如果 loss 震荡不收敛,先把lr0降到 0.001 试。
# 训练完加载最佳权重做一次验证,确认 mAP from ultralytics import YOLO model = YOLO("runs/bearing/yolov8n_baseline/weights/best.pt") metrics = model.val(data="bearing_split/data.yaml", imgsz=640) print(f"mAP50: {metrics.box.map50:.4f}") print(f"mAP50-95: {metrics.box.map:.4f}")best.pt是验证集上表现最好的权重,last.pt是最后一轮的。部署用best.pt,别用last.pt,除非你确认最后一轮没退化。
3.4 推理与结果可视化
训练完拿几张验证集外的图跑推理,肉眼确认框得准不准:
from ultralytics import YOLO model = YOLO("runs/bearing/yolov8n_baseline/weights/best.pt") results = model.predict( source="test_images/", conf=0.25, # 置信度阈值,工业场景可提到 0.4 减少误检 iou=0.45, # NMS 的 IoU 阈值 save=True, # 保存带框的结果图 project="runs/predict" )conf调高会减少误检但可能漏检,工业质检里漏检比误检代价大,一般conf设 0.2~0.3;iou控制重叠框合并,密集目标场景可以降到 0.4。结果图存到runs/predict/下,逐张看,重点看侧翻、遮挡的轴承外壳有没有被漏掉。
4. 工业数据集训练的避坑与排查:五条血泪经验
4.1 现象:训练 loss 正常但 mAP 一直是 0
原因:data.yaml里names的类别名和标注文件里的class_id对不上,或者nc写成了比实际类别数大的值。YOLO 按class_id索引names,索引越界时静默失败,loss 照算但评估全错。
解决:打开一个标注 txt,看第一列class_id的最大值,nc必须等于max(class_id) + 1,names的键必须覆盖 0 到nc-1。改完重跑。
4.2 现象:验证集 mAP 很高,实际产线推理一塌糊涂
原因:切分时随机分了,train 和 val 里有大量同批次、同光照的近似图,模型过拟合到采集条件上,换个光照就崩。
解决:按采集批次或时间段切分,保证 val 里有不同工况的样本。如果数据集本身批次信息缺失,至少按图像亮度、对比度做分层抽样,别纯随机。
4.3 现象:训练报CUDA out of memory
原因:batch或imgsz设太大,或者workers开太多导致内存泄漏。
解决:先把batch减半,还不行就降imgsz(640→512)。workers在 Windows 上设 0 或 2,Linux 上可以设 8,但别超过 CPU 核数。另外确认没有其他进程占着显存。
4.4 现象:标注框看着对,但训练时框偏移
原因:标注工具导出的是 VOC 绝对坐标,没转成 YOLO 归一化坐标,或者图像被 resize 过但标注没跟着缩放。
解决:跑 2.2 的校验脚本,确认所有坐标都在 0~1。如果是绝对坐标,写个转换脚本除以图像宽高。图像预处理(resize、padding)必须在标注转换之后做,顺序别反。
4.5 现象:小目标(远处轴承外壳)检测不出来
原因:imgsz=640下小目标像素太少,特征图上下采样后信息丢失。
解决:提高imgsz到 960 或 1280,或者在data.yaml里开启rect矩形训练减少 padding。另一个办法是用 yolov8m/l 更大的模型,但推理速度会降。工业场景要在精度和速度之间权衡,先确认产线节拍能接受多少毫秒。
5. 从单类到多类与数据增强:把这份数据集用透的进阶技巧
5.1 多类轴承外壳的类别扩展
如果产线要同时检测轴承外壳、轴、密封圈三类目标,这份数据集只标了轴承外壳轴,你得自己补标另外两类。补标时注意class_id从 0 开始连续分配,别跳号。补完更新data.yaml的nc和names,然后重新切分——新类别样本要均匀分布到 train 和 val。
nc: 3 names: 0: bearing_housing 1: shaft 2: seal_ring类别不平衡是工业数据集常态,轴承外壳样本可能远多于密封圈。ultralytics 训练时可以用cls参数调分类 loss 权重,或者在数据集层面做过采样,把少类样本复制几份进 train。
5.2 针对工业场景的数据增强配置
ultralytics 默认开了 mosaic、HSV 增强、翻转。工业场景有几个增强要慎用:上下翻转(flipud)在轴承外壳这种有明确朝向的零件上会造出物理上不存在的样本,建议关掉;左右翻转(fliplr)一般可以留。HSV 的hsv_v可以调大一点,模拟产线光照波动。
yolo detect train \ data=bearing_split/data.yaml \ model=yolov8n.pt \ epochs=150 \ imgsz=960 \ batch=8 \ fliplr=0.5 \ flipud=0.0 \ hsv_v=0.5 \ mosaic=1.0 \ project=runs/bearing \ name=yolov8n_augflipud=0.0关掉上下翻转,hsv_v=0.5加大亮度扰动,mosaic=1.0保留 mosaic 增强提升小目标检测。这些参数不是拍脑袋定的,是我在几个工业质检项目里试出来的经验值,具体还得按你的数据分布微调。
5.3 用验证集反推标注质量
训练完别只看 mAP 数字,把验证集里预测错的图挑出来看。常见做法是跑一遍model.val(save_json=True),拿到每张图的预测结果,和标注对比,IoU 低于 0.5 的挑出来人工复核。如果发现某类目标系统性漏检,八成是标注时漏标了,回去补。
from ultralytics import YOLO model = YOLO("runs/bearing/yolov8n_aug/weights/best.pt") metrics = model.val( data="bearing_split/data.yaml", save_json=True, # 导出 COCO 格式预测结果 plots=True # 生成 PR 曲线、混淆矩阵 ) # 混淆矩阵在 runs/.../confusion_matrix.png,看有没有类别互相误判混淆矩阵是排查标注错位的好工具。如果轴承外壳被大量预测成背景,说明标注框偏小或者漏标;如果两个类别互相误判,说明标注时类别定义模糊,得回去统一标准。
5.4 模型导出与产线部署衔接
训练完的best.pt要上产线,一般导出成 ONNX 或 TensorRT。ONNX 通用性好,TensorRT 在 N 卡上快但绑定硬件。
# 导出 ONNX,动态 batch 方便产线按需调 yolo export model=runs/bearing/yolov8n_aug/weights/best.pt format=onnx dynamic=True opset=12 # 导出 TensorRT,需要目标机器有对应 CUDA 环境 yolo export model=runs/bearing/yolov8n_aug/weights/best.pt format=engine half=Truedynamic=True让 ONNX 支持动态 batch 和动态输入尺寸,产线换相机分辨率时不用重新导出;half=True用 FP16 推理,速度翻倍但精度可能掉一点点,工业场景一般能接受。导出后拿几张图跑一遍 ONNX Runtime 推理,确认输出和 PyTorch 一致再上线。
从那以后我每次拿到新的工业数据集,都强制先跑一遍标注校验脚本、再按批次切分、最后才进训练——这三步省掉任何一步,后面都得花几倍时间返工。这份轴承外壳轴目标检测数据集的价值不在于它有多大,而在于它把工业场景的真实工况(多姿态、遮挡、光照波动)带进了训练流程,让你在本地就能复现产线上的检测难点。希望帮到你。
本文还有配套的精品资源,点击获取