尧图精选

3127张墙体裂纹数据集:YOLO目标检测训练与部署全流程

🕒 发布时间:2026/10/1 6:26:44 📁 来源:尧图网络
简介这份资源是面向建筑安全检测、计算机视觉方向的开发者与研究人员整理的YOLO算法房屋墙体裂纹检测数据集可用于训练和验证目标检测模型解决墙体缺陷识别中样本不足、标注缺失的问题。压缩包共2000个文件以XML标注文件为主对应3127张墙体图像涵盖裂纹、模具、渗水、阶梯裂缝、油漆剥落等多类缺陷标注信息详细记录了缺陷位置与类别整体约240.5MB便于直接接入YOLO训练流程。目前已有387人学习下载。数据集覆盖多种常见墙体病害场景标注质量与一致性较好能帮助读者省去繁琐的数据采集与手工标注环节快速搭建缺陷检测实验、对比不同模型效果并为建筑健康监测与维护提供可复用的数据基础。1. 3127 张墙体裂纹图为什么值得单独跑一遍 YOLO去年帮一个做旧房改造评估的朋友处理巡检照片他手里攒了三千多张墙面图裂纹、渗水、油漆剥落混在一起人工分类分到第三天才分完一半。后来我拿这批图跑了一遍 YOLO从标注格式转换到训练收敛前后不到两天。这件事让我意识到房屋墙体病害检测这个场景公开可用的带标签数据集其实非常稀缺大部分团队要么自己拍自己标要么拿通用缺陷数据集凑合效果总差一口气。这份 3127 张图像带标签的房屋墙体裂纹检测数据集覆盖了裂纹、模具、渗水、阶梯裂缝、油漆剥落五类常见墙体病害每张图都有对应的标注文件。它解决的核心问题不是“有没有数据”而是“数据能不能直接喂给 YOLO 系列模型跑起来”。适合做建筑巡检、老旧小区改造评估、房屋安全鉴定相关方向的同学也适合想拿一个真实场景数据集练手 YOLO 训练全流程的工程师。下面我从数据组织、格式转换、训练配置到踩坑排查把这条链路拆开讲一遍。2. 数据集结构与 YOLO 格式对齐从原始标注到可训练标签2.1 五类病害的标注逻辑与类别定义拿到一个带标签的数据集第一件事不是急着写训练脚本而是先把标注文件打开看几眼。这份数据集的五类目标——裂纹、模具、渗水、阶梯裂缝、油漆剥落——在视觉特征上差异很大。裂纹通常是细长线条模具偏向块状色斑渗水是边缘模糊的扩散区域阶梯裂缝呈锯齿状油漆剥落则是大面积不规则脱落。这种类间差异意味着模型需要同时学到线条、块状和纹理三种特征对 YOLO 的多尺度检测能力是个不错的考验。常见做法是先确认标注格式。如果标注是 XMLVOC 格式需要转成 YOLO 的 txt 格式如果已经是 txt就要检查每行的类别索引是否从 0 开始、坐标是否归一化到 0 到 1 之间。我一般会写一个小脚本先统计每个类别的实例数量看看有没有严重的长尾问题。比如裂纹可能有上千个实例而阶梯裂缝只有几十个这种不平衡会直接影响训练时的损失权重。import os from collections import Counter # 统计 YOLO 格式标注中每个类别的实例数 label_dir labels/train class_names [crack, mold, seepage, stair_crack, paint_peel] counter Counter() for txt_file in os.listdir(label_dir): if not txt_file.endswith(.txt): continue with open(os.path.join(label_dir, txt_file), r) as f: for line in f: parts line.strip().split() if len(parts) 5: cls_id int(parts[0]) counter[cls_id] 1 for cls_id, count in sorted(counter.items()): print(f{class_names[cls_id]}: {count} instances)这段代码遍历训练集标注目录逐行读取类别索引并累加计数。参数上只需要改label_dir和class_names两个地方类别名顺序必须和标注时的定义一致。跑完之后如果发现某个类别实例数低于总实例数的 5%就要考虑在训练配置里加类别权重或者用过采样策略补一下。2.2 目录划分与 data.yaml 配置YOLO 训练对目录结构有固定要求images 和 labels 分开存放各自再分 train、val、test 三个子集。这份数据集如果已经分好了直接确认路径即可如果没分我一般按 7:2:1 的比例随机划分同时保证每个子集里五类病害都有出现。划分脚本里要固定随机种子不然每次跑出来的验证集不一样指标就没法对比。import os import random import shutil random.seed(42) image_dir images/all label_dir labels/all output_base dataset # 按 7:2:1 划分 train/val/test all_files [f for f in os.listdir(image_dir) if f.endswith(.jpg)] random.shuffle(all_files) n len(all_files) train_files all_files[:int(n * 0.7)] val_files all_files[int(n * 0.7):int(n * 0.9)] test_files all_files[int(n * 0.9):] for split, files in [(train, train_files), (val, val_files), (test, test_files)]: os.makedirs(f{output_base}/images/{split}, exist_okTrue) os.makedirs(f{output_base}/labels/{split}, exist_okTrue) for f in files: shutil.copy(os.path.join(image_dir, f), f{output_base}/images/{split}/{f}) label_name f.replace(.jpg, .txt) src_label os.path.join(label_dir, label_name) if os.path.exists(src_label): shutil.copy(src_label, f{output_base}/labels/{split}/{label_name})划分完成后需要写一个data.yaml告诉 YOLO 去哪里找数据和类别名。这个文件虽然简单但路径写错是新手最常见的翻车点之一。path: ./dataset train: images/train val: images/val test: images/test nc: 5 names: 0: crack 1: mold 2: seepage 3: stair_crack 4: paint_peelpath是数据集根目录train、val、test是相对路径。nc必须和 names 的长度一致names 的顺序必须和标注文件里的类别索引严格对应。我见过有人把 names 顺序写反了训练出来的模型把裂纹识别成渗水排查了半天才发现是 yaml 写错了。2.3 标注质量抽检三招快速判断能不能用数据集能不能直接训练标注质量是关键。我一般用三个方法快速抽检第一随机抽 20 张图用脚本把标注框画到图上肉眼看框有没有明显偏移或漏标第二检查有没有宽高为 0 的无效框第三看同一张图里有没有大量重叠框重叠过多说明标注时可能重复标了。import cv2 def draw_boxes(image_path, label_path, class_names): img cv2.imread(image_path) h, w img.shape[:2] with open(label_path, r) as f: for line in f: parts line.strip().split() if len(parts) 5: continue cls_id, cx, cy, bw, bh int(parts[0]), *map(float, parts[1:5]) x1 int((cx - bw / 2) * w) y1 int((cy - bh / 2) * h) x2 int((cx bw / 2) * w) y2 int((cy bh / 2) * h) cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.putText(img, class_names[cls_id], (x1, y1 - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 1) cv2.imwrite(check_output.jpg, img)这段代码把归一化坐标还原成像素坐标并画框class_names传入类别名列表即可。抽检时重点看细长裂纹有没有被框完整渗水区域的边界框是否过大。如果发现某类病害的框普遍偏大或偏小说明标注标准不统一训练前最好统一修正一遍。3. YOLO 训练配置从预训练权重到收敛判据3.1 模型选型YOLOv8n 还是 YOLOv8s这份数据集 3127 张图五类目标规模不算大。我一般会先用 YOLOv8n 跑一版基线因为 nano 版本参数量小、训练快适合快速验证数据质量和标注格式有没有问题。如果基线跑出来 mAP50 能到 0.6 以上再换 YOLOv8s 或 YOLOv8m 看能不能进一步提升。直接上大模型不是不行但一旦数据有问题大模型训练慢排查成本高。模型参数量适用场景建议 batchYOLOv8n3.2M快速验证、边缘部署16YOLOv8s11.2M精度与速度平衡16YOLOv8m25.9M精度优先、服务器训练8选型时还要看显存。8GB 显存跑 YOLOv8s 加 batch 16 基本够用如果报显存不足先把 batch 降到 8同时把imgsz从 640 降到 512 试试。不要一上来就改模型结构大部分显存问题都是 batch 和输入尺寸引起的。3.2 训练命令与关键参数含义YOLOv8 的训练入口很简洁一条命令就能跑起来但参数怎么设直接决定收敛效果。下面是我常用的训练命令基于 ultralytics 框架。yolo detect train \ datadataset/data.yaml \ modelyolov8s.pt \ epochs100 \ imgsz640 \ batch16 \ lr00.01 \ lrf0.01 \ patience20 \ device0 \ projectruns/wall_crack \ nameexp1data指向前面写好的 yaml 文件。model用预训练权重常见做法是下载yolov8s.pt放在项目根目录训练时会自动加载。epochs100是上限实际训练中如果patience20内验证指标没提升就会提前停止。lr0是初始学习率lrf是最终学习率比例两者配合余弦退火策略使用。imgsz640是输入分辨率墙体裂纹这种细长目标不建议低于 512否则小裂纹容易漏检。训练过程中重点看三个指标box_loss是否稳定下降、mAP50是否持续上升、cls_loss有没有剧烈震荡。如果box_loss降到 0.5 以下但mAP50卡在 0.3 不动大概率是标注框和实际目标对不齐需要回到第 2 章重新抽检标注。3.3 数据增强策略针对墙体病害的调整YOLO 默认开启 mosaic、HSV 抖动、随机翻转等增强。对墙体裂纹数据集来说mosaic 增强能提升小目标检测能力但要注意它会把四张图拼在一起如果裂纹本身就很细拼接后可能变得更难识别。我一般会在训练后期关闭 mosaic让模型在真实分布上微调。from ultralytics import YOLO model YOLO(yolov8s.pt) model.train( datadataset/data.yaml, epochs100, imgsz640, batch16, mosaic0.5, # 前 80% epoch 开启后期衰减 close_mosaic20, # 最后 20 个 epoch 关闭 mosaic hsv_h0.015, # 色调抖动模拟不同光照 hsv_s0.7, # 饱和度抖动 hsv_v0.4, # 亮度抖动 degrees10.0, # 随机旋转角度 translate0.1, # 随机平移 scale0.5, # 随机缩放 )close_mosaic20表示最后 20 个 epoch 关闭 mosaic这个参数对细长目标检测提升明显。hsv_h、hsv_s、hsv_v控制颜色抖动幅度墙体照片在不同光照下色温差异大适当加大饱和度抖动有助于泛化。degrees10是旋转角度房屋巡检照片一般不会有大角度旋转设太大反而引入噪声。4. 训练结果解读与常见问题排查4.1 混淆矩阵怎么看裂纹和阶梯裂缝为什么容易混训练完成后runs/wall_crack/exp1/目录下会生成混淆矩阵图。这份数据集里裂纹和阶梯裂缝在视觉上都是线条状模型容易把两者搞混。如果混淆矩阵显示裂纹有 20% 被预测成阶梯裂缝说明这两类的特征区分度不够。解决办法有两个一是检查标注时这两类的定义是否清晰二是考虑把两类合并成一类“线性裂缝”或者加更多阶梯裂缝的样本。渗水和油漆剥落也容易混因为两者都表现为墙面颜色异常。区分点在于渗水边缘模糊、颜色偏深油漆剥落边缘清晰、颜色偏浅。如果混淆严重可以在数据增强里加一些对比度调整让模型更关注纹理差异。4.2 验证指标异常时的排查顺序训练跑完发现mAP50只有 0.2 或者box_loss不下降按下面顺序排查第一步确认data.yaml里的路径和类别数是否正确。路径写错会导致模型加载不到标注loss 直接不降。第二步抽检标注文件看坐标是否归一化、类别索引是否越界。第三步检查图片和标注是否一一对应有没有图片没有对应 txt 文件的情况。第四步看学习率是不是太大lr00.01对小数据集可能偏高可以降到 0.001 试试。第五步确认预训练权重是否加载成功如果modelyolov8s.pt但文件不存在框架会从头训练收敛会慢很多。4.3 显存不足与训练中断的恢复训练中途报 CUDA out of memory先把 batch 减半同时把imgsz降到 512。如果还是不够用ampFalse关闭混合精度训练但这样显存占用会更大一般不推荐。另一个常见问题是训练被中断后想接着跑YOLO 支持resumeTrue从上次断点继续。yolo detect train resume modelruns/wall_crack/exp1/weights/last.ptresume会读取last.pt里的优化器状态和 epoch 信息继续训练。注意last.pt是最近一个 epoch 的权重best.pt是验证指标最好的权重恢复训练用last.pt推理部署用best.pt。5. 推理部署与效果验证从单图测试到批量巡检5.1 单图推理与置信度阈值调整训练完拿到best.pt先别急着批量跑找几张验证集里的图做单图推理看看框的位置和类别对不对。from ultralytics import YOLO model YOLO(runs/wall_crack/exp1/weights/best.pt) results model.predict( sourcedataset/images/val, conf0.25, # 置信度阈值 iou0.45, # NMS IoU 阈值 saveTrue, projectruns/predict, nameval_check )conf0.25是默认置信度阈值墙体裂纹检测里如果漏检多可以降到 0.15 试试如果误检多提到 0.4。iou0.45控制 NMS 合并框的力度裂纹密集区域可以适当降低避免相邻裂纹被合并成一个框。推理结果会保存在runs/predict/val_check/下逐张打开看重点检查细长裂纹有没有被漏掉。5.2 批量巡检脚本把检测结果落成表格实际巡检场景里需要把每张图的检测结果整理成表格方便后续统计和存档。下面这个脚本遍历指定目录输出每张图的病害类别、数量和置信度。import os import csv from ultralytics import YOLO model YOLO(runs/wall_crack/exp1/weights/best.pt) image_dir dataset/images/test class_names [crack, mold, seepage, stair_crack, paint_peel] with open(inspection_report.csv, w, newline) as f: writer csv.writer(f) writer.writerow([image, class, count, avg_conf]) for img_name in os.listdir(image_dir): if not img_name.endswith(.jpg): continue results model.predict(os.path.join(image_dir, img_name), conf0.25, verboseFalse) cls_count {} cls_conf {} for box in results[0].boxes: cls_id int(box.cls[0]) conf float(box.conf[0]) cls_count[cls_id] cls_count.get(cls_id, 0) 1 cls_conf.setdefault(cls_id, []).append(conf) for cls_id, count in cls_count.items(): avg_conf sum(cls_conf[cls_id]) / len(cls_conf[cls_id]) writer.writerow([img_name, class_names[cls_id], count, round(avg_conf, 3)])这段代码输出一个 CSV 文件每行记录一张图里某类病害的数量和平均置信度。conf0.25可以根据实际漏检情况调整verboseFalse关掉每张图的详细日志批量跑的时候更清爽。拿到 CSV 后按图片分组统计就能快速看出哪些墙面病害最严重。5.3 效果验证用测试集指标判断能不能上线推理效果好不好不能只看几张图要用测试集跑一遍指标。YOLO 的val模式可以直接在测试集上评估。yolo detect val modelruns/wall_crack/exp1/weights/best.pt datadataset/data.yaml splittest重点看mAP50和mAP50-95两个指标。mAP50反映模型在宽松 IoU 下的检测能力mAP50-95更严格。墙体裂纹检测里如果mAP50到 0.7 以上、mAP50-95到 0.4 以上基本可以拿去实际巡检场景试用了。如果mAP50高但mAP50-95低说明框的位置不够准需要回到标注环节检查框的贴合度。还有一个容易忽略的点推理速度。用yolo detect val时留意每张图的推理耗时YOLOv8s 在 640 分辨率下GPU 上一般 10ms 以内CPU 上可能到 100ms 以上。如果部署环境是边缘设备建议导出 ONNX 或 TensorRT 格式再测一遍速度。yolo export modelruns/wall_crack/exp1/weights/best.pt formatonnx imgsz640导出 ONNX 后可以用 onnxruntime 加载推理速度比 PyTorch 原生推理快不少。导出时imgsz要和训练时一致否则精度会掉。如果部署到 TensorRT还要注意 CUDA 版本和 TensorRT 版本的匹配这个坑我踩过不止一次版本对不上直接报错排查起来很费时间。从那以后我每次拿到新数据集都强制先跑一遍标注抽检和基线训练确认数据没问题再上大模型。希望这份 3127 张墙体裂纹数据集能帮你省掉自己拍图标注的时间把精力放在模型调优和业务落地上。本文还有配套的精品资源点击获取
上一篇/下一篇内容由系统自动关联 返回资讯列表 →