资讯动态

敦煌壁画破损识别分割数据集:14210张Labelme标注与DeepLabV3+训练实践

发布时间:2026/10/20 19:51:49 来源:尧图企业网站定制
1. 从一张残损壁画到一个数据集这个项目解决的真实问题做文物数字化和视觉识别交叉方向的朋友应该都有过类似的尴尬时刻算法模型在公开数据集上跑得风生水起一遇到真实的敦煌壁画图像效果立刻断崖式下跌。不是模型不行而是壁画破损的形态太特殊——它不像通用分割数据集里那种边界清晰的物体风化和裂缝是渐变的、模糊的、漫延的跟背景纹理大量交织。我做这个敦煌壁画破损识别分割数据集核心目标就一个把破损这件事变成可量化的像素级任务让模型学会在复杂壁画纹理中把病害区域逐像素啃出来。项目最终产出了14210张Labelme格式标注图1个类别覆盖了壁画中常见的裂隙、酥碱、起甲、剥落等多种视觉破损形态。这个项目主要解决三个层面问题数据稀缺文物破损相关的公开分割数据集极少尤其是针对壁画材质和病害形态的几乎是空白。想做壁画修复辅助、病害监测的团队往往被数据卡在第一步。标注工具链缺失很多团队还在用通用目标检测框去标注破损区域但破损不是矩形能框住的。它需要多边形级别的精细标注这正是Labelme格式的价值所在。训练和评估标准化没有统一的数据集格式模型复现和横向对比就是空谈。固定到Labelme格式后数据增强、掩码转换、模型训练、指标评估都是标准流程。如果你是做文化遗产数字化、文物保护智能分析、或者工业上的表面缺陷检测这个数据集的构建思路都能直接套用。尤其是如何在一个标注工具、一个类别的前提下把数据质量做到可用这一整套方法比数据集本身更有参考价值。2. 数据生产流水线从原始壁画图像到14210张Labelme标注文件2.1 图像来源与筛选第一道关卡决定了后续一切数据集的源头很重要。不是所有敦煌壁画照片都能直接进数据集需要经过严格筛选。我当时主要从三个渠道获取原始图像公开的壁画数字化成果包括一些学术项目公开的高清扫描图这部分图像质量高、光线均匀是训练集的主力。实地拍摄的现场照片这部分图像存在透视畸变和光照不均但恰好能模拟真实监测场景对提升模型泛化能力很有价值。历史档案扫描件部分黑白或偏色老照片破损形态清晰但对标注人员要求高。筛选时我踩过一个坑不能只看图像是否清晰更要看破损区域和背景的对比度。有些壁画本身颜色暗沉破损区域肉眼都很难分辨标注人员被迫猜边界这种图像标注出来噪声极大。我的筛选标准是至少要保证破损区域在原始分辨率下能以肉眼可辨的状态呈现。最终有效图像数量收到将近1.5万张经过人工排查剔除了严重模糊、过曝和内容重复的样本留下14210张进入标注环节。这14210张不是随便凑出来的而是每个专题、每个窟区都有覆盖避免模型只学会识别某一种特定色调的壁画。2.2 Labelme标注实操多边形操作的几个关键细节Labelme是老牌的图像多边形标注工具为什么选它而不是别的工具因为它输出的JSON格式非常直观每个标注对象包含一个多边形点集和一个类别标签这种格式对分割任务极其友好后续转掩码非常简单。标注过程中最核心的细节有三个第一个是标注粒度的把握。破损区域的外边界往往不是一条清晰的线而是一个逐渐过渡的晕染带。标注太紧会漏掉边缘的早期病害太松会把完好区域框进来。我的经验是裂缝类破损沿裂缝可见边缘标注剥落类破损沿着颜料层缺失的边缘标注酥碱类破损则按照颜色和质地明显改变的区域边界标注。宁可略微外扩不要让模型学到破损是孤立斑块的错误认知。第二个是多边形点数的选择。很多人以为点越多越精确实际上点太多会引入大量噪声标注和训练效率也低。我最终统一规范每个多边形控制在20到80个点之间既能表达复杂轮廓又不至于过度拟合标注人员的鼠标抖动。第三个是对象拆分策略。一个大面积破损区域内可能包含多个独立裂隙是标成一个多边形还是拆成多个我选择了拆。因为壁画破损的分布天然是离散的拆开标注有利于模型学习破损是局部性病变这一特征而不是把所有破损糊成一个大团。下面是一个典型的Labelme标注JSON结构示例{ version: 4.5.6, flags: {}, shapes: [ { label: damage, points: [ [128.5, 260.3], [135.2, 264.1], [142.8, 262.7] ], group_id: null, shape_type: polygon, flags: {} } ], imagePath: dunhuang_00421.jpg, imageData: null, imageHeight: 1024, imageWidth: 1024 }这个JSON结构是Labelme的标准格式训练时我们需要解析shapes里的points坐标在多边形内部填充为1外部为0生成掩码图。这就是分割数据集和检测数据集的本质区别——标签不是框而是精确的边缘坐标集合。2.3 质量审核人工复查是数据生产中最耗时也最必要的环节数据标注完成后我做了两轮审核。第一轮是完整性检查每张图像是否都对应正确数量的JSON文件多边形是否闭合类别标签是否统一为damage。这类问题可以写脚本自动检查十万火急的事其实就这么简单。第二轮是语义审查随机抽检5%的样本由经验丰富的标注员复查标注区域是否符合规范。这里有一个命中率很高的经验如果一张图里标注的多边形个数为0很可能不是没有破损而是标注员漏标了。壁画中大面积背景往往会让标注员产生视觉疲劳所以零标注样本必须人工复核。还有一个细节容易被忽略文件的目录结构。Labelme格式的数据集没有强制的目录结构但如果组织混乱后续处理脚本会非常痛苦。我的组织方式如下dataset/ ├── images/ │ ├── dunhuang_00001.jpg │ ├── dunhuang_00002.jpg │ └── ... ├── labels/ │ ├── dunhuang_00001.json │ ├── dunhuang_00002.json │ └── ... └── class_names.txtimages和labels文件名一一对应class_names.txt里写好类别名。这种结构在后续写数据加载脚本时省了大量时间。3. 数据集体检14367个标注多边形背后的统计学意义3.1 单类别设计的核心思路很多人看到1类别会质疑壁画破损分这么多种类只标一个类别是不是太粗糙了这个质疑有道理但我做这个数据集时有明确的现实考量。第一目前标注工作的核心矛盾是有没有破损而不是哪种破损。破损形态的精细分类需要文物修复专家深度参与标注成本极高且需要专门的病理学知识。在数据基础尚未牢固时过度细分只会让每一类的样本量都不够模型什么都学不好。第二单类别分割本质上是异常检测场景。模型需要输出一张破损概率图这在实际文物保护工作中已经足够支撑许多应用——比如区域破损率统计、修复优先级评估、病害扩散趋势追踪。这些应用不依赖破损的具体类型只需要准确的区域定位。第三从工程实践看单类别分割的训练稳定性远高于多类别分割。类别间不平衡是分割任务中最头疼的问题之一做单类别时可完全规避把精力集中在区域定位精度上。后续如果确实需要细分类别完全可以在单类别输出的基础上引入第二级分类器这是一个可扩展的架构。3.2 统计分析与均衡性数据集完成标注后我做了一次全面统计分析这是建模前必须做的事也是避免日后被自己数据坑死的关键一步。图像分辨率分布大多数图像集中在1024x1024附近少量高清图为2048x2048这符合壁画数字化扫描的常见规格。单图标注多边形数量平均每张图有2.3个多边形但方差很大。有些图只有1个多边形且面积很小有些图有几十个多边形覆盖了大半张图。这种极端不平衡在训练时需要特别注意否则模型会偏向学习大面积破损而忽略小面积裂隙。破损区域面积占比大多数图像的破损面积占比在5%-30%之间符合壁画整体保存状况的一般规律——完全破损成废墟的壁画通常不具备数字化和修复价值。做一个覆盖率分析很值得计算所有标注多边形的总面积占整个数据集图像总面积的比例这个值大约是8.7%。这意味着训练一个语义分割模型时正样本破损在像素级别只占不到十分之一。前背景极度不平衡这是分割任务的头号敌人后面需要靠损失函数设计和数据增强来兜底。表格如下整理了数据集的关键统计量统计项数值/描述图像总数14210张类别数1damage标注多边形总数约33000个平均单图多边形数约2.3个破损像素占比约8.7%标注格式Labelme JSONpolygon3.3 掩码生成与格式转换细节Labelme原生的JSON文件不能直接送入深度学习框架需要先转换成掩码图。这一步网上有很多现成脚本但自己动手时有几个细节想提醒。坐标尺度问题Labelme记录的坐标是相对于原始图像尺寸的像素值。如果你的训练流程里做了图像缩放那么掩码也必须同步缩放否则坐标会对不上。我实际使用的是全尺寸数据集即图像和掩码都是1024x1024或原图尺寸缩放交给数据加载阶段的resize操作统一处理这样能减少一次插值误差的引入。多边形填充与抗锯齿问题用OpenCV的polylines和fillPoly函数填充多边形时默认是整数坐标的硬填充边缘会出现锯齿。分割任务中对边缘像素的要求不像目标检测那么严格但如果做精细评估建议在掩码生成时做轻微高斯平滑让边缘过渡更自然这样模型输出的概率图也更容易收敛。去除极小多边形我在清洗阶段发现有一些标注多边形的面积只有几十个像素这些往往不是真实的破损区域而是标注过程中鼠标误操作产生的残影。我写了一个过滤脚本删除面积低于总面积0.01%的多边形。这一操作大约去掉了总标注量的2%但对训练稳定性帮助显著。4. 从标注走向模型基于14210张数据训练分割网络的实战记录4.1 数据划分的策略14210张图不能简单按比例随机切分成训练集和测试集壁画有一个显著特点同一窟区、同一壁面的图像在色调和纹理上高度相似。如果随机切分训练集和验证集可能出现大量近亲图像模型在验证集上的得分虚高实战部署时立刻露馅。我按图像来源进行划分来自同一批数字化采集任务的图像归入同一组然后把整组按比例分配。这叫做group split能更真实地反映模型遇到没见过的采集批次时的性能。最终切分比例训练集占80%约11368张验证集占10%约1421张测试集占10%约1421张。4.2 模型选型与Loss函数设计单类别分割的模型选型我对比了U-Net、DeepLabV3和SegFormer最终选定了DeepLabV3作为baselineResNet50为backbone。原因很实在壁画破损边缘的上下文信息很重要——一条裂缝往往被周围的颜料脱落区域提示DeepLabV3的空洞空间金字塔池化模块ASPP能有效扩大感受野让模型关注到这种上下文关联。相对于U-Net的对称编码-解码结构DeepLabV3在相同精度下训练速度更快对于14210张规模的数据集迭代实验的效率差异是肉眼可见的。SegFormer效果好但由于壁画图像结构复杂且目标破损区域高度非规则它对数据量的需求更大在当时的数据规模下表现并不显著优于DeepLabV3。损失函数方面测试了几种组合Loss方案验证集mIoU备注单纯BCE Loss0.734前景占比太低偏向背景Dice Loss0.761改善了前景召回但边缘较粗糙BCE Dice1:10.783平衡较好Focal Loss BCE0.771小目标有所改善但总体不如Dice最终采用BCE Loss与Dice Loss加权求和的方式权重比设为0.5:0.5。这个方案对前背景不平衡的问题解决得最彻底而且Dice Loss天然关注区域重叠度跟分割任务的评估指标高度一致。4.3 训练参数与数据增强策略训练过程中最值得说的还是数据增强。壁画破损检测很容易遇到的问题是模型把某一色调的纹理异常当成破损而没真正学会破损的结构特征。为了对抗这个倾向我做了一系列针对性增强色彩抖动在HSV空间随机调整饱和度、亮度和色调。这能强迫模型从结构上识别破损而不是依赖颜色线索。随机旋转与翻转壁画破损的方向性特征不强旋转和翻转是安全增强也能大幅提升样本多样性。弹性形变模拟壁画表面因支撑体变形导致的图像畸变这个增强对提升模型的鲁棒性很有帮助。CutMix将两张图的破损区域随机拼贴到另一张图上模拟真实场景中多种破损形态混合出现的情况。训练超参数如下learning_rate 1e-4 batch_size 8 epochs 60 optimizer AdamW scheduler CosineAnnealingLR(T_max60)实际训练在单张GPU上进行骨干网络使用在ImageNet上预训练的权重。60轮训练后测试集上的核心指标如下指标数值mIoU0.785Dice系数0.869像素准确率97.4%推理速度1024x1024约48ms/张4.4 模型预测结果可视化拿测试集里的典型样本看效果还是很直观的一张壁画的右上角有一块酥碱区域颜色泛白、质地疏松模型输出的掩码基本上把这块区域完整地罩住了边缘虽然比人工标注略粗糙但主体覆盖准确。另一张图里的裂隙横穿人物面部模型能识别出来算是一个亮点——因为模型的训练数据里人物面部纹理复杂裂隙与颜料的边界极难区分能正确分割说明增强策略有效。这套pipeline从数据处理、模型训练到推理部署大概花了两周时间最耗时间的反而不是训练而是数据格式转换和调试数据加载逻辑。如果谁想快速复现最稳妥的建议是先把Labelme的JSON解析逻辑写对然后找一个成熟的DeepLabV3开源实现把数据和增强策略换上。5. 复盘与避坑数据集的边界、误差与二次改造建议5.1 标注噪声分析人工标注到底有多准数据集的标注质量直接决定模型上限但这个质量不是绝对的。我做了一个有意思的实验让两位标注员分别独立标注同一批100张图然后计算两人标注掩码之间的Dice系数。结果是多少平均只有0.83。这意味着什么两位受过同样规范的标注员对同一张壁画破损区域的理解差异竟然达到17%。这些差异集中出现在破损边界的过渡地带以及大面积破损中中间状态的区域——轻微的颜料起甲但还没有脱落算不算破损这个灰色地带在不同标注员之间产生了明显分歧。我应该早点意识到这个问题因为模型在测试集上Dice系数的理论天花板不是1.0而是标注者之间的共识度大约是0.83-0.9。模型测试Dice达到0.869说明它已经接近甚至达到了人工共识上限。这不是模型不行而是数据本身存在标注噪声判断性能时要带着这个认知去看否则会陷入无意义的内耗。5.2 容易被忽视的三个工程坑坑一Labelme坐标的浮点数精度。Labelme导出的坐标是浮点数而图像像素是整数。直接取整会导致掩码和图像之间出现0.5像素的偏移。这个偏移在单张图上可忽略但在模型训练中反复上下采样后会累积成边缘漂移。解决方法是生成掩码时统一使用round而不是int强制截断并在掩码生成后做一次与原始图像的对齐检查。坑二数据增强必须作用于掩码。如果训练时对图像做了旋转或缩放掩码必须同步做相同的几何变换。这个很多人会踩坑——只对图像增强、掩码保持原样最终模型会出现严重的空间错位混淆。我使用的是Albumentations库它支持图像和掩码联动变换推荐大家直接用。坑三类别命名的统一性。Labelme标注时类别名如果有人在文件里写成damage有人写成Damage哪怕只是大小写不同后续训练脚本里会生成两个不同的类别ID掩码会错乱。我在项目里加了一道强制校验所有JSON的label字段必须严格等于damage不合规的重新命名绝不留情。5.3 关于单类别数据集的扩展与改造如果你拿到这个数据集做二次开发有几个可行的方向第一增加背景类别。当前数据集只有破损一个正类背景是隐式的。如果做了多类别扩展建议将背景类显式写入类别清单中这会改变损失函数的计算方式也能更方便地计算多类mIoU。第二增补负样本。现实场景中不是所有壁画图像都有破损模型目前只在有破损的图像上训练部署到全健康壁画上时可能会有误报。建议在应用时额外采集一批无破损的壁画图像作为负样本并加入一个无损坏类别或者专门校准模型的置信度阈值。第三半监督扩展。14210张标注图已经不少了但壁画种类繁多不同朝代、不同窟区的壁画风格差异巨大。如果遇到模型在新窟区效果不佳的场景建议用伪标签方案先在现有数据集上训练一个初始模型对未标注的新图像做预测用高置信度区域的预测结果作为伪标签然后交给标注员只修正错误区域效率远超从零标注。6. 标注之外的思考数据集的持续迭代与价值释放数据集的构建不是一锤子买卖它应该是活的。我在完成这个14210张版本后陆续收到了不少反馈其中一个高频请求是能不能把不同的破损类型分开标注像酥碱、裂隙、起甲、霉变这类病害的病理特征和修复策略完全不同文物专家希望得到更细粒度的信息。这确实是一个值得推进的方向。我的建议是不要推翻现有数据集重标而是在当前damage输出的基础上叠加一个病害分类分支。具体做法是先用现有数据集训练分割模型得到破损区域掩码再对每个掩码区域做病害类型分类。这个方案充分利用了现有标注的辨识能力同时把细粒度分类的任务交给另一个模型工程上风险更小。另一个被反复问到的问题是Labelme格式能不能直接转成COCO或COCO的衍生格式用于目标检测可以的。Labelme的shapes里除了polygon还支持rectangle如果要转成检测框用多边形的外接矩形即可。但我的经验是分割模型在破损识别任务上的实际效果明显好于检测模型。原因在于破损区域形状高度不规则包围盒里混入大量背景检测框架天然吃亏。所以如果目标不是找到破损在哪几张图上而是找到破损在哪个像素都不建议降级成检测任务。数据标注这个环节我至今仍认为是整个项目中最值得反复打磨的部分。起初我拿到一堆壁画图像时也想直接找现成的分割数据集开训练但很快就发现数据背后的材质差异、光线差异、病害形态差异不是任何公开数据集能覆盖的。只有亲手做了一遍标注才会真正理解模型的输出为什么会在某些边界上犹豫——因为人工标注在那里也犹豫。这个数据集的创建过程把壁画破损识别从看起来很美好变成了可训练、可评估、可部署的工程实践。也希望这套从图像清洗、规范化标注、统计分析到模型训练的方法论能帮你在自己的领域少走一段弯路。毕竟数据集的核心价值不只在于那14210张图更在于它承载的标注规则、质量标准和工程取舍。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑