我使用了与 Pumarola et al. 一样设置的 Adam 算法来优化网络:学习率 1^−4、β_1=0.5、β_2=0.999,批大小为 25。网络训练了 6 epoch(3 000 000 个样本),在我的 GeForce GTX 1080 Ti GPU 上耗时两天。
- 人脸旋转器
人脸旋转器由两个子网络构成。双算法旋转器使用两个不同的算法旋转人物的面部,其中每个算法都有各自的优势和短板。为了将两者的优势结合到一起,还有一个组合器(combiner)能使用一个 α 掩码将两个算法输出的图像融合到一起,并且还能对图像进行修整,实现质量提升。
- 双算法旋转器
下图描述了其架构。
可以将该网络看作是对 Pumarola et al. 的生成器的扩展:其包含该生成器的所有单元,还多了一个新的输出路径。原有的路径的任务只是旋转人脸,而不是闭上眼睛和嘴。新的路径则是使用了 Zhou et al. 论文中描述的方法来旋转目标。
其中的思想是:物体旋转(尤其是角度较小时)很大程度上涉及到将输入图像内的像素移动到不同位置。因此 Zhou et al. 提出计算外观流:这是一种映射图,能指示输出图像中的每个像素应该复制输入中的哪个像素。然后,这个映射图和原始图像会被传递给一个像素采样单元以生成输出图像。在我的架构中,外观流就是简单地通过将编码器-解码器网络的输出传递给一个新的卷积单元而计算的。
我在训练网络时使用了两个不同的损失。第一个就是简单的 L1 像素差异损失:
第二个损失是 L1 像素差异损失和 Johnson et al. 的感知特征重建损失的和:
同样,优化用的是 Adam,使用了与人脸变形器一样的超参数。一共训练了 6 epoch(3 000 000 个样本)。当使用 L1 损失时,我将批大小设为 25,训练同样用去了大约两天时间。但是,由于评估特征重建损失需要远远更大的内存,所以当使用这种感知损失进行训练时,我必须将批大小降至 8。在这种情况下训练也用去了 6 天。
- 组合器
看看下面双算法旋转器的输出,可以看到单独任何一个算法的结果都不够好。