☰
建筑墙壁损伤缺陷分割数据集:7820张图与20类缺陷的labelme格式解析
2026/10/25 20:32:19 网站建设 项目流程

简介:面向建筑安全检测与计算机视觉研究者的墙壁损伤缺陷分割数据集,以labelme标注格式提供,可用于训练和评估图像分割算法,实现剥落、锈蚀、裂缝等损伤的自动识别与分类。资源包共1个docx文件,约2.1MB,内含数据集说明与标注规范,7820张640×640像素jpg图片均配有对应json标注文件,采用多边形框精细描绘损伤区域,覆盖涂鸦、支座、潮湿斑迹、锈蚀、剥落、泛碱、空洞区域、风化、残留模板、空腔、外露钢筋、伸缩缝、裂缝、排水、活动裂缝、接头胶带、岩窝、防护设备、水侵蚀混凝土及物体共20个类别,其中锈蚀、剥落、空腔等类别标注量较为丰富。已有103人学习关注。读者可据此了解数据集结构、类别分布与标注规则,并自行将json转换为mask、yolo或coco格式,用于语义分割或实例分割实验,为建筑墙壁健康监测研究提供数据基础。

1. 建筑墙壁损伤缺陷分割数据集:7820 张图背后的“建筑病历本”到底长什么样

如果你第一次听到“建筑墙壁损伤缺陷分割数据集”这个词,大概率会以为它是一份检测报告,或者某个软件的名字。其实都不是。它更像一本被拆成 7820 页的“建筑病历本”:每一页是一张 640×640 的墙壁照片,旁边配一份 JSON 文件,用多边形把墙上的裂缝、锈蚀、剥落、泛碱一块块圈出来,并写上这属于哪一类毛病。这本“病历本”一共记录了 20 种损伤类别,从涂鸦、支座到外露钢筋、水侵蚀混凝土,覆盖了建筑外墙和结构表面常见的缺陷形态。

搞懂它的价值在于:过去判断一面墙有没有问题,靠的是老师傅拿手电筒一寸寸看,经验难复制、标准难统一。而有了这种带像素级标注的数据,算法就能学着“看图识病”,把人工巡检变成可批量、可复现的自动识别。对做计算机视觉的人来说,它是一份现成的分割训练素材;对建筑检测领域的人来说,它是一份把“墙面病害”翻译成机器能读的语言的样本集。下面就从它是什么、为什么这样设计、容易和什么搞混,一层层拆开讲。

2. 为什么是 labelme 格式:一份“只给原料不给成品”的数据集

2.1 labelme 格式到底存了什么

很多人下载完数据集,解压一看只有 jpg 和 json,没有常见的 mask 图片,第一反应是“是不是缺文件”。其实这正是 labelme 格式的特点:它不直接给你一张黑白掩膜图,而是把标注信息写进 JSON 里。每份 JSON 记录的是多边形顶点坐标、类别名称、图片路径这些原始信息,相当于把“画框的过程”保存了下来,而不是只保存“画完的结果”。

打个比方,mask 文件像是一张已经烤好的蛋糕,你只能看不能改配方;labelme 的 JSON 则像一份带步骤的食谱,面粉多少、糖多少、烤箱几分钟都写着,你随时可以调整。数据集明确说明“不包含 mask 文件,仅仅包含 jpg 图片和对应的 json 文件”,这不是偷工减料,而是把转换的自由度留给了使用者。你可以把它转成语义分割用的 mask,也可以转成 YOLO 或 COCO 格式做实例分割,路线自己选。

从标注工具看,这批数据用的是 labelme 5.5.0,标注方式是 polygon 多边形框,而不是简单的矩形框。多边形意味着标注者沿着损伤区域的实际轮廓描边,裂缝的细长走向、剥落的不规则边缘都能被贴合,这对分割任务比矩形框精细得多。图片统一为 640×640 分辨率,尺寸规整,省去了大量预处理时缩放裁剪的麻烦。

2.2 为什么类别设计得这么“细”

20 个类别乍看有点多,但拆开看是有层次的。有的描述材料劣化,比如 Rust(锈蚀)、Spalling(剥落)、Efflorescence(泛碱)、Weathering(风化);有的描述结构异常,比如 Crack(裂缝)、ACrack(活动裂缝)、Hollowareas(空洞区域)、Cavity(空腔)、Rockpocket(岩窝);还有的偏向附属设施或施工遗留,比如 Bearing(支座)、EJoint(伸缩缝)、Drainage(排水)、JTape(接头胶带)、Restformwork(残留模板)、PEquipment(防护设备)。这种细分不是为了凑数,而是因为不同缺陷的成因和处理方式差别很大,模型如果只能识别“墙坏了”,实用价值有限;能分清是锈胀引起的剥落还是泛碱引起的表面析出,才谈得上辅助判断。

类别数量分布也很能说明问题。Rust 的标注数达到 14665,Spalling 有 9849,Cavity 有 9222,这三类占了很大比重;而 object 只有 13 个,ACrack 只有 423 个,JTape 1076 个。这种长尾分布是真实场景的写照——锈蚀和剥落在老旧建筑上随处可见,活动裂缝和杂物的出现频率则低得多。使用时要意识到,样本少的类别训练难度天然更高,不能指望模型对每个类别都一视同仁地准。

提示:数据集本身不对训练出的模型精度或权重作任何保证,它提供的是“准确且合理的标注”,不是“开箱即用的检测器”。把它当成原料,而不是成品。

2.3 7820 张图意味着什么量级

7820 张 jpg 配 7820 份 json,数量上一一对应,没有漏标。这个规模在建筑缺陷分割里属于中等偏上:够用来训练一个中等复杂度的分割网络,也够做一次有说服力的对比实验,但还不至于大到需要分布式训练。640×640 的分辨率对分割任务是个务实的选择——再高会显著增加显存和标注成本,再低则裂缝这类细长目标容易糊成一片。

从使用角度看,这个量级适合做几件事:训练一个基线分割模型、验证某种数据增强策略对缺陷识别的效果、或者拿其中一部分做微调。它不适合直接当成“万能检测器”的充分条件,因为建筑场景的光照、材质、拍摄角度变化极大,单一数据集很难覆盖全部情况。理解这一点,比记住 7820 这个数字更重要。

3. 20 个类别怎么读:从“墙面病害”到“机器可读标签”

3.1 材料劣化类:锈蚀、剥落、泛碱、风化

这几类是墙面最直观的“病”。Rust 指钢筋或金属件锈蚀后在表面留下的锈迹和锈胀,标注数 14665,是全集最多的类别,说明它在样本里出现得极其频繁。Spalling 是剥落,混凝土表层成片掉渣,往往和锈胀、冻融有关,标注数 9849。Efflorescence 是泛碱,墙面析出白色盐霜,看着像发霉但不是,标注数 3956。Weathering 是风化,表面被日晒雨淋磨得粗糙变色,标注数 4621。

这四类容易在视觉上互相干扰:锈迹偏红褐,泛碱偏白,剥落有凹凸阴影,风化则是整体质感变化。模型要分清它们,靠的不是颜色单一特征,而是纹理和边界的组合。标注时用多边形沿实际区域描边,正好保留了这些边界信息,比矩形框更能体现“病斑”的形状。

3.2 结构异常类:裂缝、活动裂缝、空腔、空洞区域、岩窝

Crack 是普通裂缝,标注数 3612;ACrack 是活动裂缝,标注数 423,数量少但含义特殊——活动裂缝意味着它还在发展,对结构安全的提示更强。Hollowareas 是空洞区域,标注数 1538;Cavity 是空腔,标注数 9222,两者名字接近但标注量差很多,使用时要按数据集给出的定义来理解,不要自行合并。Rockpocket 是岩窝,标注数 616,属于混凝土浇筑或基层处理留下的凹坑。

裂缝类目标的特点是细长、对比度低,分割难度高。640×640 的分辨率下,一条细裂缝可能只占几个像素宽,多边形标注能否贴合走向,直接影响模型学到的边界质量。这也是为什么数据集强调“对类别进行画多边形框 polygon”——矩形框会把大量背景裹进去,细裂缝就学不准了。

3.3 附属与施工遗留类:支座、伸缩缝、排水、接头胶带、残留模板、防护设备

Bearing(支座)标注 1201,EJoint(伸缩缝)506,Drainage(排水)1649,JTape(接头胶带)1076,Restformwork(残留模板)1019,PEquipment(防护设备)1892。这些类别严格说不是“损伤”,而是墙面上的构件或施工痕迹。它们被纳入标注,是因为在真实巡检画面里,这些元素经常和缺陷混在一起,模型如果分不清“这是伸缩缝”和“这是裂缝”,就会误报。

举个具体场景:一条笔直的伸缩缝在照片里和一条直裂缝很像,但前者是设计预留,后者是病害。数据集把 EJoint 单独列类,就是让模型有机会学会区分。同理,接头胶带和残留模板属于施工遗留,容易被当成表面异物,单独成类能减少混淆。这类“非损伤类别”的存在,恰恰说明数据集的设计考虑了真实巡检的干扰因素,而不是只挑干净的病害样本。

3.4 长尾类别与 object 的定位

object 只有 13 个标注,是全集最少的类别,含义是“物体”,大概率用于兜底标注画面里无法归入其他类别的干扰物。ACrack 423、Rockpocket 616、EJoint 506 也属于长尾。长尾类别在训练时容易被大类淹没,如果直接按整体精度评估,模型可能对它们几乎不响应却 still 拿到好看的分数。使用这份数据时,比较稳妥的做法是分类别看指标,而不是只看一个总数。

注意:类别名称里的英文拼写(如 WConccor、Restformwork)是数据集原始定义,转换格式时保持原样,不要自行“纠正”,否则和 json 里的标签对不上。

4. 易混概念辨析:分割数据集不是检测数据集,labelme 不是 mask

4.1 易混点一:分割数据集和检测数据集

很多人把“缺陷分割数据集”和“缺陷检测数据集”当成一回事。混淆的原因是两个任务都输出“哪里有缺陷”,看起来差不多。区别在于输出粒度:检测任务给的是矩形框,告诉你“这个区域有裂缝”;分割任务给的是像素级掩膜,告诉你“这几个像素是裂缝,旁边那些不是”。这份数据集用 polygon 多边形标注,走的是分割路线,虽然也能降级转成检测框用,但它的核心价值在像素级边界。

怎么区分?看标注文件里存的是什么。如果只有框的左上角坐标和宽高,那是检测;如果是多边形顶点序列,那是分割。这份数据的 json 里是多边形点集,所以它天然服务于语义分割或实例分割,而不是单纯的框检测。

4.2 易混点二:labelme 的 json 和 mask 图片

新手最容易卡在这里:以为下载完就能直接喂给分割网络,结果发现没有 mask 图。json 是“标注的源文件”,mask 是“标注的渲染结果”。json 里存的是类别和多边形坐标,mask 是把这些多边形按类别填成不同像素值的图。两者信息等价,但格式不同。数据集只给 json,意味着转换这一步要自己做,可以转 mask,也可以转 YOLO 的 txt 或 COCO 的 json。

为什么这样设计?因为不同框架要的格式不一样,统一给源文件反而最灵活。代价是使用者得会写转换脚本,或者找现成工具。这不是缺陷,是取舍。

4.3 易混点三:语义分割和实例分割

语义分割把同一类别的所有像素标成同一个值,不区分“这是第几条裂缝”;实例分割则要把每一条裂缝单独区分开。这份数据的 json 里每个多边形是独立对象,理论上两种任务都能支持,但转格式时要明确目标:转成语义 mask 就把同类合并,转成实例标注就保留每个多边形的独立性。搞混了会导致评估口径不一致,训练出来的模型用途也对不上。

4.4 易混点四:标注数量多不等于类别重要

Rust 有 14665 个标注,object 只有 13 个,数量差距巨大。有人会直觉认为“标注多的类别更重要”,其实数量多只说明它在样本里常见,不代表它在业务上优先级高。活动裂缝只有 423 个,但它对结构安全的警示意义可能远超大量普通锈迹。使用数据集时,类别权重应该按业务目标来定,而不是按标注数量排序。

4.5 易混点五:数据集开放不等于模型可用

数据集说明里写得很清楚:只提供图片和标注,不对训练出的模型或权重精度作保证。这和“下载即用”是两回事。混淆点在于,很多人把“数据质量好”等同于“模型效果好”。实际上,标注准确只是必要条件,模型效果还取决于网络结构、训练策略、数据增强、场景匹配度。把这份数据当成起点,而不是终点,心态就对了。

5. 什么时候该用它、什么时候别硬上:一份边界判断

5.1 适合用的场景

第一类,做建筑缺陷分割的基线实验。7820 张 640×640 图、20 类多边形标注,规模适中、格式统一,拿来跑一个分割网络、验证某个改进模块有没有效,是很顺手的起点。第二类,做 labelme 到其他格式的转换流程验证。json 转 mask、转 YOLO、转 COCO,这套数据量足够暴露转换脚本里的边界问题,比如多边形自相交、类别名映射遗漏。第三类,做长尾分布下的类别不平衡研究。Rust 一万多、object 十几个,天然就是一个不平衡样本,适合测试重采样、损失加权这些手段。

具体到操作层面,转换时可以先用一小批数据验证流程,比如先取 50 张跑通再全量。下面是一段把 labelme json 转成二值 mask 的示意代码,只保留多边形填充逻辑,实际使用时按类别映射改颜色值:

import json import numpy as np from PIL import Image, ImageDraw # 读取单份 labelme json,把多边形按类别填成不同像素值 with open("sample.json", "r", encoding="utf-8") as f: data = json.load(f) h, w = data["imageHeight"], data["imageWidth"] mask = np.zeros((h, w), dtype=np.uint8) # 类别名到像素值的映射,需与训练时的类别表一致 cls_map = {"Crack": 1, "Rust": 2, "Spalling": 3} draw = ImageDraw.Draw(Image.fromarray(mask)) for shape in data["shapes"]: label = shape["label"] if label not in cls_map: continue points = [tuple(p) for p in shape["points"]] # polygon 填充,第三个参数是类别像素值 ImageDraw.Draw(Image.fromarray(mask)).polygon(points, fill=cls_map[label])

这段代码的关键点有三个:imageHeight和imageWidth决定 mask 尺寸,必须和原图一致;shapes里每个元素的points是多边形顶点,顺序不能乱;cls_map是类别名到像素值的映射,必须和后续训练配置对齐,漏一个类别就会导致该类被当成背景。实际转换时还要处理多边形点数为奇数、坐标越界这些脏数据,建议先统计一遍再批量跑。

5.2 不适合硬上的场景

如果目标是直接上线一个“拍张照就知道墙坏没坏”的产品,这份数据单独不够。它覆盖的是特定拍摄条件下的 640×640 画面,真实巡检的光照、距离、遮挡变化更复杂,模型泛化需要更多场景数据补充。如果目标是检测非墙面对象,比如路面、桥梁底面,类别体系对不上,硬套只会得到一堆错标。如果团队没有格式转换能力,又不愿意写脚本,那 labelme 的 json 会成为第一道坎,这时候要么先补转换工具链,要么换现成的 mask 格式数据集。

还有一个容易被忽略的边界:这份数据不包含模型评估结果,也没有划分训练集和验证集。拿到手需要自己切分,切分时要注意同一面墙的多个角度图片不要跨集泄漏,否则验证分数会虚高。这个坑我踩过——早些年拿类似数据直接随机切分,验证集里混进了训练集同场景的图,指标好看得离谱,换真实场景就翻车。从那以后我每次切分前都先按拍摄来源分组,再在组内随机,宁可训练集小一点,也不让验证集“见过答案”。

希望这份拆解能帮你在打开那 7820 份 json 之前,先想清楚自己要拿它做什么、缺哪一步、边界在哪。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询