简介:面向瓷砖质检与缺陷检测场景,这款YOLO数据集提供约1700张瓷砖图像的标注数据,共2个类别:裂缝与正常,覆盖了质检中最常见的判断需求。图像经LabelImg工具标注后,标签以txt文本保存,并已按训练集、验证集划分到不同目录,附有classes.txt类别文件;部分样本还进行了翻转、添加噪声等数据增强,能有效模拟不同拍摄条件,提升模型在实际环境中的泛化能力,同时省去从头标注和整理数据的重复工作。资源包共2000个文件,其中1765个为txt标签文件、234个为jpg图像、1个为Python可视化脚本,压缩包大小91.75MB,目录结构清晰,可直接用于YOLOv5、YOLOv8等主流检测模型的训练或微调;标签与图像文件名一一对应,也方便二次划分和格式转换。附带的可视化脚本可随机读取一张图片并绘制边界框,无需任何修改即可运行,便于快速核验标注质量与增强效果。已有193人学习下载,适合刚接触目标检测的开发者,以及需要快速获取可训练瓷砖裂缝数据集的算法工程师和研究人员。
1. 先下手为强:一份能直接开训的瓷砖裂缝 YOLO 数据集
做缺陷检测的人最头疼的不是模型选型,而是数据集从零开始的成本。这套瓷砖裂缝数据集一共 1700 张左右图像,PNG 格式,标签是 YOLO 通用的 txt 文本,类别只有两个:裂缝(Crack)和正常(Normal)。和很多裸图资源不同,它把训练集、验证集划分好了,附带的classes.txt直接写清类别,还配了一个能一键跑通的可视化脚本——随机喂一张图就能绘制边界框并保存到当前目录,不用改任何配置。这个资源更适合三类人:做瓷砖质检、建材外观检测的从业者;刚搭好 YOLOv5 或 YOLOv8 环境、缺一份规范数据集练手的初学者;以及自己标数据标到想吐、想看看别人怎么整理标签和目录的人。数据增强在这个资源里也做了处理,部分图像做了翻转和添加噪声点,但用的是最克制、不会污染标签的做法,这点后面单独展开。
2. 数据集底细:txt 标签怎么读、目录为什么这么分、数据增强都做了什么
有人拿到数据集第一件事就是解压、翻图、看标注得准不准。这个习惯没错,但我建议先看classes.txt,再看一张标签 txt 的内容,最后才翻图像。原因很简单:检测任务的标签是纯文本坐标,图像里画没画框、画得准不准,光靠肉眼扫图是看不出来的。
2.1 标签不是图片格式:先读 txt 再谈训练
YOLO 格式的标签文件,每一行代表一个目标框,一共五个字段:类别索引、归一化后的中心点 x 坐标、归一化后的中心点 y 坐标、归一化后的框宽、归一化后的框高。随便打开一份数据集里的 txt 标签,常见内容如下:
0 0.681719 0.435937 0.124219 0.068750 1 0.432813 0.764375 0.137500 0.112500第一行的 0 对应classes.txt里的第一个类别,也就是裂缝;第二行的 1 对应正常。后面的四个小数都做了归一化,除以了图像的宽和高,范围在 0 到 1 之间。训练时所有模型都不关心你是 640 乘 640 还是 1024 乘 768 的图,只看这些相对坐标。
提示:YOLO 标签坐标系是归一化相对坐标,不是像素绝对坐标,这点和 COCO 的 JSON 格式、VOC 的 XML 格式完全不同。后续写可视化脚本、做数据增强、转格式时,最容易出问题的就是对归一化坐标的处理。
2.2 目录划分与 classes.txt 的对应关系
数据集的目录结构是严格按照 YOLOv5 训练约定来组织的,核心是两个独立目录,分别存放图像和标签,文件名一一对应。常见的组织方式如下:
dataset/ ├── images/ │ ├── train/ │ │ ├── N217_jpg.rf.cc836bba4d8c9d066097b32b5915fd3f.jpg │ │ ├── N188_jpg.rf.6ce97d1be67899e5f3ff2ad58b2c9d7c.jpg │ │ └── ... │ ├── val/ │ └── test/ ├── labels/ │ ├── train/ │ │ ├── N217_jpg.rf.cc836bba4d8c9d066097b32b5915fd3f.txt │ │ ├── N188_jpg.rf.6ce97d1be67899e5f3ff2ad58b2c9d7c.txt │ │ └── ... │ ├── val/ │ └── test/ └── classes.txt文件名前缀和图片一一对应,图像放images下,同名 txt 放labels下,这是 YOLOv5 的默认约定,也是后面训练时不报错的前提。文件名的rf段和随机哈希是标注平台 robof low 生成的特征,不影响训练,但它提醒了你一个信息:这批数据大概率来自真实产线采样图,而不是人工作弊生成的合成图。
训练时写data.yaml,需要把类别列表指到这份classes.txt,只要类别顺序不变,就不会出现"训练时是裂缝预测时变成正常"的错位问题。
2.3 翻转加噪声:数据增强不是复制粘贴,而是控制过拟合的手段
摘要里明确提到对部分数据集做了翻转、添加噪声点的数据增强操作,这里单独强调"部分"两个字,是刻意的取舍。质量和缺陷检测场景里,裂缝方向不确定,横裂、竖裂、斜裂都有现实意义,所以水平翻转和垂直翻转能有效扩充样本多样性。噪声点增强模拟的是产线相机在弱光、粉尘环境下的成像噪声,这个思路贴合真实部署场景。
但值得注意:正常的瓷砖样本没有做翻转增强,因为"正常"这个类别的特征相对单一,翻转后和原图在语义上没有本质区别。如果对所有类别无差别增强,反而会让模型在正常类别上学到过度的位置偏差,推理时把纹理背景误判成裂缝。
2.4 自己标注一版要多久:算一笔时间账
很多人一开始打算自己买瓷砖拍照、用 labelimg 打标。按一个熟练标注员的速度,一张含裂缝的复杂图片平均标 40 到 60 秒,加上选图、裁剪、清洗、命名、检查,1700 张图光标注就要 20 个小时以上,还不算前期拍摄和后期回退重标的时间。labelimg 虽然免费、上手快,但它的格式转换、类别名维护、批量修改都需要额外处理,中间任何一个环节出错,标注质量都不可控。这也是为什么拿到一份划分好的数据集能省掉大量前期工作。
3. 可视化脚本实测:一张图校验标签正确性的最快路径
数据集附带的可视化脚本是校验标签质量的第一道闸口。它的设计目标是零配置跑通,但我们要做的不是双击运行,而是搞懂它在读什么、画什么、存成什么样。这样以后换到自己的数据集,也改得动。
3.1 脚本跑法:不用改路径,但要看懂它在读什么
在数据集根目录执行即可,默认读取当前目录下的图片和标签。核心调用逻辑如下:
import cv2 import numpy as np import glob import random # 随机选一张图,os.listdir 会返回目录下全部文件名 image_paths = glob.glob("images/train/*.jpg") img_path = random.choice(image_paths) img = cv2.imread(img_path) # 通过同名替换,把 .jpg 路径换成对应的 .txt 标签路径 label_path = img_path.replace("images", "labels").replace(".jpg", ".txt")这里有个关键点在第二行替换逻辑:遍历训练集图像,然后通过字符串替换找到同名标签。如果目录命名不规范,replace("images", "labels")会把路径替换成一个不存在的目录,脚本立刻报错。这份数据集之所以能"无需改动直接运行",就是因为文件组织严格遵循了同名映射的约定。
3.2 代码逐段拆解:读取、归一化坐标、画框、保存
拿到标签后,逐行解析并绘制边界框,是脚本的核心逻辑:
with open(label_path, "r") as f: for line in f.readlines(): parts = line.strip().split() cls_id = int(parts[0]) x_center = float(parts[1]) y_center = float(parts[2]) box_w = float(parts[3]) box_h = float(parts[4]) # YOLO 的归一化坐标转成像素绝对坐标 h, w = img.shape[:2] x1 = int((x_center - box_w / 2) * w) y1 = int((y_center - box_h / 2) * h) x2 = int((x_center + box_w / 2) * w) y2 = int((y_center + box_h / 2) * h) color = (0, 0, 255) if cls_id == 0 else (0, 255, 0) cv2.rectangle(img, (x1, y1), (x2, y2), color, 2) cv2.putText(img, f"cls_{cls_id}", (x1, y1 - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.6, color, 2) cv2.imwrite("visualize_result.jpg", img) print(f"已保存可视化结果: visualize_result.jpg, 共 {len(open(label_path).readlines())} 个目标")这段逻辑值得细说。YOLO 标签给的是中心点坐标和框宽高,全部是 0 到 1 的相对值,画框前必须乘回图像的宽和高,同时把中心点加宽高的一半转换成左上角、右下角的绝对像素坐标。脚本里x1 = int((x_center - box_w / 2) * w)这一行的换算就是避免"画出框但位置全偏"的关键。类别颜色区分也做得直观:索引 0 的裂缝画红色框,索引 1 的正常画绿色框,一眼能看出两类目标的分布密度,顺带检验classes.txt里类别顺序有没有对错位。
提示:可视化脚本默认只画训练集里随机一张图。如果随机到的是一张"正常"样本,你会看到绿框,看不到红框,这是正常的,不代表脚本有 bug。
3.3 参数调哪里:想要批量可视化或换颜色改哪些行
如果想把单张随机改成批量输出,把random.choice(image_paths)换成for img_path in image_paths,再把cv2.imwrite的文件名改成原图名加_vis后缀,就能给整个 val 集生成可视化结果。换颜色只要改color = (0, 0, 255)里的 BGR 三元组,红色是 (0, 0, 255),绿色是 (0, 255, 0),蓝色是 (255, 0, 0)。
批量可视化这个操作特别适合在训练前做一次全量抽检,比单张随机看得全面。我第一次拿这个脚本转一批自采数据时,就因为只看了单张结果,漏掉了一批标签全部偏移 0.1 的错误,直到训练到第 50 轮才发现 loss 异常。从那以后批量生成可视化图成了固定动作。
4. 接进 YOLOv5 开始训练:数据配置、训练命令与关键参数
可视化确认标签没问题,就可以接进 YOLOv5 训练了。这一步的核心不在命令,而在data.yaml的写法,因为类别顺序、路径指向、验证集划分都在这一个文件里定义,配错了训练跑不起来,更坑的是有时能跑但指标全是乱的。
4.1 写 data.yaml:引用这份数据集的 class 文件
一份匹配这份数据集的data.yaml如下:
train: ./dataset/images/train val: ./dataset/images/val nc: 2 names: 0: crack 1: normaltrain和val指向的是图像目录,YOLOv5 会自动用同级labels目录找标签,所以不需要单独写标签路径。nc: 2对应两个类别。names下面是类别名,这里建议和classes.txt里的顺序保持完全一致,索引从 0 开始,不能错位。训练时 YOLOv5 还会生成一个dataset缓存索引,如果之后更新了图像或标签,要手动删掉缓存文件再训,否则读的还是旧索引。
4.2 训练命令与参数解读
基础训练命令如下:
python train.py --img 640 --batch 16 --epochs 100 \ --data dataset.yaml --weights yolov5s.pt --cache四个参数中,--img 640是训练分辨率,缺陷检测目标偏小,不建议低于 640,否则小裂缝可能缩成几个像素;--batch 16需要根据显存调整,6GB 显存建议降到 8;--epochs 100是起始轮数,缺陷检测一般 100 到 200 轮之间看收敛情况;--weights yolov5s.pt是预训练权重,v5s 的参数量对这类单类别目标检测来说性价比很高,v5m 或 v5l 对小目标会更好,但训练和推理时间都会明显上升。
--cache参数会把图像提前加载进内存,第一次训练能明显加速,但需要预留足够的 RAM,8GB 内存的机器建议去掉这个参数。
4.3 训练完第一件事:看 val 输出而不是看 loss 曲线
很多人训练完的第一反应是打开runs/train/exp里的 loss 曲线,看损失降没降。这个习惯对裂缝检测不太适用——裂缝像素占比小,正负样本极度不平衡,loss 曲线降得再漂亮,也不代表小裂缝能检出来。
我一般先看验证集输出目录里保存的几张预测图,重点观察三处:有没有把纹理边缘、污渍误判成裂缝;裂缝密集区域能不能区分出相邻的多条裂纹;小裂缝有没有漏检。然后再看val的 mAP 和 recall 指标。这两个指标单独一个高不算好,precision 高而 recall 低,说明模型偏保守,漏检多;recall 高而 precision 低,说明模型把大量正常区域误报了,实际部署时产线会频繁报警,根本没法用。
5. 避坑指南:从标签校验到训练翻车的五个常见问题
数据集本身整理得规范,不代表使用过程中不踩坑。下面这些问题我基本都遇到过,按"现象 → 原因 → 解决"写清楚,建议训练前逐条对照。
5.1 可视化脚本画不出框或报文件找不到
- 现象:运行可视化脚本后,输出提示图片不存在,或者一张图为空没有任何框。
- 原因:图像路径和标签路径的主文件名不一致。最常见的是脚本里把
images目录下的.jpg替换成.txt时,原图其实是.png,替换后找不到对应文件;也可能是换了自己的数据集,但目录名不是images和labels。 - 解决:先用
ls对比同名文件双端是否存在。如果图片是.png,把脚本里所有.jpg换成.png。更稳妥的做法是全局搜索标签目录,确认每个 txt 都有同名图片,缺任何一个都要找回来,否则训练时会跳过这张图,但你以为数据全在用,等于用了残缺数据集。
5.2 训练时报错 "AssertionError: train: No labels in ..."
- 现象:训练一开始就报错,找不到标签文件,或者提示
No labels in xxx/train。 - 原因:YOLOv5 通过图像路径推断标签路径,默认把
images替换成labels,把图片扩展名替换成.txt。如果你的目录叫imgs、label而不是images、labels,就匹配不上。 - 解决:目录名严格改成
images和labels,或者写data.yaml时在train路径后手动指定标签目录。这个数据集已经按规范组织,训练前确认路径没被改动过就行了。
5.3 训练能跑,但 mAP 极低,预测框全偏
- 现象:训练过程正常,loss 也在降,但验证时预测框位置明显偏移,甚至框长宽和真实目标完全对不上。
- 原因:标签坐标在标注或后续编辑时失掉了归一化,变成了像素绝对坐标,模型把大数值当成归一化坐标训练,学出来的框自然错乱。另外,如果数据增强脚本在处理时用了 OpenCV 的复制粘贴操作,但没有同步修改 txt 里的坐标,也会出现这种问题。
- 解决:打开任意一个 txt 标签,看坐标值是否都在 0 到 1 之间。如果有大于 1 的数值,立即停止训练,用脚本把标签统一归一化回来。
5.4 增强后的数据导致过拟合更严重
- 现象:加了翻转和噪声增强后,训练集 loss 降得很好,但验证 mAP 不升反降,而且比不加增强更差。
- 原因:常见错在把增强后的图片同时放进了训练集和验证集。验证集里出现过跟训练集几乎一致的翻转图,模型相当于开卷考试,指标虚高;但真实场景没有这种"增强后等价样本",部署时立刻现形。
- 解决:数据划分必须在增强之前完成,增强只对训练集操作,验证集保持原始图。这份数据集是划分好的,不要自行从 train 里复制图片补进 val,也不要在 val 上做任何增强。
5.5 检测结果里"正常"误报率奇高
- 现象:推理时大量正常瓷砖被画上框,precision 跌到没法看。
- 原因:训练时
batch size和epochs搭配不合理,或者训练集里正常类别的占比远高于裂缝,模型学会了"只要有纹理就报警"的偷懒策略。 - 解决:先看
results.png里的 PR 曲线,把推理置信度阈值从默认的 0.25 调高到 0.4 到 0.5,能压掉一批误检;如果还压不住,需要适当补充负样本,让模型看到更多"有纹理但不是裂缝"的图。
6. 进阶:增强叠加、置信度阈值与验证集拆分的实用技巧
数据集能直接训练只是起点,做缺陷检测的人真正要解决的是"生产环境下能不能用"。后面这部分不需要改标签,只要掌握三个技巧,就能让这套数据发挥更大价值。
第一,增强叠加。单张图的翻转和噪声只能算基础。实际的产线光照变化大,可以使用 Mosaic 和 MixUp 这类更强的增强策略,YOLOv5 默认就开了 Mosaic,训练时它会自动组合四张图,对裂缝这类小目标尤其有效。自己扩数据的话,注意不要做任何改变语义关系的位置变换,比如裁剪后不改标签、旋转 90 度后不改框,这类"标签错位"问题会导致标注信息失效。
第二,置信度阈值调整。推理命令里用--conf-thres控制置信度阈值:
python detect.py --source ./test_images --weights runs/train/exp/weights/best.pt --conf-thres 0.35生产环境误报造成的影响一般比漏检更严重。误报会让产线频繁停机复查,所以我会先从 0.35 开始,看误报率,再逐步提到 0.5。如果调高阈值后误报降下来了,但漏检变多了,说明模型能力本身不足,优先考虑增加裂缝训练样本,而不是继续优化阈值。
第三,验证集划分。这份数据已经分好训练验证集,但我每次拿到新图准备扩展训练时,都会强制走一遍"先划分再增强"的流程:先把新图按 8:2 拆成训练和验证,再对训练部分做增强。这样做的好处是验证集永远保持真实采样分布,模型评估结果更接近部署表现。
我自己的习惯是每拿到一批新图,先跑一次全量可视化,随机抽 20 张看标签和图像是否对得上,再写训练。这套流程看起来多花了十分钟,实际省掉了大量训练后才发现标签错的返工时间。数据集的标签和目录已经替你省了最耗时的一步,剩下来的就是把它用对、用好,希望这些思路能帮你在瓷砖裂缝这条路上少走点弯路。
本文还有配套的精品资源,点击获取