110玻璃脏污目标检测数据集:YOLO标注格式解析与工业质检训练实战

发布时间:2026/10/11 8:50:07
110玻璃脏污目标检测数据集:YOLO标注格式解析与工业质检训练实战 简介这份110玻璃脏污目标检测数据集面向工业自动化、智能环境监测及计算机视觉方向的研究者与开发者用于训练识别玻璃表面脏污与污渍的检测模型可服务于生产线清洁自动化、安防监控与表面缺陷识别等场景。资源包共1022个文件包含510张jpg实景图片、510个对应的YOLO格式txt标注文件以及1个yaml配置和1份docx说明文档压缩包约29.64MB训练集452张、验证集58张统一标注为110GlassDirty单一类别边界框定位准确可直接接入YOLO系列等主流框架。目前已有242人学习下载。数据集规模适中覆盖多样真实玻璃脏污情况能帮助读者快速验证算法、降低采集与标注成本适合作为工业缺陷检测项目的训练与迭代基础。1. 110玻璃脏污目标检测数据集工业质检场景下的现成训练弹药产线上玻璃盖板、光伏玻璃、显示面板在镀膜、清洗、搬运环节很容易沾上脏污划痕、指纹、灰尘、水渍这些缺陷一旦漏检下游装配就是批量返工。很多做工业质检的团队卡在第一步算法框架选好了模型结构也搭完了手里却没有一批标注规范、类别对齐、能直接喂给 YOLO 的玻璃脏污图像。这份「110玻璃脏污目标检测数据集」解决的就是这个前置问题——它把玻璃表面脏污这一类工业缺陷整理成目标检测可直接消费的标注格式省掉从零采集、清洗、标注、校验的整条链路。适合三类人正在做玻璃/面板/光伏质检落地的算法工程师、需要快速验证检测方案可行性的项目负责人、以及拿工业数据集练手目标检测的学生和转行者。它不解决模型调优但能让你把精力从「找数据」挪到「调模型」上。2. 数据集结构与 YOLO 标注格式先看懂再动手拿到一个目标检测数据集最忌讳的就是解压完直接train.py一把梭。玻璃脏污这类工业缺陷有个特点缺陷面积小、对比度低、边界模糊标注框稍微偏一点训练出来的模型定位就飘。所以第一步必须把目录结构、标注格式、类别定义这三件事看明白否则后面 loss 不降你都不知道是数据问题还是模型问题。2.1 目录组织与文件构成工业数据集常见的组织方式有两种一种是 COCO 风格的annotations/*.json集中标注一种是 YOLO 风格的「一图一 txt」平铺标注。玻璃脏污检测这类任务因为要频繁做数据增强和类别平衡YOLO 风格更常见也更好排查单张图的问题。典型结构大致是这样glass_defect_dataset/ ├── images/ │ ├── train/ # 训练集图像 │ │ ├── 0001.jpg │ │ └── ... │ └── val/ # 验证集图像 ├── labels/ │ ├── train/ # 训练集标注与 images/train 同名 │ │ ├── 0001.txt │ │ └── ... │ └── val/ └── data.yaml # 数据集配置文件这里有个血泪经验images和labels必须严格同名同层级0001.jpg对应0001.txt。我见过太多人因为文件名里多了个空格、或者大小写不一致.JPGvs.jpg导致训练时大量标注被静默丢弃模型学了个寂寞。解压后先跑一遍文件名比对别嫌麻烦。2.2 YOLO 标注格式逐字段拆解YOLO 的 txt 标注每行代表一个目标格式是class_id x_center y_center width height五个字段全部是归一化到 0~1 的浮点数不是像素值。这一点是新手翻车重灾区——直接把标注工具导出的像素坐标塞进去训练时框全跑到图像外面去了。具体含义字段含义取值范围常见错误class_id类别索引从 0 开始整数与 data.yaml 的 names 顺序不一致x_center框中心 x / 图像宽0~1误填像素坐标y_center框中心 y / 图像高0~1误填像素坐标width框宽 / 图像宽0~1误填像素宽height框高 / 图像高0~1误填像素高一行一个目标一张图有多个脏污就写多行。如果某张图确认无缺陷负样本txt 文件留空即可但文件本身要存在否则 YOLO 会报找不到标签。2.3 data.yaml 配置与类别对齐data.yaml是 YOLO 训练的入口配置路径和类别名都在这里定义# 数据集根路径建议用绝对路径避免相对路径踩坑 path: /data/glass_defect_dataset train: images/train val: images/val # 类别数量与名称顺序必须与标注里的 class_id 对应 nc: 1 names: 0: stain # 玻璃脏污若有多类按 0/1/2 顺序排参数说明path是数据集根目录train/val是相对path的子路径nc是类别数玻璃脏污如果只做「有脏污/无脏污」二分类检测nc就是 1names的键必须从 0 连续编号中间不能跳号。改完 yaml 后用下面这段脚本快速校验标注合法性能提前揪出越界框和类别越界import os import yaml def check_labels(yaml_path): with open(yaml_path, r, encodingutf-8) as f: cfg yaml.safe_load(f) nc cfg[nc] root cfg[path] for split in [train, val]: label_dir os.path.join(root, cfg[split].replace(images, labels)) bad 0 for name in os.listdir(label_dir): if not name.endswith(.txt): continue with open(os.path.join(label_dir, name)) as lf: for line_no, line in enumerate(lf, 1): parts line.strip().split() if len(parts) ! 5: print(f{name}:{line_no} 字段数异常); bad 1; continue cid int(parts[0]) vals [float(v) for v in parts[1:]] # 类别越界或坐标越界都算非法 if cid 0 or cid nc or any(v 0 or v 1 for v in vals): print(f{name}:{line_no} 越界 {line}); bad 1 print(f{split} 检查完成异常 {bad} 处) check_labels(data.yaml)这段脚本做三件事读 yaml 拿到类别数和路径、遍历 train/val 的每个 txt、逐行检查字段数、类别索引和坐标范围。逻辑说明——字段数不等于 5 说明标注被截断或格式错乱类别索引超出nc说明类别没对齐坐标超出 0~1 说明归一化没做或做错了。跑完没有异常输出才说明这份数据可以进训练流程。3. 用 YOLO 跑通玻璃脏污检测从环境到首轮训练数据看懂了接下来就是把它真正跑起来。玻璃脏污检测和通用目标检测最大的区别在于缺陷目标小、背景纹理单一、正负样本极度不均衡。这决定了训练配置不能照搬 COCO 那套默认参数否则要么模型学不到小目标要么被大量背景带偏。这一章按「环境 → 训练 → 评估」的顺序走一遍参数怎么设、为什么这么设都讲清楚。3.1 环境准备与依赖安装YOLO 系列目前主流用 Ultralytics 的实现装起来不复杂但版本要对齐否则 API 会变。常见做法是建独立虚拟环境避免和系统里的 torch 打架# 建虚拟环境Python 3.8~3.10 兼容性最好 python -m venv venv_glass source venv_glass/bin/activate # Windows 用 venv_glass\Scripts\activate # 装 ultralytics会自动带 torch 依赖 pip install ultralytics # 验证安装与 GPU 可用性 python -c import torch; print(torch.__version__, torch.cuda.is_available())参数说明torch.cuda.is_available()返回True才说明 GPU 能被调用返回False要么是没装 CUDA 版 torch要么是驱动版本不匹配。工业质检训练动辄几百上千轮纯 CPU 跑会慢到怀疑人生建议至少一张 8G 显存的卡。如果显存紧张后面训练时把batch调小即可。3.2 训练命令与关键参数环境就绪后一条命令启动训练。玻璃脏污这类小目标缺陷输入分辨率不能太低否则脏污在特征图上就剩几个像素yolo detect train \ datadata.yaml \ modelyolov8s.pt \ epochs200 \ imgsz640 \ batch16 \ lr00.01 \ patience30 \ projectruns/glass \ nameexp1逐参数说明data指向前面配好的 yamlmodel用预训练权重做迁移学习玻璃脏污样本量通常不大从头训容易过拟合yolov8s是速度和精度的折中显存够可以换yolov8mepochs200是上限配合patience30做早停——30 轮验证指标不涨就停省时间imgsz640是输入尺寸脏污特别小的场景可以提到 960 或 1280但显存占用会明显上升batch16按显存调爆显存就降到 8 或 4lr00.01是初始学习率迁移学习场景这个值比较稳太大容易震荡。训练过程中重点盯两个指标box_loss和mAP50。box_loss持续下降说明定位在收敛mAP50是 IoU 阈值 0.5 下的平均精度玻璃脏污检测里这个值能到 0.7 以上就算可用。如果box_loss降但mAP50不涨大概率是标注框质量差或者类别定义混乱回头查第 2 章的校验脚本。3.3 推理验证与结果查看训练完在验证集上跑推理确认模型不是只记住了训练集# 在验证集上评估输出 mAP、precision、recall yolo detect val modelruns/glass/exp1/weights/best.pt datadata.yaml # 对单张图或整个目录做推理保存可视化结果 yolo detect predict \ modelruns/glass/exp1/weights/best.pt \ sourceimages/val \ conf0.25 \ saveTrue参数说明conf0.25是置信度阈值低于这个值的检测框被丢弃。工业质检里这个值要按漏检和误检的代价来调——漏检代价高就调低比如 0.15误检代价高就调高比如 0.4。saveTrue会把带框的结果图存到runs/detect/predict下肉眼过一遍能发现很多指标看不出的问题比如框偏、重复框、把反光当脏污。这一步别省指标好看但可视化一塌糊涂的情况太常见了。4. 玻璃脏污检测的避坑与排查那些指标不告诉你的问题跑通训练只是及格线真正落地时坑都在细节里。玻璃这种高反光、低对比度的材质脏污检测有几个特有的翻车点指标上不一定看得出来但上线就暴露。下面这几条是我在实际项目里踩过的按「现象 → 原因 → 解决」整理照着排查能省不少时间。4.1 反光被当成脏污误检率居高不下现象模型在验证集 mAP 不错但实际产线图像上大量反光区域被框成脏污误检率远超预期。原因训练集里的光照条件和产线不一致模型把「高亮区域」这个特征和脏污关联起来了本质是数据分布偏移。解决采集一批产线真实光照下的图像补充进训练集尤其是反光强烈的样本训练时开启随机亮度、对比度增强YOLO 默认的 HSV 增强里hsv_v控制亮度扰动让模型对光照变化更鲁棒推理阶段如果反光位置固定可以在预处理里做 ROI 裁剪把已知反光区排除掉。4.2 小脏污漏检mAP 虚高现象整体 mAP50 有 0.8但小面积脏污几个像素几乎全漏大脏污检测正常。原因小目标在 640 分辨率下经过多次下采样后特征几乎消失而 mAP 是所有目标平均大目标拉高了均值掩盖了小目标的差。解决提高输入分辨率到 960 或 1280在数据增强里减少缩放类增强的强度避免小目标被进一步缩小评估时单独统计小目标的 recall别只看整体 mAP。如果显存扛不住高分辨率可以试试切图推理把大图切成小块分别检测再合并。4.3 类别不均衡导致模型偏向背景现象训练 loss 正常下降但模型几乎不输出检测框或者只对某一类脏污敏感。原因玻璃图像里脏污占比极低背景像素远多于缺陷像素模型学会了「全预测背景」这个偷懒策略。解决在 yaml 里确认负样本无缺陷图比例不要过高一般控制在 10%~20%训练时用cls损失权重或者 focal loss 思路缓解数据增强里对含缺陷的图做过采样。YOLO 本身没有直接的类别平衡参数主要靠数据层面调。4.4 标注框过松或过紧现象模型能检出脏污但框明显比实际脏污大一圈或小一圈IoU 上不去。原因标注时不同人对脏污边界的判断不一致玻璃脏污边界本来就模糊标注标准没统一。解决制定明确的标注规范比如「框住脏污可见区域外扩 2 像素」多人标注时做交叉校验算标注一致性训练前用第 2 章的脚本抽查一批框可视化叠加到原图上肉眼确认。标注质量是检测上限模型再强也救不了烂标注。4.5 验证集和训练集同源指标虚高现象验证集 mAP 很高换一批新图就崩。原因train/val 划分时没有按采集批次、光照条件、产品型号分层验证集和训练集高度相似等于在考自己做过的题。解决划分时按批次或时间段切分让验证集覆盖训练集没见过的条件如果数据来自多个产线按产线划分更能反映泛化能力。这一步在数据准备阶段就要做训练完再发现就晚了。5. 进阶技巧把玻璃脏污检测从「能跑」推到「能用」前面把流程跑通了但工业质检的验收标准从来不是「能跑」而是「稳定可用」。这一章讲几个把模型从 demo 推到产线的具体技巧都是能直接落地的操作不是泛泛而谈。第一个技巧是用切片推理SAHI处理高分辨率产线图。产线相机动辄 2000 万像素直接缩到 640 训练会丢小目标但全分辨率训练显存又扛不住。常见做法是训练时用 640 或 960推理时把大图切成带重叠的小块分别检测再合并。重叠区域设成切片尺寸的 20% 左右避免脏污正好落在切缝上被切两半。合并时用 NMS 去重IoU 阈值设 0.5 左右。这套流程对小脏污的召回提升很明显代价是推理耗时增加产线节拍紧的话要权衡。第二个技巧是用置信度分层做人工复核。产线不可能全自动合理的方式是模型先筛一遍高置信度比如 0.7直接判缺陷低置信度0.25~0.7送人工复核低于 0.25 的丢弃。这样既控制了漏检又把人工量压到最低。具体阈值要靠产线数据统计确定画一条置信度-准确率曲线找到准确率骤降的拐点作为分界。第三个技巧是建立持续迭代的数据闭环。模型上线后把人工复核确认的误检和漏检样本定期回收重新标注后加入训练集每隔一段时间重训一版。玻璃脏污的形态会随工艺、原料、环境变化一次训练管一辈子的模型不存在。我一般会留一个hard_samples目录专门存这些难例重训时按比例混入。验证模型是否真的可用别只看 mAP。我习惯做三件事一是拿一批完全没参与训练的产线新图跑推理统计漏检率和误检率二是把模型输出和人工标注做逐图对比看框的位置偏差分布三是模拟产线节拍测推理耗时确认单张图处理时间满足产线要求。这三项都过了才敢说这个模型能用。从那以后我每次拿到新的工业数据集都会先跑一遍标注校验脚本、再可视化抽查一批框、最后才进训练这三步强制走一遍能挡掉八成后期返工。希望这份玻璃脏污数据集和上面的流程能帮你把质检模型更快推到能用。本文还有配套的精品资源点击获取