基于掩码的图像编辑:AI 怎么理解哪些区域该改、哪些该保留

你打开一个 AI 图像编辑器,选中照片里的一小块区域,输入“把这里变成一只猫”。几秒后,一只猫出现在那个区域里。神奇的是,猫的毛发边缘和原本的背景融合得恰到好处,光照角度都一致。你可能会想:AI 怎么知道只改这个区域,其他东西都别动?

AI technology illustration

答案的玩笑之处在于:AI 根本不需要“知道”。它只需要被镇压。你选中的那个区域,是一块被剥夺一切自由的领域——那里允许模型胡编乱造,而其他每一个像素,都在每一个生成步骤里被死死锁住,不许移动半分。这篇回答带你拆开这个过程。

扩散模型的底色:从随机噪声里“浮现”图像

现在主流 AI 图像生成模型是扩散模型。它的工作方式很像雕刻:从一整块纯噪声开始,每次去一点噪,让图像一点点清晰起来。如果没人管它,它会自由发挥,最后生成一张符合它见过的图片统计规律的新图——但没有任何约束,它不知道你的照片长什么样。

那怎么告诉它“我的照片”呢?一种极端的做法是把你的照片作为“条件”,让它整体重画。但我们只想改一小块,怎么办?那就需要一个掩码 mask——把你允许修改的区域标出来。可问题来了:模型并不会读你的心意,它只看到一些数字。你画的那个白色方块,对模型来说,只代表一个数字矩阵:1表示这里可以动,0表示这里不能动。

最朴素的做法:先生成,再胶上去

我最早以为,AI 做局部编辑是分两步的:先让模型自由生成一张全新图像,然后把你没想改的地方(非 mask 区域)用原图覆盖回去。听起来很合理?但这个方案有一个致命伤——全局光照不一致。

想象一幅画:你让画家在画布上画了只猫,然后把猫剪下来,贴到另一幅背景上。边缘总有接缝,猫的色调和背景的光线也对不上。同理,模型在生成时根本没看见周围的真实像素,它只是凭统计规律画了一个猫,你强行覆盖回去后,整个画面显得格格不入。

那怎么办?改进办法是在扩散模型内部动刀:不要最后才覆盖,而是从第一步开始,每一步都让模型同时看着“保留区”的真实样子。

真正的配方:每一步都把保留区“焊”回去

扩散模型从噪声到图像要迭代很多步,通常 50 步。每一步开始时,模型手里有一张“半成品”图像 zₜ——它目前还是大量噪声。如果完全无人干预,zₜ会继续朝着随机方向去噪。

有 mask 时,做法变了。设原图为 x,mask 为 m(1 表示可改区,0 表示保留区)。在每一步 t,模型先对原图做一个“同样程度的加噪”:xₜ = 加噪到和当前时间步一致的原图。然后把当前半成品和 xₜ 做一个像素级混合:

zₜ = m * zₜ + (1-m) * xₜ

这个式子的意思是:保留区一律使用原图加噪后的版本,而可改区继续使用模型自己正在生成的噪声版。然后模型基于这个混合结果,去预测下一步的去噪方向。

关键动作来了:这个混合不是只做一次,而是发生在每一步采样之后、送入模型之前。用专业的话说,这叫做“replacement”。这样,模型在每一步都能看到保留区的真实信息(虽然带噪声),然后它再决定可改区域长成什么样。相当于每走一步,保留区都被重新“校订”回原图,防止模型在几十步的迭代中逐渐漂移。我在Stable Diffusion 官方 inpainting 实现里第一次看到这个技巧时,瞬间明白了为什么网上教程都强调“mask 一定要涂对”——因为 mask 边界内的任何一点误差,都会让模型把不该动的像素也当作可改区域,然后它在生成时会基于自己的想象重画那一部分。

值得注意:在 Stable Diffusion 中,这个操作不是对图像像素直接做,而是对潜伏空间(latent space)做。因为模型不是在高分辨率像素上工作,而是把图像编码成一个低维的 latent 张量。所以上面的混合是在 latent 上进行的。不过原理是一样的。

模型凭什么“看”得到保留区?靠注意力

如果说强制替换是“锁住”保留区,那生成区如何与保留区协调,靠的是注意力机制。

扩散模型的骨架通常是 UNet,里面布满了交叉自注意力层。每个位置的像素在生成时,会和其他所有位置的像素计算相关性,然后从相关性更高的地方借用信息。你可以把它想象成一场全班的传纸条:生成 mask 区域内的每个像素时,这个像素都会问周围每一个像素“你是什么颜色?你属于哪个物体?”然后综合这些答案来决定自己长什么样。因为相邻像素在注意力中的权重天然更高,所以 mask 区域生成的纹理、颜色、光照会自动与保留区一致。

这就是为什么即使是硬性的像素级 mask,模型生成的补丁也不会像贴纸一样突兀。因为它不是最后裁剪的,而是在整个生成过程中,通过注意力源源不断从保留区“抄”到了上下文信息。

不同掩码编辑路线:一张表看明白

虽然文章讲的是基于 mask 的图像编辑,但“基于 mask”这个词下面掩盖了完全不同的技术路线。它们的核心区别是:mask 到底怎么参与模型运算?我梳理了一下:

方法 mask 的使用方式 优势 局限
传统 PatchMatch 从图像其他区域找最相似的 patch 填充 快,纹理同源 没有语义,生成不了新物体
GAN-based(DeepFill v2) 把 mask 作为额外通道拼进网络输入 能理解语义,结构合理 对大区域和复杂上下文容易崩
扩散 + 每步强制替换(本文主角) 在采样过程中按 mask 混合原图加噪噪声 质量高,全局一致 需要保证噪声级别对齐,计算较慢
扩散 + 专门训练 mask 条件(GLIDE inpainting) 训练时把 mask、原图、噪声一起作为输入 模型端到端学习 mask 语义 需要重新训练一个大模型
注意力编辑(Prompt-to-Prompt) 不显式给 mask,通过修改 cross-attention map 控制 无需硬分割 对几何形状和精细区域控制弱

值得强调的是,即便像 GLIDE 这种专门训练的方式,在推理时同样要配合“每步强制替换”来处理复杂边缘。所以这不是两种互斥方案,而是层层叠加的关系。

为什么 mask 边缘总是最容易翻车的地方?

你有没有遇到过:明明涂的 mask 在猫的轮廓内,生成后猫的周围却出现了一圈奇怪的“毛刺”?我踩过这个坑。一开始我以为是模型笨,后来才想通:mask 会把画面硬切成“可动”和“不可动”两个阵营,但在边缘那一圈,模型并不知道你切的是猫的毛发还是背景。它看到的只是几十个像素宽的含糊地带:一边是自由的,一边是锁死的。于是它在可动区生成的内容,很可能和保留区边界处最后几个像素不匹配。

更麻烦的是,在每一步强制替换中,保留区的原图噪声级别必须和当前时间步匹配。如果实现里这一步做不好,保留区的信息就会像“噪声污染”一样干扰生成,导致边缘出现深浅不一的颜色。这也是为什么官方实现里通常会在 mask 上做一下模糊(甚至膨胀)处理,给边缘留一点过渡。

我的认知更新:mask 不是“边界线”,而是“像素级权重”

我在很长一段时间里都把 mask 想象成一个选区工具,像 Photoshop 里的蚂蚁线。但实际上,AI 眼里的 mask 只是一个数值矩阵,它告诉模型的不是“这里是我的边界”,而是“这些像素你可以随意修改,而那些像素,给我别动”。模型不知道猫是什么,不知道背景是什么,它只是在每一轮采样里执行那个混合公式。

有一次我在测试一个 inpainting 模型时,不小心把 mask 画到了猫的前臂上一点,结果模型直接把猫的前臂重新画了一遍——没有任何违和感,但那只猫已经不是我原来的猫了。那一刻我才明白:mask 的精确性不是为了防止 AI 改动,而是为了防止 AI 把本该保留的像素当作自由区域。一旦它获得了修改权,它就会用自己的世界观重写那一块——而这正是我们想要的效果,只不过我们不想让它碰主体。

所以,你画 mask 时真正控制的是“权限”,而不是“语义”。

几个常见问题

mask 区域是纯随机噪声吗?

在开始的时候,是可改区域会被初始化为随机的噪声 latent。但随着扩散迭代,模型逐步填补内容。保留区并不是噪声,而是每一步都用原图的加噪版本重新赋值。

为什么有时候生成的补丁跟周围颜色不统一?

最常见的原因是保留区原图的噪声级别没有和当前时间步对齐。如果模型看到一个比预期噪得更厉害或更轻的保留区,它会误解上下文。另一个原因是你画的 mask 边缘太坚硬,没有给扩散模型留一点过渡空间。

只用 mask 不配文字提示,模型会填什么?

它会根据周围像素来“脑补”最合理的纹理和结构,但因为没有语义目标,生成的可能是一个模糊的、平均化的事物。想让补丁是具体物体,必须搭配文本提示或其他条件。

掩码编辑的边界在哪里?

基于掩码的硬约束适合“改变局部内容”这种任务:换背景、删物体、补全画面。但它有一个根本性的问题——它不知道哪些像素是“同一个物体”。你如果想给猫加个微笑,mask 很难只画在嘴巴区域;如果你想拉长猫的尾巴,mask 也许能限制范围,但模型并不具备对“形状变形”的几何操作能力。因为这些任务需要的是语义理解,而 mask 是一种像素级权限控制。

所以现在的趋势是把 mask 和更高级的条件结合起来。比如 ControlNet 用边缘或深度图来引导结构,InstructPix2Pix 直接用指令编辑图像而无需 mask。但它们内部依然依赖于类似机制:在扩散过程中,如何让输入图像(或它的编码)保留下来。也就是说,你在这里学到的“每步强制保留”思想,是所有可控编辑模型的底盘。

哪天你看到某个 AI 编辑器“神奇地”只改了你想改的部分,请记住,背后可能没有一丝一毫的“理解”,只有每一步 50 次的无情替换,和注意力机制那场跨越所有像素的传纸条。掩码是给模型的紧箍咒,而紧箍咒从来不需要知道唐僧为什么要念经。

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

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

相关推荐