扩散模型如何实现 Inpainting 和 Outpainting?
简化版
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. 加强记忆
- 三输入:原图上下文、Mask、文本/结构条件。
- 逐步融合:未编辑 latent 要与当前噪声级别对齐。
- 边界处理:膨胀清旧轮廓,羽化消接缝。
- 扩图策略:小步扩展、保留重叠、维持透视与光照。
- 三区评测:Mask 内、边界带、Mask 外分别验收。