Pre
title: Zero-shot Image-to-Image Translation
accepted: Arxiv 2023
paper: https://arxiv.org/abs/2302.03027
code: https://github.com/pix2pixzero/pix2pix-zero
关键词:Zero-shot, Image-to-Image Translation, pretrained model, BLIP, CLIP, GPT-3, diffusion model, training-free, prompting-free
阅读理由:zero-shot+I2I真的很有吸引力,图1效果也很好
Idea
输入图片x根据DDIM的前向过程得到噪声 \(x_{inv}\) ,再用BLIP+CLIP为x生成对应的文本嵌入c,根据源域、目标域描述用GPT-3+CLIP生成一系列句子的嵌入,计算两个域描述间的平均偏差嵌入,作为图片的编辑方向 \(\Delta c_{edit}\) 。以扩散模型每层对 \(x_{inv}\) 的特征跟c计算出跨注意力图M,约束 \(x_{inv}\) 跟 \(c + \Delta c_{edit}\) 计算得到的跨注意力图跟M一样,从而保证原图的结构不变并达到编辑的目的。
Motivation&Solution
大规模文本到图片生成模型的合成效果特别好,但是很难直接用于编辑真实图片,有以下三点原因:
- 用户难以提出准确的prompt去精确描述输入图片里的每个细节(改什么保存什么) —— BLIP+平均编辑方向
- 当前模型可以修改图片,但常常过度修改内容,并修改不正确的区域 —— 用跨注意力图引导
- 扩散模型太慢 —— 将其蒸馏为条件式GAN,实现实时推理
而pix2pix-zero可以保持原图的内容,并且不需要手动设置prompt
Background
Deep image editing with GANs.
Text-to-Image models. our method retains the input structure without any spatial mask. In contrast, we use the pre-trained
Stable Diffusion models, without additional training.
Image editing with diffusion models.
Method(Model)
Overview
图1 pix2pix-zero是基于扩散的I2I方法,允许用户在运行中指定编辑方向(cat->dog)。途中前两行是真实图片,最后一行是合成的,可以进行多种转换任务,同时保持输入图片的结构。该方法既不需要手动编写prompt也不需要为每个任务进行微调
Inverting Real Images
Deterministic inversion. inversion是指基于采样寻找一个噪声map \(x_{inv}\) 它能用于重建输入的隐编码 \(x_0\)。对应DDPM里面的固定前向加噪过程,后续还有反向的降噪过程,但这两个过程都是随机的,不是忠实的重建。因此采用确定性的DDIM的反向过程:
\[\begin{equation} x_{t+1}=\sqrt{\bar{\alpha}_{t+1}}f_{\theta}(x_{t},t,c)+\sqrt{1-\bar{\alpha}_{t+1}}\epsilon_{\theta}(x_{t},t,c), \end{equation} \]这怎么看着像前向过程呢,感觉 \(x_{t+1}\) 应该换成 \(x_{t-1}\) 吧? \(x_t\) 是时间步t的加噪隐编码, \(\epsilon_\theta\) 是Unet结构的降噪器,能预测出t时间步根据文本特征c加上去的噪声, \(\bar{\alpha}_{t+1}\) 是DDIM的噪声缩放因子, \(f_{\theta}\) 能预测出最终完全去噪的隐编码 \(x_0\)
\[\begin{equation} f_{\theta}(x_{t},t,c)={\frac{x_{t}-\sqrt{1-\bar{\alpha}_{t}}\epsilon_\theta(x_{t},t,c)}{\sqrt{\bar{\alpha}_{t}}}} \end{equation} \]通过DDIM前向给一开始的隐编码 \(x_0\) 加入噪声,在inversion最后(at the end of inversion ?),最终加完噪声的 \(x_T\) 作为 \(x_{inv}\)
[注] GAN Inversion里的inversion是将图片映射到隐空间,通过修改隐变量来达到对图片的编辑。但本文好像是借助DDIM将输入图片转换为对应的、尺寸更小的噪声,然后将该噪声结合上不同的条件来得到编辑的图片
Noise regularization. 由DDIM inversion \(\epsilon_\theta\) 生成的逆映射?(inverted)噪声图(The inverted noise maps)不符合无相关的(uncorrelated)高斯白噪声的统计属性,因此不好编辑。
由于高斯白噪声应符合:
- 任何随机位置对之间都无关
- 任何空间位置都有0均值,单位方差。这将反映在其自相关函数中,即Kronecker delta函数
因此使用自相关目标函数,由配对(pairwise)项 \(\mathcal{L}_{pair}\) 跟每个像素位置上的KL散度项 \(\mathcal{L}_{KL}\) 构成。由于对所有位置两两进行密集采样开销很大,就是用金字塔结构,形成 \(\left\{\eta^{0},\eta^{1},\eta^{2},\eta^{3}\right\}\) 四个级别, \(\eta^{0}\) 是预测出来的噪声,64x64,后续都是2倍下采样而来。
\[\begin{equation} {\mathcal{L}}_{\mathrm{pair}}=\sum_{p}{\frac{1}{S_{p}^{2}}}\sum_{\delta=1}^{S_{p}-1}\sum_{x,y,c}\eta_{x,y,c}^{p}\left(\eta_{x-\delta,y,c}^{p}+\eta_{x,y-\delta,c}^{p}\right), \end{equation} \]\(\eta_{x,y,c}^{p}\) 用循环indexing、通道索引一个空间位置。p是金字塔层级,整个配对正则(pairwise regularization)是自相关系数的平方和,at possible \(\delta\) offsets,并根据噪声图大小 \(S_p\) 进行归一化
老实说没看懂,但目的应该是希望预测的噪声是高斯白噪声?这个方法也是改进来的,每个iteration都采样一个 \(\delta\) 更有效地传递长距离信息。而且每个时间步都应该好好地正则化,因为多轮远程连接的传递会导致中间的时间步脱离分布。
此外发现用归一化强约束0均值单位方差会导致降噪过程不收敛,因此改用那个软约束的KL散度,最终的损失:
\[\begin{equation} \mathcal{L}_{\mathrm{auto}}=\mathcal{L}_{\mathrm{pair}}+\lambda\mathcal{L}_{\mathrm{KL}}, \end{equation} \]Discovering Edit Directions
区别于已有的,靠text来描述生成目标的大模型,本文作者想通过提供源域到目标域“改变”就实现I2I,比如 猫->狗
图2 寻找编辑方向。给定源域跟目标域文本,使用GPT-3生成大量且多样的句子,计算它们的CLIP嵌入,并根据平均差距来得到编辑方向 $\Delta c_{edit}$
通过给文本嵌入添加图2所示的方向就可以实现对图片的编辑。图4是几个编辑结果,用多个句子得到的文本方向更鲁棒。而且该方法算一个方向只要5秒,还可以先算好。
Editing via CrossAttention Guidance
图3 方法总览。猫到狗的编辑例子。首先用正则化的DDIM反向来获取反向的噪声图,该过程由BLIP、CLIP生成的文本嵌入进行引导。之后使用原始的文本嵌入进行降噪来获取跨注意力图,充当上面两栏输入图片结构的参考。 接下来使用编辑后的文本嵌入 $c + \Delta_{edit}$ 进行降噪,加一个损失来鼓励跨注意力图匹配上第二行的参考跨注意力图。这种方式确保编辑后的图片不会变化太大,第三行是不使用跨注意力引导进行的降噪,在结构上出现了较大变化
近来的大规模扩散模型通过用跨注意力层增强降噪网络 \(\epsilon_\theta\) 来实现条件生成,这里用开源的 Stable Diffusion,基于隐扩散模型LDM,并使用CLIP的文本编辑器来产生文本嵌入c。模型计算编码文本跟降噪器 \(\epsilon_\theta\) 中间特征之间的跨注意力来加入文本条件:
\[\begin{equation} Attention(Q,K,V)=M\cdot V, where\ M= Sofmax\left({\frac{Q K^{T}}{\sqrt{d}}}\right). \end{equation} \]其中 \(Q = W_{Q}\varphi(x_{t}),\ K=W_{K}c,\ V=W_{V}c,\), \(\varphi(x_{t})\) 是 \(\epsilon_\theta\) 的中间空间特征,c是文本嵌入,d是QK的维度。而M就是跨注意力图,它与图片结构有紧密的联系, \(M_{i,j}\) 表示第j个文本token对第i空间位置的贡献。同时跨注意力mask对每个时间步都是不同的,用 \(M_t\) 表示t时间步的mask
直接用 \(c_{edit}= c+\Delta c_{edit}\) 去生成 \(x_{edit}\) 的话能修改图片,但无法维持结构,如图3最后一行所示。
算法1 pix2pix-zero algorithm
如算法1描述的,两阶段处理,首先只用输入文本来重建图片,获得t时间的参考跨注意力图 \(M_t^{ref}\) ,它包含了希望保持的原图结构e。然后使用 \(c_{edit}\) 去生成跨注意力图 \(M_t^{edit}\) 。然后计算匹配 \(M_t^{ref}\) 的 \(x_t\) 的梯度,并减小下列跨注意力损失 \(\mathcal{L}_{xa}\):
\[\begin{equation} {\mathcal{L}}_{\mathrm{xa}}=||M_{t}^{\mathrm{edit}}-M_{t}^{\mathrm{ref}}||_{2}. \end{equation} \]该损失鼓励 \(M_{t}^{\mathrm{edit}}\) 不要偏离 \(M_{t}^{\mathrm{ref}}\) ,即是应用修改但要维持原始结构
Experiment
实验基于Stable Diffusion v1.4,用了相同的采样步数跟相同的classifier-free引导
Metrics
CLIP Acc: 编辑后图片更接近于目标文本的比例,越高越好
Structure Dist: Structure Dist分数越低越好,说明编辑后的图片结构仍然接近原图的结构
BG LIPIPS: 背景LPIPS错误率,测量原图的背景跟编辑后图片的背景的LPIPS距离,越低越好,说明背景保持得很好
Baselines
SDEdit with word swap 同样添加噪声再用新文本prompt去降噪,但新的prompt是直接用目标单词替换原prompt而来
prompt-to-prompt 不但直接用目标单词替换原词,还加上了跨注意力图的使用,但是作为强约束,而本文则是将其用作一种软性约束
DDIM with word swap 直接用目标单词替换原词,但使用确定性的DDIM进行invert跟降噪操作
Dataset
LAION 5B
Results
图4 pix2pix-zero 结果示例
图5 跟不同baseline的对比,本文的方法能完美保持结构
表1 跟之前基于扩散的编辑方法进行比较
图6 跨注意引导对于结构维持的有效性
表1显示本文的方法有最高的CLIP分类精度同时还能维持输入图片的细节。最后两列没有显示BG LPIPS的分数,因为这些任务无关背景或涉及到整张图片,背景也得改变
表2 消融实验
表2中,A使用DDPM进行随机性的invert,并且使用word swap策略,无法维持输入图片的结构或背景;B将DDPM改成了DDIM,对结构跟背景维持都有提升;C加入了自相关正则化;D将word swap换成了本文的基于句子的编辑方向,对指标有明显提升;E又加入了跨注意力图引导,即本文最终的方法,效果显著
图7 用条件GAN进行模型加速,蒸馏的基于GAN模型能快上约3800倍
图7考虑到扩散模型太慢,于是用它去生成一些配对数据集,然后用于训练GAN,说是用的 Co-Mod-GAN。用A100+pytorch,一张图只需要0.018秒,不过从图上来看效果是有明显下降的
Limitations and Discussion
图8 限制 对太复杂的例子,对象姿态少见的图效果不好,而跨注意力图分辨率太小的话结构无法维持。
Critique
确实zero-shot,确实不用训练也不用设计prompt,但用了好多预训练模型,还挺复杂的,而且用扩散模型的话速度慢开销大,而蒸馏的GAN感觉效果又差点意思。用跨注意力图去约束,比较取巧,但如果转换目标大小跟原目标不匹配或许无法很好进行?
不过还是不错的,实验很充分,图清晰,能代表了现在微调/甚至不调直接利用大模型进行一些研究的趋势
Unknown
- 扩散模型反向预测的不就是前向时加入的噪声吗,想要高斯白噪声的话前向加进去就好了吧,为什么 Noise regularization 还用啥自相关系数去约束?