0%

人脸风格迁移 + StyleGAN 的最新玩法

如今,人脸风格迁移的效果越来越惊人。给定一张人脸照片,不管是变成卡通风格、二次元风格,甚至是变成讽刺画风格,AI都能轻轻松松做到。

AI能有这么强的生成效果,都得归功于创作力极强的StyleGAN。StyleGAN本身只是用来随机生成人脸的模型。随着研究的不断推进,StyleGAN被应用到了人脸风格迁移任务中。在这篇文章里,我将简要介绍一下基于StyleGAN的人脸风格迁移的最新pipeline。

知识准备

风格迁移

在深度CNN展示出了强大的图像识别能力后,人们产生了疑问:CNN是感知图像的呢?为此,研究者找出了令深度CNN各层输出值最大的输入图片。这些图片能表明CNN各层“看到了”什么。实验结果显示,浅层网络关注轮廓信息,而深层网络会关注更抽象的信息。

受此启发,有人提出了一种叫做神经网络风格迁移[1]的应用——输入一张内容图像(C)和一张风格图像(S),输出一幅融合内容与风格的图片(G)。这一应用是通过对齐图像在深度CNN中各层的输出结果实现的。

风格迁移的具体介绍可以参见我之前的文章:Neural Style Transfer 风格迁移经典论文讲解

StyleGAN

GAN能够根据一个高维向量$z$生成图像($z$可以看成图像的身份证号)。但是,早期的图像GAN不能对图像生成的过程加以干预。

对此,人们提出了可控的图像生成网络StyleGAN[2]。在这个模型生成完一幅图像后,可以对图片进行由粗至精共18种微调:对于人脸生成而言,既可以调整性别、年龄这种更宏观的属性,也可以调整肤色、发色这种更具体的属性。

StyleGAN 的详细介绍可以参见我之前的文章:用18支画笔作画的AI ~ StyleGAN特点浅析

基于 image-to-image 的风格迁移

在计算机眼中,无论是自然语言,还是图像,都是一堆数据。就像不同的语言之间可以翻译一样,不同风格之间也可以翻译。风格迁移任务,其实就可以看成把来自某一种风格的图像翻译到另一种风格中。早期的人脸风格迁移,都是通过图像翻译(image-to-image translation)框架实现的。

对于语言翻译,需要准备好成对数据的数据集。比如在中文到英文翻译任务中,要给每一个中文句子准备其对应的英文翻译。而在风格迁移任务中,获得成对数据是几乎不可能的:哪有画家会去费心地给上千张人脸绘制出对应的漫画脸呢?因此,在风格迁移中,图像翻译都是通过无监督方式训练的,即不去使用成对的数据。

无监督的图像翻译一般也是通过GAN实现。生成器的输入是普通的人脸照片,输出是其对应的风格人脸照片;判别器的输入是生成的假图或者风格数据集里的真图,输出为该图片是否是风格图片。受到StyleGAN的启发,风格迁移的图像翻译网络还会使用类似的“风格模块”,以提升风格迁移的效果。下图是近期的图像翻译风格迁移工作 U-GAT-IT[3] 的网络示意图。

用图像翻译的想法来做风格迁移确实可行。但是,换一种新风格,就得花费大量精力去训练一个GAN,这一流程十分繁琐。

利用预训练 StyleGAN 的 Toonify

在StyleGAN面世后,热心的研究者们对其展开了各个角度的拓展。其中,有一篇短小精悍的文章用一种十分简单的方法让StyleGAN完成了风格迁移。这篇工作后来被称为Toonify[4]。

先来看一下Toonify的使用效果。Toonify使用了两个StyleGAN,一个能够生成真实的人脸,一个能够生成风格化人脸。对于同一个高维向量输入$z$,只需要对两个StyleGAN的权重进行插值,就能让$z$对应的两幅图像之间发生风格迁移。下图中,a是真实StyleGAN的输出,b是风格化StyleGAN的输出,c, d是把两幅图像的内容和风格交换后的输出,e是精心组合两个StyleGAN权重得到的输出。

Toonify使用的权重插值方法非常直接。StyleGAN生成图像时,会先生成分辨率较小的图片,再逐渐把图片放大。修改小分辨率处的权重,会改变图像的内容;修改大分辨率处的权重,会改变图像的风格。Toonify做的插值,仅仅是交换两个StyleGAN不同分辨率处的权重而已。

以上只是Toonify的核心思想。要利用Toonify做风格迁移,还有两个问题要解决:

  1. 怎么根据真实StyleGAN得到风格化的StyleGAN?
  2. StyleGAN的图片是通过$z$生成出来的。对于任意一幅真实人脸图像,怎么得到它的$z$呢?

对于第一个问题,风格化的StyleGAN是通过微调得到的。作者用预训练的真实StyleGAN在新的风格化数据集上微调出了另一个StyleGAN。

对于第二个问题,任意一张真实人脸图片的$z$可以通过简单的数学优化来实现:给定一张图片,我们要求一个$z$,使得$z$通过真实StyleGAN的输出和输入图片尽可能相似。当然,这种直接优化得到的$z$不一定是最优的。把任何一张图片嵌入进StyleGAN的隐空间是一个大的研究方向,叫做GAN Inversion.

总结下来,Toonify使用的pipeline如下:

  1. 在新风格上微调StyleGAN。
  2. 通过GAN Inversion得到真实人脸的$z$。
  3. 交换新旧StyleGAN的权重,得到插值StyleGAN。$z$在插值StyleGAN中的输出就是风格迁移后的图片。

基于 StyleGAN 的风格迁移

Toonify这篇工作本身非常简短,但它却为风格迁移指出了一条新的路线。相比基于图像翻译的风格迁移,这种新方法有以下好处:

  1. 训练代价大幅减小。新方法可以直接使用预训练好的StyleGAN,在几百幅新风格的图像上微调即可完成主要的模型训练,而无需从头训练一个GAN。
  2. 可以直接利用StyleGAN的强大图像生成能力,甚至是StyleGAN的图像编辑能力(修改低分辨率或高分辨率的输入,以改变图像的内容和风格)。

以发表在图形学顶刊ACM TOG上的AgileGAN[5]为例,我们来简单地看一下前沿的风格迁移框架是怎样的。

模型训练分两部分,先训练编码器(完成GAN Inversion),再训练解码器(生成图像)。作者用VAE来建模编码器的训练过程,此时的解码器是固定权重的预训练StyleGAN。基于VAE的编码器训练好了之后,再固定编码器的权重,把预训练的StyleGAN在新数据集上微调,得到风格化的StyleGAN。

在推理时,输入一张图片,VAE输出的分布的均值即是该图片的编码$z$。把$z$输入进微调后的StyleGAN,即可得到风格迁移的结果。

由于使用了预训练StyleGAN,整个训练过程能在一小时内完成。

作者还精心优化了StyleGAN的结构。StyleGAN的浅层决定了生成图像的抽象属性,比如性别、年龄。通过修改浅层的权重,即可得到不同性别、年龄的人脸图像。作者在StyleGAN的浅层网络中加入了多条路径(多条路径其实等价于多个网络),一条路径固定了一种人脸属性。比如第一条路径只能生成男性,第二条路径只能生成女性。每一条路径都有一个专门的判别器,该判别器集成了StyleGAN本身的预训练判别器和一个判断属性的判别器,保证一条路径生成的图像都满足某属性。

从这个例子中,我们能够直观地认识到微调StyleGAN的风格迁移方法的优势。训练上的便捷性、StyleGAN强大的生成能力与编辑能力使得这一方法在众多风格迁移方法中脱颖而出。

结语

在这篇文章中,我简要介绍了一种前沿的风格迁移pipeline,并讲述了它是如何一步一步诞生的。从本文提及的前沿工作中也能看出,当前风格迁移的效果非常好,训练起来也不难,可以用其轻松地开发出人脸年轻化、性别转换、二次元化等等有趣的应用。如果你对相关的研究或应用感兴趣,欢迎参考这篇文章提及的文献进行学习。

如果你很细心,会发现这篇文章开头展示的图片并不是本文介绍的任何一篇论文的输出结果。实际上,它是一篇更新的工作——DualStyleGAN——的输出结果。这篇工作的原理更加复杂,我会在之后的文章里对其做介绍。

参考文献

[1] Image style transfer using convolutional neural networks

[2] A Style-Based Generator Architecture for Generative Adversarial Networks

[3] U-GAT-IT: Unsupervised Generative Attentional Networks with Adaptive Layer-Instance Normalization for Image-to-Image Translation

[4] Resolution Dependent GAN Interpolation for
Controllable Image Synthesis Between Domains

[5] AgileGAN: Stylizing Portraits by Inversion-Consistent Transfer Learning