在22年CVPR中,DDPM生成范式终于是对image inpainting任务下手了,本文作为第一个使用DDPM方法进行image inpainting的文章,其题目也是平平无穷(褒义)。
出发点
首先本文对image inpainting任务又挖了一个新坑:作者提出,以往的image inpainting方法可以表示为 x c = G ( x ⊙ ( 1 − m ) , m ) x_c = G(x \odot (1-m),m) xc=G(x⊙(1−m),m),可以看到在inpainting的时候,生成模型 G ( ) G() G()是以掩码矩阵 m m m为条件的,这就限制了trained model的适用范围,因此作者提出,他要搞一个无条件的image inpainting模型,于是就有了本文。
模型介绍
(对于DDPM不太了解的,可以去看一下我的另一篇讲:用DDPM做image SR的讲解)
首先作者的前向很简单,就是直接由完整图像
x
0
x_0
x0经过
t
t
t步加噪获得:
其中
α
ˉ
\bar\alpha
αˉ是0到t的噪声强度累计,可以表示为
α
ˉ
=
P
i
s
=
1
t
(
1
−
β
s
)
\bar\alpha = Pi^t_{s=1}(1-\beta_s)
αˉ=Pis=1t(1−βs)。接下来重点说一下反向过程:
这个很好理解,作者将第
t
−
1
t-1
t−1时刻的完整噪声图像分成了两部分,
x
t
−
1
k
n
o
w
n
x^{known}_{t-1}
xt−1known和
x
t
−
1
u
n
k
n
o
w
n
x^{unknown}_{t-1}
xt−1unknown。首先由于观测区域是可以直接获得的,因此
x
t
−
1
k
n
o
w
n
x^{known}_{t-1}
xt−1known可以直接由
x
0
x_0
x0加噪获得。对于缺失区域,作者由
x
t
x_t
xt出发,通过网络来估计第t时刻
x
t
−
1
x_{t-1}
xt−1的均值和方差,然后采样,最后将两部分依据mask组合在一起,就成了完整的
x
t
−
1
x_{t-1}
xt−1。然后再以
x
t
−
1
x_{t-1}
xt−1为起点,去估计
x
t
−
2
x_{t-2}
xt−2的分布,依次进行。单次反向过程的流程图如下:
到这里模型流程就介绍完了,然而文章到这里只介绍完了一半,细心的朋友可能会发现,在上式中,缺失噪声区域是通过模型模拟马尔科夫链不断迭代得到的,而观测噪声区域则是直接由观测区域加噪获得的,也就是说,每次迭代,生成部分和观测部分并没有很强的联系,例如在第t次迭代时,生成部分
x
t
−
1
k
n
o
w
n
x^{known}_{t-1}
xt−1known仅仅与
x
t
x_t
xt有联系,即与
x
t
k
n
o
w
n
x^{known}_t
xtknown有联系,而与
x
t
−
1
k
n
o
w
n
x^{known}_{t-1}
xt−1known没有很强的联系,每次迭代时观测噪声部分在生成时没有考虑先前的生成结果,这就会导致生成的两部分出现不和谐的现象,并且由于这种不和谐在每一级马尔科夫链都会引入,因此一级一级的传递下来就会严重影响模型训练。
为此,作者提出在每次inpainting去噪后,对网络添加了一个约束,即要求生成结果再添加一次对应级别的噪声能够返回上一级没去噪的图像
x
t
x_t
xt,注意,这里的
x
t
x_t
xt是直接由真实完整图像通过添加对应级别的噪声获得的,即:
x
t
∼
N
(
1
−
β
t
x
t
−
1
,
β
t
I
)
x_t \sim N(\sqrt{1-\beta_t}x_{t-1}, \beta_tI)
xt∼N(1−βtxt−1,βtI)。由此,就可以使得每一级的去噪过程都被真实完整图像很强约束着,不至于跑偏。以上是相邻两步反向过程的和谐方式,为了和谐更长的距离,作者还提出跳过多级反向过程来进行和谐的方式。整个算法伪代码如下: