我也可以迁移已有视频中的人脸运动:
这个网络的输入是人物的正面图像,人物的姿势由 6 个数值指定。通过渲染 8000 个可下载的动漫人物的 3D 模型创造了一个新的数据集。使用的方法结合了之前两项研究。
一是 Pumarola et al. 2018 年的 GANimation 论文《GANimation: Anatomically-aware Facial Animation from a Single Image》,将其用于修改面部的特征(具体来说是闭上眼睛和嘴)。二是 Zhou et al. 2016 年根据外观流实现目标旋转的论文《View Synthesis by Appearance Flow》,将其用于实现人脸的旋转。
想要解决的问题是这样的:给定某个动漫人物的一张人脸图像和一个「姿势(pose)」,生成同一人物的另一张图像,并且其人脸会根据姿势而变化。在这里,姿势是一个指定了该人物面部表情和头部旋转情况的数值的集合。具体来说,姿势有 6 个数值,分别对应前面动图中的不同滑块。
在「问题设定」讨论输入和输出的细节。该系统的输入和输出
我使用了深度学习来解决下面这两个问题:
- 我要使用什么数据来训练这个网络?
- 我要使用什么网络架构以及具体采用怎样的训练方法?
事实证明,第一个问题是最主要的挑战。我需要一个包含姿势标签的人脸图像数据集。EmotioNet 是一个包含所需类型的标签的大型人脸数据集。
同时课程种类资源丰富,各行各业都有,总有人需要。但是,就我所知,还没有类似的动漫人物数据集。因此,我专门为本项目生成了一个新的数据集。
为此,我利用了这一事实:网上就有数以万计可下载的动漫人物 3D 模型,这些模型是用一款名为 MikuMikuDance 的 3D 动画软件创造的。我下载了大约 8000 个模型,然后使用了它们来渲染随机姿势的动漫人脸。
我根据实现 3D 人物模型动画化的方法设计了该网络。我将这个过程分成了两步。第一步是改变面部表情;即控制眼睛和嘴的开闭程度。第二步是人脸旋转。
我为每一步都使用了一个单独的网络,并将第一个网络的输出用作第二个网络的输入。我将第一个网络称为人脸变形器(face morpher),第二个网络称为人脸旋转器(face rotator)。
该系统的执行过程分为两个步骤
人脸变形器使用了 Pumarola et al. 的 ECCV 2018 论文中所用的生成器架构。该网络可通过生成另一张包含对原始图像的修改的新图像来改变人脸表情。这些改变会通过一个 α 掩码与原图像组合,而这个 α 掩码也是由该网络本身生成的。我发现,这种架构在修改图像中的小部件方面表现非常出色:这里是闭上眼睛和嘴。
人脸旋转器则要复杂得多我在单个网络中实现了两个算法来旋转人脸,因此该网络有两个输出。这两个算法是:
Pumarola et al. 的算法。这就是刚刚用来修改面部表情的算法,但现在该网络的任务是旋转人脸。
Zhou et al. 的视图合成算法。他们的目标是旋转图像中的 3D 目标。他们的实现方法是让神经网络计算一个外观流(appearance flow):这是一个映射图,能指示输出图像中的每个像素应该复制输入中哪个像素的颜色。
外观流能得到保留了原有纹理的清晰结果,但这种方法不善于描绘在旋转后变得可见的部分。另一方面,Pumarola et al 的架构得到的结果较模糊,但能描绘被遮挡的部分,因为其训练目标就是改变原始图像的像素,而不是从已有图像复制像素。为了将这两种方法的长项结合到一起,我训练了另一个网络通过一个 α 掩码将这两个输出融合到一起。这个网络还能输出「修整(retouch)」图像,即可将组合后的图像与另一个 α 掩码再组合起来。