YOLO瓷砖裂缝检测数据集:从划分、标签到可视化验证全流程
发布时间:2026/10/1 17:22:03来源:尧图网络
简介面向目标检测入门与工业质检场景的YOLO格式瓷砖缺陷数据集包含约1700张标注图片共裂缝、正常两个类别适合用于瓷砖表面裂缝识别模型的训练与验证。图片与标签文本分别保存在不同目录标注由LabelImg完成标签为txt格式并已对部分数据做翻转、添加噪声等增强处理可直接投入YOLO系列模型训练。压缩包内共2000个文件其中1765个txt标注文件、234个jpg图像及1个数据可视化py脚本整体约91.75MB目录结构清晰classes.txt明确类别对应关系。附带可视化脚本无需改动即可运行随机传入一张图片即可输出带边界框的标注结果便于快速核查标签质量。目前已有193人学习下载适合需要现成数据集进行裂缝检测实验、YOLOv5改进或目标检测入门练习的读者也可用于学习数据增强与标注格式转换。1. 这块瓷砖数据集是什么一个能直接进训练流程的“2类裂缝检测包”做瓷砖表面缺陷检测的人拿到手的第一份资源往往不是模型而是一份划分好的 YOLO 数据集。标题里这个包解决的就是“从数据到可训练”这一步2 个类别通常是长条形的裂纹crack和边缘崩角或表面破口chip图片按 train / val / test 分好附带类别 class 文件和一套数据可视化脚本。也就是说解压之后不用再花一晚上整理目录、写转换脚本直接用 YOLO 训练命令就能跑起来。这套东西适合谁一类是刚入手 YOLO 的工程师想在建自己的数据集之前先看一份规范样本长什么样另一类是已经标了一批瓷砖图片但不会划分、不会检查标注的团队拿这份目录和脚本当模板改一改就能复用。关键不在于图片数量多大而在于流程完整数据划分干净、class 文件和标签一一对应、可视化脚本能把标注质量摊开给人看。训练深度学习模型之前至少要有一次“肉眼审查标注”的机会这个包里的脚本就是干这个的。2. 翻开划分好的数据集目录结构、class 文件与标签格式2.1 先看清 train / val / test 三件套的落位解压后第一件事不是急着训模型而是先把目录结构完整看一遍。常见做法是 YOLO 系列统一的数据布局images下按train / val / test分子目录labels下同名子目录标签和图片通过“同名不同后缀”对应。比如一张IMG_001.jpg的标注必然在同级 labels 目录下能找到IMG_001.txt。用一条命令就能把骨架看明白tree -L 2 --dirsfirst # 期望看到类似输出 # . # ├── classes.txt # ├── images # │ ├── test # │ ├── train # │ └── val # ├── labels # │ ├── test # │ ├── train # │ └── val # ├── visualize.py # └── data.yaml这里classes.txt就是标题里说的类别 class 文件visualize.py是可视化脚本data.yaml是训练时给 YOLO 吃的配置。很多新手下意识以为train / val / test比例越接近越好其实对瓷砖裂缝这种缺陷检测三类场景分布差异很大尤其是光照不均、表面纹理干扰多的批次必须保证 val 和 test 里也有这些困难样本而不是只放在 train 里。划分比例的常见做法是 7 : 2 : 1 或 8 : 1 : 1。比例本身不是难点难在划分时要把同一块瓷砖的不同视角图片放进同一个集合里。否则一张瓷砖的粗裂纹出现在 train它的另一个视角切片却出现在 testval 阶段指标虚高训出来的模型到了产线一测就原形毕露。2.2 class 文件命名与实际图片标注顺序不一致的后果class 文件看起来只有两行文本但它的顺序直接决定了模型学到的类别是什么。YOLO 的标签文件里每条记录的第一个数字是类别索引这个索引按classes.txt的“行号”来算第一行是 0第二行是 1。不是按类别名字的拼音或首字母排序也不是按你在标注软件里看列表时的视觉顺序。常见翻车现场是一个数据集在 Roboflow 上标注时类别叫crack和chip导出时顺序是crack在前、chip在后另一个人拿到手以后为了让名字“更好看”把classes.txt改成了chip在前、crack在后但 labels 目录里几千个 txt 文件的索引没跟着改。于是原本标注为 chip 的框训练时被当成了 crack整个模型类别语义颠倒val 曲线再好也是假的。先检查再动手两步到位# 1. 看 class 文件内容 cat classes.txt # crack # chip # 2. 抽查 labels/train 里任意一个 txt 的类别索引分布 awk {print $1} labels/train/*.txt | sort | uniq -c # 期望看到 0 和 1 都有出现确认图片里两种缺陷都标了如果第二步统计出来只有 0 或者只有 1先别怀疑数据有问题要回到图片上确认是不是确实只包含单类缺陷。瓷砖数据集里这种情况挺常见一批次只裂不崩另一批次只崩不裂单一批次抽查不到另一类是正常的。2.3 label 文件一条记录一个框YOLO 标签的格式是每行一个目标规范是五列class_id x_center y_center width height后四列全部是归一化坐标范围在 0 到 1 之间相对于图片的宽和高计算不是像素值。举例来说一张 1920 x 1080 的图片里某个裂缝框的左上角在像素 (600, 300)右下角在 (1200, 700)换算后中心点是 ((6001200)/2 / 1920, (300700)/2 / 1080)宽是 (1200-600)/1920高是 (700-300)/1080。这个换算逻辑是可视化脚本的基础几乎所有排查都要基于它展开。用一段短命令快速扫描异常标签是省时间的做法# 找出坐标越界的标签行 awk { if ($2 0 || $2 1 || $3 0 || $3 1 || $4 0 || $4 1 || $5 0 || $5 1) print FILENAME: $0 } labels/train/*.txt没有输出就是正常。这里特别提醒YOLO 标签允许目标紧贴图片边缘所以中心点坐标可以非常接近 0 或 1宽度也可能接近 1这本身不是错误但只要出现负值基本是标注软件导出 bug 或手工改坏了训练时轻则报 warning重则 loss 直接飞掉。见到这类文件最快的解决办法是删除对应图片和标签而不是试图去修坐标一张两张的丢弃对模型影响可以忽略。3. 可视化脚本在训练前把标注质量摊开来看3.1 用 OpenCV 叠加边界框标题里特意点出的“数据可视化脚本”本质上解决的是信任问题。标签文件是纯数字没人能靠读 txt 判断标注准不准可视化脚本把这些数字还原成图片上的彩色框一眼就能看出裂缝位置对不对、框体是否把纹理误当成了裂纹。这段脚本是一个最小实现也是绝大多数数据集自带脚本的底层逻辑import cv2 import os image_dir images/train label_dir labels/train output_dir visual_check os.makedirs(output_dir, exist_okTrue) for img_name in os.listdir(image_dir): if not img_name.endswith(.jpg): continue img_path os.path.join(image_dir, img_name) label_path os.path.join(label_dir, img_name.replace(.jpg, .txt)) img cv2.imread(img_path) img_h, img_w img.shape[:2] with open(label_path, r, encodingutf-8) as f: lines f.readlines() for line in lines: parts line.strip().split() if len(parts) 5: continue cls_id, xc, yc, w, h map(float, parts[:5]) # 从归一化坐标换算回像素坐标 x1 int((xc - w / 2) * img_w) y1 int((yc - h / 2) * img_h) x2 int((xc w / 2) * img_w) y2 int((yc h / 2) * img_h) # 边缘像素保护防止画出图外 x1, y1 max(0, x1), max(0, y1) x2, y2 min(img_w - 1, x2), min(img_h - 1, y2) color (0, 0, 255) if int(cls_id) 0 else (0, 255, 255) cv2.rectangle(img, (x1, y1), (x2, y2), color, 2) cv2.putText(img, str(int(cls_id)), (x1, y1 - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.6, color, 2) out_path os.path.join(output_dir, img_name) cv2.imwrite(out_path, img) if os.path.getsize(out_path) 1024: print(f可疑文件输出图片过小: {img_name})这段脚本逻辑分成三步读图、读标签、画框。类别索引 0 用红色1 用黄色实际使用中颜色自己定义即可重点看两个参数color用于区分类别thickness2是边框粗细。瓷砖裂纹通常细长如果线宽太大会盖住裂缝本体肉眼检查时反而不容易判断框和裂纹边缘是否贴合所以瓷砖这类小目标场景我一般把 thickness 设为 1 或 2。3.2 用类别分布柱状图发现类别失衡画框只能看到单张图的质量看不到整个数据集的分布。两份数据集在“视觉上都能看到裂缝”和“可训练程度”之间差别很大一个典型变量是每个类别到底有多少个目标框。只画框不统计容易漏掉类别失衡的问题。import os import matplotlib.pyplot as plt label_dir labels/train class_names [crack, chip] counts {0: 0, 1: 0} for txt_name in os.listdir(label_dir): if not txt_name.endswith(.txt): continue with open(os.path.join(label_dir, txt_name), r, encodingutf-8) as f: for line in f: parts line.strip().split() if len(parts) 1: cls_id int(parts[0]) counts[cls_id] counts.get(cls_id, 0) 1 plt.bar(class_names, [counts[0], counts[1]]) plt.title(Training Set Class Distribution) plt.ylabel(Object Count) plt.tight_layout() plt.savefig(class_distribution.png, dpi150)跑完看一眼柱状图如果 crack 有 3000 个框而 chip 只有 180 个相差接近 17 倍这就是典型的长尾分布。应对方法通常有两个一是用--cls损失权重让模型更关注少样本类别二是对 chip 类别做离线复制增强。两种方法的细节在第 5 章展开这里先得出“是否失衡”的结论。3.3 可视化脚本的入参与可调项一个工程上能反复用的可视化脚本应当支持命令行参数而不是改代码换目录。常见做法是给脚本加四个参数--image_dir、--label_dir、--output_dir、--class_file。这样做的好处是 train / val / test 三个集合都能复用同一个脚本不用复制三份代码。--class_file是一个关键参数脚本从 class 文件读取类别名而不是写死在代码里。这样即使 class 文件被更新脚本无需改动。python visualize.py \ --image_dir images/train \ --label_dir labels/train \ --output_dir visual_check/train \ --class_file classes.txt另一个容易被忽视的是图片后缀匹配。瓷砖数据集可能混着.jpg和.png脚本里如果只匹配一个后缀另一个格式的图片会被静默跳过你看到全部可视化结果但实际只覆盖了部分数据。更稳妥的做法是直接匹配 label 文件名再反查图片是否存在for label_name in os.listdir(label_dir): base os.path.splitext(label_name)[0] img_path os.path.join(image_dir, base .jpg) if not os.path.exists(img_path): img_path os.path.join(image_dir, base .png) if not os.path.exists(img_path): print(f标签存在但图片缺失: {label_name}) continue这样能顺手查出“孤儿标签”——有 txt 无图片的脏数据。这类文件在训练时不会直接报错但会让 val 阶段的目标数量统计失真等到发现指标对不上时已经浪费了一轮训练。4. 实战避坑跑 YOLO 训练时最容易卡住的 4 个细节4.1 图片是 BGR、标签是归一化——别指望肉眼直读现象可视化脚本画出来的框位置整体偏移或者色彩明显不对裂纹明明是灰白色的却偏蓝偏绿。原因OpenCV 的cv2.imread读进来的是 BGR 通道顺序可视化脚本如果直接用plt.imshow显示红蓝通道互换颜色全乱边界框偏移则是因为标签坐标是归一化值脚本忘了乘图片宽高。解决显示前做一次通道转换cv2.cvtColor(img, cv2.COLOR_BGR2RGB)换算坐标时严格按xc * img_w和yc * img_h计算宽度和高度分别乘对应轴的尺寸不要图省事统一乘一个值。这不是玄学是每个跑过目标检测的人都踩过的同一块石头。4.2 class 文件顺序变动导致模型学到的类别张冠李戴现象训练跑完val 精度看着不错打开推理结果发现红色框全标在崩角上黄色框全标在裂纹上整个类别语义对调。原因某个环节改过classes.txt的行顺序但没有同步修改 labels 目录里成千上万个 txt 文件第一列的索引。YOLO 训练时类别名只从classes.txt里读它不关心图片里原来叫 crack 还是 chip完全按索引号对齐。解决训练前做一次全量抽查用第 2.2 节里的awk命令统计每个类别的框数量然后和 class 文件逐行对应确认。最保险的是在数据准备阶段就固定 class 文件顺序之后任何环节都不允许改动除非重新生成标签。4.3 数据划分后文件数量对不上现象images/train 里有 800 张图labels/train 里只有 760 个 txt或者反过来 labels 里多出几十个没有对应图片的标签。原因很多人划分数据是直接在图片文件夹里按比例随机挑文件复制到 train 目录后忘记把对应的 txt 一起带过去。图片是 jpg、标签是 txt后缀不同文件管理器里排序规律不同批量操作时很容易遗漏。解决划分数据集要基于“主文件名”而不是文件类型。用脚本遍历 labels 目录文件名去 images 里反查同名文件是否存在缺失的列一张清单统一补齐如果图片本身已经无法找回就把孤儿标签清掉保证两边都是 766 张。4.4 碰到缺失或损坏图片现象训练在某个 epoch 突然中断报错信息指向cv2.imread返回 None后面跟着一个奇怪的图片文件名。原因图片文件后缀是.jpg但实际内容损坏或者文件大小为 0。OpenCV 读不进来返回 None数据加载器没做防御程序直接崩溃。解决训练前用一条命令全量体检损坏图片尽量直接删除或重拷find images -name *.jpg -size 0 -delete python -c import cv2, glob bad [] for p in glob.glob(images/**/*.jpg, recursiveTrue): if cv2.imread(p) is None: bad.append(p) print(\n.join(bad)) 这段脚本把imread失败的图片列出来执行前提是已经确认这些图片不重要只做体检不做恢复。更稳妥的做法是在训练数据加载器里加try/except跳过坏图但这属于“后悔药”不推荐作为首要防线。数据进入训练流程之前必须先让每条样本可读、坐标合法、类别索引对应。5. 进阶用可视化结果反向微调训练集两处改动就能压住裂缝漏检5.1 先给少样本类别加权重可视化脚本跑完最容易得到的结论就是类别失衡。瓷砖场景里裂缝条数通常远多于崩角模型训练时倾向把模糊的崩角也预测成裂缝。YOLOv8 / YOLO11 风格的新版训练入口可以在 data yaml 里直接指定权重矩阵。例如 chip 只有 crack 的 1/10把loss_weights设为[1.0, 3.0]让模型对少样本类别的误判付出更高代价。这个参数不是越大越好。之前见过有人把少样本类别权重提到 10结果模型把所有高置信度预测都推向 chip泛化能力反而下降。从 2 到 3 起步观察 val 类别精度如果 chip 的 recall 明显上升而 precision 没有崩再继续加。5.2 把可视化结果里的难例筛出来单独验证可视化脚本真正值钱的地方是让你看见“模型即将看到什么”。我在实际项目中会把框压着裂缝边缘、框体跨过砖缝纹理、光照极暗导致裂缝几乎看不清的图片单独拷到一个hard_examples目录用这些图片而不是 val 全集做推理测试。效果很直接模型在全量 val 上 mAP 挺高但拿 hard examples 一测就现原形这个模型到了现场大概率翻车。具体节奏是先跑一次可视化挑 20 到 30 张难例训完一个版本后立刻推理这些难例看裂缝的中段是否断开、相邻两条裂纹是否被合并成一个大框。哪里断框就用第 3.1 节标记缺陷位置拿到第 5.1 节的权重里侧重复试。“数据可视化 hard example 回归”这套组合比只看训练曲线可靠得多因为训练曲线只告诉你 loss 在降不告诉你实际场景里有哪些裂缝没被找出来。5.3 最后顺手做的一件事保存 val 可视化对比图训练到一个阶段后让可视化脚本跑在labels/val上再把模型推理 val 图片的结果也用同一套画框函数导出打到一个目录里按文件名对比。一边是标注框一边是预测框框重叠得齐不齐、预测框是不是把背景杂点也框了都一眼可见。这也是我长期比较认可的验证方式数值指标负责总结整体趋势可视化对比负责挑刺。做数据集的工程师很少纯粹“给别人提供数据”这份数据集最终是用来训练模型的模型能用可视化脚本自查质量数据集的复用价值才真正落地。按照这套流程把数据从解压、检查到训练首尾走通之后再遇到新的瓷砖纹理、新的缺陷形态你只需要改 class 文件、重跑可视化脚本、换掉一批困难样本整个闭环就能再次转起来。少踩几轮晕头转向的坑是我做这个方向最直接的收获希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网