欢迎光临散文网 会员登陆 & 注册

AIGC: SDEdit (Stochastic Differential Editing) 笔记

2023-09-09 17:27 作者:刹那-Ksana-  | 我要投稿

上一个文章介绍了扩散模型的图像修复,这次顺势介绍一下扩散模型的 img2img. 论文(2108.01073)里面的一些符号喜欢用函数表示,这里全部改成通用的下标形式了。

Img2img 的任务,左侧为输入图像,右侧为输出图像

从回顾SGM开始

这里,先回顾一下 Score-based Generative Models (2011.13456). 对于扩散的正向加噪过程,我们可以有以下的通用形式(假设扩散项只与时间有关):

d%5Cmathbf%7Bx%7D%3D%5Cmathbf%7Bf%7D(%5Cmathbf%7Bx%7D%2Ct)dt%2Bg(t)d%5Cmathbf%7Bw%7D

对于 VP-SDE (Variance Preserving SDE), 我们有  %5Cmathbf%7Bf%7D(%5Cmathbf%7Bx%7D%2Ct)%3D-%5Cfrac%7B1%7D%7B2%7D%5Cbeta(t)%5Cmathbf%7Bx%7D 和 g(t)%3D%5Csqrt%7B%5Cbeta(t)%7D. 对于 VE-SDE (Variance Exploding SDE), 我们有 %5Cmathbf%7Bf%7D(%5Cmathbf%7Bx%7D%2Ct)%3D0 和 g(t)%3D%5Csqrt%7B%5Cfrac%7Bd%5B%5Csigma%5E2(t)%5D%7D%7Bdt%7D%7D.

而对于每一个正向加噪过程,我们都有一个对应的逆向去噪过程:

d%5Cmathbf%7Bx%7D%3D%5B%5Cmathbf%7Bf%7D(%5Cmathbf%7Bx%7D%2Ct)-g(t)%5E2%5Cnabla_%7B%5Cmathbf%7Bx%7D%7D%20%5Clog%20p_t(x)%5Ddt%20%2B%20g(t)d%5Cbar%7B%5Cmathbf%7Bw%7D%7D

其中,%5Cnabla_%7B%5Cmathbf%7Bx%7D%7D%20%5Clog%20p_t(x) 被称作分数函数 (score function), 我们使用一个模型 s_%7B%5Ctheta%7D(x_t%2C%20t) 去"学习"这个分数函数。通常我们没法求上述 SDE 的解析解,所以我们将连续时间 t%5Cin%20%5B0%2C1%5D 做一个离散化,然后利用一些数值解法来求解。

所以,论文中(对于 VE-SDE)采用了 Euler-Maruyama 的数值解法:

%7B%5Cmathbf%7Bx%7D%7D_t%20%3D%20%7B%5Cmathbf%7Bx%7D%7D_%7Bt%20%2B%20%5CDelta%20t%7D%20%2B%20(%5Csigma%5E2_%7Bt%7D-%20%5Csigma%5E2_%7Bt%20%2B%20%5CDelta%20t%7D)s_%5Ctheta%20(%5Cmathbf%7Bx%7D_t%2C%20t)%2B%5Csqrt%7B%5Csigma%5E2_t-%5Csigma%5E2_%7Bt%20%2B%20%5CDelta%20t%7D%7D%5Cmathbf%7Bz%7D

其中,

%5Csigma_t%3D%5Cbegin%7Bcases%7D%200%2C%20%26%5Cquad%20t%20%3D%200%5C%5C%0A%20%20%20%20%5Csigma_%5Ctext%7Bmin%7D%20%5Cleft(%5Cfrac%7B%5Csigma_%5Ctext%7Bmax%7D%7D%7B%5Csigma_%5Ctext%7Bmin%7D%7D%20%5Cright)%5Et%2C%20%26%5Cquad%20t%20%3E%200%20%5Cend%7Bcases%7D

Img2Img

接下来是 SDEdit 的初始设定,我们的任务是一个 img2img ——将一个图片转换为另外一个图片。原图我们称作引导图像(guide),用 %5Cmathbf%7Bx%7D%5E%7B(g)%7D 来表示,转换后的图像我们用 %5Cmathbf%7Bx%7D_0 表示。

我们发现,解 SDE 其实未必要从 t%3D1 出发,而是可以从中途的任一时间点开始。所以,我们选取一个时间点 t_0, 对 %5Cmathbf%7Bx%7D%5E%7B(g)%7D 加噪声:%5Cmathbf%7Bx%7D%5E%7B(g)%7D_%7Bt_0%7D%5Csim%20%5Cmathcal%7BN%7D(%5Cmathbf%7Bx%7D%5E%7B(g)%7D%3B%20%5Csigma%5E2_%7Bt_0%7DI)

然后,我们利用上述的数值解法,从 %5Cmathbf%7Bx%7D%5E%7B(g)%7D_%7Bt_0%7D 进行逆向去噪过程,然后获得图像 %5Cmathbf%7Bx%7D_0

这一整个过程,我们把它称作 %5Ctext%7BSDEdit%7D%20(x%5E%7B(g)%7D%3Bt_0%2C%5Ctheta).

我们把接近原图像的程度称作是 faithful, 把生成图片的质量称作是 realistic. 那么我们可以得到如下的一个图像:

横轴是 t0, 蓝色的线是 KID, 衡量了合成的图片质量(越低越好), 橙色的线是 L2 距离,衡量了生成图像和原图像的相似程度(越低越好). 所以从图像上来看,t0 设置在 0.3 到 0.6 之间是最佳的范围

很显然,如果我们把 t_0 设置为 0, 意味着我们没有加入任何的噪声,那么我们最终生成的图像就是我们的引导图像(意味着 L2 距离为 0);如果我们把 t_0 设置为 1,那么就相当于纯高斯噪声开始去噪,所以最终生成的图像将和引导图像毫无关联。

遮罩编辑

我们在上面的基础上再进一步,希望只"编辑"源图像的一小部分,那么我们就需要有一个遮罩,我们把它称作 %5COmega%20%5Cin%20%5C%7B0%2C1%5C%7D%5E%7BC%5Ctimes%20H%5Ctimes%20W%7D

首先我们还是选择一个时间点 t_0 对原图像 %5Cmathbf%7Bx%7D_0 进行加噪,得到 %5Cmathbf%7Bx%7D_%7Bt_0%7D

然后我们针对遮罩的部分,和被遮罩的部分,这两个部分进行分别处理。对于遮罩的部分,我们利用上述的 %5Ctext%7BSDEdit%7D%20 进行去噪,然后将每一步去噪的结果和遮罩 %5COmega 进行元素间相乘。用公式表达,即 %5COmega%20%5Codot%20(%5Cmathbf%7Bx%7D_t%2B%5Cepsilon%5E2s_%5Ctheta(%5Cmathbf%7Bx%7D_t%2Ct)%2B%5Cepsilon%20z).

而对于未遮罩的部分,我们则直接进行一个加噪,即  (1-%5COmega)%20%5Codot%20(%5Cmathbf%7Bx%7D_0%20%2B%5Csigma_t%20%5Cmathbf%7Bz%7D).

然后我们把上面两部分相加,就得到了每个时间点 t 时对应的图像。

完。

B站公式编辑器经常崩溃,所以如果看到 tex parse error 之类的错误信息时,刷新一下页面一般能解决。

AIGC: SDEdit (Stochastic Differential Editing) 笔记的评论 (共 条)

分享到微博请遵守国家法律