使用StableDiffusion进行图片Inpainting原理

本文介绍了基于去噪扩散概率模型的图像修复方法RePaint,该方法适用于极端的mask情况,通过预训练的Unconditional DDPM进行修复。通过反向扩散过程结合Resampling技巧,解决了传统方法中的语义修复问题,提高了图像修复的质量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

Inpainting任务是指在任意一个二进制的掩码指定的图片区域上重新生成新的内容,且新生成的内容需要和周围内容保持协调。当前SOTA模型用单一类型的 mask 训练限制了模型的泛化能力,此外 pixel-wise 和 perceptual loss 会导致生成模型朝着纹理填充而不是语义修复方向更新。
本文提出了基于去噪扩散概率模型的图像修复方法Repaint,该方法甚至对于极端的 mask 情况(如mask 面积很大,几乎遮挡了整幅图像)都适用。本文利用一个预训练的 Unconditional DDPM 作为先验模型。为了调节生成过程,我们使用给定的图像信息仅对未屏蔽区域进行采样来改变反向扩散迭代。由于该技术不修改原始 DDPM 网络本身,因此该模型可以为任何修复形式生成高质量的图像。

1. 预备知识

本章节将介绍几个后面要用到的DDPM的结论,关于这些结论是如何得到的以及DDPM的相关知识可以移步至 通俗理解DDPM到Stable Diffusion原理

扩散的前向过程:
q ( x t ∣ x t − 1 ) = N ( x t ; 1 − β t x t − 1 , β t I ) (1) q(x_t|x_{t-1})=\mathcal{N}(x_t;\sqrt{1-\beta_t}x_{t-1},\beta_t\text{I})\quad\text{(1)} q(xtxt1)=N(xt;1βt xt1,βtI)(1)
进一步可以直接从 x 0 x_0 x0推到出加噪后的 x t x_t xt:
q ( x t ∣ x 0 ) = N ( x t ; α ˉ t x 0 , ( 1 − α ˉ t ) I ) ( 2 ) q(x_t|x_0)=\mathcal{N}(x_t;\sqrt{\bar{\alpha}_t}x_0,(1-\bar{\alpha}_t)\mathbf{I})\quad(2) q(xtx0)=

### 图像修复 (Inpainting) 的原理 图像修复是一种通过填补缺失部分来恢复受损或不完整的图像的技术。其核心目标是利用已知的信息推断并重建丢失的数据,使得最终的结果尽可能接近原始图像。 #### 传统方法的局限性 传统的图像修复方法通常依赖于手工设计的特征提取算法以及局部邻域信息的传播机制。然而,这些方法的学习能力有限,在处理复杂场景或者严重损坏的图像时表现不佳[^1]。 #### 深度学习驱动下的图像修复 近年来,随着深度学习的发展,特别是生成对抗网络(GANs)的应用,图像修复领域取得了显著进步。这种方法能够更好地理解全局结构和纹理细节,从而实现高质量的修复效果。 ##### Partial Convolution 技术 一种重要的创新来自 **Partial Convolution** 方法,它专门针对带有遮罩输入的情况进行了优化。该技术允许卷积操作仅作用于有效像素上,并动态调整权重以适应不同位置的有效数据量变化。这种特性非常适合解决具有任意形状孔洞的问题[^2]。 以下是 partial convolution 的基本工作流程: ```python import torch.nn as nn class PartialConv(nn.Module): def __init__(self, in_channels, out_channels, kernel_size=3, stride=1, padding=1, bias=False): super(PartialConv, self).__init__() self.conv = nn.Conv2d(in_channels, out_channels, kernel_size, stride=stride, padding=padding, bias=bias) def forward(self, input_image, mask_in=None): if mask_in is None: mask_out = torch.ones_like(input_image[:, :1]) else: mask_out = F.conv2d(mask_in.float(), weight=torch.ones(1).unsqueeze(0).unsqueeze(-1).unsqueeze(-1), stride=self.stride, padding=self.padding) output = self.conv(input_image * mask_in) masked_output = output / (mask_out + 1e-8) new_mask = (mask_out > 0).float() return masked_output, new_mask ``` 上述代码片段展示了如何定义一个支持部分卷积层的基础模块。其中 `input_image` 表示待修复图片,而 `mask_in` 则指示哪些区域需要被填充。 #### 数据预处理建议 为了获得最佳性能,在实际应用过程中还需要注意一些具体的操作指南。例如当准备训练样本时可以采用特定颜色标记需修补范围——即把要修复的部分设置为纯绿 `(0,255,0)`;同时为了避免边缘模糊影响结果质量,应选用精确绘图工具如铅笔而非画刷来进行标注,并关闭抗锯齿选项[^3]。 ### 总结 综上所述,现代基于深度学习框架下开发出来的新型图像修复方案不仅克服了以往经典算法存在的缺陷,而且还能创造出更加逼真的视觉体验。这得益于先进神经网络架构的设计理念及其强大的表达能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值