尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

YOLO工业油污缺陷检测数据集详解:格式转换与训练避坑指南

发布时间:2026/9/28 20:26:08

资讯中心
01
ARTICLE

YOLO工业油污缺陷检测数据集详解:格式转换与训练避坑指南

YOLO工业油污缺陷检测数据集详解:格式转换与训练避坑指南
简介面向制造业质检与工业视觉场景这份YOLO工业油污缺陷检测数据集包含约10000张真实拍摄的高质量图片标注框精确可直接用于YOLO系列目标检测模型训练。压缩包共2000个文件以1985个xml标注文件为主同时包含HTML环境搭建与训练教程、Python划分脚本等辅助内容整体大小约797.79MB。资源提供voc、coco、yolo三种格式标注适配常见目标检测工具链。已有286人浏览学习适合正在做工业缺陷检测项目或课程设计的学生与工程师。除数据本身外还附赠Linux与Windows双版本YOLO环境搭建教程和基于案例的训练教程以及灵活划分训练集、验证集、测试集的Python脚本帮助读者从数据准备到模型训练完整走通流程。1. YOLO工业油污缺陷检测数据集10000张真实场景图的直接可用性做工业视觉的人最烦的不是模型不好而是数据源头不干净。网上能找到的油污缺陷图要么是实验室摆拍要么背景干净得不像产线训出来的模型一上机就翻车。YOLO工业油污缺陷检测数据集这套资源给的是10000张真实场景图片labelimg产出标注框还按文件夹把VOC、COCO、YOLO三种格式标签分开存放。下载后不需要自己写转换脚本划分脚本和训练教程也打包在里面直接喂给YOLOv5或YOLOv8就能开训。适合刚入坑缺陷检测的工程师、做毕业设计的学生以及想快速验证算法方案的项目组。下面从标签格式、划分脚本到训练排错逐个讲清楚。2. 三种标注格式的底账VOC、COCO、YOLO标签怎么对应同一个框油污缺陷检测这种工业场景标注数据往往要传给不同框架用。老项目用VOC的xml新项目要COCO的json而YOLO系列要的是归一化txt。这份数据集把三种都放了前提是你得知道它们各自存的什么、怎么对应否则模型训练时读错标签指标再好看也是假的。2.1 目录结构与标注字段先从三个文件夹看懂数据解压后先看顶层的目录划分不要急着开训。常见结构是图片放在JPEGImages或images下三种标签各占一个文件夹分别叫Annotations、annotations、labels。下面是一个典型排布不同版本略有出入但逻辑一致。层级文件夹内容说明图片images/全部jpg/png原图文件名带编号VOC标签Annotations/每个xml对应一张图记录object的name和bndboxCOCO标签annotations/一个或按训练/验证拆分的json文件YOLO标签labels/每张图对应一个txt内容是归一化坐标打开一个xml核心结构长这样object下面有name和bndboxbndbox里是xmin、ymin、xmax、ymax四个像素坐标值。这就是VOC格式的全部家当。标注软件生成的xml里还可能带difficult字段训练时如果不想算难例读取时直接跳过。COCO的json则是把categories、images、annotations三大块塞在一个文件里。每张图的宽高存在images里每个标注对象在annotations里用bbox字段写[x, y, width, height]注意这是左上角坐标加宽高不是VOC的右下角坐标。YOLO格式的txt最简洁每行一个目标五个数类别id、归一化中心x、归一化中心y、归一化宽、归一化高。类别id从0开始顺序和训练配置里的names列表必须一一对应这里一旦错位模型会学得稀里糊涂。2.2 XML、JSON、TXT互相转换一张图怎么对应三份标签三份标注描述的是同一个真实框只是坐标系和存储结构不同。VOC转YOLO是最常见的需求因为很多老标注数据只有xml而YOLO训练只认txt。转换前先拿一张图的xml核对图片尺寸我一般会用下面这段脚本单独测试。import os import xml.etree.ElementTree as ET xml_path Annotations/000001.xml img_w 1920 img_h 1080 classes [oil_stain] tree ET.parse(xml_path) root tree.getroot() for obj in root.iter(object): name obj.find(name).text cls_id classes.index(name) bndbox obj.find(bndbox) xmin int(bndbox.find(xmin).text) ymin int(bndbox.find(ymin).text) xmax int(bndbox.find(xmax).text) ymax int(bndbox.find(ymax).text) x_center (xmin xmax) / 2.0 / img_w y_center (ymin ymax) / 2.0 / img_h w (xmax - xmin) / img_w h (ymax - ymin) / img_h print(f{cls_id} {x_center:.6f} {y_center:.6f} {w:.6f} {h:.6f})这段脚本的关键点在于像素坐标转归一化时x_center和w都必须除以图片宽度y_center和h必须除以图片高度。很多新手把宽高除反了框在训练时全部偏离位置训练过程loss正常但mAP始终起不来。另外classes列表里的顺序必须和后续data.yaml里的names一致油污这个场景如果只有一类写起来简单但多类别时顺序错一个整份txt就废了。COCO格式相对麻烦它需要先遍历所有图片构建images数组再收集标注构建annotations数组最后把categories单独列出来。从VOC转COCO的脚本比txt多几十行核心在于bbox的格式是[xmin, ymin, width, height]用width xmax - xmin计算如果直接从xml里把xmax抄进去检测框会明显偏大这是转coco时最常见的翻车点。3. 用自带的划分脚本拆数据三种脚本各自管什么数据集到手后第一件事不是开训而是划分训练集、验证集、测试集。这套资源自带了三个Python脚本拿到手容易懵不知道跑哪个。先看清楚区别再动手能少走很多弯路。3.1 三个Python脚本的分工与适用场景第一个是「训练集、验证集、测试集划分脚本」把数据拆成三份并写入新文件夹适合需要独立测试集做最终评估的场景。第二个是「训练集、验证集划分脚本」只拆两份适合数据集量不大、所有样本都要参与训练的快速验证。第三个是split_train_val生成ImageSets下txt文件划分脚本不移动文件只生成VOC风格的train.txt、val.txt文件列表适合训练脚本通过txt列表读数据的YOLOv5老版本。脚本输出物适用场景三份划分脚本train/、val/、test/三个新目录需要留独立测试集做最终验证两份划分脚本train/、val/两个新目录快速验证、数据量小ImageSets脚本train.txt、val.txt框架要求读txt列表三个脚本本质都是读取图片和标签列表然后按比例随机打乱再落到新目录。区别只在于输出物是文件夹还是txt。我一般建议先跑三份划分测试集永远不要参与调参否则最后的mAP数字没有说服力。3.2 跑通划分流程并验证结果脚本顶部通常有train_ratio、val_ratio、test_ratio三个比例变量加起来等于1.0。按8:1:1适合万级数据量如果只想快速试跑改成0.8:0.1:0.1先跑通流程。不同脚本的写法可能有出入有的直接用input接收比例有的在代码里硬编码打开看一眼再改。cd 数据集根目录 python 训练集、验证集、测试集划分脚本图片标签划分写入新文件夹.py跑完检查两个点第一train、val、test三个目录下是否同时存在图片和对应标签子目录第二抽查图片和标签文件名是否一一对应。这里最容易出的问题是只复制了图片没复制标签或者标签文件名和图片名前缀不一致后面训练时data loader报找不到标签文件白折腾一晚上。import os train_img_dir train/images train_lab_dir train/labels img_files os.listdir(train_img_dir) lab_files os.listdir(train_lab_dir) missing [] for f in img_files: stem os.path.splitext(f)[0] lab_path os.path.join(train_lab_dir, stem .txt) if not os.path.exists(lab_path): missing.append(f) print(缺少标签的图片数:, len(missing)) if missing: print(missing[:5])这段校验脚本没有复杂逻辑就是遍历图片名去找同名txt。如果发现缺得很多大概率是划分脚本的标签路径写错了别急着改数据回去看脚本里定义的labels目录名和实际是否一致。文件名大小写、扩展名是.txt还是.TXT在Windows上没问题换到Linux就敏感统一用小写最省心。4. 环境搭建与训练跑通Windows与Linux两条路的配置要点资源包里附带了两套HTML教程一套是Windows环境搭建一套是Linux版本还各有对应的训练教程。环境这东西按教程走大部分顺利但版本对齐和路径问题是高频翻车点。4.1 Windows侧从Python版本到torch安装Windows上训练YOLO优先用Python 3.8到3.10这个区间太新的Python版本会踩torch预编译包不匹配的坑。CUDA建议先装11.8或12.1的正式版别追最新的XX.2小版本很多第三方库的预编译包还没跟上。安装torch时用官方镜像地址国内网络环境下加清华源速度会快很多。pip install torch2.0.1 torchvision0.15.1 --index-url https://download.pytorch.org/whl/cu118装完务必验证CUDA是否真的可用这一步很多人跳过结果训练时一直用CPU死磕慢出天际。import torch print(torch.__version__) print(torch.cuda.is_available()) print(torch.cuda.get_device_name(0))cuda.is_available()返回True才算环境通过。如果返回False优先检查驱动版本nvidia-smi能看到的驱动版本和CUDA版本不匹配是常见原因。另外在Windows上训练时pip install pycocotools经常编译失败直接装预编译版pycocotools-windows能省很多事。4.2 Linux侧data.yaml怎么改成自己的数据集Linux下流程和Windows基本一致多了一个坑路径权限。项目文件如果放在root用户目录下训练脚本用普通用户跑会报PermissionError。先chmod -R 755把数据目录放开再进入项目目录。环境搭好后把data.yaml按下面的模板改。path: /data/yolo_oil # 数据集根目录写绝对路径 train: train/images val: val/images test: test/images nc: 1 names: [oil_stain]注意几个细节。train和val写的是相对path的相对路径不要在前面加斜杠。nc必须和names的数量一致类别顺序决定了txt里的id映射到哪个名字。如果你的数据集里有多类缺陷names列表的顺序一定要和txt里类别id的数字对应而不是按你喜欢的顺序排。如果用的是YOLOv5老版本训练命令会读train.txt和val.txt这时把ImageSets脚本生成的txt文件路径填进data.yaml并把path指向包含两个txt文件的目录。YOLOv8读目录更省事直接给图片目录就行。4.3 避坑油污缺陷训练里的五条血泪记录这里写几条我实际踩过的坑按现象、原因、解决一条条说清楚。现象一训练loss直接飙到NaN。原因大概率是学习率太大或者标签里有坐标越界。解决先把--lr降到0.001以下再检查txt里的x_center、w是否出现负数或大于1的值用脚本批量刷一遍。现象二验证集mAP为0但训练loss正常。原因一般是data.yaml的names顺序和txt里的类别id不一致或者验证集里没有对应类别的真实框。解决随机挑一张验证集图片和它的txt人肉对照框的位置再看val目录里是否真有图片被复制进去。现象三batch size设16就OOM。油污图分辨率普遍偏高动不动1920×1080imgsz640时显存消耗不小。解决先降到batch 8试跑或者imgsz降到512。油污目标本身不算极小512也能检出。现象四数据集里含一堆背景干净的图模型学到的是背景规律。油污缺陷检测的数据不平衡经常有这种情况。解决用train_list.txt统计每个类别的目标框数量把多数类降采样或者对缺陷少的图做增强别直接拿原比例开训。现象五用了预训练权重但mAP还是低。预训练模型是在COCO上训的默认输出80个类别。换到单类油污数据集时要确保模型头部的nc改成了1否则匹配紊乱。解决训练命令里显式指定--nc 1或者在模型yaml文件里把nc字段改掉。一条额外的经验工业场景下清洗数据比调参更值得花时间。10000张图先跑一遍简单的亮度过滤统计把过曝和纯黑帧剔除模型收敛速度和稳定性都会有明显提升。5. 训练完的验证闭环mAP之外还要看什么训练结束一切正常很多人直接看mAP五十几就觉得完事了但工业缺陷检测误检比漏检更要命。油污和阴影、锈斑在视觉上高度相似mAP再高落到产线上频繁误报依然没法交付。5.1 用val命令和混淆矩阵定位误检来源训练完先跑一次正式验证带着plots参数把混淆矩阵和图都生成出来。python val.py --data data.yaml --weights runs/train/exp/weights/best.pt --plots重点看混淆矩阵里的背景类别那一行。如果很多负样本被判成背景说明漏检集中在低对比度区域如果背景行里混进不少oil_stain的预测那就是误检信号。油污场景里误检目标往往集中在反光区域看一下错误预测对应的原图基本能确认是哪类干扰。再把conf阈值拉高0.05到0.3左右重跑一遍val对比mAP变化。如果mAP掉得不多但误检少了很多说明模型对油污的置信度分布是健康的如果mAP直接腰斩说明模型本身就是靠低置信度框在撑指标这种模型不能上线。5.2 拿未参与训练的产线截图实测一轮val指标合格后从产线拍新图再detect一轮这是最扎实的闭环验证。python detect.py --weights runs/train/exp/weights/best.pt --source test/ --conf 0.3 --save-txt看三个点第一conf 0.3下有没有大量漏框第二标注框有没有明显偏大或偏小的系统性偏差第三保存的txt里有没有孤立的、重叠的乱框。工业模型最怕系统性偏差如果框普遍偏大在后处理里缩一圈比重新调参快得多。一套完整的验证下来mAP只算一道门槛误检率和框的几何质量才是上线决策的依据。我以前做过一个金属表面检测项目mAP刷到62想都没想就上机结果误检框把产线工人烦得不行。从那以后我每次训练完都强制走一遍混淆矩阵加产线实拍验证先看误检再看mAP顺序反了就是白干。这套流程对油污数据集同样适用拿到资源后建议也按这个顺序跑一遍希望帮到你。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。