图像修复(Image Inpainting):AI 补全缺失区域时,怎么保证和周围环境自然衔接

修复不是还原,是合理编造

你给 AI 一张照片,照片上有一块被撕掉的角。AI 填了一块内容进去。填完之后你盯着看:颜色过渡自然,纹理走向合理,边缘没有一丝破绽。然后我问你:你知道那片被撕掉的地方原本是什么吗?你大概率不知道。AI 也不知道。它只是用周围能看见的证据,设计了一个最合理的答案——一个连它自己都无法确认是否真实的答案。

AI technology illustration

图像修复(Image Inpainting)的任务看起来朴素:把缺失区域的像素补出来,并让补出的内容与周围环境自然衔接。形式化一点说,已知图 I 和掩码 M(1 表示可见,0 表示缺失),模型要算出一个 G,在洞里生成的值要和洞外的已知像素严丝合缝地拼在一起:

I_out = I ⊙ M + G(I, M) ⊙ (1 - M)

已知区域原封不动,缺失区域全靠模型生成。但"自然衔接"这四个字,逼着模型同时解决三个不同层次的问题:

  • 像素级连续:洞边界不能出现断线、色块或锯齿。
  • 结构级延续:墙的直线、地砖的排布、物体的透视关系,过界之后要接着走。
  • 语义级合理:洞里是草地就不能补出水面,是天空就不能补出桌面。

这三个约束经常打架。一根电线杆的杆身穿过缺失区域,结构连续性要求直线毫无偏差地接上,但语义可能提醒模型:洞里画的是一个人的脸,这条线应该让开。模型只能选一个它认为最不违和的解。所以同一个洞,换一个模型、换一次训练,填出来可能是完全不同的东西。这不是模型抽风,而是修复任务天生没有唯一解——它不是在还原,它是在合理编造。

老办法:把已知区域一层一层抹进洞里

图像修复的祖师爷是扩散。2004 年,Telea 提出 Fast Marching Method(FMM),思路在今天看来朴素得可爱:把洞看成一块被挖空的区域,然后从洞边缘开始,把已知像素的颜色和纹理一层层往洞里推。

  1. 把洞边界看作一道等值线,先处理离已知区域最近的像素。
  2. 对边界上的每个像素,用它的已知邻居做加权平均,权重同时考虑距离、方向和局部梯度。
  3. 填完一圈,边界往里缩一圈,重复直到洞被填满。

我最早天真地以为,修复就是把洞周围的颜色一点点抹进去。看完这篇论文才发现,这个"抹"字大有讲究:朝哪个方向抹、邻居的权重怎么分配,直接决定了一条线能不能顺着原方向穿过洞。

但它有一个致命的缺陷:它只看得见洞周围几个像素,完全没有场景理解。洞稍微大一点,抹出来的就是一坨糊。它不知道洞里应该是一张人脸还是一扇窗——它只知道顺着纹理继续抹。

另一条路线是 patch 复制。有代表性的算法叫 PatchMatch,Adobe 把类似思路做进了 Photoshop 的内容感知填充:在图像已知部分寻找跟洞边缘最相似的图像块,一块一块搬进洞里,再揉合边界。处理草地、砖墙这类重复纹理时它得心应手,但只要洞里应该是一个全新的物体,它照样两眼一抹黑——因为它只会抄,不会想。

深度学习的入场:修复从补洞变成了画画

2016 年,Context Encoders 第一次把修复当成生成问题来解:一个编码器把整张图压成紧凑的特征向量,一个解码器从这个向量里把缺失区域画出来。训练由两部分损失驱动:重建 loss 逼已知区域与原图一致,对抗 loss 逼补出来的部分看起来像真实照片。

这件事的意义在于:模型第一次在"看懂整张图"之后才动手。当时它只能在固定大小的方形遮罩上工作,不规则区域没法直接套用,但方向已经变了——修复不再是一把由局部推到局部的抹刀,而是一支由全局推断局部的画笔。

自然衔接的三件武器

从深度学习发力开始,"衔接得自然"就变成了一个系统工程。我把它拆成三件武器。

盔甲:掩码感知卷积

普通卷积有个尴尬的问题:它不知道哪些像素是洞里无效的。洞内像素被置零后,卷积核扫过洞边缘时,会把洞外真实的纹理和洞里一堆零混在一起算,生成的特征图被污染。NVIDIA 的 Partial Convolutions 处理得很直接:卷积时只对有效像素计算,权重只在有效像素上归一化;每算完一层,掩码自动收缩——因为那些位置的特征已经综合了周围信息,可以视作有效了。这是处理不规则掩码的里程碑。

但自动收缩还是太机械。后来 Gated Convolution 把二值掩码整个扔掉,让网络自己学习逐像素的门控值,决定每个位置该采信多少已知信息。

普通卷积 Partial Conv Gated Conv
掩码 无,无效像素混入计算 固定二值掩码,自动收缩 可学习软掩码,随特征调整
不规则洞 不适用 支持 支持
灵活性 最低 中等 最高

拼图术:上下文注意力

纹理有极强的重复性。同一面砖墙,你看过左边三块,基本能猜出右边三块长什么样。Generative Image Inpainting with Contextual Attention 把这个直觉写进了网络:把洞切成若干 patch,到已知区域搜索最相似的 patch,按相似度加权搬到洞里。

说人话:对于重复纹理,模型根本不是"画"的,是"抄"的。它从你看得见的地方,借来最匹配的纹理,铺进你看不见的地方。这就是草地、墙面、水面能被修复得天衣无缝的直接原因。

裁判团:多尺度损失函数

损失函数是模型的老师。今天的修复模型一般同时受四个老师管教:L1 loss 管像素差,感知 loss 用 VGG 的特征距离逼它"看起来像同一张图",对抗 loss 让判别器评判整图真不真,风格 loss 约束纹理的全局一致性。四者各管一段,缺一个都会崩。

大洞翻车之谜:不是不聪明,是看不到远方

很长一段时间,我都把大洞修复翻车归咎于模型不聪明。直到看到 LaMa 论文里的对比实验,我才意识到:不是它不聪明,是它根本没机会看到远处的信息。

普通卷积的感受野随层数增长,理论上有机会覆盖全图,但实际需要极深的网络。当洞占画面 30% 时,洞中心的像素要跨越漫长距离才能看到远处的上下文,信息在半路就稀释了。LaMa 的解法是用傅里叶卷积:任一位置的输入都能直接影响任意位置的输出,全图信息一步到达,不需要层层接力。这让它在超大掩码上的视觉质量直接上升了一个台阶。

这个发现让我想通了一件事:图像修复的衔接,本质上不是一个局部平滑问题,而是一个全局信息流动问题。它真正稀缺的资源不是计算量,是远处上下文。

翻车现场:模型最怕的三类问题

把模型逼到极限,你会看见三类典型失败。

  • 多解性,无解。洞里原本是你的狗,但狗被遮掉了大半。任何修复模型都只能给你一只"最常见形态的狗",它无法还原你的那一只。生成结果可以自然,但自然不等于真相。
  • 细长物体必断。耳机线、电线、栏杆这类细结构经常被补齐成背景。原因很实在:在损失函数眼里,少一根线对整体分数的伤害,远小于草地理错方向的伤害。
  • 人脸身份漂移。修复人像时,模型能补出光滑的皮肤和端正的五官,但你叔叔修完可能变成了别人。纹理衔接是成功的,身份还原是失败的。
扩散模型修复是什么路子

扩散模型近两年也杀进了修复领域,思路和 GAN 完全不一样:从纯噪声出发反复去噪,每次去噪都参考已知区域,把修复当成条件生成。它的优势是全局一致性更好,代价是速度慢得多。两种范式远没到谁取代谁的时候。

几个常见疑问

修复出来的结果和原图到底差多少?

没法保证。它给的是条件概率最大化的答案,不是唯一解。洞越小、周围线索越多,答案越集中;洞越大、内容越孤立,模型基本就是在猜。

为什么 Photoshop 的内容感知填充有时会拉丝?

因为它本质是 patch 拼接,缺少语义理解。它努力让每个小块的边界重合,但块与块之间的透视、遮挡关系不一致,就会留下拉丝痕迹。生成式修复不这么干,它先推断全局语义结构,再逐块细化。

它到底是怎么做到自然衔接的?

三句话总结:掩码感知卷积保证局部特征干净,上下文注意力从已知区域借纹理,多尺度损失逼它实现全局一致。三者配合,洞口的过渡才无迹可循。

它永远在给你一个最可能的世界

今天的图像修复,工程意义上的目标已经悄悄变了:它不再追求"还原被遮住的像素",而是追求"生成一个与可见证据完全一致的合理答案"。这不是一句算法黑话,而是这项技术的哲学底色。

理解了这一点,你就会明白它什么情况下值得信赖:洞越小、背景越重复、语义越确定,它越接近"正确"。而一旦涉及唯一性——某个人、某个物体、某个不服从纹理规律的细节——再精准的模型也只是在替你掷骰子。你需要的不是更强的算力,而是一个肉眼看不出来的谎言。

原创文章,作者:guanweilu,如若转载,请注明出处:https://guanweilu.cn/article/397.html

(0)
上一篇 4天前
下一篇 4天前

相关推荐