玩转StyleGAN2模型:教你生成动漫人物

2023-12-06 阅读17 评论0 喜欢0

生成式对抗网络

生成式对抗网络(GAN)是一种能够生成新内容的生成式模型。由于其有趣的应用,如生成合成训练数据、创造艺术、风格转换、图像到图像的翻译等,这个话题在机器学习界真的很受欢迎。

GAN架构 [图片由作者提供]


GAN由2个网络组成,即生成器和鉴别器。生成器将尝试生成假样本,并愚弄鉴别器,使其相信是真实样本。鉴别器将试图从真假样本中检测出生成的样本。这个有趣的对抗性概念是由Ian Goodfellow在2014年提出的。已经有很多资源可以用来学习GAN,因此为了避免冗余,我就不解释GAN了。

我推荐大家阅读Joseph Rocca写的这篇理解GAN的美文。

理解生成式对抗网络(GANs)

风格GAN2

英伟达在2018年发表了StyleGAN论文《A Style-Based Architecture for GANs》。该论文为GAN提出了一种新的生成器架构,允许他们控制生成样本的不同细节水平,从粗糙的细节(如头部形状)到更精细的细节(如眼睛颜色)。

StyleGAN还融合了Progressive GAN的思想,即网络最初在较低分辨率(4x4)上进行训练,稳定后再逐步增加更大的层数。这样做,训练时间变得更快,训练也更稳定。

渐进式增长GAN[来源:萨拉-沃尔夫]

StyleGAN进一步改进了它,增加了一个映射网络,将输入向量编码成一个中间的潜伏空间,w,然后将有单独的值用来控制不同层次的细节。

StyleGAN生成器架构 [图片由作者提供]。

为什么要增加一个映射网络?

GAN的问题之一是它的纠缠潜码表示(输入向量,z)。例如,假设我们有2个维度的潜伏码,它代表了脸的大小和眼睛的大小。在这种情况下,人脸的大小与眼睛的大小高度纠缠在一起(眼睛越大也就意味着人脸越大)。另一方面,我们可以通过存储脸部和眼睛的比例来简化这个问题,这将使我们的模型更简单,因为无纠缠的表示方式更容易让模型解释。

在纠缠表示下,数据分布不一定遵循正态分布,我们希望从那里抽取输入向量z的样本。例如,数据分布会有这样一个缺角,它代表了眼睛和脸部的比例变得不现实的区域。

[来源:文件]


如果我们从正态分布中对z进行采样,我们的模型会试图也生成缺失的区域,其中的比例是不现实的,由于没有具有这种特征的训练数据Is,生成器会生成不良的图像。因此,映射网络的目的是拆分潜伏表征,并扭曲潜伏空间,使其能够从正态分布中采样。

[来源:文件]

此外,在每个层次上有单独的输入向量w,允许生成器控制不同层次的视觉特征。前几层(4x4,8x8)将控制更高级别的细节,如头型、姿势和发型。最后几层(512x512,1024x1024)将控制更精细的细节,如头发和眼睛的颜色。

粗层次细节的变化(头型、发型、姿势、眼镜)[来源:文件]

细部细节的变化(发色)[来源:文件]


关于StyleGAN架构的完整细节,我推荐大家阅读NVIDIA官方关于他们实现的论文。下面是论文本身的完整架构图示。

[来源:基于风格的全球行动网文件架构]

随机变化

StyleGAN还允许你通过在各自的图层上给予噪声来控制不同层次的细节的随机变化。随机变化是图像上的小随机性,不会改变我们的感知或图像的身份,如不同的梳理的头发,不同的头发位置等。你可以在下面的动画图像中看到变化的效果。

粗随机变化[来源:论文]

精细随机变化[来源:论文]

StyleGAN还做了一些其他的改进,我在这些文章中就不一一介绍了,比如AdaIN的规范化和其他常规化。你可以阅读官方论文,Jonathan Hui的这篇文章,或者Rani Horev的这篇文章来代替阅读进一步的细节。

截断技巧

当训练样本中存在代表性不足的数据时,生成器可能无法学习样本,生成效果不佳。为了避免这种情况,StyleGAN使用了一个 "截断技巧",通过截断中间的潜伏向量w,迫使其接近平均值。

(psi)是阈值,用来截断和重新采样高于阈值的潜向量。因此,如果使用更高的 ,你可以在生成的图像上获得更高的多样性,但它也有更高的机会生成奇怪或破碎的面孔。对于这个网络来说, 的值在0.5到0.7之间,根据Gwern的说法,似乎可以得到一个具有足够多样性的好图像。虽然,可以随意试验一下阈值。

用0.3磅/平方英寸(左)与0.7磅/平方英寸(中)与1.3磅/平方英寸(右)生成的3x3网格图像。

生成动漫人物

我将使用Aaron Gokaslan预先训练好的Anime StyleGAN2,这样我们就可以直接加载模型并生成动漫脸。所以,打开你的Jupyter笔记本或Google Colab,让我们开始编码吧。

注:如果你有困难,可以参考我的Colab笔记本。

所以首先,我们应该克隆styleGAN repo。

$ git clone https://github.com/NVlabs/stylegan2.git

如果你使用的是 Google Colab,你可以在命令前加上'!'来作为命令运行。!"git clone github.com/NVlabs/style

接下来,我们需要下载预训练的权重并加载模型。当你使用Google Colab时,请确保你是在GPU运行时运行,因为模型被配置为使用GPU。

这段代码是从这个笔记本上修改而来的

现在,我们需要生成随机向量z,作为生成器的输入。让我们创建一个函数,从给定的种子中生成潜伏代码z。

然后,我们可以创建一个函数,将生成的随机向量z,生成图像。

现在,我们可以尝试生成一些图像,看看结果。

该函数将返回一个PIL.Image的数组。在Google Colab中,你可以直接通过打印变量来显示图像。这里是第一张生成的图片。


图片由作者提供


让我们用图片的网格来显示,这样我们就可以同时看到多张图片。

然后我们可以将生成的图像显示在3x3网格中。

图片由作者提供

GAN的一个好处是,GAN有一个平滑和连续的潜伏空间,而不像VAE(Variational Auto Encoder)有间隙。因此,当你在潜伏空间中取两个点,将产生两个不同的面,你可以通过在两个点之间取一个线性路径来创建两个面的过渡或插值。

潜在空间的插值[来源:Joseph Rocca]

让我们在代码中实现这一点,并创建一个函数来在z向量的两个值之间进行插值。

让我们看看插值结果。你可以看到,第一幅图像逐渐过渡到第二幅图像。

图片由作者提供


现在我们已经完成了插值工作。我们终于可以尝试制作上面缩略图中的插值动画了。我们将使用moviepy库来创建视频或GIF文件。


当你运行这段代码时,它会生成一个插值的GIF动画。你还可以使用顶部的变量修改持续时间、网格大小或fps。

生成的StyleGAN2插值GIF [图片由作者提供]。


如果你做到了这一步,恭喜你! 你已经使用StyleGAN2生成了动画面孔,并学会了GAN和StyleGAN架构的基础知识。

下一步是什么?

现在我们已经完成了,你还可以做什么,进一步改进呢?以下是你可以做的几件事。

其他数据集

显然,StyleGAN并不局限于动漫数据集,还有很多可用的预训练数据集,你可以尽情玩耍,比如真实的脸部图像、猫咪、艺术和绘画。请查看这个GitHub repo,了解可用的预训练权重。另一方面,你也可以用自己选择的数据集来训练StyleGAN。

有条件的GAN

目前,我们无法真正控制我们想要生成的特征,如头发的颜色,眼睛的颜色,发型和配件。条件GAN允许你在输入向量z旁边给出一个标签,从而将生成的图像调节成我们想要的样子。另外,你也可以尝试通过回归或手动来理解潜伏空间。如果你想往这个方向走,Snow Halcy repo也许能帮到你,因为他已经做了,甚至在这个Jupyter笔记本上做了互动。


不只是科技数码,还有一些有趣的生活分享给大家

  • 文章

    0

  • 浏览

    0

  • 获赞

    0

赞一个、收藏了!

分享给朋友看看这篇文章