← 返回题目列表

扩散模型如何实现 Inpainting 和 Outpainting?

中等 第 12 / 25 题 更新于 2026/09/17

简化版

Inpainting 在遮罩区域重新生成内容,同时尽量保留未遮罩区域;Outpainting 则先扩展画布,把新增区域当作待生成 Mask,并利用原图边缘作为上下文补全。

实现时通常把带噪 latent、原图 masked latent 和 Mask 一起送入专用模型,或在每个去噪步骤把未编辑区域重新融合回来。质量关键在于 Mask 语义、羽化边界、上下文范围和 Prompt。硬边界容易出现接缝,Mask 太大则会丢失结构约束。

局部编辑的难点不只是“遮住哪里”,还包括“边界如何连续、未编辑区域如何真正保持”。

详细版

m=1 表示要重绘,m=0 表示保留。一个常见的逐步融合是:

z_orig_t = add_noise(z_orig, ε, t)
z_t = m ⊙ z_generated_t + (1-m) ⊙ z_orig_t

这样未编辑区域在每个时间步都回到与当前噪声级别匹配的原图 latent,而不是只在最后粗暴粘贴。专用 Inpainting U-Net 还可能输入 9 通道:4 通道噪声 latent、4 通道 masked-image latent 和 1 通道 Mask。

设置优点风险
硬二值 Mask边界明确容易出现色差和接缝
羽化 Mask过渡自然编辑范围可能外溢
小 Mask保留内容多上下文不足,难重建完整对象
大 Mask生成自由度大身份、透视和构图容易漂移

例如把 Mask 向外膨胀 8~32 像素,再羽化 4~16 像素,常比精确贴着对象边缘更自然,但这些数值需按分辨率和目标域验证。

完整版教学

1. Inpainting 的输入有哪些

基础输入包括原图、Mask、Prompt 和随机种子。Pipeline 会把原图编码为 latent,把被遮区域置空或加噪,再用周围上下文生成。

original image -> VAE -> original latent ----┐
mask -----------------> resize to latent -----┼-> inpaint denoiser
masked image -> VAE -> masked latent ---------┤
prompt -> text encoder -----------------------┘

Mask 的坐标、插值和黑白语义必须确认,反转一次就会重绘错误区域。

2. 为什么要给模型 masked image

只有 Mask 和噪声时,模型知道哪里要生成,却缺少未遮区域的低层视觉信息。masked-image latent 提供颜色、纹理和布局上下文。

专用 Inpainting 模型在训练中见过这种通道组合,通常比把普通文生图模型直接用于遮罩任务更能保持边界。

3. 未编辑区域为什么仍可能变化

整张图进入 VAE 时会产生有损重建;若整幅 latent 都参与去噪,未遮区域也可能漂移。即使 latent 被锁定,最终 Decoder 的卷积感受野也可能在边界附近传播变化。

要求像素级保持时,最可靠做法是解码后用原始像素与羽化 Mask 合成,但要处理颜色与光照接缝。

“未遮区域视觉相同”和“未遮区域像素完全相同”是两个不同验收标准。

4. Mask 膨胀和羽化分别解决什么

紧贴对象轮廓的 Mask 可能保留旧对象边缘,造成残影。先膨胀能把旧边缘纳入重绘,羽化则让新旧内容平滑混合。

操作作用过度使用的后果
膨胀清除旧轮廓和阴影改动过多背景
腐蚀缩小编辑范围残留旧对象
高斯羽化平滑颜色纹理接缝边界发糊、内容外溢

Mask 处理应按输出分辨率定义,不能把 512 图的固定像素参数直接用于 4K 图。

5. Denoising Strength 如何影响局部编辑

低强度主要修改纹理,难以替换对象结构;高强度允许彻底重画,但与周边身份和透视更容易不一致。专用 Inpainting Pipeline 中具体映射仍由 Scheduler 决定。

替换小物体可从中高强度开始,修复皮肤瑕疵则用低强度。应固定 Seed 扫描曲线,而不是依赖通用默认值。

6. Outpainting 与 Inpainting 有什么关系

Outpainting 先把原图放到更大画布,新增区域设为 Mask,再做 Inpainting。难点是新增区域没有外侧上下文,模型必须延续原图的透视、光照和语义。

可分多次向外扩展,每次保留重叠带;一次扩展过大时,远端内容容易与原图失去联系。

7. 如何保持构图和透视连续

Prompt 应描述完整场景,而不只是新增对象。深度、边缘或透视线控制可帮助延续几何;参考适配器可保持风格和人物身份。

扩图前还可对原图边缘做镜像或模糊填充,给 VAE 提供较平滑初值,但不能让填充纹理成为错误结构条件。

8. 多轮编辑为什么会累计退化

每轮都重新编码、解码整图,会累计 VAE 色偏和细节损失。新的接缝还可能成为下一轮模型的错误上下文。

应保留最高质量原图和编辑历史,尽量只重编码必要区域;多轮完成后可统一做色彩匹配,而不是每轮反复压缩成有损格式。

9. 怎样评测局部编辑

评测需拆成三个区域:Mask 内编辑成功、边界带融合质量、Mask 外保持程度。

inside:  Prompt 对齐、对象正确、伪影率
border:  梯度连续、色差、接缝人评
outside: LPIPS/SSIM 或像素差、身份和结构保持

对 Outpainting 还要评估整体构图、重复纹理和远端语义合理性。

10. 常见故障如何排查

Mask 外全变:检查语义是否反转、是否每步融合原 latent;边缘有光圈:检查羽化和颜色空间;对象残影:增加膨胀;新增区域重复:减小单次扩展或增加结构条件。

同时确认 Mask Resize 使用最近邻还是灰度插值。二值 Mask 被错误平滑可能产生意外半透明编辑区。

11. 常见误区与追问

  • 误区:Mask 画得越精确越好。 太贴边会保留旧轮廓,通常需要适当膨胀和羽化。
  • 误区:Mask 外一定逐像素不变。 VAE 和全图解码可能改变未编辑区域。
  • 误区:Outpainting 是把空白边缘直接文生图。 它需要利用原图重叠上下文保持连续。
  • 误区:一次扩得越大越省事。 上下文影响会随距离减弱,透视和语义更容易漂移。
  • 误区:普通文生图模型与专用 Inpainting 模型效果等价。 专用模型通常训练过 Mask 和 masked latent 通道。
  • 追问:怎样做到背景完全不动? 最终像素级合成原图,并仅在羽化边界允许混合。
  • 追问:怎样替换整个人又保姿态? Mask 重绘结合 Pose/Depth ControlNet 和身份参考条件。

12. 加强记忆

  1. 三输入:原图上下文、Mask、文本/结构条件。
  2. 逐步融合:未编辑 latent 要与当前噪声级别对齐。
  3. 边界处理:膨胀清旧轮廓,羽化消接缝。
  4. 扩图策略:小步扩展、保留重叠、维持透视与光照。
  5. 三区评测:Mask 内、边界带、Mask 外分别验收。