瓷砖裂缝检测数据集详解:用YOLO训练工业质检模型的实战指南
发布时间:2026/10/1 17:22:17来源:尧图网络
简介面向工业质检与目标检测入门者这份YOLO格式的瓷砖裂缝识别数据集包含1700余张已标注图像图片与TXT标签一一对应划分明确后可无缝接入YOLOv5等主流训练流程。数据覆盖裂缝与正常两类样本并对部分图像做了翻转、加噪等增强处理有助于提升模型泛化能力。压缩包内共2000个文件以1765个txt标注文件、234张jpg图像以及1个可直接运行的py可视化脚本为主整体大小91.75MB目录按用途组织便于查找。配套的Python脚本无需修改参数随机指定一张图片即可自动绘制边界框并保存到当前目录适合快速校验标注质量或展示检测效果。资源已有193人学习使用无论用于毕业设计、竞赛练手还是企业预研都能省去手工标注和格式转换的时间。1. 瓷砖裂缝识别数据集1700张图、两个类拿来就能训YOLO做工业质检的朋友应该都有体会瓷砖裂缝检测是个典型的小目标、低对比度问题裂缝细得像头发丝和背景色差不大光照一偏就全完。网上公开的裂缝数据集大多是好几百张的经典路面裂缝换到瓷砖表面就水土不服。这份资源的好处是它直接按YOLO格式分好了目录训练集、验证集都备好了还有配套的可视化脚本下载之后不用再写格式转换脚本直接把路径指到data.yaml就能开训。它还带了两类标签裂缝和正常正常样本可以用来压制误检。适合刚起步做目标检测落地、或者准备用YOLOv5/v8训练自己数据的工程新手也适合需要快速验证数据增强策略的算法工程师。整包约1700张图不算大但足够让模型学到“什么是裂缝”的基本边界。2. 数据集结构与标注格式从目录布局到classes.txt先搞清你拿到的是什么2.1 images和labels分目录存放train/valid划分的常见习惯这份数据的组织方式很接近YOLO官方coco128的布局图片和标签分开存放图片放在images下标签放labels下两者靠文件名一一对应。文件名形如N217_jpg.rf.cc836bba4d8c9d066097b32b5915fd3f.jpg前面的N或C代表类别语义N应该是NormalC是Crack后面那串长hash是Roboflow导出时留下的痕迹。老实说这套命名是从Roboflow流出来的但它不影响YOLO训练因为训练时只认图片路径和对应的txt标签路径不解析文件名含义。查看目录时建议先把images和labels下面的train、valid、test子目录都列出来看看。如果test目录为空就直接把valid当测试集用反正数量少不影响评估。我一般会用一行命令数一下每类图片数量ls images/train | wc -l ls images/valid | wc -l find labels/train -name *.txt | xargs grep -l ^0 | wc -l第三条命令用来快速统计训练标签里第一类裂缝出现的次数^0匹配的是标签首字符为0的行。这里的类别序号0对应classes.txt里的第一行通常是crack。如果发现裂缝样本数远少于正常样本训练时就要考虑加类权重或者做正样本增强。2.2 classes.txt只有两类crack和normal别改文件名打开classes.txt大概率就是两行crack、normal也可能顺序反过来。这个顺序决定了标注txt里数字0和1的含义所以训练前务必打开确认一遍。最稳的做法是直接把这个文件拷到你的数据集根目录不要自己新建一个txt再手敲类别名手敲容易打错空格或者把顺序搞反。顺序一旦反了模型训练时会把裂缝当正常正常当裂缝loss曲线照样下降但推理结果全错。另外注意这份数据里“正常”类不是绝对干净的白瓷砖而是带有纹理、杂质、色差的正常砖面。这样设计是合理的因为实际产线上正常的瓷砖本来就有纹理如果正常类全是纯白图片模型会学成“有纹理就是裂缝”部署时误检率会高得没法看。所以训练时不要把normal类删掉只训裂缝二分类检测的价值就在于让模型学会区分“缺陷”和“背景里的干扰”。2.3 标注格式是YOLO txt不是VOC XML训练前先验证labels目录下的txt文件每行代表一个目标框格式是“类别编号 中心x 中心y 宽 高”四个坐标值都是归一化在0到1之间的小数。比如一行0 0.516 0.782 0.048 0.006代表裂缝框中心在图片水平51.6%、垂直78.2%的位置宽高分别是图片尺寸的4.8%和0.6%。这种细长的框正是裂缝的特征宽远大于高面积占比很小所以模型学习时容易漏检训练时我会特意调高小目标的anchor比例。训练前最好先抽几个txt文件看内容验证坐标没有越界或负值。我习惯写个十行左右的Python脚本把所有标签文件读一遍检查有没有坐标小于0或大于1的情况。常见做法是import os label_dir labels/train for name in os.listdir(label_dir): if not name.endswith(.txt): continue path os.path.join(label_dir, name) with open(path) as f: for line in f: parts line.strip().split() if len(parts) ! 5: print(f格式错误: {name} - {line}) continue cls int(parts[0]) x, y, w, h map(float, parts[1:]) if cls 0 or cls 1: print(f类别越界: {name}) if not (0 x 1 and 0 y 1 and 0 w 1 and 0 h 1): print(f坐标越界: {name} - {line})这个脚本只做基础校验跑一遍能发现标注软件导出时可能留下的脏数据。我遇到过Roboflow导出的txt里混入空行或者带逗号的格式YOLO训练时解析失败直接跳图很耽误时间提前查一下能省不少事。3. 数据增强与可视化翻转、加噪声以及那个免改即跑的draw脚本3.1 数据增强怎么加翻转和噪声的参数选择这份资源里已经对部分数据做了翻转和加噪声点增强也就是说训练集里会有同一张瓷砖的左右翻转版本以及加了椒盐噪声或高斯噪声的版本。这样做的目的是模拟产线相机的传感器噪声和瓷砖摆放方向随机性让模型对方向不敏感、对噪声有鲁棒性。但增强不是越多越好后面我踩过坑噪声增强过头会导致模型把正常纹理当裂缝稍后再细说。如果想自己再做一轮增强我一般建议只用YOLO自带的hsv_h、hsv_s、degrees这三个参数不要额外加太多马赛克和随机裁剪因为裂缝是细长结构mosaic拼接时如果目标被裁剪掉一半标签框会变形反而学坏。常见配置是hsv_h: 0.015 hsv_s: 0.7 hsv_v: 0.4 degrees: 10 translate: 0.1 scale: 0.5 fliplr: 0.5 mosaic: 0.0 mixup: 0.0这里degrees设10度是考虑到瓷砖摆放可能有轻微旋转别设太大裂缝旋转超过20度后会变得和斜纹纹理难以区分。fliplr水平翻转保持0.5因为瓷砖左右对称翻转不会改变缺陷语义。mosaic和mixup对细长小目标不友好我习惯关掉等模型baseline跑出来后再逐步打开对比。3.2 可视化脚本使用随机传一张图自动画框保存包里那个可视化py文件是把图片和对应的txt标签一起读入用OpenCV画矩形框然后把标注后的图片保存到当前目录。它不需要你手动改路径或传参直接运行就能随机挑一张图片出来展示边界框画在图上保存成新文件。这个脚本对检查标注质量特别有用尤其是想看看裂缝框有没有紧紧贴住裂缝两端。运行方式很简单python visualize.py脚本内部逻辑大概是读一张随机图片再去同名的txt里读每一行坐标把归一化坐标乘回图片宽高然后调用cv2.rectangle画框。如果脚本顶部写死了图片目录而你下载后目录结构和它预期不一致会报错找不到文件。这时把脚本里那个img_dir变量改成你当前机器上images/train的实际路径就行。有一个细节值得注意OpenCV读取PNG图片时用的是BGR通道顺序画框颜色如果直接用RGB的红色255,0,0画出来会偏蓝。所以脚本里一般会写(0, 0, 255)才是红色这一点在OpenCV里是老玄学稍不留神就画错颜色。3.3 手动验证标注用Python快速检查框是否越界可视化脚本看单张图够用但1700张图不可能一张张翻。我一般会在训练前写个批量自检脚本把每张图片尺寸读出来再对照txt坐标换算成像素坐标检查是否落在图片范围内。逻辑不复杂import cv2 import os img_dir images/train label_dir labels/train for img_name in os.listdir(img_dir): if not img_name.endswith(.png): continue img cv2.imread(os.path.join(img_dir, img_name)) h, w img.shape[:2] label_path os.path.join(label_dir, img_name.replace(.png, .txt)) if not os.path.exists(label_path): print(f缺少标签: {img_name}) continue with open(label_path) as f: for line in f: parts line.strip().split() if len(parts) ! 5: continue x, y, bw, bh map(float, parts[1:]) x1 int((x - bw / 2) * w) y1 int((y - bh / 2) * h) x2 int((x bw / 2) * w) y2 int((y bh / 2) * h) if x1 0 or y1 0 or x2 w or y2 h: print(f越界: {img_name} - {line.strip()})这段脚本会把边界框换算回像素坐标越界的打印出来。如果报错数量很少比如两三个框可以直接用文本编辑器把那两行坐标改成0到1之间的值。如果报错成片出现大概率是标签和图片尺寸不匹配比如某几张图被resize过但标签没跟着改这种情况需要重新导出标注。4. 用YOLOv5/v8训练瓷砖裂缝data.yaml配置与超参调整4.1 准备data.yaml路径、类别数、类别名把数据集整理好后需要写一个data.yaml来告诉YOLO训练器训练图片在哪、验证图片在哪、有几类、类别名是什么。这是整个训练流程里最容易被忽略的一步很多人翻车就是把路径写成了相对路径结果在别的机器上跑直接报错。我习惯写绝对路径或者把数据集放到固定位置后统一写相对路径两种方式各有利弊。一个可用的data.yaml长这样train: /your/path/tile_crack/images/train val: /your/path/tile_crack/images/valid nc: 2 names: [crack, normal]train和val指向的是图片目录YOLO会自动去同级的labels目录找对应标签前提是labels目录和images目录在同一个父目录下。如果你的目录是images/train和labels/train那没问题。如果标签目录不按这个结构放必须在data.yaml里额外指定但这份资源本身就是按标准结构分的所以不用改。nc和names的顺序必须和classes.txt一致。万一classes.txt里是normal和crack也就是normal在前那么names应该写成[normal, crack]不然类别0变成normal模型预测的裂缝就变成类别1推理时调换回来很痛苦。4.2 训练命令与参数img、batch、epochs怎么设训练命令本身不复杂复杂的是参数选择。针对瓷砖裂缝这种小目标、低对比度数据我比较倾向用YOLOv5s或者YOLOv8s起步先看baseline再决定是否换大模型。常用命令python train.py --img 640 --batch 16 --epochs 100 --data tile_crack.yaml --weights yolov5s.pt --cacheimg设为640是因为原始图片大概率在640x640附近保持同尺寸可以减少缩放变形。如果你的图片实际尺寸是1920x1080也不要直接设成640先看可视化脚本跑出来的图片长什么样如果裂缝在640下已经缩成几个像素可以考虑设成1280但显存占用会翻倍。batch大小看显卡16G显存跑16没问题8G就降到8。epochs不用一开始就设300先100个看趋势如果val loss还在降就续训。--cache参数会把图片提前缓存到内存里解决每次epoch都重复读盘的问题。如果数据集在机械硬盘上这个参数能省接近一半训练时间。如果你的机器内存只有16G1700张图缓存可能略紧张但一般能抗住不行就关掉。4.3 训练后查看结果混淆矩阵和PR曲线怎么看训练结束后YOLO会在runs/train/exp目录下生成混淆矩阵、PR曲线、F1曲线等图。看结果要先看混淆矩阵横坐标是真实类别纵坐标是预测类别。对角线越亮越好重点关注正常类有没有被大量预测成裂缝或者裂缝被漏掉成背景。对于瓷砖裂缝场景我一般看指标的顺序是召回率Recall优先于精确率Precision。因为产线上漏掉一块有裂缝的砖比误杀一块好砖更严重漏检可能导致问题批次的瓷砖流出厂。所以训练时我会把conf_thres设低一点比如0.15然后看recall值。如果recall上不去大概率是裂缝样本太少或者小目标anchor没覆盖到这时候可以试试在yaml里加一组更小尺寸的anchor或者把img调大。PR曲线靠左上方越好但如果曲线尾部掉得快说明模型对困难样本没把握比如那些细得几乎看不见的早期裂缝。这类样本人眼都要仔细看模型漏检不丢人但如果连中等粗细的裂缝都漏就要检查标签框是否画得太松把纹理背景包进框里了。5. 避坑与常见问题瓷砖裂缝训练中我踩过的五个坑5.1 坑一图片是png但OpenCV读出来通道顺序不对现象自己写的画框脚本里明明是红色画出来却偏蓝或者训练时用cv2读取数据增强结果颜色怪怪的。原因OpenCV默认读入的通道顺序是BGR而通常我们说的RGB只是习惯数据增强库比如albumentations是按RGB处理两种库混着用就会翻车。解决统一用cv2.imread读图训练管线交给YOLO内部处理自己写可视化脚本时记住cv2.rectangle的颜色参数是(B,G,R)红色写(0,0,255)。如果是用PIL读图再转cv2记得先cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR)。5.2 坑二txt标签和jpg文件名不一致导致训练找不到目标现象训练日志提示WARNING: No labels in xxx.jpg或者模型训练完AP一直是0。原因Roboflow导出的文件名带hash有的标签文件后缀是.txt图片却写成.png或.jpg如果中间手工改过文件名对应关系就断了。解决训练前用脚本核对一下列出images目录下存在但labels目录下没有对应txt的文件我前文那个批量自检脚本就有这功能。另外注意文件名后缀要严格一致图片叫N217_jpg.rf.cc836bba4d8c9d066097b32b5915fd3f.jpg标签就该叫N217_jpg.rf.cc836bba4d8c9d066097b32b5915fd3f.txt中间那个_jpg是原图后缀不要画蛇添足改成别的。5.3 坑三数据增强把噪声加到正常类上误检率飙升现象训练时loss很漂亮验证集mAP也不低但一跑真实产线图片正常瓷砖上也被框出一堆裂缝。原因训练集里对正常类图片也加了椒盐噪声模型把噪声点学成了裂缝特征尤其当噪声密度较高时白色噪点在深色瓷砖上特别像微裂纹。解决加噪声增强时只对含裂缝的样本做或者把噪声密度控制在很低水平比如salt_pepper密度0.02同时确保正常类图片保持干净。如果这份资源里已经加了噪声你拿到手后可以用可视化脚本抽查几张normal类的图片如果感觉噪声明显建议把对应图片和标签从训练集里剔除重新整理一份干净版本。5.4 坑四可视化脚本画框坐标越界画到图外现象脚本运行不报错但保存出来的图上框线有一部分在图片外面或者框显示的位置明显偏移。原因txt里的归一化坐标是按原始图片尺寸算的但有些图片被预处理脚本resize过如果标签没同步更新坐标从0-1换算回像素后就超出边界。解决用我前面写的越界检查脚本跑一遍把越界的框找出来手动修正标签。如果是整批图片都resize过而标签没变最稳妥的办法是重新标注别试图通过缩放标签来弥补因为resize还可能改变宽高比直接换算会把框拉变形。5.5 坑五类别不平衡正常类远多于裂缝类现象混淆矩阵里normal类准确率极高crack类recall却很低模型更倾向把输入预测为normal。原因数据集里正常样本数量可能是裂缝样本的两三倍模型天然学会“猜正常”来降低总loss。解决有几个办法一是给crack类在loss里加权重YOLO没有直接按类加权参数但可以复制几份裂缝样本到训练集里做过采样二是用focal loss的超参把fl_gamma调大一点比如从1.5调到2.0让模型更关注难分类的裂缝三是把训练epochs拉长配合早停有时候模型到后期才开始真正学到裂缝的细节。我推荐先做过采样简单直接效果可预期。6. 进阶验证自己写个批量推理脚本统计mAP和漏检率训练完模型光看YOLO自己打印的mAP还不够我习惯在测试集上跑一遍批量推理把每张图的预测结果和真实标签对齐统计置信度阈值在0.25时到底漏了多少裂缝。这一步能让模型的实际可用性一目了然也方便给别人展示效果。先写一个简单的推理脚本import torch import cv2 import os from pathlib import Path model torch.hub.load(ultralytics/yolov5, custom, pathruns/train/exp/weights/best.pt) model.conf 0.25 model.iou 0.45 img_dir images/test save_dir pred_out os.makedirs(save_dir, exist_okTrue) for img_name in os.listdir(img_dir): if not img_name.endswith(.png): continue results model(os.path.join(img_dir, img_name)) results.save(save_dir) det results.pandas().xyxy[0] crack_det det[det[class] 0] print(f{img_name}: {len(crack_det)} 个裂缝框)脚本里model.conf0.25是置信度阈值低于这个值的预测会被过滤。改成0.1可以多召回一些弱裂缝但误检也会增多。results.save(save_dir)会把带框的图片保存下来方便事后翻看漏检的是不是那种极细的裂缝。如果发现模型在某个纹理方向上的裂缝系统性漏检说明训练集里缺这个角度的样本这时候再针对性补数据。最后再提一个训练技巧如果资源里自带的训练配置跑出来的模型mAP卡在0.8上不去可以试试先用这份数据集的预训练模型调整输入尺寸接着用余弦退火学习率跑后50个epoch一般能把mAP再抬两三个点。我之前做过一个类似的项目换了大模型反而过拟合退回去用YOLOv5s配合上面这套流程最后在测试集上的recall到了0.9误检率控制在可接受范围。从那以后我每次拿到工业缺陷数据集都强制自己先跑一遍数据检查脚本再谈训练参数因为数据质量和标签边界才是这类小目标检测的真正瓶颈。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网