概括起来,输入是人物人脸的图像与一个 6 维姿势向量。输出是另一张姿势根据情况有所调整的人脸图像。
网络,如前所述,我的神经网络包含多个子网络。下面详细介绍它们。
人脸变形器确定人物人脸的姿势的第一步是修改其人脸特征。更具体来说,我们需要人物能闭上眼睛和嘴。Pumarola et al. 在他们的论文中描述了一种可以根据给定的动作单位(AU:Action Units,表示面部肌肉的运动)修改人脸特征的网络。因为 AU 是非常通用的编码系统,所以他们的网络可不止能闭眼和闭嘴。因此,我觉得这能有效地处理我们手头上的任务。它没有让我失望。
但是,我没有使用该论文的所有方法,因为我的问题比他们的简单很多。尤其是他们的训练数据没有来自同一个人的表情不同的人脸对。因此,他们需要使用带有循环一致性损失的 GAN 来执行无监督学习。但是,我的数据是配对好的,所以我可以执行简单的监督学习。所以,我只需要他们的生成器网络。
下面我详细说说 Pumarola et al. 的生成器。下图是其架构示意图。
人脸变形器的架构。这是针对本案例对 Pumarola et al. 的论文中图 3 的复现
该网络会通过生成改变图像来实现对面部表情的修改,这个改变图像是原图像与一个 α 掩码(Pumarola et al. 称之为注意力掩码,但我这里使用了一个更常用的术语)的组合。要做到这一点,输入图像和姿势会被送入一个编码器-解码器网络,这会为输入图像的每个像素得到一个 64 维的特征向量。然后,这些特征向量构成的图像会经过两次不同的 2D 卷积单元和适当非线性的训练处理,得到 α 掩码和改变图像。附录 A.1. 给出了该网络的详细指标。
Pumarola et al. 使用了一个相对复杂的损失函数来训练他们的网络。让我惊讶的是,对我的问题来说,简单的 L1 像素差异损失就足够了。这个损失函数的数学描述如下: