简介本资源是一套面向计算机视觉与文化遗产数字化保护方向研究者的壁画图像修复开源实现聚焦壁画损伤区域的语义重建与画线引导式修复任务适用于图像修复算法学习、文物数字复原实践及深度学习模型二次开发。压缩包共34个文件含14个Python核心脚本涵盖数据加载、网络构建、损失计算、评估与训练/测试流程、10张示例与结果图像jpg/png格式、4份配置与说明文本txt/md/yml/cfg以及网络结构图、项目介绍图等辅助材料整体体积6.86MB结构清晰、模块解耦便于快速理解MuralNet架构设计与端到端修复流程。目前已有296人学习下载提供完整可运行代码、预设配置、典型输入输出示例及README文档覆盖从环境搭建、数据准备、模型训练到定量评估的全流程是开展壁画类图像修复研究的实用入门与进阶参考。 想聊一个让我折腾了挺久的项目壁画图像修复。准确说是把破损壁画数字化之后用“画线引导”的方式让模型自动把缺块补回去同时不让补出来的结构跑偏。这项目是个打包好的工程里面有整套修复流程、训练代码和推理脚本。我拿到之后从读代码、跑通到调出满意的效果踩了不少坑也攒了不少经验。这篇文章就复盘一下整个思路、关键步骤和实操中会遇到的问题给同样想入坑图像修复、尤其是偏文化遗产数字化方向的朋友做个参考。1. 壁画修复的整体思路与方案选型1.1 壁画损伤的典型类型与修复需求拆解壁画这东西跟普通照片的瑕疵完全不是一个量级。照片上可能就一道划痕、一块污渍壁画则是成片脱落、裂缝、起甲、霉变加上几百上千年的颜料的自然老化信息丢失非常严重。所以开始做修复之前得先想清楚到底修的是什么损伤。我按照实际项目中的情况把壁画损伤粗略分成三类。第一类是几何性缺损比如墙体开裂、表面剥落特征是结构断裂、边缘明显修复重点是“补形状”。第二类是纹理退化比如颜料褪色、霉斑覆盖特征是表面还在但细节和颜色不对修复重点是“还原质感”。第三类是结构性缺失比如人物面部、衣纹大面积脱落这类最难因为原有的线条走向和色彩层次完全丢了AI再怎么猜也得有个依据。传统做法像GIMP或Photoshop里的人工修复靠的是修复师的经验和美术功底一笔一笔画。但批量数字化的时候几百张高分辨率壁画要这么弄时间成本受不了。卷积网络做图像修复速度是上去了可问题是自由发挥空间太大模型容易上手“脑补”补出来的纹理和周围不搭结构也容易错。1.2 为什么选画线引导而不是纯自动修复这是整个方案的核心取舍。全自动修复看着省事但用在壁画上风险很大。壁画是有叙事性的人物的位置、手的姿态、衣纹的走向都是有严格构图逻辑的模型不知道这些。你给它一张缺了半张脸的壁画它可能补出一张完全不同的脸纹理倒是自然但历史信息是错的。画线引导的思路是把人的判断和模型的计算结合起来。修复师或者标注人员先在破损区域用画笔画出主要的结构线——比如衣纹的走势、脸颊的轮廓、飘带的弧度。这些线进去了模型就有了“骨架”生成颜色和纹理的时候会严格沿着线走。我实测下来的感受是画线引导能把修复结果从“看起来像”提升到“结构准确”。少了这一步模型补出来的东西十次里有七八次是不符合壁画原有构图的。加了引导线之后虽然还不是百分百但至少关键结构不会跑偏修复师在后期微调时能省很大力气。2. 核心原理图像修复与画线引导的配合逻辑2.1 图像修复技术两条路线传统算法与深度模型这个项目里实现的核心算法逻辑得从两条技术路线说起。传统路线以OpenCV的cv2.inpaint为代表分INPAINT_TELEA和INPAINT_NS两种算法。TELEA的思路是靠快速行进法从缺损区域的边缘往里一层层推进每一层用周围已知像素的加权平均来填充权重和距离、方向、像素梯度都有关系。NS算法则有物理背景它模拟流体力学里的等照度线isophotes传输把边缘的梯度信息往区域内部“送”。这类算法快、简单但只适合小面积、低纹理的区域。我在项目里用它做边缘处理前的预处理比如清理掉一些孤立的小斑点效果好生成的颜色过渡也自然。深度路线主流思路就是GAN。生成器接受一张带mask的破损图和引导线图输出修复图判别器负责判断输出图的真假。关键点在生成器结构上一般会设计成两个分支一个分支处理结构信息引导线一个分支处理纹理信息色彩块中间用特征融合模块把它们拼接起来。我在这个项目里跑了两个经典的模型做对比一个是EdgeConnect它先生成边缘图再做补全另一个是Structured Inpainting它直接把结构信息编码到生成器的中间层。EdgeConnect对画线依赖更强线条画得越准补出来的纹理越连贯。Structured Inpainting对结构信息的处理更灵活但训练时间也长一点。2.2 画线引导Edge/Structure Guidance调节了什么画线引导的核心逻辑本质上是改变了这个“优化问题”的约束条件。纯模型的优化目标是“生成的像素和真实像素尽可能接近像素分布的概率让它看起来像真图”。但像素分布概率是个统计概念它不能保证拓扑关系正确。一旦遇到大面积缺失区域统计平均的结果就是生成模糊、畸变、没有方向性的纹理。但把画线加进去之后优化目标里多了一项结构损失。这个损失在特征层面计算它会强制生成图上对应位置的边缘响应与用户画线的边缘响应保持一致。简单说你画了衣纹输出结果里这个位置的衣纹就必须存在即使颜色稍微偏一点结构也不能丢。调节的时候有个关键参数叫结构权重λ_structure。太小引导线形同虚设太大生成结果会“过拟合”到线稿上导致颜色块变得很平、像卡通图。我调参的经验是λ_structure设在0.3到0.5之间视觉效果和结构忠实度比较平衡。但最终效果还是在壁画本身的纹理复杂度像大幅重彩壁画线条流畅度本来就高这个参数要稍调高一点淡彩壁画纹理层次柔和结构权重反而不能给太高。3. 实操过程从数据准备到模型训练3.1 壁画损伤区域模拟与数据增强数据准备是这类项目里最容易被低估的一步。壁画真迹是没法拿来做监督学习的因为你没有“修复后”的标准答案。所以常规做法是用完好壁画的图像人为叠加损伤mask生成“假破损”的训练对。我先把高分辨率壁画切片成512x512的patch每张patch随机生成多类mask。mask类型包括随机的多边形块斑、粗细不一的曲线裂缝、模拟边缘剥落的不规则条带。有一种比较实用的生成方法是“随机游走”从patch的某一点出发随机方向、随机步长生成形状自然的长条裂缝比单纯用矩形或圆形更像真实的墙体开裂。数据增强方面光照扰动和色彩抖动是必须的。壁画的拍摄环境并不统一有的地方打了强闪光有的地方是自然光同一个洞窟里壁画表面的明暗差异也大。如果训练集里全是均匀采光条件下的图片模型泛化能力基本为零。我用到了随机亮度调整、对比度拉伸、HSV通道的小幅扰动、随机水平/垂直翻转和90度旋转。有一点要提醒增强的时候引导线图必须和图像同步做相同的变换不然线就对不上图了。这个看似简单的细节容易出错一旦忘了同步训练出来模型效果会非常差。3.2 画线标注工具与标注策略画线引导的数据正规叫法是“structure map”或“edge map”。有两个获取途径一个是让标注员手动画一个是用Canny或HED算法自动提取。手动画的工具我用的是LabelMe加一个自写的小插件。核心体验是单纯的线画上去尺度感不好把握。得让标注员能同时看到原始图和局部放大图线要画在图幅层级但精度又要在像素层级。后来我直接在原图上叠加一个半透明的图层标注员在半透明层上画线画完导出一个单通道的线稿图。这个方案简单但有效。自动提取的路线Canny结果是单像素薄线太碎HED边缘图更完整但会把壁画的纹理细节也当成边缘画出来的线图会很“花”。我建议自动提取和手动修正结合先用HED跑一遍得到基础边缘图再用标注员对破损区域附近的边缘做修正、增补或擦除。实际操作中破损区域的边缘本来就断了HED只会提取出断口周围的纹理不会“脑补”出正确的结构延续。所以破损区域内部的线必须靠人工补画。这活儿的质量直接决定修复结果的上限。3.3 训练配置与参数选择训练阶段我的环境是单卡RTX 309024GB显存。配置如下图像分辨率512x512batch size4显存刚好撑住优化器Adam初始学习率2e-4学习率调度余弦退火训练总轮数200轮损失函数L1重建损失 VGG感知损失 判别器对抗损失 结构一致性损失关键点是结构一致性损失函数。我没用简单的L2而是把生成图和真实图分别输入预训练VGG16取第2层和第4层的特征图计算L1距离。这样做结构引导更稳补出来的边缘不容易“糊”。感知损失的权重系数也得调。权重太高生成图会偏向语义正确但纹理平滑的结果权重太低生成图纹理丰富但容易失真。我做了一组消融实验最终确定设置是L1损失权重1.0、感知损失权重0.8、对抗损失权重0.3、结构一致性损失权重0.5。推理阶段因为显卡不能一次性输入整幅高清壁画我采用滑窗裁切。窗口大小512x512重叠区域设64像素。处理完后重叠部分用加权平均融合核心是避免接缝出现。融合公式不复杂但效果很关键两张图的输出位置重叠时权重按像素到窗口边缘的距离来算从边缘到中心线性递增。4. 常见问题与排查技巧实录4.1 生成区域颜色断层这几乎是所有图像修复项目的第一大坑。模型单独看每张图都觉得没问题可一旦把修复区域和原始壁画一对比颜色明暗断层一眼就能看出来。排查思路先检查是不是数据预处理阶段没对齐。壁画的亮度和色偏在不同光照条件下差异很大如果训练时用同样的输入分布而推理时的测试图光照条件不一样输出自然对不上。我给训练数据做了光照归一化用固定的参考光源对颜色做一次映射。其次是感知损失的权重。感知损失关注的是高层的语义特征对像素级的颜色一致性并不敏感。如果感知损失权重太大生成图虽然“内容合理”但“色调不符合环境”。我把感知损失降到0.8之后颜色断层的问题明显缓解。还有一种情况是直方图匹配没做。壁画出图前我用修复区域周围20像素范围内的像素颜色分布对生成区域做一个直方图匹配强制生成结果的颜色统计特征和外圈对齐。这步虽然是后处理但可以解决很多神经网络的“色偏强迫症”。4.2 引导线太密导致生成结果纹理僵硬画线引导是个“过犹不及”的事。标注员如果认真到连颜料颗粒的纹理都画上线模型生成的区域就会像打印出来一样缺乏壁画的自然笔触感。这里得理解一个原理引导线本质上是一种强先验它会把模型“限制”在结构上。线画得越多模型的自由空间越小最后生成出来的纹理细节就极少图像虽然“修复正确”但“审美失败”。我的处理办法是对标注线做膨胀和高斯模糊处理。每根线膨胀1到2个像素然后做标准差为1.5的高斯模糊让线不再是硬性的二值边缘而是柔和的结构提示。这样模型既能得到结构的走向提示又能保留一部分在纹理细节上的自主生成能力。这类小技巧对最终效果的影响往往比换模型还大。4.3 裂缝区域过平滑壁画裂缝的修复有个特殊难点裂缝在照片里是暗色的、锐利的线状区域修复后如果变成一片平滑的色彩视觉上会非常“假”因为周围壁画的表面肌理是凹凸不平的。处理办法是在损失函数里增加高频细节约束。我用了傅里叶频谱的高频分量做一致性判断把生成区域和真实修复结果的频谱高频分量做对比计算它们之间差距的L1损失。这样强制生成图保留足够的边缘纹理响应不容易“过度平滑”。后续推理阶段如果不做损失函数干预可以叠加一层“纹理迁移”从修复区域周围相同纹理风格的区域里随机采样小patch做基于PatchMatch的纹理合成覆盖到修复区域上再用深度模型的结果做融合。这个方法的思路是人为地把周围真实壁画纹理“搬”到缺口里深度的色彩生成和传统的纹理合成互不干扰各管一段。下面把常见问题和对应排查点整理成一张速查表方便后面直接查现象核心原因处理办法优先级修复区域和周围色彩断层光照归一化缺失或感知损失权重过高做光照归一化把感知损失权重降到0.8高生成纹理细节缺失过于平滑感知损失权重偏低或引导线权重过高调高感知损失降低结构权重λ_structure高修复区域出现明显的接缝滑窗推理时重叠区域小或融合权重不当重叠区域提高到64像素融合权重按距离线性上升中壁画线条结构和原图不符引导线不完整模型自主发挥过头补标注线增加结构一致性损失中生成区域边缘发黑或发白数据增强时不匹配检查翻转和旋转是否同步处理了引导线图高大面积缺口修复后内容显空洞训练数据中缺少大面积mask的样本增加随机游走生成的大面积mask样本比例中结果纹理丰富但语义不对对抗损失占比过高模型过度追求“真实感”降低对抗损失权重调高感知损失低标注线太多导致生成类似线稿引导线过密、过硬线条膨胀后加高斯模糊转化为结构提示中4.4 训练显存不足怎么办壁画图幅大训练又必须在高分辨率下进行不然细节丢失严重。但24GB显存扔一个512x512的batch 4就已经顶上限了。想要更高分辨率我只能用梯度累积。梯度累积不复杂就是每2个batch先只做前向和反向不更新参数攒够一定次数之后把梯度累加值一次性用于参数更新。这样做的效果等效于增大了batch size但显存占用不变。我用了accumulation_steps4等效batch size变成16训练稳定性和最终效果都有提升。还有个亲测好使的招混合精度训练。PyTorch的AMP模块把模型参数和梯度在训练时切成半精度浮点数FP16能省将近一半显存。一开始我担心精度损失会影响壁画修复这种像素级任务实际上在超参数不变的情况下PSNR指标的差距在0.1dB以内肉眼完全无法分辨。4.5 引导线标注的时间成本预估给壁画做精细的画线标注是项目的隐性成本大头。我统计过一张512x512的patch如果破损面积占30%纯手动画线平均需要15到20分钟。主要时间不是画线本身而是看着原图判断结构走向要参考周围的衣纹、轮廓线推断缺失部分应该如何延续。如果项目时间紧可以采用折中策略只对有明确语义信息的大区域脸部、手部、衣纹画精细的线其余的小剥落区域直接丢给模型自主生成不画引导线。这样可以在标注质量和人效之间取得平衡实际修复效果也基本在线。5. 画线引导在壁画修复中的扩展思考画线引导这套机制不只适用于壁画。流程本身是通用的任何需要“结构可控、细节丰富”的图像修复场景都能用它来约束模型的输出。像老旧照片的人物面部、文物拓片上的文字结构修复、古画长卷的补色思路完全一样。我后续还试过把它迁移到“线稿上色”的场景。传统线稿上色是用参考图做颜色迁移但布局复杂时容易脏。如果先用画线引导把线稿的结构信息编码进特征再在解码阶段用颜色风格条件控制生成效果比传统方法稳很多颜色更贴合线稿的走向。另外壁画修复项目做完之后留下的是一套“数据管线训练范式推理脚本”的组合。这套东西可以复用到其他数字文物保护项目中比如岩画、碑刻、古建筑彩绘的数字化修复。只要按第3节的数据准备思路把不同材质的图像规格统一模型结构不用大改就能迁移过去。还有一点值得提壁画表面的3D褶皱和多视角光照导致的纹理变化在纯2D技术上很难完全处理。后续如果想追求更好的效果可以试试引入深度信息用深度图辅助结构调整。我已经测试过把NeRF重建出的几何结果法线图作为额外输入通道在部分复杂纹理的修复上比单纯用RGB图效果更好。当然那套流程训练成本更高数据准备也更复杂建议作为进阶方向来尝试。最后分享一个我自己总结的经验画线引导修复永远不要指望模型“一步到位”。它的设计哲学是“人机协作”——人负责提供结构和语义判断模型负责高效的纹理生成和色彩复原。实际操作时把修复结果叠加回原图进行一轮人工微调调整边缘、修正颜色效果远远好于直接接受模型输出。这个微调过程熟练之后一张512x512的patch花不了5分钟但整个修复结果会显得“专业”非常多细节经得起放大看。本文还有配套的精品资源点击获取