CVPR2022:Blended Diffusion for Text-driven Editing of Natural Images
Paper:https://openaccess.thecvf.com/content/CVPR2022/html/Avrahami_Blended_Diffusion_for_Text-Driven_Editing_of_Natural_Images_CVPR_2022_paper.html
Github:https://github.com/omriav/blended-diffusion
0. Conclusion
首先这篇文章我最开始看的时候有点误解了,当时没了解Guided Diffusion
,以为每一步得到的损失是用来优化扩散模型UNet
参数的;组会讨论后觉得这篇工作的结果在生成的区域始终有噪声,看代码之后才发现这篇工作其实是不需要训练的,基于OpenAI
的Guided Diffusion
预训练模型,所有的损失都作为扩散模型调整均值的一种指导;当时与这篇工作同期有GLIDE
,效果明显更好,能发出来只能说是点子新吧。
后来调代码,越发觉得这篇文章没工作量,结果的瑕疵也没做优化;之后偶然发现这仨作者在六月左右已经发了Latent Blended Diffusion
,有兴趣可以看看。
1. Motivation
真实图像的编辑工作主流是基于GAN模型,通过GAN Inversion实现;
首先本身基于GAN的方法,通常在训练的时候就将图像限制在了某个特定的domain中;
其次GAN Inversion的实验中表明,此方法是在重建准确性和编辑性之间需要做出取舍。
2. Goal
将编辑操作限制在某个固定区域,实现对图片的编辑,而且未编辑的部分应该与原图尽可能保持一致。
3. Contribution
1)提出了第一个使用文本驱动的,基于区域编辑真实的、多样的图像的方法:
2)保证了未改变的区域被完美保存;
4. Method
输入:给定图像x,引导的文本提示d,二进制掩码m
输出:修改的图像x^\hat{x}x^
DDPM
从X0→XTX_{0} \rightarrow X_{T}X0→XT,每一步可通过加噪获得,通过递推可得下式:
q(xt∣x0)=N(αˉtx0,(1−αˉt)I)
q(x_t|x_{0})=\mathcal{N}(\sqrt{\bar{\alpha}_t}x_{0},(1-\bar{\alpha}_t)\mathbf{I})
q(xt∣x0)=N(αˉtx0,(1−αˉt)I)
即:
xt=αˉtx0+1−αˉtε
x_t = \sqrt{\bar{\alpha}_t}x_0+\sqrt{1-\bar{\alpha}_t}\varepsilon
xt=αˉtx0+1−αˉtε
Extending augmentations
在扩散过程中,由DCLIPD_{CLIP}DCLIP损失指导的在图像像素上进行的所谓优化,可能会使得评分降低,但并不会在图像上产生高级的语义变化。
作者发现使用简单的数据增强技术便能减缓这个问题,在扩散过程的每个步骤,并不直接对于从xtx_txt估计得到的x^0\hat{x}_0x^0计算CLIP损失;而是先对x^0\hat{x}_0x^0进行增强操作:
class ImageAugmentations(nn.Module):
...
self.augmentations = nn.Sequential(
K.RandomAffine(degrees=15, translate=0.1, p=p, padding_mode="border"), # type: ignore
K.RandomPerspective(0.7, p=p),
)
...
augmented_batch = self.augmentations(resized_images[batch_size:])
updated_batch = torch.cat([non_augmented_batch, augmented_batch], dim=0)
...
return updated_batch
最终所得到的增强结果:
updated_batch.shape = [augmentations_number, 3, ouput_size, output_size]
在这些增强结果上计算平均梯度用于更新参数。
下图对比了有无增强操作的编辑结果:
Background preserving blending
背景损失:
Dbg(x1,x2,m)=d(x1⊙(1−m),x2⊙(1−m))
\mathcal{D}_{bg}(x_1,x_2,m)=d(x_1\odot(1-m),x_2\odot(1-m))
Dbg(x1,x2,m)=d(x1⊙(1−m),x2⊙(1−m))
其中:
d(x1,x2)=12(MSE(x1,x2)+LPIPS(x1,x2))
d(x_1,x_2) = \frac{1}{2}(MSE(x_1,x_2)+LPIPS(x_1,x_2))
d(x1,x2)=21(MSE(x1,x2)+LPIPS(x1,x2))
Dbg\mathcal{D}_{bg}Dbg这是用来保护掩码之外区域的一致性。这是因为局部的DCLIP\mathcal{D}_{CLIP}DCLIP仍会作用到全局;简单的做法是将最终结果使用掩码与输入图片结合一下,作者并没有采取这种粗暴的做法。
而是受前人工作:Burt and Adelson [7] show that two images can be blended smoothly by separately blending each level of their Laplacian pyramids.
启发,作者提出在扩散过程的每一阶段都执行blending
操作,详细见Text-driven blended diffusion
。简要概括,作者通过在每个扩散阶段都进行融合操作,使得最终结果中mask
内外两区域的内容更为贴切(当然最终还是使用原图中的mask
之外的部分)。
Local CLIP-guided diffusion
作者希望使用预训练CLIP
模型作为扩散模型中的约束,从而使得编辑区域的图像能够与文本提示一致;
首先,CLIP
模型训练使用的数据集为真实的图像文本对<clean image, text>
(其中图像记为x0x_0x0);但是在扩散模型逆过程中,逐步产生的图片(记作noisy latent
xtx_txt)并不能够称之为真实图像。
所以,如果想用CLIP
作为约束,就需要实现从xtx_txt到x0x_0x0,也就是估计位于扩散逆过程的任何一阶段所产生的中间产物xtx_txt,所对应的真实图像x0x_0x0到底长啥样。
在DDPM
中,已知x0x_0x0,可以推导得到任意阶段的xtx_txt;那借助这个式子同样可以得到x0x_0x0关于xtx_txt的表达式:
x^0=xtαˉt−1−αˉtεθ(xt,t)αˉt
\hat{x}_0=\frac{x_t}{\sqrt{\bar{\alpha}_t}}-\frac{\sqrt{1-\bar{\alpha}_t}\varepsilon_{\theta}(x_t,t)}{\sqrt{\bar{\alpha}_t}}
x^0=αˉtxt−αˉt1−αˉtεθ(xt,t)
既然如此,便可引入CLIP
作为损失函数:
DCLIP(x,d,m)=Dc(CLIPimg(x⊙m),CLIPtxt(d))
\mathcal{D}_{CLIP}(x,d,m)=D_c(CLIP_{img}(x\odot m),CLIP_{txt}(d))
DCLIP(x,d,m)=Dc(CLIPimg(x⊙m),CLIPtxt(d))
其中CLIPimgCLIP_{img}CLIPimg,CLIPtxtCLIP_{txt}CLIPtxt分别表示CLIP
的两个编码器,其输出均为512
维度向量;DcD_cDc为余弦距离;m
为掩码;
整个过程伪代码如下:
for all t from k to 1 do
-
使用扩散模型预测噪声分布N(μ,∑)\mathcal{N}(\mu,\sum)N(μ,∑)
-
得到估计的x^0\hat{x}_0x^0
-
进行数据增强得到x^0,aug\hat{x}_{0,aug}x^0,aug
-
计算DCLIPD_{CLIP}DCLIP和DbgD_{bg}Dbg
-
使用梯度作为指导修改噪声分布的均值,得到xt−1x_{t-1}xt−1
其中λ\lambdaλ为背景保护的权重:
可以看到就算设到10,000
,右边的狗子还是和原图有差异的。
Text-driven blended diffusion
为了解决背景与编辑区域不贴的问题,作者提出了在每一个扩散阶段都加入blending
操作的方法。
作者的想法是,在x0→xTx_0\rightarrow x_Tx0→xT的过程中,每一次扩散所产生的图片xtx_txt (0<=t<=T)
,都与一个mainfold
相对应,而且随着t
增大,所对应的mainfold
里面的图片的噪声就越多。
可以想象一下,每次扩散产生的图像xtx_txt,都是属于mainfoldtmainfold_tmainfoldt的,这个t
不一样,就说明图片的noise
程度不一样,x0x_0x0最有序、xTx_TxT最混乱。所以每一次的去噪扩散过程,都是将一个noisy image
投影到一个噪音更少的mainfold
上。
作者提出,把去噪扩散过程每一阶段产生的前景(mask
内容),和一个与其属于同一mainfold
的背景(mask
外内容),通过掩码混合起来。
如何获得对应mainfoldtmainfold_tmainfoldt的背景图片呢?
xt,bg=αˉtx0+1−αˉtε
x_{t,bg} = \sqrt{\bar{\alpha}_t}x_0+\sqrt{1-\bar{\alpha}_t}\varepsilon
xt,bg=αˉtx0+1−αˉtε
看起来就像扩散模型的两个阶段在同时进行。
整个过程伪代码如下:
for all t from k to 1 do
-
使用扩散模型预测噪声分布N(μ,∑)\mathcal{N}(\mu,\sum)N(μ,∑)
-
得到估计的x^0\hat{x}_0x^0
-
进行数据增强得到一组x^0,aug\hat{x}_{0,aug}x^0,aug
-
在增强图片组上计算平均梯度∇text∇_{text}∇text
-
使用梯度作为指导修改噪声分布的均值,得到xfgx_{fg}xfg
-
估计xbgx_{bg}xbg
-
混合得到xt−1x_{t-1}xt−1
注意返回的是x−1x_{-1}x−1,因为最后需要用到x0x_0x0得到原始的背景。
对于相同输入的不同结果,作者使用DCLIP\mathcal{D}_{CLIP}DCLIP作为衡量标准(不做数据增强)。
5. Experiment
Background Preserve
效果好的咱不说,生成的区域很自然,但是总感觉还没完全扩散开,掩码区域还有很多像素点比较明显。
用户测试也都觉得好——真实、背景保护、文本匹配:
由于PaintByWord
这项工作没有开源,刚刚只是用PaintByWord
里面的例子进行了一下对照,下面进行了更多对照:
Multiple outcomes
输出多样性
Scribble-guided editing
根据用户提供的粗糙图像进行编辑
Text-guided image extrapolation
Limitations
- 推理时间慢,半分钟推理一张图片;
- 对于输出结果的排序方法,并没有考虑整张图片,而是只对编辑区域内进行评分,导致像下面这种失败案例(1):
- 继承了
CLIP
的缺点:typographic attacks
,应该就像DALLE-2无法分清”红色的书在黄色的桌子上“这一类问题;