墙面缺陷识别尤其是建筑物裂缝、霉斑、水渍这类目标的AI检测过去几年我从零开始摸爬滚打踩了不少坑也攒下了一套现在团队还在用的数据集制作和模型训练流程。这次聊的这份“智慧墙体墙面缺陷识别数据集第10167号”正好覆盖了建筑物裂缝识别、霉斑检测、桥梁渗水识别、墙面污渍、水渍、潮湿等常见缺陷目标而且已经是YOLO格式能直接进训练流程。对做智慧工地、建筑巡检、无人机病害普查的朋友来说这类数据是模型能不能落地的关键所以我把整个“从数据到模型”的实操过程和避坑心得完整整理出来。先说结论墙面缺陷检测这类任务难点不在模型结构而在数据口径。同样一张带水痕的墙面有人标水渍有人标潮湿有人标污渍三个标签看似都能沾边但训练出来的模型行为完全不同。所以我在做第10167号这类数据集时把80%的精力都压在了类别定义、标注规范和格式转换上真正调模型的时间反而很少。下面按我实际的推进顺序来讲。1. 为什么墙面缺陷AI需要一份专门的“墙体数据集”最初我试过直接用公开的通用目标检测数据集来训练墙面缺陷模型效果惨不忍睹。原因说起来也简单墙面瑕疵和自然图像里的物体在特征分布上完全是两回事。通用数据集里的物体比如人、车、猫、狗都有清晰轮廓和稳定纹理模型很容易学到“边界”的概念。但墙面裂缝是一条细长的深色线条背景可能是浅灰的水泥面、泛黄的腻子、粗糙的瓷砖缝霉斑是一团边缘模糊的暗色区域和墙面阴影、掉漆、水泥返碱都高度相似水渍更是玄学有的呈流挂状有的是整片颜色加深还有的因为墙体内部渗水表面只露出一块若有若无的潮痕。这类目标用通用目标检测的预训练权重开局小尺寸裂缝很容易漏检霉斑又容易被当成背景纹理直接忽略。另外实际项目里的拍摄场景太杂了。白天室外墙面有强光反射傍晚室内灯光偏暖地下室墙面常年潮湿发黑桥梁下方则全是斑驳的渗水痕迹和白色析出物。同一个缺陷在不同光照、不同距离、不同材质下视觉差异极大。这就逼着我不得不做“场景化”的数据集——目标不是大而全而是“贴合真实巡检路径”把项目的拍摄环境预计是什么样的数据就按什么样的来采集和标注。第10167号这套数据集的定位就是围绕建筑物和桥梁巡检常见缺陷做一份垂直领域数据。它里面除了裂缝、霉斑这类最基础的类别还专门把“潮湿”“水渍”“渗水”“污渍”这类容易混淆的“区域性缺陷”拆了出来这对训练来说非常关键。因为在实际检测中墙面裂缝可能只有几毫米宽但引发的问题是最严重的而霉斑和水渍虽然不像裂缝那样牵涉结构安全却直接反映建筑使用状态和渗漏隐患。如果模型分不清渗水和污渍工程端就没法用。还有一个容易忽略的点数据集的“业务视角”很重要。一份好的墙面缺陷数据集不是把图片里所有“看着不对的地方”都框出来就完了而是要知道每个框最终服务于什么决策。裂缝框是给结构工程师看的霉斑框是给物业整改看的渗水框是给桥梁养护部门看的。框选范围是框住整条裂缝还是只框裂缝核心段两种标法训练出来的模型定位能力完全不同。做第10167号这类数据集时最忌讳的就是交给不熟悉建筑场景的标注员“看图划线”最后标出来一堆形状漂亮但业务上没法用的框。所以在整个工程里我给自己定的原则是先确定缺陷的“业务口径”再谈标注和训练。口径错了后面全白干。2. 裂缝、霉斑、污渍、水渍、渗水、潮湿六类目标的识别口径一份数据集能不能用第一关就是类别定义是否互斥、完备、且能被标注员稳定执行。第10167号数据集里涉及的六类目标我把它们的判定边界和标注规则理清如下这套规则也是我和标注团队反复磨合之后定下来的。2.1 建筑物裂缝裂缝的目标形态是线状或树枝状的深色痕迹边界比较锐利常见于墙面、梁柱交界处、窗角和墙体开洞周边。标注时我要求把整条连续裂缝看作一个目标用一个尽量贴合裂缝走向的最小外接矩形框住如果裂缝分叉明显就按主裂缝和分叉分别标注避免一个大框把半面墙都包进去。这里最大的争议点是“哪些细纹算裂缝”——我的标准是宽度超过约0.2毫米、在正常室内光线下肉眼清晰可辨、且具有一定长度延伸的才算表面浮灰形成的细线、刷痕和拉毛纹理一律不算。另外结构裂缝和非结构裂缝在数据里不做细分统一归为裂缝因为从视觉上很难可靠区分强行细分只会把标注一致性搞崩。2.2 墙面霉斑霉斑的视觉特征是点状、片状或絮状的暗色区域颜色通常偏黑、偏绿或偏棕边缘模糊常见于卫生间外墙、厨房背面、潮湿墙角、窗台下方。标注时按“霉斑聚集区域”整体框选不需要把每一粒霉点单独框出来如果一片墙上有好几处独立霉斑就分别标注。霉斑最大的混淆对象是污渍和水泥返碱。我的区分规则是霉斑有“生长感”常见从点向外扩散的渐变边缘污渍往往是人为或外部因素造成的颜色附着边缘和形态相对随机返碱则呈现出白色粉末状结晶特征一般不归入霉斑除非表面已经同时滋生黑色霉点。2.3 墙面污渍污渍是这六类里面最“杂”的一类包括手印、脚印、油污、泥浆飞溅、颜料泼洒、锈水痕迹等。标注时按污渍的实际覆盖范围框选同一片区域如果同时存在水和污渍叠加优先拆分成水渍和污渍两个目标或者按更严重的那个类别来归并。这里我定了一条规则标注时“污渍优先于水渍”还是“水渍优先于污渍”要看场景。如果是桥墩表面的泥浆冲刷痕迹我归为污渍如果是墙体内部的渗漏导致表面形成的黄色水痕我归为水渍。整体原则是宁可多标一个目标也不要在一个框里塞两个类别。2.4 水渍水渍指的是墙面表面因水分浸润、干燥后留下的痕迹可能是浅黄色、褐色或深灰色的不规则区域常见于管道周边、空调机位下方、屋檐滴水处。水渍和潮湿的区别在于水渍是“已经干过、留下了痕迹”边缘边界比潮湿更明确潮湿则是“当前就是湿的”整体颜色发深边界更模糊而且会随时间变化。标注水渍时我会要求标注员尽量沿水痕的外轮廓绘制框颜色晕开很广的部分如果明显比周围墙面颜色深也一并框入但如果只是隐约的颜色过渡不框因为这种目标连人眼都无法确认模型训练出来也一定在错。2.5 桥梁渗水桥梁渗水其实和水渍、潮湿在视觉上高度重叠但它有一个非常特殊的业务背景出现在桥梁的箱梁腹板、桥墩顶部、伸缩缝附近、翼缘板下方等部位通常会伴随白色钙化物析出或呈钟乳石状的白色、灰色沉积物。所以在标注规则里我把“渗水”定义为“与桥梁结构渗漏相关的、常伴随析出物的湿痕或水痕”它不像墙面水渍那样只是表面美观问题而是直接影响结构耐久性的缺陷。这个类别在训练时需要注意因为样本通常少、形态又特别多样我会在数据集中专门对它的采集数量做加权并在训练时提高它的损失权重。2.6 潮湿潮湿是一个“面状态”类别和前面几类缺陷的“点/线状”目标不同。它一般是墙面大范围颜色变深、边界不清常见于地下室墙体、卫生间背水面、长期不通风的储藏室。标注潮湿时要框的是“明显可见的颜色异常加深区域”而不是整面发黑的墙。这需要标注员现场靠经验判断“这块墙原本应该是什么颜色”所以只靠电脑屏幕看图远远不够。我在做标注管理时会要求标注员先看一组不同材质墙面在正常状态下的参照图再开始标潮湿不然很容易把正常的混凝土色差误判成缺陷。这六类口径定完之后我还会给标注团队提供一张“判定优先级表”。如果一个目标同时满足多个类别特征比如墙角的黑色区域既有霉斑特征又是潮湿状态我的规则是如果其中存在明显的点状霉斑就标霉斑如果只是整片颜色变深没有点状生长特征就标潮湿。类似这种优先级规则能把标注过程中的主观偏差压到最低。3. 从现场采图到标注交付数据集制作的实际流程数据集标得好不好源头在采图。第10167号这套数据的图像来源主要覆盖了三类现场一是室内墙面包含住宅、办公楼、学校教学楼二是建筑外立面通过手持设备和高处拍摄完成三是桥梁结构表面重点采集箱梁、墩柱、翼缘板等部位。我按下面这套流程走每个环节都有明确产出物。3.1 采图规范让数据覆盖“真实分布”采图时我最关注三个维度拍摄距离、角度、光照。拍摄距离我把目标分成“近景”和“远景”两类。近景指距墙面0.3到1米用于捕捉裂缝细节和霉斑纹理远景指距墙面1.5到5米用于模拟人工巡检时肉眼观察的画面。训练时两类都需要否则模型只在单一尺度上有效。拍摄角度正面拍摄为主允许30度以内的斜角。超过45度的斜角会造成目标形变严重我在初筛时会直接剔掉。但也有例外桥梁底部等难以正面取景的部位斜角不可避免这类图像单独保留作为模型的“难度样本”。光照尽量覆盖晴天、阴天、室内灯光、逆光、阴影遮挡等场景。一个很实在的建议是别只挑“拍得好看”的图入库因为真实巡检时大量图片就是模糊、过曝、背光的模型没见过这些图上线就必然露馅。采图设备上我用了一台普通旗舰手机和一台带云台的运动相机。手机主拍室内和近景运动相机负责外立面和高处拍摄。桥下空间光照暗我还要补一块便携补光灯不然拍出来的图全是黑糊糊一片标注员根本看不清缺陷边界。注意补光灯不能直打墙面最好侧向打光否则会洗掉缺陷纹理。3.2 初筛人是第一道过滤器所有原始图像先跑一遍人工初筛剔除四类废图完全模糊的、严重过曝欠曝的、目标占比过小缺陷区域小于全图面积的约1%的、以及重复度超过80%的近似图。这一步能省下大量标注成本。我还额外加了一条“类别敏感性筛查”每组连续拍摄的照片里如果都是同一面墙的连续帧只保留信息量最大的2到3张避免数据冗余导致训练时模型对同一场景过拟合。3.3 标注工具与标注任务切分标注工具我用的开源矩形框标注工具功能稳定能直接导出主流格式。标注任务按“图像分组”派发给不同标注员一图为一条记录。每个标框需要填两项类别和矩形边界。标完后由我进行一轮全量复核。在任务切分上最好把“难样本”单独抽出来交给经验更丰富的标注员。比如第10167号数据集里的桥梁渗水图样本少且特征模糊新手很容易标偏而污渍、裂缝这类特征明显的图可以大胆交给新手。这样能保证数据集尽量少的因为标注质量问题后期返工、重新标注。3.4 复核机制三重检查第一重是标注员自查检查每个目标是否贴边、是否漏标。第二重是交叉复标抽20%的图交给另一个标注员重新标一遍比对两个版本的交并比低于0.7的样本全部打回重标。第三重是我自己做的“业务抽查”重点看那些容易混淆的样本确认标注结果和类别定义表一致。做完这三重检查才允许进入下一步格式转换。4. 转成YOLO格式标注文件转换脚本与一套数据自检方法YOLO格式的核心是每个图像对应一个同名txt文件每行内容为类别编号、归一化中心坐标x、归一化中心坐标y、归一化宽度w、归一化高度h。网上现成转换工具很多但我不建议直接拿别人脚本跑完就入库因为标注工具的导出字段差异、图像尺寸不一致、坐标越界等问题会让沉默的错误悄悄污染数据集训练时才发现就晚了。4.1 转换脚本核心逻辑假设标注工具导出的是JSON格式每张图的标注字段包含目标框左上角点和右下角点坐标。转换脚本我按下面这个思路写import os import json from PIL import Image def convert_to_yolo_txt(json_path, image_path, output_txt_path, class_map): with open(json_path, r, encodingutf-8) as f: data json.load(f) img Image.open(image_path) img_w, img_h img.size lines [] for shape in data[shapes]: label shape[label] if label not in class_map: continue class_id class_map[label] points shape[points] # 标注工具返回的是多边形点集 xs [p[0] for p in points] ys [p[1] for p in points] x_min, x_max min(xs), max(xs) y_min, y_max min(ys), max(ys) # 转YOLO归一化格式 cx ((x_min x_max) / 2) / img_w cy ((y_min y_max) / 2) / img_h w (x_max - x_min) / img_w h (y_max - y_min) / img_h # 防止个别越界坐标导致训练报错 cx min(max(cx, 0.0), 1.0) cy min(max(cy, 0.0), 1.0) w min(max(w, 0.0), 1.0) h min(max(h, 0.0), 1.0) lines.append(f{class_id} {cx:.6f} {cy:.6f} {w:.6f} {h:.6f}) with open(output_txt_path, w, encodingutf-8) as f: f.write(\n.join(lines)) # 类别编号顺序必须与训练时data.yaml保持一致 class_map { crack: 0, mold: 1, stain: 2, water_stain: 3, seepage: 4, damp: 5, }有一个细节很多人会忽略如果标注工具里画的是多边形而非矩形比如我为了让裂缝框贴合走向手工画了折线转换脚本必须取多边形外接矩形。直接用多边形首尾点坐标会得到错误框。上面脚本用x_min、x_max、y_min、y_max取外接矩形的做法就是为了兼容这种情况。4.2 数据自检不是“能打开”就叫合格转换完成之后我会跑一套自检脚本检查每个txt文件是否为空空文件直接定位到对应图像确认是不是漏标。检查txt坐标是否都在0到1范围内越界说明标注框超出了图像边界。检查图像文件名和txt文件名是否一一对应Windows系统里尤其要注意大小写问题。按类别统计目标数量确认数据分布有没有严重偏斜。比如裂缝占了70%渗水只占2%这时就要人工检查是不是标注漏了或采集本身就很少。随机抽20张图把txt文件的框绘制回图上人眼确认坐标没有错位。这套自检我每次都跑因为标注工具版本升级、不同平台的文件路径问题、导出字段不一致都可能让转换结果悄悄出错。跳过自检直接训练等到mAP上不去再回头查数据时间成本至少翻三倍。4.3 目录组织最终的数据集目录结构我固定如下dataset/ ├── images/ │ ├── train/ │ └── val/ ├── labels/ │ ├── train/ │ └── val/ └── dataset.yamldataset.yaml的内容也很简单path: ./dataset train: images/train val: images/val names: 0: crack 1: mold 2: stain 3: water_stain 4: seepage 5: damp这里最容易踩的坑是names的顺序。YOLO训练时类别编号是按names列表索引走的如果数据集txt里的编号和names顺序对不上模型训练出来所有框全部错位。这类错误很隐蔽我见过不止一次最后全是靠验证集可视化才发现。5. 基于这套数据集训练YOLO模型参数设置与踩坑记录数据集就绪模型训练反而相对“标准化”。我用的是YOLO系列模型具体来说在算力有限的情况下选轻量化版本作为快速迭代基线在精度要求高的场景切到中大型版本。第10167号数据集的图像尺寸比较杂训练前统一resize到640×640。5.1 训练参数与理由图像尺寸640×640。墙面裂缝目标偏细长尺寸太大会拖慢速度尺寸太小细节丢失严重640是兼顾速度和精度的常用值。batch size16。如果显存只有8G我通常会降到8并同步调低学习率。epochs300但开了早停机制连续50轮验证集指标不上涨就停。墙面缺陷数据量不大训练到150轮左右基本就收敛了。初始学习率0.01配合余弦退火衰减。学习率是训练中最敏感的超参新手最容易上来就崩。数据增强我用马赛克增强、随机透视、色调扰动和缩放旋转。但要注意墙面缺陷目标小且细过强的旋转和透视会让“裂缝”扭曲成不真实形态所以旋转角度我限制在±15度以内透视系数控制在0.2以内。类别权重当某类样本明显偏少时我在损失函数里提高权重。这个数据集里我实际把“渗水”的权重调到1.5“潮湿”调到1.2其余保持1.0。这种做法能让小类别AP提升大概3到5个点代价是大类别可能有轻微下降但工程上可接受。5.2 训练中遇到的两个典型问题第一个问题是“裂缝细长目标容易断检”。裂缝和霉斑不同它不是紧凑的块状区域而是长条线状目标。模型预测出的框往往只覆盖裂缝的一段而不是整条裂缝。我解决这个问题有两个思路一是增强训练数据中“完整长裂缝”的比例让模型看到更多完整形态二是后处理时对同一图像内距离接近、且类别一致的框做融合合并成一个大框。后者在工程代码里用非极大值抑制的改进变体实现能在不影响召回的情况下减少断裂检测。第二个问题是“霉斑和水渍在低光照下分不清”。我刚开始训练时模型在暗光图上频繁把霉斑预测成水渍把水渍预测成潮湿。查了原因后发现数据里暗光样本本就不多而且标注时暗光样本的类别判定就存在分歧。最后我针对暗光场景单独补采了一批图同时重新复核了原有暗光标注把不确定的样本全部剔除。这轮操作之后暗光场景的预测准确率明显回升。所以这类问题本质上还是数据问题不是模型问题。5.3 用验证集看指标更要看错误样本训练好之后我不会只盯mAP。mAP是宏观指标但工程落地更关注“哪些错误是不可接受的”。我会从验证集里把预测错误的图全部导出来按错误类型分桶漏检真实框没被预测出来优先级最高说明模型对某类场景还没学会。误检把正常墙面区域预测成缺陷会导致工程现场产生大量无效报警优先级其次。定位偏差预测框和真实框交并比不达标常见于长裂缝和多目标密集场景。类别混淆渗水预测成水渍这种错误在业务上会造成维修工单派错也需要专项处理。我最终用一套“工程加权F1”来评估漏检扣2分误检扣1分类别混淆扣1.5分定位偏差扣0.5分。这样比单纯看mAP更能反映模型在现场好不好用。6. 把模型搬进真实场景光照、距离、遮挡与数据闭环训练完成只是开始。墙面缺陷检测模型真正上线后我遇到的实际问题比训练集里预想的要多得多。6.1 光照与色彩风格劈叉同一个墙面缺陷训练图里是室内暖光灯下偏黄的腻子墙面到了实际工地是阴天冷光下的水泥墙面模型的表现会明显掉档。我后来想通了这不是模型鲁棒性问题而是数据分布问题。我在数据集里刻意引入不同摄像头、不同白平衡设置拍出来的图还做了基于颜色空间的随机扰动增强把RGB三个通道的强度随机调整让模型对墙面材质和色温变化不那么敏感。更实用的一个办法是在部署时对输入图像做一次“风格归一化”——把图像的色温和对比度统一到和训练集接近的范围内效果立竿见影。6.2 距离带来的目标尺度分布差异无人机巡检拍到的墙面裂缝往往只有几十个像素宽而手持手机拍摄时裂缝能占图像宽度的三分之一。模型对尺度非常敏感。我的做法有两步第一训练时启用多尺度训练让模型每轮随机在416到896之间切换输入尺寸第二在数据采集时有意识地把“远距离小目标”和“近距离大目标”分开建目录、打标签方便后续观察模型在不同尺度上的具体表现。实测下来多尺度训练对墙面裂缝这种“尺度跨度极大”的任务提升非常明显小目标召回率能涨将近8个点。6.3 遮挡、视角和复合缺陷真实墙面往往是“多缺陷共存”的一片墙上既有裂缝又有渗水还有霉斑并且墙角有管线遮挡。这种情况下标注时如果只框裂缝不框水渍或者框了水渍又漏了霉斑模型学到的上下文就会乱。我现在的方法是对“复合缺陷”图像单独管理标注时允许同一区域出现多个同类别或不同类别框的叠加同时要求标注员精确到像素级边界避免一个大框同时覆盖三种缺陷。训练时这种图像会贡献更丰富的特征关联模型在多缺陷共存场景的表现也好很多。6.4 数据闭环每次现场巡检都在为模型做增量模型上线后我养成了一个习惯把每次现场巡检采集的新图都保留下来定期和人工复核结果合并形成增量训练集。具体做法是每月抽一个晚上把现场识别结果中“高置信度但错误”和“低置信度但正确”的样本筛出来重新标注并入训练集然后增量训练一轮。这样迭代半年后模型在项目现场的表现会越来越稳因为它见的才是这个项目真正的地形、材质和光照分布。6.5 输出结果要贴合业务操作习惯最后提醒一个容易被忽视的点模型输出的检测框需要和业务系统对接这涉及到坐标系的转换。比如无人机巡检照片原图是几千万像素模型推理前会resize到640×640那么检测框坐标就要按原图尺寸反向换算再叠加拍摄位置和姿态信息映射到地图或房屋平面图上。这一步看似简单但我在项目里见过多次因为忘记换算导致缺陷位置标错、维修人员找不到目标的情况。做数据集和训练时从一开始就把原图尺寸记录下来并在推理管道里妥善维护会比后期补做省力得多。我现在做墙面缺陷识别项目已经把“数据集制作-格式转换-模型训练-现场验证”跑成了一天能循环一轮的流程。每次拿到类似第10167号这样的YOLO格式数据集都会先花半天做类别口径核对和随机抽样可视化确认数据没有脏标签再进训练。说实话模型在墙面缺陷这类任务上的性能七成由数据质量决定三成由调参技巧决定。把类别定义清楚、把标注规则定死、把数据自检跑透比换任何一个“更强”的模型都管用。
阅读完成 · 觉得有帮助?