GANimation: Anatomically-aware Facial Animation from a Single Image
本文提出一种基于 Action Units (AU) 的 conditional GAN,可以生成连续人脸表情。文章采用完全的无监督训练(但是要标注AU?)。还提出了一种注意力机制,这种注意力机制使得模型更加关注需要做出变形的地方,对于人脸其他部位和背景可以尽量保持不变,所以模型更加鲁棒。
文章整体思路结合了 conditional GAN, CycleGAN 和 Attention 三种方法,在生成器的输入中加入面部表情编码 (FACS),使得生成器能够生成一系列连续变化的表情。文中借鉴了 CycleGAN 的思想,但是只有一个生成器,生成何种表情,由输入的表情编码决定,这样只要交换输出和输入里的表情编码,就可以实现循环。
方法
如图2所示,该方法中包括两个模块,一方面训练一个生成器 根据输入图像 和想要生成的表情编码 来产生近乎真是的人脸表情图像。在这个过程中 执行了两次,首先根据 生成 (映射 ),然后又反过来将 作为输入重新生成 (映射 ) 。另一方面,需要用 WGAN-GP 训练一个判别器 来判断生成图像的真实性。
网络结构
生成器。 生成器由两个 Resnet 组成,每个Resnet 包括2次下采样、中间6个残差模块和2次上采样。2个部分分别生成注意力图像 和色彩图像 ,最终生成的图像通过下面的公式获得:
基本过程见图3
判别器。判别器类似于 PatchGAN,最终输出的特征图为尺寸为 () ,另外在增加了一个用于判断表情编码的分支。
损失函数
损失函数包括 Image Adversarial Loss, Attention Loss, Conditional Expression Loss, Identity Loss.
Image Adversarial Loss 就是用 WGAN-GP 计算 GAN Loss,公式为
Attention Loss. 由于数据中没有 Attention Mask 的 ground truth, 而且在训练过程生成的 attention mask 很容易达到饱和值1,致使对应的生成器没有效果。为了保证生成图像过渡平滑,文章对 A 做了总变差正则化 (Total Variation Regularization). Attention Loss 计算公式为
Conditional Expression Loss. 这个 Loss 的作用是为了让生成器学习根据表情编码生成目标表情,计算公式为
Identity Loss. 这个 Loss 实际上就是 CycleGAN 中的 cycle-consistency-loss,目的是为了让生成的照片是同一个人,计算公式如下
将上面几部分加起来,就得到总的损失函数
整个优化过程仍旧是GAN一样:
实现细节
生成器的结构采用李飞飞 Perception Loss (参考文献1) 中的 Resnet 结构,文章中说是将最后卷积层改为2个平行的卷积分支,分别输出 color mask C 和 attention mask A ,但是github上的代码中确实从头到尾直接用了两个一样的 Resnet,并没有共享特征提取层。对于判别器,文章去掉了 PatchGAN 中的 normalization,
训练中使用 Adam 优化器,lr=0.0001, beta1=0.5, beta2=0.999, batch_size=25,前30轮学习率不变,后10轮线性减小至0. 每训练更新5次判别器,训练一次生成器。各个 loss 的权重系数为
实验结果
这里关注一下 Attention Mask 的作用。图5 中可以看到 A 很好地体现了面部变化的关注点,变化越明显的地方 A 的值越高。
其他实验结果可以参见项目链接: GANimation
参考文献
- Johnson, J., Alahi, A., Fei-Fei, L.: Perceptual losses for real-time style transfer and
super-resolution. In: ECCV (2016)