ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

瓷砖裂缝YOLO数据集实战:从标签解析到训练避坑指南

瓷砖裂缝YOLO数据集实战:从标签解析到训练避坑指南 简介面向瓷砖质检与缺陷检测场景这款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, fcls_{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参数会把图像提前加载进内存第一次训练能明显加速但需要预留足够的 RAM8GB 内存的机器建议去掉这个参数。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 张看标签和图像是否对得上再写训练。这套流程看起来多花了十分钟实际省掉了大量训练后才发现标签错的返工时间。数据集的标签和目录已经替你省了最耗时的一步剩下来的就是把它用对、用好希望这些思路能帮你在瓷砖裂缝这条路上少走点弯路。本文还有配套的精品资源点击获取
返回列表