Drag GAN - 生成图像流形上的交互式点操作
引言
最近我对几个月前登上头条的 Drag GAN 论文很感兴趣。在图像中选择源点(即手柄点)和目标点,并将源点中的语义位置(脸、鼻子、腿、手等)移动到目标位置的想法令人惊叹。此外,结果更加真实。
每当我想要阅读一篇新的研究论文时,我通常会在线搜索视频/博客材料,以便在深入阅读实际论文之前对主题有一个清晰的概述。但对于 Drag GAN,我看到了很多博客和视频解释如何使用 GUI,而不是更好地概述其底层机制。本博客旨在简要而有用地概述 Drag GAN 的架构、底层思想以及如何实现它。
架构
Drag GAN 利用了 StyleGAN-2 框架。但在此之前,什么是 GAN?
(趣闻——以上所有图片都是从 这里 人工生成的图片)
GAN(生成对抗网络)是一类以最小最大博弈方式学习的生成模型。它有一个生成器和一个判别器。判别器用作分类器,标记输入图像是真实的还是虚假的。生成器学习从随机噪声(通常来自单位高斯分布)生成真实图像。在每次优化中,生成器试图欺骗判别器,而判别器则学习更好地找到虚假图像(即以最小最大博弈方式)。那么,这种学习如何达到平衡呢?当判别器对真实和虚假图像都返回接近 0.5 的概率时,我们可以说模型达到/达到了纳什均衡。在博弈论中,当一个玩家的行为不取决于对手的行为时,就达到了纳什均衡。
回到 Drag GAN 中使用的 StyleGan-2,它是 StyleGan-1 的改进。StyleGan 架构与原始 GAN 的主要侧重/修改在于生成器,而判别器保持不变。
由于 StyleGan 专注于生成器本身,因此上图对应于其生成器。StyleGan2 是 DragGan 中使用的版本,其区别可以从上图中其合成网络方面看出。解释 StyleGan 超出了本博客的范围,但我有兴趣给出 StyleGAN 中映射网络的直观解释。
通常在 GAN 中,生成器使用一个潜在向量作为输入(例如 512 维潜在向量 z)来生成图像。在 StyleGan 的情况下,来自潜在空间 (Z) 的原始潜在向量 z 通过一系列全连接层映射到另一个 512 维的空间 (W)。
该论文声称,将潜在空间 (Z) 映射到 W 空间后,W 空间中的向量“w”更具解缠性,这意味着改变单个特征(512 维中的一个)只会影响一个真实属性(可能是微笑、姿势或头发颜色等)。这在编辑/操作生成图像时提供了更大的自由度和丰富性。
Drag GAN 的理念
Drag GAN 允许对图像进行交互式点操作,从而生成定制的真实图像。如果你想移动一个人的鼻子位置,交互式地将其选择为手柄(即源点),然后选择一个目标点。经过几次迭代后,鼻子位置将从源点移动到目标位置,而不会扭曲图像的真实性。
尽管它看起来是一个复杂的机制,但它只是有效利用了两个简单的想法。Drag Gan 的交互式点操作解决了两个子问题;
- 运动监督
- 点跟踪
这是在没有任何额外网络的情况下实现的,这提高了模型性能的效率。生成器(即 StyleGAN 中的合成网络)的中间特征是判别性的。也就是说,它学习特征的方式能够区分不同类别的图像。这种“生成器中特征具有判别性”的特性被运动监督和点跟踪机制有效地利用了。
在优化的每次迭代中,会发生以下情况;
- 原始潜在代码
w
被优化以获得w'
,从而生成新图像I'
。 I'
是I
的轻微修改,其中手柄点周围的相应语义位置向目标点移动。- 由于复杂的动态,手柄点运动的确切长度未知。因为我们正在处理
W
空间,所以我们真的无法说如果我们改变w
的位置以在 W 空间中获得w'
,手柄点在输出图像空间中会观察到多少运动。 - 图像
I
中的原始手柄点位置(例如 (x,y))现在在图像I'
(通过w'
获得)中处于不同的位置 (x', y')。可以这样理解——假设用户想将人类的手从图像中心移动到图像的右角。也就是说,在原始图像中,手在图像的某个中间位置。让手柄点选择在手上,目标点选择在图像右端附近。在新的图像I'
中,手向右移动。这不会一步完成,它需要几次迭代——理想情况下是 30-200 次。我们需要在每次迭代中跟踪手的新位置,以便在后续迭代中正确移动手,而不是其他属性/语义特征。 - 这种跟踪是通过最近邻搜索实现的。
让我们详细了解这两个子问题。
运动监督
如果你看上面的 GIF,用户选择红色点(手柄点)和蓝色点(目标点)。运动监督机制的目的是将手柄点的小区域中的对象向目标点区域移动,而不会扭曲原始图像的外观。此外,用户可以提供一个二值掩码(一个区域),它强制模型在不影响二值掩码区域之外的对象/纹理外观的情况下移动语义特征。这发生在多次迭代中,而不是一步优化过程。
运动监督在早期研究中并未得到充分探索,作者提出了一种可以实现手柄点向目标点移动的损失函数。StyleGAN 的合成网络有几个块/层,每个块逐步生成更高分辨率的图像,其中最终块的输出是所需的生成图像。中间块的输出也可以称为特征图。StyleGAN 原始论文中提到,第 6 个块之后的特征图在分辨率和判别性之间具有良好的权衡;即
- 较低的块 - 具有对判别特性有用的特征
- 较高阶的块 - 具有更高的分辨率
从合成器第 6 块输出获得的特征图在尺寸上明显小于原始生成的图像。因此,它通过插值进行大小调整以匹配实际生成器的输出图像尺寸。
设 为手柄点, 是位于 半径为 的点集 。设 为第 6 块插值特征图在像素位置 处的特征值,其中 。设 为原始特征图(即对应于 w
的原始输出图像)。设 为与输出图像形状相同的二值掩码。运动监督的损失函数建议如下;
这两个求和对应于第一项。让我们分解一下。在第一项中, 是连接目标点 (\(t_i\)) 和手柄点 (\(p_i\)) 的归一化向量(或单位向量)。第一项仅在 时达到最小值,这发生在手柄点与目标点重合时。这正是我们想要的,对吧?即移动手柄点附近的语义位置(小块)到目标点。那么为什么我们需要第二项呢?我提到过可以选择提供一个二值掩码,它强制模型限制移动二值掩码区域之外的区域。如果用户只选择猫的脸并使用掩码,即脸内的区域对应 1,掩码中脸外的区域对应 0。在第二项中,重建损失用于通过惩罚二值掩码外部像素值的任何变化来避免非掩码区域的移动。因此,只有猫的脸会移动,而不是它的身体。
有了这个损失,反向传播完成以更新 w
,现在更新为 w'
。如果你看上面的 StyleGAN 架构,w
被传递到多个块,而不仅仅是初始块(就像在原始 GAN 中一样)。不需要更新所有的 w
,而是更新通过第 6 块或更早的块传递的 w
就足够了,因为它们负责改变属性(微笑、发型等)。而合成器中后面的层/块负责改变外观,这不是我们目前感兴趣的。
点跟踪
从上述运动监督步骤中,我们得到了 w'
。w'
通过合成网络生成新图像 I'
。现在,手柄点位置一定已在新的图像 I'
中移动到其他位置。必须跟踪此位置,以便在随后的优化步骤中,原始手柄点正确地向目标移动。此跟踪通过最近邻搜索完成。
设 为原始手柄点坐标 在特征图 中对应的特征值,其中 是新的特征图(对应于 w'
), 是在新的特征图 中,围绕原始手柄点 位置形成一个小块的点集,半径为 。
对应于上述表达式中最小值的点 ,使得 最接近 ,是在新特征空间 中获得的,是手柄点的新位置。
有了这个新的手柄点,下一个优化步骤将以 w'
、I'
作为初始值开始。如果用户选择多个手柄-目标点对,优化步骤可以分别使用每个点应用。
Drag GAN 的应用
Drag GAN 可以用于以下方面;
- 可用于编辑真实图像。通过 GAN 反演技术,可以将真实图像转换为潜在代码
w
,然后通过选择多对手柄点和目标点来执行优化步骤,以根据用户的需要编辑图像。
- 可用于通过精细控制其外观来合成新图像。
- 该模型擅长“幻化”被遮挡的语义对象,例如,你可以打开一张闭着嘴巴的狮子(或任何其他动物)图像的嘴巴。它会显示原本被遮挡的牙齿。
网上有很多关于如何设置 Drag GAN 的资源,所以我不想在这里解释。
局限性与改进空间
作者在论文中列出了一些局限性;
- 尽管模型擅长处理分布外(例如遮挡对象的幻觉等),但当我们试图以与原始训练图像分布中的语义特征不符的方式操纵对象时,它仍然会产生不真实的输出图像。
- 假设我们的数据集中包含人类不伸展手脚的图像。当我们尝试通过手柄和目标点将腿和手向两侧移动时,它会产生不真实的输出/伪影。你可以清楚地看到下面手和腿的奇怪弯曲。
- 这是最令人担忧的事情。我们仍处于生成建模的黎明时期,我相信未来我们将拥有更复杂的图像编辑模型,这些模型将更容易被普通人使用。滥用该工具创建虚假语义特征(假笑/假笑/假姿势等)可能会造成严重的社会问题。
每个行动都应该有相等和相反的反应,无论何时图像的合成生成/修改取得进展,也必须有识别此类图像的工作。
结论
我希望您对本文的底层机制有了清晰的概述。为了避免读者不知所措,我在本博客中没有包含论文的许多细节。主要目的是提供一个概述。有了这个,您可以更好地理解原始的 Drag GAN 论文。
如果您有任何建议/澄清,请在 领英 上发送消息。大多数插图均来自各自的原始论文。
参考文献