网易伏羲AI实验室新突破:基于神经风格迁移框架生成逼真人脸

2019 年 9 月 30 日

网易伏羲AI实验室新突破:基于神经风格迁移框架生成逼真人脸

角色定制系统是角色扮演类游戏(Role-Playing Games,RPG)的一个重要部分,该系统允许玩家依照自己的喜好编辑游戏角色的面部外观,而不是使用默认模板。网易伏羲AI实验室提出了一种根据输入的面部照片自动创建游戏角色的方法,相关论文已经被ICCV2019录用发表。该方法通过解决大量具有物理意义的面部参数优化问题,依据面部相似性度量和参数搜索范式制定上述“艺术创作”过程。

为了有效地最小化生成图像与真实面部图像间的距离,作者设计了“判别损失”和“面部内容损失”这两个损失函数。由于游戏引擎的渲染过程是不可微的,因此作者设计了一个生成网络作为“模拟器”来模拟游戏引擎的生成过程,以便论文提出的方法可以在神经风格迁移框架下实现,并能通过梯度下降法对模型参数进行优化。

实验结果表明,使用论文提出的方法生成的游戏角色与输入的人脸图像在全局外观和局部细节方面都达到了高度相似的水平。该方法已经在网易去年的新游戏中部署,现在已经被超过100万玩家使用。


1 背景介绍


角色定制系统允许玩家根据自己的喜好编辑游戏内角色的形象,例如使用一个流行明星或玩家自己的实际形象生成游戏角色形象。在最近的一些 RPG 类游戏中,为了提高玩家的沉浸式体验,角色定制系统发展地越来越精细。但是,对于大多数玩家来说,角色定制过程变得越来越耗时且困难。例如,在《Grand Theft Auto Online》、《Dark Souls III》以及《Justice》这几个游戏中,玩家为了给游戏人物“捏脸”需要耗费好几个小时调整上百个参数,即使是一位经验丰富的老玩家也需要很长的时间来创建他的自定义游戏角色。


创建 RPG 游戏角色的一个标准工作流程需要配置大量的面部参数,游戏引擎将这些详细的面部参数作为输入然后产生一个 3D 人脸模型。理论上来讲,游戏角色定制可以看成是“单目 3D 人脸重建”或“风格迁移”问题的一个特殊情况。长期以来,生成包含语义结构的 3D 图像在计算机视觉领域都是一个非常困难的任务。但如今,计算机已经可以使用 CNN 自动生成具有新风格的图像,甚至是由单张面部图像生成 3D 重构结果,这都要归功于近年来深度学习的发展。


但是由于一些因素的限制,通用的风格迁移或 3D 重建算法不能直接用于游戏环境。具体原因如下:


  1. 通用的方法不是为生成参数化的角色而设计,它们通常是使用图像或3D点阵作为输入。而游戏引擎通常是使用用户自设的参数进行生成。

  2. 这些方法的用户交互通常都不是很友好,多数用户不直接编辑3D点阵或栅格化的图像。

  3. 游戏引擎使用用户自定义的参数进行渲染的过程是不可微的,这限制了基于深度学习的方法在游戏环境中的应用。


图1:方法总览,该方法可以使用输入的照片生成参数化的3D人脸表示,同时用户也可以通过一些预设的参数微调面部形象。


图 1:方法总览,该方法可以使用输入的照片生成参数化的 3D 人脸表示,同时用户也可以通过一些预设的参数微调面部形象。


考虑到上述问题,这篇文章提出了一种自动化的游戏角色生成过程,该方法使用一张输入的人脸图像进行角色创建,如图 1 所示。以往的 3D 人脸重构方法会生成 3D 人脸点阵,而该方法则对具有清晰物理意义参数进行预测,生成骨架驱动的 3D 模型。在该方法中,每个参数控制着每个面部组件的独立属性,包括位置、方向和尺度。更重要的是,该方法支持用户在基础的创建结果上基于他们的需求进行额外的用户交互。由于游戏引擎的渲染过程是不可微的,作者设计的了一个生成网络 G 作为一个模拟器来模拟游戏引擎的生成过程,以便提出的方法可以使用神经风格迁移框架实现,并通过梯度下降法对面部参数进行优化。考虑到该方法的特性,作者将该方法定义为一种“人脸-参数”(Face-to-Parameter,F2P)翻译方法。


论文的贡献:


  1. 我们提出了一种端到端的方法用于人脸-参数翻译和游戏角色自动生成。据我们所知,目前为止仅有很少一部分工作在该问题上进行研究。

  2. 介绍了一种由生成网络构成的模拟器,它可以模拟游戏引擎的行为。通过这种方法,梯度可以平滑的反向传播,从而可以使用梯度下降法更新面部参数。

  3. 针对跨域人脸相似性度量,分别设计了两个损失函数。在多任务学习框架中,该方法的目标函数可以被联合优化。


2 方法


论文提出的人脸-参数模型由一个模拟器 G(x)和一个特征提取器 F(y)组成。前者使用用户自定义的面部参数 x 来模拟游戏引擎的生成过程,并生成一个“预渲染”的面部图像 y。后者则用来决定特征空间,使得面部相似性度量方法可以被用于优化面部参数。整个方法的处理框架如图 2 所示。


图2:方法框架


图 2:方法框架


2.1 模拟器


作者训练了一个卷积神经网络作为模拟器,以适应游戏引擎的输入-输出关系,从而使角色定制系统可微。模拟器 G(x)采用了与 DCGAN 类似的网络配置,它由 8 个转置卷积层组成。模拟器的框架结构如图 3 所示。为了简单起见,作者设计的模拟器 G 仅对面部模型的正视图以及相应的面部定制参数进行模拟。


图3:模拟器结构


图 3:模拟器结构


作者将模拟器的学习和预测构建为一个基于深度学习的标准回归问题,其中该任务的目标是最小化游戏中渲染图像与生成的图像在原始像素空间中的差异。训练模拟器使用的损失函数如下:



其中 x 表示输入的人脸参数,G(x)表示模拟器的输出:



表示游戏引擎渲染的输出。作者使用 l1 损失函数作为约束,因为相比于 l2 损失,l1 损失能减少更多的模糊。输入参数 x 采样自多维正态分布 u(x)。最终,训练时的目标函数可写为:



在训练阶段,作者使用游戏“Justice”的引擎随机生成了 20000 个独立的人脸以及相应的面部自定义参数。80%的人脸样本用于训练,其余的则用于测试。图 4 展示了三个由模拟器“渲染”得到的样本。由于训练样本都是从面部参数的标准分布模型中随机生成的,因此对于大部分角色来说看起来可能会比较奇怪(这部分内容在论文的补充材料中有详细解释)。然而,正如我们可图 4 中看到的那样,即使在具有复杂纹理的一些区域中,生成的面部图像和直接由渲染得到真实图像仍具有高度的相似性,例如头发区域。这表明模拟器不仅适合低维面部流形的训练数据,而且还能学会解耦不同面部参数之间的相关性。


图4:由模拟器G(x)生成的人脸图像及其真实值,这些图像的面部参数均为手动生成的。


图 4:由模拟器 G(x)生成的人脸图像及其真实值,这些图像的面部参数均为手动生成的。


2.2 面部相似性度量


一旦我们获得了训练好的模拟器 G,由面部参数生成面部图像的过程本质上就成为了一个面部相似性度量问题。由于输入的人脸照片和渲染出的游戏角色图像属于不同的图像域,为了有效地度量面部相似度,作者设计了两个损失函数分别从全局表观和局部细节两方面进行度量。作者借鉴了神经风格迁移的框架在特征空间计算这些损失,而不是在原始的像素空间计算它们的损失值。参数的生成过程可以视为在模拟器所在的流形进行搜索的过程,作者通过寻找最优点:



来最小化 y 和参考图像 y_r 之间的距离,如图 5 所示。


图5:游戏角色自动生成过程可以视为在模拟器的流形上进行搜索的过程。


图 5:游戏角色自动生成过程可以视为在模拟器的流形上进行搜索的过程。


#2.2.1 判别损失


作者引入了一个人脸识别模型 F1 来度量两张人脸的全局表观损失,如人脸形状以及大致表情。同时,作者受到感知距离(perceptual distance,在图像风格转换、图像超分辨率重建、以及特征可视化等领域有广泛应用)的启发。假设对于同一个人的不同肖像照片,它们的特征应该具有相同的表示。最终,作者使用了目前领先的人脸识别模型“Light CNN-29 v2”来提取 256 维的人脸嵌入表示,然后使用该特征计算两张人脸之间的余弦距离作为它们的相似度表示。作者将该损失定义为“判别损失”,因为它的功能是判断真实照片和由模拟器生成的图像是否属于同一个身份。上述的判别损失可以写为下面这种形式:



其中,两个向量间的余弦距离可以表示为:



2.2.2 面部内容损失


除了判别性损失之外,作者还使用人脸语义分割模型提取了局部面部特征,并通过计算这些特征在像素级的误差定义了一个面部内容损失。面部内容损失可以被视为对两个图像中不同面部成分的形状和位移的约束,例如,眼睛、嘴巴和鼻子。由于面部内容损失更关心的是面部图像特征差异而不是日常图像,因此作者没有使用在 ImageNet 数据集上训练的语义分割模型,而是使用非常著名的 Helen 人脸语义分割数据库对模型进行了训练。作者使用 Resnet-50 作为语义分割模型的基础结构,移除了最后的全连接层,并将其输出分辨率从 1/32 增加到了 1/8。为了提高面部语义特征的姿态敏感度,作者使用分割结果(类级的概率响应图)作为特征图的权重来构建姿态敏感的面部内容损失函数。最终,面部内容损失可以定义为:



其中 F_2 表示从输入图像到面部语义特征映射的过程,w 表示特征的像素级权重,例如 w_1 表示眼-鼻-嘴响应图。


图6:两种不同的损失函数可以有效的对不同域的面部图像相似度进行度量


图 6:两种不同的损失函数可以有效的对不同域的面部图像相似度进行度量


最终,模型的总损失函数可以写为判别损失和面部内容损失的线性组合:



其中参数 Alpha 用于平衡两个任务的重要性。上文中提到的特征提取器如图 6 所示,作者使用了梯度下降法来解决下面这个优化问题:



其中:



表示需要优化的面部参数,y_r 表示输入的参考人脸照片。针对作者提出方法,其完整优化过程可以总结为:


  • 阶段1:训练模拟器G、人脸识别网络F_1以及人脸分割网络F_2

  • 阶段2:固定G、F_1和F_2,初始化并更新人脸面部参数x,直到接近迭代的最大次数:



2.3 实现细节


模拟器:作者设计的模拟器使用了 4*4 大小的卷积核,转置卷积的步长设为了 2,以便将每个卷积操作后的特征图大小翻倍。批归一化和 ReLU 激活函数被嵌入了模拟器的每个卷积层之后,除了输出层。此外,作者使用 SGD 优化器进行训练,批大小设为了 16,动量为 0.9。学习率设为了 0.01,学习率每 50 代衰减 10%,整个训练过程进行了 500 代。


面部分割网络:作者使用了 Resnet-50 作为分割网络的骨干网络,并移除了其全连接层且在顶部增加了一个额外的 1X1 卷积层。此外,为了增加输出特征图的分辨率,作者将 Conv_3 和 Conv_4 的步长由 2 设置为了 1。作者使用了在 ImageNet 上与训练的权重进行模型的初始化,然后在 Helen 人脸语义分割数据集上使用像素级的交叉熵损失对模型进行了微调。训练时的学习率设为了 0.001,其余配置均与模拟器的训练参数相同。


面部参数:面部参数 D 的维度针对男性角色和女性角色分别设为了 264 和 310。在这些参数中,208 个参数是连续值(例如眉毛长度、宽度和浓密程度),其余的则是离散值(如发型、眉毛风格、胡子风格和嘴唇风格)。这些离散参数被处理为独热编码形式与连续参数拼接起来表示完整的面部参数。由于独热编码难以优化,作者使用了 softmax 函数来对离散变量进行平滑处理:



其中,D’表示离散参数独热编码的维度。Beta>0 控制了平滑等级。作者将 beta 设置为了 100 以加速优化过程。在初始化面部参数时,作者使用了“平均脸”,即将连续参数均设置为 0.5 而离散参数全设置为 0。


优化:阶段 2,Alpha 设置为 0.01,最大迭代数为 50,学习率 mu 设置为 10 并且每 5 次迭代衰减 20%。


人脸对齐:作者使用了 dlib 人脸工具库对输入特征提取器之前的图像进行了人脸对齐操作,并使用渲染的“平均脸”作为其参考图像。


图7:一些输入照片和使用模型生成的角色


图 7:一些输入照片和使用模型生成的角色


3 实验结果及分析


作者使用了 50 个人脸特写照片来进行实验。图 7 展示了一些输入照片和生成的人脸参数。可以看出,游戏引擎可以在多个视角渲染出游戏内角色,并且渲染结果与输入照片体现出高度的相似性。


3.1 消融学习


作者进行了消融学习实验来验证提出的框架中每个组件的重要性,包括 1)判别损失和 2)面部内容损失。在对判别损失进行验证时,作者使用 Gatys 提出的内容损失作为基准方法。如图 8 所示,可以看出当使用了判别损失时,输入图像与渲染结果的相似性有了显著提高。


图8:针对判别损失的消融实验结果


图 8:针对判别损失的消融实验结果


图 9 展示了使用面部内容损失的消融实验结果。为了更清楚地展示,作者提取了参考图像的面部语义图和面部组件边缘,红色的像素表示生成人脸的部件位置。可以看出,当使用面部内容损失时,输入图像和生成人脸之间在像素位置上有更好的相关性。


图9:面部内容损失函数对生成效果的影响。


图 9:面部内容损失函数对生成效果的影响。


此外,作者还展示了主观评价结果,如表 1 所示。可以看出使用两种损失函数结合时,模型生成的角色外观的主观评价结果更好。


表1:消融学习部分主观评价结果。


表 1:消融学习部分主观评价结果。


3.2 与其他方法的比较


作者还将该文论提出的方法与一些流行的神经风格迁移方法进行了比较,包括全局风格方法[1]和局部风格方法[2]。尽管这些方法不是专为角色生成这一任务设计的,作者还是与它们进行了比较,因为在很多方面上它们与该论文提出的方法有相似性。图 10 对这些结果进行了展示,通过图 10 可以看出如果将图像风格从内容中分离出来再对其进行组合,很难生成生动的游戏角色。这是因为生成图像并不是严格地从游戏角色所在流形上采样得到的,因此这些方法很难用于 RPG 环境中。作者同时也与流行的单目 3D 人脸重构方法 3DMM-CNN 进行了比较,结果在图 10 的最右侧。可以看出即使 3DMM-CNN 能够根据相似的面部轮廓生成蒙板,使用该论文提出的方法自动生成的游戏角色依然与输入具有更高的相似度。


图10:与其他生成方法的对比实验结果


图 10:与其他生成方法的对比实验结果


为了定量地评价生成人脸和游戏内风格图像的相似度,作者使用了 Mode Score(MS)和 Frechet Inception Distance(FID)作为度量方式。对于每个测试图像,作者从模拟器的训练集随机选择一张图像作为参考,然后计算整个测试集的平均 MS 和 FID。作者重复了 5 次实验,然后计算了它们的均值和方差,结果如表 2 所示。此外,作者还对运行时间进行了统计。可以看出,该论文提出的方法具有更高的风格相似度同时具有更快的运行速度。


表2:风格相似度和速度性能对比实验结果。


表 2:风格相似度和速度性能对比实验结果。


4 结论


在这篇论文中,作者提出了一种基于人脸图像自动化生成游戏角色的方法。作者在面部相似性测量和参数搜索范式下制定了该创造过程。实验结果表明该论文提出的方法在生成结果的相似度和鲁棒性方面达到了目前领先的水平。


参考文献


[1] Leon A. Gatys, Alexander S. Ecker, and Matthias Bethge. Image style transfer using convolutional neural networks. In The IEEE Conference on Computer Vision and Pattern Recognition (CVPR), June 2016.


[2] Shuyang Gu, Congliang Chen, Jing Liao, and Lu Yuan. Arbitrary style transfer with deep feature reshuffle. In The IEEE Conference on Computer Vision and Pattern Recognition (CVPR), June 2018.


2019 年 9 月 30 日 08:006502

评论 2 条评论

发布
用户头像
我记得2K也能扫描人脸,这两个用的技术是一样的吗?
2019 年 09 月 30 日 18:27
回复
用户头像
这个厉害了
2019 年 09 月 30 日 08:43
回复
没有更多评论了
发现更多内容

商业通识 : 商业到底是什么?

Walker

学习 得到 个人成长 商业

Flink从保存点启动应用-18

小知识点

scala 大数据 flink

为稳外贸保驾护航 区块链交易平台显身手

CECBC区块链专委会

区块链 银行 福费廷

怎么向女朋友解释什么叫区块链?

艾小仙

比特币 区块链 以太坊 defi

区块链技术应用于链接智慧医疗

CECBC区块链专委会

区块链 社会保险 智能医疗

Python 为什么没有 void 关键字?

Python猫

Python 编程

一个在交流群里讨论过两轮的问题,答案竟然跟一个 PEP 有关

Python猫

Python 编程

SpringBoot 缓存之常用注解

hepingfly

Java 缓存 springboot 注解

2020-09-03-第十三周作业

路易斯李李李

Elasticsearch之mapping

北漂码农有话说

人生革命由自律发起

胡迪伦

自学编程 拖延症 懒惰 死循环

Python 中的数字到底是什么?

Python猫

Python 翻译 PEP

Python 为什么要在 18 年前引入布尔类型?且与 C、C++ 和 Java 都不同?

Python猫

Python 编程

JavaScript 深拷贝与浅拷贝

好编程

首个数字银行卡明年发行,广州出台区块链措施支持大湾区

CECBC区块链专委会

区块链 金融科技 社会

职场求生攻略答疑篇之 3 —— 数据是土地

臧萌

数据 职场成长

宁波新基建之路 基于制造优势破题智慧发展

CECBC区块链专委会

新基建

如何将VSCode变成绿色版本

lmymirror

vscode 教程

[翻译]Defer,Panic,and Recover

卓丁

golang defer panic recover

妈妈,今天您几点下班?

脑极体

智能商业时代的思考(一)从在线化到网络化

刘旭东

拼多多 淘宝 智能商业 网络协同

Google鼓励的13条代码审查标准 [建议收藏]

简爱W

拥抱K8S系列-04-基于docker部署更多应用

张无忌

Docker 标准化 vsftpd

java安全编码指南之:声明和初始化

程序那些事

安全编码 java安全编码 编码指南 对象初始化

为什么Java二维数组不用指定列的长度

Rayjun

Java 数组

oeasy教您玩转linux010206toilet

o

Python 函数为什么会默认返回 None?

Python猫

Python 编程

Python 为什么能支持任意的真值判断?

Python猫

Python 编程

持续集成有什么好处?快来看鸭

清菡

jenkins

区块链技术破解数字版权保护难题

CECBC区块链专委会

区块链 版权保护 数字技术

【MySQL】我这样分析MySQL中的事务,面试官对我刮目相看!!

冰河

MySQL 面试 事务 隔离级别 冰河

网易伏羲AI实验室新突破:基于神经风格迁移框架生成逼真人脸-InfoQ