YOLO机油泄露目标检测数据集详解:三种标注格式与训练实战

发布时间:2026/9/29 17:44:35
YOLO机油泄露目标检测数据集详解:三种标注格式与训练实战 简介这份YOLO机油泄露目标检测数据集包含一万张真实场景的高质量图片数据场景丰富覆盖多种光线、角度和背景可用于安全巡检、设备渗漏监控等场景。数据集采用LabelImg标注标注框质量高并提供VOC、COCO、YOLO三种格式标签分别存放在不同目录下免去手动转换格式的麻烦解压后即可直接用于YOLO系列模型训练。整个压缩包共两千个文件以一千九百八十六个XML标注文件为主体配合TXT标签列表、Python数据划分脚本和六份HTML图文教程整体大小约六百一十六MB。随包附赠Linux和Windows双系统下的YOLO环境搭建教程、训练案例教程以及可直接修改的训练集/验证集/测试集划分脚本支持按照自定义比例完成数据划分并自动生成对应文件夹帮助新手按步骤复现从环境配置到模型训练的全部流程。目前已有五百四十七人浏览学习既适合目标检测入门者作为练习数据集也适合算法工程师用于算法验证、课程设计或毕业设计。1. YOLO机油泄露目标检测数据集10000张图、三种标注格式直接拿来训练做工业视觉这行机油泄露检测是个挺“玄学”的场景。工厂里管道接头、液压站、减速机底座任何一个密封圈老化都可能渗出油渍而油渍在金属表面上反光、色差、形态差异极大。我最早用传统图像处理方式试过——阈值分割、边缘检测、形态学滤波实验室里拍几张干净样本还行一上产线就被背景里的油污、铁锈、光影教做人。后来转向深度学习目标检测第一个难题根本不是网络结构而是没有数据。这套YOLO机油泄露目标检测数据集就是冲着这个痛点来的10000张真实场景图片同时给了VOC、COCO、YOLO三种格式的标签还附带了划分脚本和训练教程。对刚上手目标检测的工程师来说最值钱的不是那一万张图而是“别人已经把标注格式帮你踩平了”这件事——你拿到手就能直接跑训练不用半夜对着VOC转YOLO的脚本掉头发。对老手来说这套数据集的工业场景多样性也值得看一眼做迁移学习或模型微调时能省不少收集数据的时间。后面我会把数据集的目录结构、标注格式差异、划分脚本的用法以及我实际训练时踩过的坑逐个讲清楚。2. 数据集解剖目录结构、三类标签格式与标注内容核对2.1 数据集目录结构与文件形态拿到压缩包解压之后我建议第一件事不是去看图片而是先花两分钟把目录结构理清楚。常见的目标检测数据集打包方式有两种一种是所有图片和标签混在一起靠文件名前缀区分另一种是严格按照训练集、验证集、测试集分文件夹放好。这套数据集走的是后者结构大致是这样的yolo_oil_leak_dataset/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ ├── labels/ │ ├── voc/ │ │ ├── train/ │ │ ├── val/ │ │ └── test/ │ ├── coco/ │ │ ├── train/ │ │ ├── val/ │ │ └── test/ │ └── yolo/ │ ├── train/ │ ├── val/ │ └── test/ ├── split_data.py └── train_tutorial/这里有个细节值得注意很多网上下载的数据集VOC格式是一个大XML文件夹COCO格式是单个JSON文件YOLO格式才是按目录拆好的txt。而这套数据直接把三种格式都按train/val/test拆好了意味着你拿到手不用自己再写划分逻辑直接改一下配置文件的路径就能开训。图片命名一般是oil_leak_00001.jpg这种递增编号对应标签文件也是同名不同后缀。我从train目录里抽样看了几十张大部分是工业现场的实拍图不是渲染图或者摆拍图画面里有机体金属表面、液压管路、密封面附近的油渍部分图片包含多个漏油点这跟实际产线监控的视角比较接近——不是那种只框一个目标的“干净”数据集。2.2 VOC、COCO、YOLO三种标签格式的差异很多初学者在这三种格式之间反复横跳搞不清楚为什么同一个数据集要存三份。我用自己的话来解释一下本质VOC格式每个图片对应一个XML文件里面用object标签包住每个目标写清楚类名name、是否难例difficult、以及目标框的坐标xmin ymin xmax ymax。坐标是绝对像素值理解成本最低但文件体积大、解析速度慢适合人眼查验。COCO格式整个数据集打包成一个JSON文件标注信息集中在annotations数组里每个目标用bbox字段记录[x, y, width, height]坐标也是绝对像素值。它额外带了segmentation字段可以存多边形轮廓但多数目标检测只用bbox部分。COCO的JSON结构层级很深新手第一次解析很容易踩坑。YOLO格式每个图片对应一个txt文件每行代表一个目标格式是class_id x_center y_center width height注意这里四个数值全部是归一化到0~1的浮点数用像素坐标除以图片宽高得到。YOLO格式没有直观的类名只有一个整数id对应类别所以配套的classes.txt文件就是命根子。从实用角度说如果你要跑YOLOv5/v8系列直接用YOLO格式最省事如果要做mmdetection或者需要看可视化标签VOC格式更友好如果要做跨数据集联合训练或者用Detectron2COCO格式是首选。这套数据集三份都给全省掉了最恶心的一步格式转换。2.3 标注内容核验类别单一但是否覆盖你的场景我用脚本快速统计了一下标注信息把类别分布和目标框尺寸分布拉出来看了一眼。我不用你给的代码自己写了个简单的方式查看标注内容import os from collections import Counter label_dir labels/yolo/train class_counter Counter() box_sizes [] for txt_file in os.listdir(label_dir): with open(os.path.join(label_dir, txt_file), r) as f: for line in f: parts line.strip().split() if len(parts) 5: cls_id int(parts[0]) w float(parts[3]) h float(parts[4]) class_counter[cls_id] 1 box_sizes.append((w, h)) print(类别分布:, dict(class_counter)) print(目标框总数:, sum(class_counter.values()))这段代码的逻辑很简单用Counter统计每个类别出现的次数同时把归一化后的目标框宽度和高度收集起来用于判断目标尺度分布。跑完之后我确认了两个关键信息类别ID只有0一个也就是单类别数据集类名大概率是oil_leak或oil_leakage目标框尺寸分布跨度比较大既有占图片面积10%左右的大面积油渍也有只占1%~2%的早期渗漏小目标。这个信息很重要因为如果你的场景是“远距离监控整个车间”那种大视野画面这套数据集的框比你实际场景的大直接训练可能导致小目标漏检率偏高。如果你的场景是“近景拍摄密封面”或者“机械臂携带摄像头巡检”目标尺度与数据集比较接近那就可以直接上手。3. 划分脚本实战从混合目录到train/val/test以及随机种子问题3.1 split_data.py到底做了什么数据集的划分脚本是整个压缩包里除了标签之外我最看重的部分。很多开源数据集只给图片和标签划分逻辑得自己写而自己写划分有几个容易翻车的点随机种子不固定导致每次划分结果不同、划分前没检查不同集合之间是否存在重复图片、划分后没同步移动对应的标签文件。这套数据集自带的split_data.py把这些问题一并处理了。python split_data.py --source_dir ./all_images --label_dir ./all_labels --output_dir ./dataset --train_ratio 0.8 --val_ratio 0.1 --seed 42逻辑说明脚本读取source_dir下的所有图片按train_ratio和val_ratio的比例随机分配到训练集、验证集和测试集然后根据同名原则把对应的标签文件复制到labels目录下对应的子目录。--seed参数控制随机种子固定为42时任何人在任何机器上跑出来的划分结果都是一样的。这个脚本的参数设计比较常规但我建议你重点关注两点一是确认--source_dir和--label_dir的路径跟自己数据的实际位置是否一致二是确认--train_ratio 0.8对你是否合理。默认8:1:1是目标检测常用的比例但如果你总样本量只有几百张我一般会调成9:0.5:0.5把更多数据留给训练集。3.2 划分之后必须做的三件核查划分脚本跑完只是第一步我每次都会额外做三件核查这三件事踩坑概率极高。第一检查三集合之间的图片ID是否有交集。理想情况下一张图片只能出现在train、val、test中的一个集合里如果出现重叠说明划分脚本的随机采样逻辑有问题泄漏会被模型“记住”验证集效果虚高。第二检查图片与标签之间的对应关系。拿YOLO格式来说每张.jpg必须有一个同名.txt反之亦然。如果出现图片有标签文件但标签文件是空文件的情况或者标签文件存在但对应图片缺失训练时YOLO会直接报错或者静默跳过。第三检查YOLO格式标签中的坐标值是否都落在0~1区间内。有些转换脚本在归一化时会因为除零或者边界像素问题产生大于1或小于0的坐标值这类脏数据会导致训练损失飙升或边界框预测偏移。这三件事每件事都可以用一段简单的Python脚本快速核查。我就用第三件做个示范import os label_dir dataset/labels/yolo/train bad_files [] for txt_file in os.listdir(label_dir): path os.path.join(label_dir, txt_file) with open(path, r) as f: for line in f: parts line.strip().split() if len(parts) ! 5: bad_files.append((txt_file, col_count, len(parts))) continue try: vals list(map(float, parts)) except ValueError: bad_files.append((txt_file, non_float, line.strip())) continue if not all(0.0 v 1.0 for v in vals[1:]): bad_files.append((txt_file, out_of_range, str(vals))) if len(bad_files) 0: print(所有YOLO标签坐标均在0~1区间核查通过) else: for item in bad_files[:20]: print(异常文件:, item)这段代码会遍历指定目录下的所有txt标签文件检查每行是不是恰好5列、第2到第5列是不是合法的浮点数、数值是否在0到1之间。凡是检查不过的都记录下来。我负责任地告诉你我在这套数据集的YOLO标签中没查到一个越界坐标但以前用其他来源的数据集做过同样的检查曾经发现过一整批标签的宽度和高度写反的情况——那是转换脚本把x_center和y_center、width和height的顺序搞错了比边界越界更难排查。3.3 划分比例建议与样本不均衡问题数据集本身是单类别的不存在类别不均衡问题但“目标数量不均匀”是存在的——有些图片只有1个标注框有些图片有5个甚至更多。如果你直接按图片数量8:1:1来划分有可能出现一种隐蔽问题某个子集中包含大量“多目标图片”另一个子集以“单目标图片”为主导致不同集合的目标总数差异远大于图片数量差异。我的习惯是在跑划分脚本之前先统计每张图片的目标数量然后按目标数量做分层划分。比如把所有图片分成“1个目标”“2~3个目标”“4个以上目标”三个桶在每个桶内分别按8:1:1比例随机抽取这样能保证三个集合中的目标密度分布基本一致。虽然split_data.py默认的纯随机划分在样本量足够大时问题不大但对于只有几百上千张图片的自建数据集分层划分能避免很多验证集效果虚高或偏低的问题。4. 训练教程解析YOLOv8/v5配置修改、anchor与超参数调整4.1 data.yaml与模型配置文件修改压缩包里的train_tutorial目录是训练教程我按照里面的流程跑了一遍基本套路和通用YOLO训练流程一致。核心配置文件是data.yaml这是模型读取数据集的入口写下你训练的关键路径需要改的内容是这三处# data.yaml path: /your/absolute/path/yolo_oil_leak_dataset # 数据集的根目录 train: images/train # 训练集图片路径相对于path val: images/val # 验证集图片路径相对于path test: images/test # 测试集图片路径相对于path nc: 1 # 类别数量这里是单类别 names: 0: oil_leak # 类别名必须与训练时你期望的类名一致参数说明path必须是绝对路径而且不能带尾随空格train和val建议用相对路径写法配合绝对路径的根目录这样换机器跑的时候不用改子路径。很多人在这一步翻车的原因不是写错而是路径中带了中文或空格YOLO读取时偶尔会出莫名其妙的问题。我一般会直接把数据集放在纯英文路径下比如D:/datasets/oil_leak避免任何编码问题。模型配置文件看你的显卡显存。显存6G以下yolov5s.yaml或yolov8s.yaml是起步选择显存12G以上建议直接用yolov5m.yaml或yolov8m.yaml因为单类别检测任务比较简单大模型的收益主要体现在召回率上小模型速度快但边界框精度略差。我用的是yolov8s做基线测试单卡RTX 3060上训练速度可以接受。4.2 我把训练命令改了这几处教程里默认给的训练命令长这样python train.py --data data.yaml --weights yolov8s.pt --epochs 300 --batch-size 16 --img 640 --device 0我在复现过程中根据机油泄露这个任务的特点改了几个参数改完之后的命令是这样的python train.py --data data.yaml --weights yolov8s.pt --epochs 200 --batch-size 16 --img 640 --device 0 --patience 30 --cos-lr --close-mosaic 10改动逻辑说明--epochs 300我改成了--epochs 200因为从第一次跑的训练曲线看模型在120轮之后mAP基本收敛300轮属于浪费算力--patience 30的意思是连续30轮验证集指标不提升就提前结束训练给训练过程留了个“后悔药”机制。--close-mosaic 10是YOLOv8新增的参数意思是最后10轮关闭马赛克增强让模型在收尾阶段看到真实分布的数据避免因过度增强导致的精度下降。--cos-lr这个参数值得多说一句。默认的线性学习率衰减在训练后期衰减力度不够余弦退火可以在后期以更平滑的曲线把学习率降到更低对油渍这种边缘模糊的目标有一定帮助——因为这类目标在训练后期需要更精细的权重微调。4.3 训练过程监控loss曲线怎么看mAP如何解读训练跑起来之后终端每隔一段时间会输出一行训练指标关键要看这四个值box_loss、cls_loss、dfl_loss和mAP50-95。前三个是损失函数值总体趋势是下降的如果出现某个loss先降后升多半是学习率设置过大或者出现了梯度爆炸。第四个是综合指标机油泄露这种单类检测mAP50达到0.85以上就基本可用——注意这里我说的是“基本可用”工业场景还要看误报率。我习惯把训练输出的results.csv拿来做可视化分析方便看出什么问题。方法是在训练结束后运行tensorboard --logdir runs/detect/train4.4 推理验证把训练好的模型跑一遍测试集训练结束后模型权重文件会保存在runs/detect/train/weights/best.pt。best.pt是验证集上指标最优的那个权重而不是最后一轮的权重这是YOLO系列一直保留的好习惯但初学者很容易用错——有人直接拿last.pt去推理效果可能比best.pt差两到三个百分点。推理命令非常简单python detect.py --weights runs/detect/train/weights/best.pt --source dataset/images/test --conf 0.25 --save-txt --save-conf--conf 0.25是置信度阈值低于这个值的预测结果会被过滤掉。机油泄露场景我建议不要设太高——油渍本身边界模糊置信度普遍偏低设0.25比较合适。如果误检太多再往上调到0.3或0.35。推理输出里带着--save-txt参数时每张图片对应的检测结果会写到runs/detect/exp/labels/目录下格式和YOLO标签格式一样。我每次都会抽几张图对比检测输出的txt和真实标签的txt确认框的位置是否对得上。这个操作虽然土但能发现一些模型实际上学偏了的问题。5. 避坑指南标签格式、训练异常与服务端部署的四个高频坑5.1 坑一YOLO格式标签全部为空现象把数据集下好、改好配置路径一启动训练就报No labels found in ...或者训练正常跑但loss一直不降val指标全部为零。原因某些图片对应的txt标签文件存在但内容是空的或者txt文件编码不是UTF-8YOLO读取时直接跳过。我检查过这套数据集本身没有这个问题但如果之后你自己采集数据、用LabelImg或者Roboflow导出导出流程有概率产生空标签文件。解决写一个全量检查脚本遍历标签目录找出字节数小于等于10的txt文件单独列出来看是空文件还是只有一个换行符。办法有两个——删除对应图片或者人工重新标注。我一般用find . -name *.txt -size -10c在Linux上快速定位。这里只针对这个数据集的使用来提醒它的标签本身是完整的。5.2 坑二类别ID与classes.txt不一致现象训练能跑通但推理时输出的类别名是错的比如把油渍识别成了“背景”或“污染”或者模型能框出目标但评估时mAP非常低。原因数据集的data.yaml里names顺序和标签文件里的class_id对应不上。VOC转YOLO时class_id是按classes.txt里类名出现的顺序分配的如果你后来重新排过classes.txt但标签文件没同步更新就会出现错位。解决我每次拿到新数据集都先跑一个反查脚本取出标签中class_id0的十张对应图片把图片打开看一眼确认标注框确实框在油渍上再确认data.yaml里names: 0: oil_leak。这套流程只要做一次就能避免后面所有莫名其妙的问题。5.3 坑三训练时爆显存OOM现象torch.cuda.OutOfMemoryError程序崩溃退出。原因不止一个batch-size设太大、--img 640输入的尺寸在你显存余量不够时都是最常见的直接原因。另外--workers设太高会导致数据加载线程占用的内存过多也可能触发OOM尤其是在Windows上。解决优先把batch-size从16降到8如果还爆就降到4。降batch-size是影响最小的手段比降低输入分辨率对精度的影响小得多。其次--workers改成2Windows上数据加载的坑大家心里有数num_workers经常名存实亡设成2完全够用。5.4 坑四推理速度达不到实时要求现象模型在测试集上指标不错但换到实际推理环境用服务端CPU推理或者边缘设备推理速度只有几百毫秒一帧远达不到预期。原因很多人训练时用的best.pt是全精度Float32权重推理代码又没做任何加速处理模型跑在CPU上自然极慢。解决在项目环境里我用两种方法处理。第一种是把模型转成TensorRT的engine格式推理速度可以达到原来的三到五倍。TensorRT需要用到NVIDIA的显卡和CUDA环境你需要在自己的服务端配置好第二种是如果不方便用TensorRT至少把权重转成FP16半精度再推理做法是在YOLOv8里调用model.half()速度提升也很明显代码改动只有一行。6. 进阶验证玩法用可视化脚本确认标签质量迁移到自己的产线数据数据集本身不是终点验证数据质量才是。我每次训练前都会做一次“可视化核对”做法是把图片和对应的标注框画在一起肉眼逐张扫一遍。这个方法笨但有效撕开了很多数据集的“遮羞布”。下面这段代码可以把YOLO格式的标注画回图片上import cv2 import os img_dir dataset/images/train label_dir dataset/labels/yolo/train out_dir visual_check os.makedirs(out_dir, exist_okTrue) for img_name in os.listdir(img_dir)[:50]: img_path os.path.join(img_dir, img_name) txt_path os.path.join(label_dir, img_name.replace(.jpg, .txt)) img cv2.imread(img_path) h, w img.shape[:2] with open(txt_path, r) as f: for line in f: _, xc, yc, bw, bh map(float, line.strip().split()) x1 int((xc - bw / 2) * w) y1 int((yc - bh / 2) * h) x2 int((xc bw / 2) * w) y2 int((yc bh / 2) * h) cv2.rectangle(img, (x1, y1), (x2, y2), (0, 0, 255), 2) cv2.imwrite(os.path.join(out_dir, img_name), img) print(f已生成 {img_name} 的可视化标注图)这段代码的逻辑是读取图片尺寸把YOLO归一化坐标乘以图片宽高还原成像素坐标然后用OpenCV画红色矩形框。跑完之后打开visual_check目录如果矩形框准确贴合油渍边缘说明标注质量可靠如果框过大、过小或者明显偏移说明标签存在系统性偏差这时候直接拿去训练就是在拿垃圾数据训练模型。关于迁移到自己的产线数据我的经验是先用这套数据集训练一个基线模型然后去现场拍200~300张自己场景的图片用训练好的模型做“伪标注”人工修正后再把这批数据加入训练集重新微调。这种做法在工业视觉里叫“半监督自训练”用的就是公开数据集先学共性、用自己的数据学个性的思路。机油泄露场景的材质、光照、相机角度差异很大如果你换了一个厂区务必做这个迁移步骤否则直接部署大概率翻车。从那以后我每次拿到一个新的工业检测数据集都强制自己先跑一遍可视化核对脚本再谈训练——这个习惯救过我太多次了。希望帮到你也盼着你在自己的场景里跑出好结果。本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询