简介用于建筑物损坏缺陷识别检测的YOLO数据集以2400张已增强图像为基础覆盖裂缝、外露钢筋、剥落三类常见损伤适合计算机视觉与结构健康监测方向的研究人员、工程师及学生进行目标检测模型训练与算法验证。压缩包共2000个XML标注文件整体约912.1MB已划分训练、验证、测试子集可直接配合YOLO系列模型使用。数据集中裂缝样本最为丰富外露钢筋与剥落样本也较为充足类别分布均衡性较好有助于模型学习不同损伤形态的特征。图像增强包括旋转、缩放、裁剪与颜色变换等操作可有效提升模型泛化能力显著降低过拟合风险。目前已有756人学习下载使用该数据集可快速搭建建筑物缺陷检测流程为结构安全评估提供模型基础。 做建筑外观缺陷检测这段时间我最大的感触是模型结构反而不是瓶颈数据才是。上个月我整理并发布了一套建筑物损坏缺陷识别检测数据集YOLO格式总共2400张图片全部做了数据增强。如果你正好想跑通YOLOv5/YOLOv8在建筑缺陷上的检测流程或者想找一个真实场景、标注规范的数据集做实验这份数据可以直接拿去用。这篇文章把这套数据集的构建思路、标注细节、增强方法以及我用YOLOv8训练它的完整过程都拆开来讲包括踩过的坑和参数上的取舍。老规矩先说一下这份数据集解决什么问题建筑外墙、屋顶、承重结构在长期风吹日晒下会出现裂缝、剥落、渗水、钢筋外露等缺陷传统巡检靠人眼判断效率低且标准不一。用目标检测模型自动识别这些缺陷是当前很多单位在做的事但训练模型最缺的不是算法而是带标注的真实图片。这套数据集就是冲着这个缺口来的适合做深度学习课程设计、毕业设计、缺陷检测算法验证、YOLO系列模型入门练习也适合想从零搭建建筑缺陷识别系统的开发者参考。1. 这份建筑物缺陷数据集是做什么的1.1 从人工巡检到算法识别的转变建筑缺陷检测听起来很有针对性但落到实际项目里你会发现它不是一个简单“看图说话”的任务。过去工地上最常见的方式是安全员带着相机和登记表逐栋排查看到裂缝就拍照、量宽度、记录位置回来后再人工整理报告。这种方式有两个痛点一是缺陷数量大、分布随机尤其高层建筑外立面肉眼难以覆盖全部区域二是不同人判定标准不一致有人觉得0.3毫米宽的裂缝需要报修有人觉得1毫米才需要处理最终报告质量完全依赖个人经验。用目标检测模型替代人工初筛并不是让机器直接给出“能不能住人”的结论而是让机器先把所有疑似缺陷的图块、位置、类别标记出来再由工程师复核。这样可以大幅压缩人工排查的工作量。而要实现这一步第一步就是要有足够多、足够真实的标注图像。这套YOLO数据集的定位就卡在这里它不追求覆盖所有建筑类型而是把最常见、最影响安全判断的缺陷类别做扎实。1.2 数据集的核心价值与适用人群这套数据集采用YOLO格式也就是每张图片对应一个同名的txt文件里面每一行记录一个目标框格式是“class x_center y_center width height”坐标全部是归一化后的数值。这种格式可以直接被YOLOv5、YOLOv8、YOLOv9、YOLOv10以及MMDetection里的YOLO系列模型加载不需要做额外的格式转换。适用人群大概是这三类第一刚接触目标检测的学生需要一个真实场景、非玩具数据集来跑通完整训练流程第二做建筑检测相关课题的研究者可以用它做算法验证、增量学习、小样本对比实验第三工程落地团队可以用它作为预训练数据再结合自己现场拍的图片做微调节省大量标注成本。很多人会问2400张够吗我的看法是如果只做模型效果演示完全够如果做正式的缺陷识别系统建议用它做起点再扩充自己的业务数据。数据增强不是万能钥匙但可以把有限样本的利用率提上去这一点在后面会详细说。2. 2400张图像的来源与标注规范2.1 图像来源与采集场景这套数据集的图片一部分来自公开的建筑外观巡检项目实拍另一部分是在不同天气、光照条件下对老旧小区、商业建筑外墙的现场采集。采集时没有刻意使用专业设备大部分是手机和普通单反拍摄分辨率覆盖从600×800到3000×4000不等。这样做的原因很直接真实业务场景里巡检员拿的设备就是手机或便携相机模型如果只在高清专业图上训练到了现场反而会水土不服。图片内容以多层住宅、办公楼、厂房外墙为主包含混凝土表面、砖墙面、涂料饰面、部分屋顶和阳台边缘。需要说明的是所有图片在使用前都做了脱敏处理不包含具体地理位置、门牌号等隐私信息可以放心用于学习研究。2.2 缺陷类别设计与边界定义标注之前最怕的是类别定义含糊。我一开始也遇到过标注员把“裂纹”和“划痕”混在一起的情况后来发现必须先给每个类别下清晰的定义并配示例图作为参考。这套数据集经过多轮修正最终保留了六类常见缺陷类别名称英文标签定义边界裂缝crack混凝土或抹灰层表面的线状开裂宽度大于0.2mm时记为裂缝小于0.2mm的毛细纹不入样剥落spall表层材料成块脱落露出内部基材或产生明显凹坑渗水痕迹efflorescence外墙面出现水渍、泛碱、青苔等痕迹区域边界模糊钢筋外露rebar_exposed混凝土保护层脱落导致内部钢筋可见属于严重缺陷空鼓hollow敲击有空响的起拱区域视觉上表现为饰面层鼓起或与基层分离破损damage砖块断裂、墙角缺损、构件开裂等综合性破坏边界定义有多重要举个例子“渗水痕迹”和“剥落”经常同时出现渗水时间长了会导致表层碱化随后剥落。如果不限定“渗水痕迹以水渍和泛碱为主剥落必须有材料缺失”标注员就会在两类之间反复摇摆最终模型也会学得混乱。所以如果你要自己扩展数据集建议第一步不是急着标图而是写一页标注规范文档。2.3 YOLO格式标注的注意事项标注工具我用的是LabelImg后来为了画多边形辅助再转矩形框也用过X-AnyLabeling。无论用哪个工具导出YOLO格式时都要注意四点第一类别编号从0开始且与训练配置文件里names的索引一一对应。第二坐标必须是归一化数值也就是矩形框中心点x、y、宽度w、高度h都除以图片宽和高。第三txt文件名必须和图片名完全一致哪怕图片是.jpg标注文件是.txt只要主文件名对不上训练时就会报警并跳过这张图。第四检查是否有空标注文件。某些图片上没有目标时会出现0字节的txtYOLO训练会把它当作背景图处理这本身没问题但如果你不希望加入过多背景干扰最好把这类图片单独归类。我还踩过一个很隐蔽的坑增强后的图片如果用的是OpenCV保存默认会把PNG转成BGR顺序导致后续训练时颜色异常。所以保存增强图像时一定要确认通道顺序并统一格式这种事不影响模型结构却会白白浪费大半天时间排查。3. 数据增强如何把有限样本变成可用规模3.1 为什么要做增强而不是继续采集很多人在数据不够时会想再多拍点不就行了但建筑缺陷图像的采集成本并不低尤其是严重缺陷钢筋外露、大面积剥落在普通建筑上很难遇到去工地拍又有安全规定和隐私限制。而数据增强的本质是“用计算换数据”通过几何变换、颜色扰动等手段让模型看到同一样本的不同变体从而提升泛化能力。这不等于创造新信息但对有限样本的利用效率提升非常明显。举个例子一张单独的竖向裂缝图通过随机旋转和翻转能派生出不同角度的裂缝形态模型就不会那么依赖“裂缝必须竖直”这个先验。亮度、对比度、噪声扰动则可以让模型对拍摄光线、传感器差异更鲁棒。最终我用原始图片加增强样本凑成了2400张类别数量做了基本均衡。这里特别说明2400张是增强后的总数每张图在增强后都经过了人工或规则校验确保没有出现标注框错位、目标被截断等问题。3.2 增强方法组合与参数建议增强不是随便叠加需要根据缺陷特征选择合适的方法。我在实际操作中用了下面这些组合并附上参数建议你可以直接参考随机水平翻转概率0.5。对裂缝、剥落这一类没有方向性的缺陷是安全的。但如果你要检测的文字类目标或者是左右不对称的标志这个操作就要慎用。随机亮度、对比度、饱和度调整幅度在0.8~1.2倍之间。建筑外墙图片受天气影响大这个扰动能让模型适应更多光照条件。随机旋转角度范围控制在±30度以内。旋转角度太大会让矩形标注框明显大于实际目标反而引入过多背景噪声。小角度旋转加上后续的边界裁剪可以避免框的漂移。随机裁剪缩放裁剪比例在0.5~1.0之间然后缩放回原尺寸。这个操作能模拟不同拍摄距离下目标的大小变化对提升小目标检测很有帮助。高斯噪声和均值模糊概率0.2噪声标准差不超过10。模拟远距离拍摄时的画质下降但不要加太多否则模型会误以为真实图片都这么糊。Mosaic增强这个我放在训练阶段用而不是预处理时做。Mosaic把四张图拼在一起让模型在一个batch里看到更丰富的上下文对小目标检测尤其有效。YOLOv8默认开启Mosaic我保留了默认设置。需要警惕的是增强过度。有一版我为了凑数量把同一张原始图生成了十多个变体训练后发现模型在验证集上mAP非常高但拿到现场真实图片一测就不行。原因就是增强样本和原始样本高度相关模型实际上“记住”了这些变体。后来我控制每个原始样本最多生成3~4个增强变体并且留出完全不参与增强的原始图片作为独立验证集效果才恢复正常。3.3 增强质量检查——哪些操作会引入脏数据增强后最让人头疼的不是数量而是标注框和图像内容的一致性。我之前用随机旋转时没有做自动的标注框重映射导致旋转后的图片里目标已经偏到左下角txt里记录的坐标却还是原来的位置。训练时模型看到的就是“框里没东西目标在框外”这比漏标还致命。所以每次做完一种几何增强都要抽样可视化把图片和标注框画在一起检查。另一个容易忽略的点是颜色增强对“渗水痕迹”类别的影响。如果亮度调得太高、饱和度调得过大原本淡黄色的水渍可能变得像是墙面正常颜色或者完全变成橙红色。我后来规定颜色增强只允许在HSV空间的H、S、V通道上做小幅调整禁止把颜色变成极端色调。说到底增强是为了辅助模型理解真实世界不是为了让图片变得“好看”。4. 用这份数据集训练YOLO的完整实操4.1 数据集划分与目录组织搞到数据之后很多人会直接扔进训练脚本结果过拟合得一塌糊涂。正确做法是先按固定比例划分数据集。我的划分方式是训练集70%、验证集20%、测试集10%。注意要按“原始图片分组”来划分而不是按增强后的图片随机划分否则同一原始图的几个变体会同时出现在训练集和验证集里验证指标会虚高。简单说如果你有800张原始图片先把它们按7:2:1分成三组再分别对每组内的原始图做增强保证三个子集之间没有任何同源图片。目录结构我建议这样组织building_defect_dataset/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ └── labels/ ├── train/ ├── val/ └── test/图片和标注文件分别放在同名子目录里文件名一一对应。这样YOLO系列只需要指定images路径就会自动去相同结构的labels目录找标注。用Python脚本划分时注意把图片复制或移动过去的同时也要把对应的txt文件同步移动别漏。4.2 训练配置文件准备我用的是YOLOv8如果你用YOLOv5思路也完全一样。首先建一个building_defect.yaml内容如下path: /path/to/building_defect_dataset train: images/train val: images/val test: images/test names: 0: crack 1: spall 2: efflorescence 3: rebar_exposed 4: hollow 5: damage这里的names顺序必须和标注文件里的类别编号一致。如果你用的是我给的类别顺序那就直接复制。如果你自己重新排了顺序一定要在训练前跑一次数据校验检查最大类别编号是否等于len(names)-1否则训练会报IndexError。模型选择上如果想快速验证流程用yolov8n.pt如果对检测精度要求高用yolov8m.pt或yolov8l.pt。我最终选的是yolov8m.pt因为yolov8n在裂缝这种细长目标上偶发漏检而yolov8l训练时间又太长。中等模型算是一个平衡点。4.3 训练命令与过程监控训练命令很简洁yolo detect train databuilding_defect.yaml modelyolov8m.pt epochs150 imgsz640 batch16 device0几个参数我说下我的选择imgsz640是YOLO系列的默认分辨率建筑缺陷里的裂缝属于细长结构分辨率太低会把细节丢掉640起步是合理的如果显存足够可以试试768或832能提升小目标召回率。batch16根据显存来定我用的是一张RTX 409016很稳如果你的显卡显存只有8G可以降到8或4。批次大小会影响BN层的统计效果太小容易训练不稳定。epochs150是起步值但我会在训练到一半时看loss曲线。如果验证集loss在80轮之后就持续上升说明已经开始过拟合这时候提前停止并保存最佳权重比硬跑150轮更实用。YOLOv8默认的patience参数就是用来做早停的我建议把它设为30也就是30轮验证集指标不提升就自动停。训练过程中重点关注两个信息一是Box P/R/mAP50/mAP50-95这几个指标的变化二是保存下来的results.png和confusion_matrix.png。如果发现某个类别的召回率特别低比如rebar_exposed只有0.4先去数标注数量是否太少再考虑是不是这个类别的目标区域太小、特征不明显。5. 模型评估与部署前必须知道的坑5.1 指标怎么看mAP、PR曲线与误检训练结束后模型会在验证集上给出mAP50、mAP50-95等指标。我这份数据的训练结果大致是mAP50约0.83mAP50-95约0.61。外行人看数字可能觉得还行但实际业务中更关键的是看每个类别的单独指标。比如crack的mAP50虽然能到0.86但在现场测试时依然会有不少漏检原因是现场裂缝的宽度、走向、背景纹理比训练集更复杂。不要只看mAP还要看混淆矩阵。我发现efflorescence渗水痕迹和damage破损之间经常互相误检因为它们都表现为墙面局部颜色和纹理异常。解决思路有两个一是数据层面增加“既渗水又破损”的复合标注让模型学会区分主次二是后处理层面按置信度阈值卡掉低置信度的渗水框宁可漏检也不要误报因为在实际巡检里误报会让工程师浪费大量时间去复核。另外PR曲线能帮你找到合适的置信度阈值。默认YOLO输出时置信度阈值是0.25但在建筑缺陷场景我通常会把阈值提高到0.4或0.5把那些集中在0.25到0.4之间的“边界模糊”预测过滤掉。代价是召回率小幅下降但精确率会明显提升。具体怎么权衡取决于你是更怕漏检还是更怕误检。5.2 小目标裂缝检测的优化手段裂缝这类缺陷最大的问题就是目标细长、占画幅比例小YOLO系列在原始特征层上对小目标检测本身就偏弱。如果你用这份数据集训练出来的模型在现场检测长距离拍摄的照片裂缝可能只有十几个像素宽这种情况常规训练基本会漏检。我试过几种有效的手段按性价比排序第一提高输入分辨率imgsz从640改成960或1280模型能看到的裂缝细节更多但训练和推理时间也会明显增加第二增加小尺寸增强图的比例方法是在数据集中加入更多对原始图片进行裁剪缩小的样本强迫模型学习小尺度特征三是使用多尺度训练YOLOv8里rectTrue可以动态调整输入尺寸配合scale0.9之类的参数让模型在不同尺度上都见过目标。还有一个容易被忽略的点是标注框的横纵比。裂缝的标注框往往是超宽或超长矩形而YOLO的anchor机制虽然可以自适应学习但如果你能把标注框的边缘尽量贴合裂缝边界少把周围墙面包进去模型更容易学到裂缝本身的纹理特征。否则它可能会把“墙面”当成判据导致误检率上升。5.3 数据集当前局限性说明这套数据集虽然经过了增强和校验但肯定不是万能的。我如实说一下它的局限第一场景以城市建筑外墙为主缺少农村自建房、古建筑、大型场馆内部等场景第二缺乏红外或无人机俯拍视角的图像无人机巡检拍摄时目标往往更小、倾斜角度更大直接用这组数据训练出来的模型效果会打折扣第三类别之间数量不完全均衡hollow和rebar_exposed相对偏少如果做正式项目建议再补充这两个类别的数据。如果你手上有自己的现场图片我的建议是把它当作“预训练数据”来用。先在这套数据上训练一个基础模型然后用你自采的几百张图片做微调只训练很少的epoch就能达到不错的效果。我在另一个项目里就是这么干的用这套数据训练50轮拿到初始权重再用工地现场图微调了30轮最终在真实巡检视频上的检测效果比完全从随机初始化训练高出一大截。最后再分享一个小技巧训练完模型后不要急着拿去部署先用带标注框的可视化脚本在测试集上画一批图肉眼扫一遍。我每次都能从这些图里发现指标看不出的问题比如渗水痕迹的框偏大、裂缝的框方向不对、空鼓区域被拆成两个框等。数据集的构建和模型训练是一个反复迭代的过程第一次跑出来的结果不需要完美但一定要留好原始数据、增强脚本和训练配置后面随时可以回来改进。本文还有配套的精品资源点击获取