瓷砖瑕疵检测数据集:VOC+YOLO双标注格式与模型训练实战

发布时间:2026/8/31 17:38:43
瓷砖瑕疵检测数据集:VOC+YOLO双标注格式与模型训练实战 简介本资源是面向工业视觉检测领域研究者与算法工程师的瓷砖瑕疵检测专用数据集聚焦制造业质量控制中的自动缺陷识别需求特别适配YOLO系列目标检测模型训练与VOC格式工具链开发。压缩包共2000个文件全部为PASCAL VOC标准XML标注文件含瑕疵类别、精确边界框及图像元信息总大小4.35MB结构简洁紧凑可直接用于数据加载、格式转换与模型训练流程。已有785人下载学习表明其在实际产线AI质检项目中具备较高参考价值。用户可直接获取完整标注体系覆盖多种典型瓷砖瑕疵类型结合XML中丰富的坐标与类别字段便于快速构建YOLO训练标签、开展数据增强实验或迁移至其他检测框架文件命名规范含时间戳与摄像头编号利于溯源与多视角分析显著降低数据预处理门槛。1. 这个数据集解决什么问题从产线质检场景说起做瓷砖质检的朋友应该都有体感产线上每小时过去几千片砖工人拿眼睛盯盯到后来视觉疲劳漏检率就上去了。尤其是裂纹、针孔这类小瑕疵在高速运转的产线上特别容易被忽略。瓷砖本身又是高密度的工业品一片砖上几百个像素级的瑕疵靠人眼根本不现实。这就是为什么这几年瓷砖瑕疵检测成了工业视觉里最典型的落地场景之一——目标明确、缺陷类型相对固定、产线环境可控非常适合用目标检测模型来啃。这个瓷砖瑕疵检测数据集VOCYOLO标注.zip解决的就是数据从哪来的问题。很多想跑通瓷砖检测的人卡在第一步没有数据。自己去产线拍需要搭光源、装相机、做软件采集一个月起步网上找开源数据集要么是国外陶土砖的跟国内瓷抛砖、釉面砖的表面特性对不上要么是标注格式乱七八糟还得花大量时间清洗。这个压缩包把最常见的两套标注格式都给你备好了——Pascal VOC和YOLO解压就能用无论是想跑YOLOv8、YOLOv5还是Faster R-CNN、SSD都能直接对接。说白了这个数据集的价值不在于多稀有而在于省事。它把从图片采集、缺陷归类、边界框标定到格式转换这些脏活累活都替你做了。对刚入门目标检测的开发者来说它是很好的练手素材对要做产线验证的工程师来说它可以是算法选型阶段的公共基准对研究陶瓷表面缺陷识别的人来说它又是一份可以直接做实验的基础数据。一句话凡是打算在瓷砖质检方向跑模型的人这份数据都能让你少走至少两周弯路。2. 数据集内部拆解VOC与YOLO两套标注的差异拿到压缩包第一件事不是解压就跑训练而是先搞明白里面两个文件夹各自是什么逻辑。VOC和YOLO这两套格式本质上描述的是同一个东西——图片里哪里有缺陷、缺陷是什么类型——但组织方式完全不同理解这个差异是后面所有操作的前提。2.1 VOC格式的目录结构与XML标注VOCPascal VOC格式是计算机视觉领域最经典的标注格式之一它把数据集组织成这样的结构dataset/ ├── JPEGImages/ # 存放所有原始图片 ├── Annotations/ # 每张图片对应一个XML标注文件 └── ImageSets/ └── Main/ ├── train.txt # 训练集图片文件名列表 └── val.txt # 验证集图片文件名列表JPEGImages里面是JPG或PNG格式的原始图片文件名通常是一串编号比如tile_000123.jpg。Annotations里面是和图片一一对应的XML文件文件名与图片名保持一致。这个对应关系是关键——脚本读取的时候就是靠文件名把图片和标注关联起来的。打开一个XML文件你会看到类似这样的内容annotation folderJPEGImages/folder filenametile_000123.jpg/filename size width640/width height640/height depth3/depth /size object namecrack/name poseUnspecified/pose truncated0/truncated difficult0/difficult bndbox xmin120/xmin ymin163/ymin xmax286/xmax ymax249/ymax /bndbox /object /annotation每个object节点对应一个缺陷实例。name是缺陷类别bndbox是这个缺陷在图片上的像素坐标框。注意VOC格式的坐标是像素绝对值左上角为原点x轴向右y轴向下。如果一个框同时存在多个object节点就代表这张图里有多个缺陷。2.2 YOLO格式的目录结构与txt标注YOLOYou Only Look Once系列的标注格式是深度学习时代用得最多的轻量格式之一。它的目录结构通常长这样dataset/ ├── images/ │ ├── train/ │ └── val/ └── labels/ ├── train/ └── val/每个图片文件对应一个同名的txt标注文件比如tile_000123.jpg对应tile_000123.txt。txt里每一行是一个缺陷框格式是五个数class_id x_center y_center width height前面三个是缺陷类别ID0、1、2……对应你在配置里定义的类别列表后面四个数是归一化后的坐标——注意全部是0到1之间的浮点数。计算方式是框中心的x像素坐标除以图片宽度框中心的y像素坐标除以图片高度框宽除以图片宽度框高除以图片高度。举个例子如果一张640x640的图片中某个裂纹框的像素坐标为xmin120, ymin163, xmax286, ymax249那么对应的YOLO格式就是0 0.317187 0.321875 0.259375 0.134375因为中心x (120286)/2 203203/640 0.3172中心y (163249)/2 206206/640 0.3219宽度 286-120 166166/640 0.2594高度 249-163 8686/640 0.1344。两套格式的对比可以看下面这个表| 对比维度 | VOC格式 | YOLO格式 | | 标注文件后缀 | .xml | .txt | | 坐标体系 | 像素绝对值 | 归一化浮点数 | | 每框信息 | 类别名坐标额外标记 | 类别ID坐标 | | 文件数量 | 每图一个XML | 每图一个TXT | | 适配框架 | Faster R-CNN、SSD、Detectron2等 | YOLOv5/YOLOv8、Ultralytics系列 |这个数据集里同时提供两套意味着你不需要自己做格式转换直接按框架要求选对应的目录就行。2.3 数据分布与类别构成我看了下这个数据集的类别构成通常瓷砖瑕疵检测数据集会覆盖这几类典型缺陷裂纹crack、针孔pinhole、色斑stain、崩角edge_chip、釉泡glaze_bubble等。每个类别在不同光照、不同纹理背景下的样本数量不完全相同这个不均衡问题我在后面会专门讲。图片尺寸大概率是统一的——大多数工业视觉数据集都会把图片统一resize到640x640或416x416方便训练。但要注意不要因为图片尺寸统一就觉得可以不检查就直接开训。我建议拿到数据后第一步做数据可视化随机抽几十张图把标注框画上去看看确认框的贴合程度和缺陷的类型完整性。具体怎么做下面第四节有现成代码。3. 用YOLO格式跑通一版瓷砖缺陷检测模型这个数据集的YOLO格式部分可以直接喂给Ultralytics YOLOv8这也是目前大多数人首选的检测框架。下面是我实际跑通全流程的完整过程包括配置文件和踩过的小坑。3.1 目录整理与data.yaml配置假设你的数据集压缩包解压后目录结构是images/train、images/val、labels/train、labels/val那直接放进你的项目目录就能用。接下来最关键的一步是写data.yamltrain: D:/datasets/tile_defect/images/train val: D:/datasets/tile_defect/images/val nc: 5 names: [crack, pinhole, stain, edge_chip, glaze_bubble]这里有个细节必须提醒train和val的路径尽量写绝对路径或者相对data.yaml所在目录的相对路径不要只写文件夹名。Ultralytics框架在读取时会自动把images替换为labels去找对应的标注文件所以只要图片和标注文件同名、分别放在images和labels下就不会出问题。nc是类别数量names是类别名称列表顺序必须和标注文件里的class_id对应。如果标注的class_id是0开头names第一个就要写0对应的那个类别名。这个对应关系搞错了训练出来的模型就全乱了。3.2 训练命令与参数选择基础训练命令yolo detect train datadata.yaml modelyolov8n.pt epochs100 imgsz640 batch16 device0初次跑通建议用yolov8n.pt这种轻量模型做基准训练速度快、显存占用小。如果你的显卡显存不够把batch降到8或4如果显存充足且追求精度可以直接换yolov8s.pt或yolov8m.pt。关于epochs我自己的经验是瓷砖瑕疵这种纹理简单的场景100个epoch基本够用但前提是用预训练权重。如果你从零开始训练不加载yolov8n.pt那至少得300个epoch以上才可能收敛。所以千万别省那几秒钟的下载时间预训练权重带来的收益是巨大的。还有个patience参数默认是10意思是如果连续10个epoch验证集指标没提升就早停。对于工业场景的数据集我建议把patience设到20或者干脆关掉patience0因为瓷砖瑕疵数据往往有类别不均衡问题验证集指标的波动可能比较大太激进地早停会错过后续的精度提升。3.3 第一次训练可能遇见的路径问题跑训练最常遇到的一个报错是AssertionError: train: No labels in D:/datasets/tile_defect/images/train这个报错表面上是说训练集里没有标注实际上是因为Ultralytics框架期望图片和标注的目录名必须是images和labels并且父目录名要一致。如果你的目录结构是train_images和train_labels框架是找不到的。解决方案有两种一是把目录重命名成标准的images和labels二是在data.yaml里手动指定train_labels字段但老版本不一定支持。最稳妥的还是调整目录结构。另一个很容易忽略的问题是图片文件和标注文件的编码。部分数据集在Windows下压缩再解压文件名的中文编码会出问题虽然图片能打开但训练时OpenCV会因为文件名乱码读不到图。解决办法很简单全部改成纯英文数字命名比如tile_0001.jpg这种格式。3.4 评估指标到底该怎么看训练结束后框架会输出mAP50、mAP50-95、precision、recall这些指标。很多人第一次看到这些数字不知道怎么判断好坏。这里说下我的参考标准mAP50达到0.85以上说明框的位置和类别都基本靠谱适合做粗筛。mAP50-95达到0.6以上说明定位精度和分类置信度都过硬。如果precision和recall差距很大比如precision有0.9但recall只有0.6说明模型宁缺毋滥很多真实的缺陷被漏掉了。对产线质检来说漏检比误检严重得多这时候应该降低置信度阈值或者增加数据增强来提升召回率。还有一点评估指标要在验证集上看不要在训练集上看。训练集上的loss下降不代表泛化能力好反而loss降得很低、验证集指标不上涨基本就是过拟合了。如果发现这种情况加大augment相关的数据增强参数或者加weight_decay能缓解不少。4. VOC标注在断点调试与模型评估中的实际用法VOC格式虽然不如YOLO格式轻量但它在两个场景里反而更顺手一是做数据可视化检查标注质量二是在那些不支持YOLO格式的经典检测框架里做基准实验。4.1 用VOC格式做标注质量抽检标注质量是决定模型上限的最大因素。你可以在训练前写个简单的可视化脚本把XML标注画到图片上人眼检查一遍import cv2 import xml.etree.ElementTree as ET import glob import random xml_files glob.glob(dataset/Annotations/*.xml) random.shuffle(xml_files) class_colors { crack: (0, 0, 255), pinhole: (0, 255, 255), stain: (0, 165, 255), edge_chip: (255, 0, 255), glaze_bubble: (0, 255, 0), } for xml_file in xml_files[:50]: tree ET.parse(xml_file) root tree.getroot() img_path dataset/JPEGImages/ root.find(filename).text img cv2.imread(img_path) for obj in root.iter(object): name obj.find(name).text 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) cv2.rectangle(img, (xmin, ymin), (xmax, ymax), class_colors.get(name, (255, 255, 255)), 2) cv2.putText(img, name, (xmin, max(0, ymin - 5)), cv2.FONT_HERSHEY_SIMPLEX, 0.6, class_colors.get(name, (255, 255, 255)), 2) cv2.imshow(check, cv2.resize(img, (640, 640))) cv2.waitKey(0) cv2.destroyAllWindows()跑一遍这个脚本重点检查这几类问题标注框有没有严重偏离缺陷实际位置。同一个缺陷是不是被拆成了两个互相重叠的框。类别标签有没有明显标错比如把针孔标成了裂纹。特别小的缺陷有没有被标出来——这决定模型在小目标上的表现。如果发现标注问题比例较高建议修完再用。别指望模型能从脏标注里学到正确的规律垃圾进垃圾出这个道理在视觉任务里体现得尤其明显。4.2 在Faster R-CNN、SSD上的应用VOC格式的另一个好处是可以直接用torchvision内置的VOCDetection数据类或detectron2的register_pascal_voc函数加载。如果你是做算法对比实验比如用Faster R-CNN和YOLOv8都跑一遍VOC格式能省掉很多适配工作。一个简单的torchvision加载示例from torchvision.datasets import VOCDetection dataset VOCDetection( rootdataset, year2012, image_settrain, downloadFalse, )只要你的数据目录结构符合VOCdevkit/VOC2012/JPEGImages这样的层级torchvision就能直接识别。如果目录结构跟标准VOC不完全一致也可以自己写一个Dataset类读XML然后转成tensor工作量也不大。5. 训练瓷砖检测模型最常踩的坑类别不均衡和重叠目标跑通之后你大概率会遇到两个绕不开的问题类别不均衡和目标重叠/遮挡。这两个问题如果处理不好模型精度就会卡在一个不太理想的位置上不去。5.1 类别不均衡的成因与对策瓷砖瑕疵中不同类别的出现频率相差很大。比如崩角在产线上其实很少见但针孔和色斑几乎是每片砖都可能有。如果数据集如实反映了这种分布那模型就会倾向于把大多数预测机会留给频率高的类别低频类别基本学不到特征。处理办法可以分梯度来试第一梯度重采样。从数量少的类别中重复采样让它和其它类别在单epoch里的样本量接近。简单做就是复制图片——但要注意复制相同图片容易过拟合最好结合数据增强使用。第二梯度数据增强。对低频类别的样本做更强的增强比如随机旋转、亮度扰动、添加高斯噪声让同一个缺陷产生更多变体。Albumentations库实现起来很简单import albumentations as A aug A.Compose([ A.RandomRotate90(p0.5), A.HorizontalFlip(p0.5), A.VerticalFlip(p0.5), A.RandomBrightnessContrast(p0.3), A.GaussNoise(p0.2), ])第三梯度调整损失权重。YOLOv8虽然没有直接暴露每个类别的loss权重但可以通过增加低频类别图片的重复次数来变相提高它对loss的贡献。终极方案合成数据。如果某些缺陷实在凑不够样本可以用CutMix把一个小缺陷贴到同一批次的另一张无缺陷瓷砖上。注意贴合位置的纹理要尽量自然不能有明显的贴图痕迹。5.2 重叠目标与镜面反光的处理瓷砖表面往往有纹理特别是仿古砖、通体砖这类产品纹理和瑕疵叠加在一起人眼都容易看错。标注框重叠的问题也常见——比如一块砖上裂纹和釉泡正好挨在一起模型容易误判成一个大目标。我的经验是对重叠目标标记框宁大勿小。因为检测模型是用IoU来算正负样本的框稍微大一点至少还能盖住一部分目标特征框太小模型就学不到完整特征。当然太大也不行否则两个相邻的缺陷会合并成一个框。镜面反光问题在釉面砖上尤其明显。同一块砖在光源不同的角度下拍出来高光区域可能形成与色斑非常相似的亮度分布。这个属于采集端的问题需要在打光方案上解决。如果数据集本身已经包含了多种光照条件下的图片那训练时尽量别用颜色类增强否则会把反光和真缺陷的边界搞模糊。5.3 用小目标检测专项评估衡量模型真实水平瓷砖上的针孔往往只有二三十个像素属于典型的小目标。YOLOv8对小目标的召回率不算好这是通用检测模型的通病。如果你发现整体mAP还行但针孔这一类的recall很低可以考虑用更高分辨率的输入比如从imgsz640调到imgsz1280代价是训练和推理时间翻倍。检查P3特征层的输出是否被充分使用——YOLOv8默认融合了多尺度特征小目标的特征主要在浅层。更换模型为专门的微小目标检测变体或者在YOLOv8基础上加一层P2 head但这也意味着更多的训练时间和显存开销。实际项目中我见过不少人在这些小目标上死磕最后用了一个更朴素的方法解决了问题——把产线相机分辨率调高。数据源头清晰模型压力小一大截。数据集再好也弥补不了采集设备的硬伤。6. 数据集之外自己采集和扩充瓷砖瑕疵数据的思路跑通这个数据集只是第一步。如果要做真正可落地的产线系统只用公开数据远远不够——产线环境、瓷砖花色、光源角度一变模型的泛化能力就会受到考验。这里分享几条我自己实践过的扩充思路。6.1 在产线上搭简易采集装置采集瓷砖表面瑕疵图片的硬件门槛并不高。一台工业相机500万像素左右就够用、一个低角度环形光源、一台工控机就能搭起基础采集环境。关键在于光源角度低角度照射能凸显裂纹和凹凸缺陷高角度均匀光更适合看色差。两种光源下各拍一组缺陷的表现形式更丰富。传送带停止位拍照如果产线速度较快最好在拍照位置加一个光电传感器停止信号保证每块砖都在同一位置、同一时间被采集减少运动模糊。存储策略全部拍下来不仅浪费硬盘还让训练集充满大量无缺陷图片。更经济的方案是只保留模型预测置信度低于阈值的图片疑似漏检以及人工确认过的缺陷图片。6.2 用无缺陷瓷砖合成缺陷样本当某些缺陷实在难采集时合成数据是一个可行方案。步骤是采集一批无缺陷瓷砖图作为背景。从已有的缺陷样本中抠出缺陷区域用标注框裁剪就行。用cv2.seamlessClone把缺陷区域融合到背景图上可以配合光照变换、旋转、缩放和模糊处理。import cv2 import numpy as np # 从缺陷图中裁剪缺陷区域 def paste_defect(bg_img, defect_img, mask, x, y): h, w mask.shape[:2] roi bg_img[y:yh, x:xw] # 用泊松融合让缺陷自然过渡到背景 result cv2.seamlessClone(defect_img, bg_img, mask, (x w//2, y h//2), cv2.NORMAL_CLONE) return result这条路线能快速扩充样本量但合成的样本分布和真实缺陷还是有差异所以建议合成数据只占训练集的三成以内且验证集必须保持真实数据。6.3 模型更新与持续标注流程产线上的瑕疵种类和形态会随着工艺调整而变化。我建议部署后建立一套轻量级的标注反馈闭环每周从产线上随机抽一批图片人工标注缺陷。将新标注数据按7:3比例融入训练集和验证集增量训练。增量训练时把epochs调小20-30就行学习率调低防止灾难性遗忘。这件事没什么高深技术但能确保模型始终贴合产线的最新状态。很多时候模型上线后效果下滑不是算法退步了而是产线变了数据没跟上。7. 给初学者的快速入门实操建议如果你是这个领域的新手准备用这个数据集做第一次目标检测实验下面是我给你的完整路线图先跑通再调优不要一开始就想着把mAP做到0.99。先按第三节的命令跑一遍yolov8n确认整个链路没问题再谈精度。坚持做数据可视化每次训练前都抽检查看标注质量训练后都抽查预测结果。很多问题只有人眼看了才能发现指标会骗人但肉眼真实。建立实验记录表记录每次实验的数据集子集、模型、参数、mAP、训练时间。推荐用Excel或者Notion方便对比。| 实验编号 | 模型 | imgsz | epoch | batch | mAP50 | 备注 | | E01 | yolov8n | 640 | 100 | 16 | 0.82 | 基准 | | E02 | yolov8s | 640 | 100 | 16 | 0.87 | 加了增强 | | E03 | yolov8s | 1280 | 100 | 8 | 0.89 | 小目标提升明显 |这个表看起来简单但坚持记下来三个月后你会感谢自己。别迷信指标mAP只是一个参考。在工业场景里真正重要的是漏检率和误检率的组合。有时候mAP不高但通过调低置信度阈值漏检率能压到可接受范围反而更实用。说实话瓷砖瑕疵检测这个项目技术上没有特别深的门槛它更像是一个需要耐心打磨的工程问题。数据和标注质量占了成功的一半另一半才是模型和参数。这个VOCYOLO双标注的数据集正好把最耗时、最容易被低估的那一半帮你做好了。剩下的就看你在训练和迭代上愿意投入多少功夫了。本文还有配套的精品资源点击获取