1 前言
本篇文章,我们来讲DragDiffusion,他与DragGAN是一个差不多的。只是一个是用GAN去做;一个是用Diffusion去做。总之就是换汤不换药。
视频讲解:DragDiffusion:利用扩散模型进行基于点的交互式图像编辑
参考论文:DragDiffusion: Harnessing Diffusion Models for Interactive Point-based Image Editing
2 引入
对于传统的条件生成模型,一般来说,是根据给定的文本或者其他条件,然后按照条件来生成模型。然而,这种方法始终是存在一些限制的。首先,如何构造合适的提示词,是一个重要的课题。并且对于文本条件控制,很难实现精准的控制。于是,人们就制作了一个基于图像编辑的模型,即选定图像中的某个部分的初始像素点,再选定一个目标像素点,让初始像素点朝目标像素点移动,见下图
3 图像编辑
首先,要对图像编辑,首先要知道该如何编辑。在编辑的过程中,我们会选定哪些区域可以编辑,哪一部分的像素可以改变。与DragGAN一样,他们都是通过修改网络中的特征图,来实现编辑图像的。
那么,该如何去选择一个合适的特征图呢?论文使用PCA主成分分析,将不同扩散步骤的Unet特征图可视化,发现t=35那个时间步所对应的特征图包含足够多的语义、几何信息。于是论文就决定修改这一部分的特征图,以实现图像的编辑。
总的来说,整个步骤可以归结为下面的三个步骤(该扩散模型使用的是隐扩散模型,在进行扩散训练之前,会先使用VAE进行编码):
进行图像编辑的前提是,你必须要有一个已经预被训练好的扩散模型。
上图步骤(1)对应第4节;步骤(2)对应5-7节;步骤(3)对应第8节
4 LoRA微调
LoRA微调为上图的第一个步骤(1),即,使用用户的输入图像(input image,见图中长得不知道是什么的动物)。然后使用LoRA的方法在该图像上微调扩散模型。即使用Eq.(1)进行优化
L
f
t
(
z
,
Δ
θ
)
=
E
ϵ
,
t
[
∥
ϵ
−
ϵ
θ
+
Δ
θ
(
α
t
z
+
σ
t
ϵ
)
∥
2
2
]
(1)
\mathcal{L}_{ft}(z,\Delta \theta)=\mathbb{E}_{\epsilon,t}\left[\Vert \epsilon-\epsilon_{\theta+\Delta \theta}(\alpha_tz+\sigma_t\epsilon)\Vert^2_2\right]\tag{1}
Lft(z,Δθ)=Eϵ,t[∥ϵ−ϵθ+Δθ(αtz+σtϵ)∥22](1)
其中,
θ
\theta
θ和
Δ
θ
\Delta \theta
Δθ分别是UNet和LoRA的参数。z是真实地图像(输入图像input image),
ϵ
\epsilon
ϵ是随机采样地高斯白噪声,
ϵ
θ
+
Δ
θ
(
⋅
)
\epsilon_{\theta+\Delta \theta}(\cdot)
ϵθ+Δθ(⋅)是经过微调之后地Unet的网络(集成了LoRA的Unet噪声图),
α
t
\alpha_t
αt和
σ
t
\sigma_t
σt是扩散步长t的噪声调度参数。
我们可以直观理解微调的原因。首先,已经被预训练好的扩散模型可能在训练的时候没有见过输入图像,亦或者就算是见过了。我们使用LoRA微调,也可让这个预训练好的扩散模型更好地编码图像的特征。论文发现使用LoRA微调80步即可达成目的。
5 生成特征图
首先,我们需要使用用户输入的图像(input image),在经过图像VAE编码之后,使用DDIM的反向过程(见Diffusion AutoEncoder的随机编码器,或DDIM对应ODE方程的反向)
x
i
+
1
=
α
ˉ
i
+
1
f
(
x
i
,
i
,
,
z
sem
)
+
1
−
α
ˉ
i
+
1
ϵ
(
x
i
,
i
,
,
z
sem
)
(2)
x_{i+1}=\sqrt{\bar\alpha_{i+1}}f(x_i,i,,z_{\text{sem}})+\sqrt{1-\bar\alpha_{i+1}}\epsilon(x_i,i,,z_{\text{sem}})\tag{2}
xi+1=αˉi+1f(xi,i,,zsem)+1−αˉi+1ϵ(xi,i,,zsem)(2)
即使用Eq.(2)将原始输入图像
x
0
x_0
x0加噪到
x
t
(
t
=
35
)
x_t \quad (t=35)
xt(t=35)
每一个反演步骤都能够得到特征图,当到了t=35时刻时,我们取出Unet网络中解码器部分的第三个block的输出特征图作为我们需要修改的特征图(此过程对应流程图里面(2)当中的 z 0 → z t z_0\to z_t z0→zt)
为什么是解码器第三部分的特征图呢?作者拿把八倍镜发现的,见下图
6 运动监督
有了特征图,我们需要对特征图优化,输入图像标记为 z 0 z_0 z0,经过DDIM反演之后得到的结果记作 z t z_t zt,对应特征图记作 F ( z t ) F(z_t) F(zt)。首先,用户在输入图像中,选定可以修改的区域。然后在该区域内,选择一个红色点(控制点,记作 { h i k = ( x i k , y i k ) : i = 1 , ⋯ , n } \{h_i^k=(x_i^k,y_i^k):i=1,\cdots,n\} {hik=(xik,yik):i=1,⋯,n},里面的k表示第k次优化特征图),一个蓝色点(目标点,记作 { g i = ( x i ~ , y i ~ ) : i = 1 , ⋯ , n } \{g_i=(\widetilde{x_i},\widetilde{y_i}):i=1,\cdots,n\} {gi=(xi ,yi ):i=1,⋯,n})。对于每一个控制点所对应的特征图的值,我们记作 F h i k ( z t ) F_{h_i^k}(z_t) Fhik(zt)。还需以每一个 h i k h_i^k hik为中心,画一个正方形小块(记作 Ω ( h i k , r 1 ) = { ( x , y : ∣ x − x i k ∣ ≤ r 1 , ∣ y − y i k ∣ ≤ r 1 ) } \Omega(h_i^k,r_1)=\{(x,y:|x-x_i^k|\le r_1,|y-y_i^k|\le r_1)\} Ω(hik,r1)={(x,y:∣x−xik∣≤r1,∣y−yik∣≤r1)})
有了以上定义,我们需要为每一对控制点和目标点构建一个指向归一化向量,假设是第i对点,我们记作 d i = ( g i − h i k ) ∥ g i − h i k ∥ 2 d_i=\frac{(g_i-h_i^k)}{\Vert g_i-h_i^k \Vert_2} di=∥gi−hik∥2(gi−hik)。我们都知道,坐标系的内的两个点相减,就是构造一个指向向量,除以下面的范数是进行归一化。
首先,假设是第i对点,我们有以下优化目标(最小化)
∥
F
h
i
k
+
d
i
(
z
^
t
k
)
−
sg
(
F
h
i
k
(
z
^
t
k
)
)
∥
1
(3)
\Vert F_{h_i^k+d_i}(\hat{z}_t^k) - \text{sg}(F_{h_i^k}(\hat{z}_t^k)) \Vert_1\tag{3}
∥Fhik+di(z^tk)−sg(Fhik(z^tk))∥1(3)
其中,
z
^
t
k
\hat{z}_t^k
z^tk是进行了第k次优化之后的反演结果,
h
i
k
+
d
i
h_i^k+d_i
hik+di表示控制点往目标点移动一小段距离
d
i
d_i
di的坐标位置,所以
F
h
i
k
+
d
i
(
z
^
t
k
)
F_{h_i^k+d_i}(\hat{z}_t^k)
Fhik+di(z^tk)表示的就是
h
i
k
+
d
i
h_i^k+d_i
hik+di这个坐标位置下所对应的特征图。sg的意思是停止梯度,这样一来的话,优化Eq.(3)只会让
F
h
i
k
+
d
i
(
z
^
t
k
)
F_{h_i^k+d_i}(\hat{z}_t^k)
Fhik+di(z^tk)往
F
h
i
k
(
z
^
t
k
)
F_{h_i^k}(\hat{z}_t^k)
Fhik(z^tk)的值靠近,从而达到修改特征值的位置
Eq.(3)是第i对点的,实际上我们并不是让某个点位置的特征值移动,而是让该点附近(正方形小块范围内)所有的特征值都移动,即让我们记
h
i
k
h_i^k
hik附近小正方形范围内的点记作q。那么就有
∑
q
∈
Ω
(
h
i
k
,
r
1
)
∥
F
h
i
k
+
d
i
(
z
^
t
k
)
−
sg
(
F
h
i
k
(
z
^
t
k
)
)
∥
1
(4)
\sum\limits_{q\in \Omega(h_i^k,r_1)}\Vert F_{h_i^k+d_i}(\hat{z}_t^k) - \text{sg}(F_{h_i^k}(\hat{z}_t^k)) \Vert_1\tag{4}
q∈Ω(hik,r1)∑∥Fhik+di(z^tk)−sg(Fhik(z^tk))∥1(4)
所以Eq.(4)就是移动第i对点的。当存在n对点,那么就有
∑
i
=
1
n
∑
q
∈
Ω
(
h
i
k
,
r
1
)
∥
F
h
i
k
+
d
i
(
z
^
t
k
)
−
sg
(
F
h
i
k
(
z
^
t
k
)
)
∥
1
(5)
\sum\limits_{i=1}^n\sum\limits_{q\in \Omega(h_i^k,r_1)}\Vert F_{h_i^k+d_i}(\hat{z}_t^k) - \text{sg}(F_{h_i^k}(\hat{z}_t^k)) \Vert_1\tag{5}
i=1∑nq∈Ω(hik,r1)∑∥Fhik+di(z^tk)−sg(Fhik(z^tk))∥1(5)
除此之外,正如我们前面所说的那样,我们还会控制哪些地方地方需要修改,哪些地方不用修改。因此,我们需要构建一个掩码矩阵M,他与图像大小相同,每个像素点取值0或1(0表示像素是不可变的,1表示像素可变)。所以我们就有了以下优化目标
L
m
s
(
z
^
t
k
)
=
∑
i
=
1
n
∑
q
∈
Ω
(
h
i
k
,
r
1
)
∥
F
h
i
k
+
d
i
(
z
^
t
k
)
−
sg
(
F
h
i
k
(
z
^
t
k
)
)
∥
1
+
λ
∥
(
z
^
t
−
1
k
−
sg
(
z
^
t
−
1
0
)
)
⊙
(
1
−
M
)
∥
1
(6)
\mathcal{L}_{ms}(\hat z_t^k)=\sum\limits_{i=1}^n\sum\limits_{q\in \Omega(h_i^k,r_1)}\Vert F_{h_i^k+d_i}(\hat{z}_t^k) - \text{sg}(F_{h_i^k}(\hat{z}_t^k)) \Vert_1+\lambda\Vert (\hat z_{t-1}^k-\text{sg}(\hat z_{t-1}^0))\odot(1-M) \Vert_1\tag{6}
Lms(z^tk)=i=1∑nq∈Ω(hik,r1)∑∥Fhik+di(z^tk)−sg(Fhik(z^tk))∥1+λ∥(z^t−1k−sg(z^t−10))⊙(1−M)∥1(6)
Eq.(6)就是优化目标,有了这个优化目标,就有了梯度,我们就可以进行梯度优化更新了(优化
z
^
t
k
\hat z_t^k
z^tk),见Eq.(7)
z
^
t
k
+
1
=
z
^
t
k
−
η
⋅
∂
L
m
s
(
z
^
t
k
)
∂
z
^
t
k
\hat z_{t}^{k+1}=\hat z_{t}^{k} -\eta \cdot \frac{\partial \mathcal{L}_{ms}(\hat z_t^k) }{\partial \hat z_t^k}
z^tk+1=z^tk−η⋅∂z^tk∂Lms(z^tk)
η
\eta
η是学习率。
注意到Eq.(6)的第二项,与DragGAN是不一样的,他鼓励的是反演结果 z t z_t zt的某些区域不变,而不是 z t z_t zt的特征图保持不变。也就是说,我们首先得到 z ^ t k \hat z_t^k z^tk,然后通过DDIM进行一步去噪得到 z ^ t − 1 k \hat z_{t-1}^k z^t−1k,我们希望 z ^ t − 1 k \hat z_{t-1}^k z^t−1k未掩码区域(像素不可变区域)与原始未经过优化的 z ^ t − 1 0 \hat z_{t-1}^0 z^t−10尽可能相同。
7 点追踪
每一次使用运动监督进行优化更新,都会导致控制点向目标移动一些距离,但由于梯度下降的特殊性,我们很难知道到底移动了多少,故而我们使用最近邻搜索来找到那个点。具体来说:
首先,由于进行了梯度优化更新,我们就得到了优化之后的特征图 F ( z ^ t + 1 k ) F(\hat z_{t+1}^k) F(z^t+1k)和未优化之前的特征图 F ( z ^ t k ) F(\hat z_{t}^k) F(z^tk)。接着,我们以 F ( z ^ t k ) F(\hat z_{t}^k) F(z^tk)特征图的控制点为中心,再构造一个小正方形 Ω ( h i k , r 2 ) = { ( x , y ) : ∣ x − x i k ∣ ≤ r 2 , ∣ y − = y i k ∣ ≤ r 2 } \Omega(h_i^k,r_2)=\{(x,y):|x-x_i^k|\le r_2,|y-=y_i^k|\le r_2\} Ω(hik,r2)={(x,y):∣x−xik∣≤r2,∣y−=yik∣≤r2}
最后,我们在
F
(
z
^
t
+
1
k
)
F(\hat z_{t+1}^k)
F(z^t+1k)对应的小正方形区域,找到一个与初始特征图
F
h
i
0
(
z
t
)
F_{h_i^0}(z_t)
Fhi0(zt)对应像素点最相近的特征,然后把该特征所对应的坐标位置作为新的控制点就可以了,即
h
i
k
+
1
=
arg
min
q
∈
Ω
(
h
i
k
,
r
2
)
∥
F
q
(
z
^
t
k
+
1
)
−
F
h
i
0
(
z
t
)
∥
1
(7)
h_i^{k+1}=\arg\min\limits_{q\in \Omega(h_i^k,r_2)}\Vert F_q(\hat z_t^{k+1})-F_{h_i^0}(z_t) \Vert_1\tag{7}
hik+1=argq∈Ω(hik,r2)min∥Fq(z^tk+1)−Fhi0(zt)∥1(7)
8 Reference Latent Control
论文提到,当完成优化之后,我们就得到了最终的特征图 z ^ t n \hat z_t^n z^tn,只需要使用DDIM对他去噪,即可得到编辑之后的图像。然而,论文作者发现此法会让编辑之后的图像产生一些不希望的身份漂移和质量下降。论文假设这个问题是由于去噪的时候缺乏原始输入图像的指导导致的。
于是,为了解决这个问题,论文就在去噪的时候,引入一些原始图像的信息。于是,他们就在去噪过程中UNet的自注意力模块的前向传播过程中,我们将从 z ^ n \hat z^n z^n生成的键和值向量替换为从 z t z_t zt生成的键和值向量
由此,我们就成功得到了编辑之后的图像了。
9 结束
好了,本期内容到此为止,如有问题,还望指出,阿里嘎多!