动二次元妹子,从一张图生成动态虚拟主播,想当主播,又有多少人会害羞,对自己的长相没有信心而放弃? 虚拟播音员和语音转换器可能有助于实现梦想,但实际上做起来更难。
目前,谷歌Japan的软件工程师Pramook Khungurn正在开发基于深度学习的系统,只需一张脸部为正脸的动画人物图,就可以轻松合成脸部和头部活动的各种视频。
项目作者最喜欢的虚拟播音员——Shirakami Fubuki
通过训练一个叫做互联网的新网络,可以将动画角色的脸动画化,这样的工作就可以完成了。
我把这个系统连接到了面部跟踪器上。 可以模仿我的头部动作了:
也可以从现有视频中迁移面部运动:
该网络的输入是人物的正面图像,人物的姿势由6个数值指定。 通过渲染8000个可下载动画角色的3D模型创建了新的数据集。 使用的方法是以前的两个研究的组合。
一个是Pumarola et al. 2023年的GANimation论文《GANimation: Anatomically-aware Facial Animation from a Single Image》,将其用于修正脸部特征。 二是2023年基于外貌流程实现目标旋转的论文《View Synthesis by Appearance Flow》,将其用于实现人脸旋转。
要解决的问题是,给定一个动画人物的脸部图像和“姿势”,生成同一人物的另一个图像,脸部会根据姿势而变化。 在此,姿势是指指定该人物表情和头部旋转状况的数值集合。 具体来说,姿势有6个数值,分别与前置图的不同滑块相对应。
在“问题设置”中,复查输入和输出的详细信息。 该系统的输入输出
使用深度学习解决了以下两个问题:
事实证明,使用什么样的数据来训练这个网络,使用什么样的网络架构,以及具体采用什么样的训练方法,首要的问题是最主要的挑战。 需要包含姿势标签的脸部图像数据集。 EmotioNet是一个包含所需类型标签的大型面部数据集。
同时,课程种类资源丰富,各行各业,总有需要的人。 但是,据我所知,还没有动画人物数据集。 因此,我为这个项目生成了新的数据集。
因此,我利用了这个事实。 互联网上有数以万计的动画角色的3D模型。 这些模型是用一个叫MikuMikuDance的3D动画软件制作的。 我下载了大约8000个模型,用它们渲染了随机姿势的动画脸。
我根据实现3D角色模型动画化的方法设计了这个网络。 我把这个过程分为两个阶段。 第一步是改变脸部表情,也就是说,控制眼睛和嘴巴的开合程度。 第二步是脸部旋转。
我们对每个步骤使用了单独的网络,并将第一个网络的输出用作第二个网络的输入。 我把第一个网络称为面部除雾器,第二个网络称为面部旋转器。
这个系统的执行过程分为两个步骤
面部变形器使用了Pumarola et al .的ECCV 2023论文中使用的生成器架构。 该网络可以通过生成包括对原始图像的修正在内的另一个新图像来改变脸部表情。 这些更改通过蒙版与原始图像组合,该蒙版也由网络本身生成。 我们发现这个体系结构在修改图像中的小部件方面非常好。 在这里闭上眼睛和嘴。
脸部旋转器更复杂,因为我在一个网络上实现了两个算法来旋转脸部,所以这个网络有两个输出。 这两种算法
Pumarola et al .的算法。 这就是用于修正脸部表情的算法,但目前该网络的作用是旋转脸部。
周et al .的视图合成算法。 他们的目标是旋转图像中的3D目标。 他们的实现方法是让神经网络计算“外观流”。 这是一个映射,指示输出图像中的每个像素应该复制输入中哪个像素的颜色。
虽然外观的流动可以得到保留原始纹理的清晰结果,但这种方法不擅长绘制旋转后可见的部分。 另一方面,在Pumarola et al的体系结构中得到的结果很模糊,但是可以描绘出隐藏的部分。 这是因为训练的目标是更改原始图像的像素,而不是从现有图像中复制像素。 为了将这两种方法的长项合并在一起,我训练了另一个网络用一个掩码将这两个输出融合在一起。 该网络还可以输出“裁剪”图像,并可以重新组合组合图像和其他掩码。
更详细地展示了网络系统,这里是脸部旋转器
设置问题
如上所述,人物脸部的配置由姿势控制。 这里的姿势为6维向量,其中3个成分控制脸部特征,其取值范围为闭区间[ 0,1 ]。
这三种成分中,两种成分控制眼睛的开闭。 一个控制左眼,另一个控制右眼。 值为0表示眼睛完全睁开,值为1表示眼睛完全闭着。
另一个分量控制嘴巴的开合。 但是,该量为0表示口完全闭合,为1表示口完全张开。 眼睛和嘴巴参数的含义相反是因为这些3D模型的“变形”权重的含义就是这样。 https://en.Wikipedia.org/wiki/morph _ target _ animation
六维姿态向量的其他三个分量控制头部的旋转方式。 在3D动画术语中,头部由通过一个“骨骼”连接的两个“关节”控制。 “颈根”( neck root )关节是颈部和身体连接的位置,而“颈顶”( neck top )关节是颈部和头部连接的位置。 在人物的骨架中,颈尖是颈根的伸展。 因此,应用于颈根的3D变换也会影响颈尖,但不能反向。
控制角色头部的两个关节
概括地说,输入是人脸的图像和六维姿态矢量。 输出是根据情况调整了姿势的脸部图像。
网络,如上所述,我的神经网络包括多个子网。 详细说明这些。
脸部变形器修改脸部特征是确定人物脸部姿势的第一步。 更具体地说,需要闭上眼睛和嘴的人物。 Pumarola et al .在他们的论文中,记述了可以根据给定的动作单位( au ) actionunits,表示脸部肌肉动作)来修正脸部特征的网络。 因为AU是非常通用的编码系统,所以他们的网络不仅仅是闭上眼睛或沉默。 因此,我认为这可以有效处理我们手头的任务。 没有让我失望。
但是,我没有使用这篇论文的所有方法。 因为我的问题比他们的问题简单多了。 特别是在他们的训练数据中,没有同一个人表情不同的人脸对。 因此,他们需要使用具有循环一致性损失的GAN执行无监督学习。 但是,我的数据是成对的,所以可以执行简单的监督学习。 所以,我只需要他们的生成器网络。
详细介绍Pumarola et al .的生成器。 下图是体系结构的图像。
面部变形器体系结构。 这是Pumarola et al .对于这次事例的论文中的图3的再现
该网络通过生成由原始图像和蒙版(称为Pumarola et al .注意蒙版,但这里使用了更常见的术语)组合而成的更改图像来校正脸部表情。 为此,输入图像和姿势被发送到编码器-解码器网络,为输入图像的每个像素获得64维特征向量。 然后,由这些特征向量组成的图像经过两次不同的2D卷积单元和适当的非线性的训练处理,得到掩码和修饰图像。 附录A.1 .给出了该网络的详细指标。
Pumarola et al .使用了比较复杂的损失函数来训练网络。 令人惊讶的是,对于我的问题,简单的L1像素差异损失就足够了。 该损失函数的数学描述如下。
我使用和Pumarola et al .一样设定的Adam算法优化了网络。 学习率1^4,_1=0.5,_2=0.999,批量大小为25。 互联网训练了6 epoch ( 3000,000个样本),在我的GeForce GTX 1080 Ti GPU上花了两天时间。
人脸旋转器人脸旋转器由两个子网络构成。 双算法微调器使用两种不同的算法旋转人脸。 每个算法都有各自的优点和短板。 为了将两者的优势结合起来,有些广告制作工具将两种算法输出的图像用一个蒙版合并,然后裁剪图像以提高质量。
双算法微调器下图说明了其体系结构。
可以将此网络视为Pumarola et al .的生成器的扩展。 包含生成器的所有设备,并添加了新的输出路径。 本来路径的任务只是旋转人脸,而不是闭上眼睛和嘴巴。 新的路径是使用周et al .论文中描述的方法旋转目标。
其中的思想与物体的旋转,特别是角度较小时,使输入图像内的像素移动到不同的位置有很大关系。 因此,周星驰建议计算外观流。 这是一个映射,指示输出图像中的每个像素应该复制输入中的哪些像素。 然后,该地图和原始图像被传递到像素采样单元,生成输出图像。 在我的架构中,外观流只是通过将编码器-解码器网络的输出传递到新的卷积单元来计算。
我在网络训练中使用了两种不同的损失。 第一个是简单的L1像素差异损失。
第二个损失是L1像素差异损失与Johnson et al .的感知特性重构损失之和。
同样,优化使用了Adam,并使用了与面部变形器类似的超级参数。 一共训练了6 epoch ( 3000,000个样本)。 使用L1损失的时候,我把批量设定为25,训练也花了约两天时间。 但是,评估特征重建损失需要更大的内存,因此在使用此感知损失进行训练时,需要将批量降低到8。 在这种情况下,训练也花了六天。
如果结合使用以下双算法微调器的输出,您将会发现仅使用其中一种算法无法获得足够的结果。
使用不同的算法将人物颈部向右旋转15
上图显示了旋转操作人物脖子的情况。 旋转后,可以看到她原本被遮住的长发的一部分。 可以看出Pumarola et al .的算法会得到模糊的人脸。 由于该网络需要根据压缩后的特征码生成所有新像素,因此推测可能会丢失原始图像的高频细节。 在以前的一些编码器解码器架构的研究中也观察到了类似的行为。 例如Tatarchenko et al .和Park et al .
因为Zhou et al .是将输入图像多路复用的像素,所以可以得到清晰的结果。 但是,通过复制现有像素,很难重建以前隐藏的部分。 特别是在复制的位置很远的情况下。 在上图b中,您可以看到,Zhou et al .的算法使用手臂像素重建了去除遮罩的头发。 另一方面,用Pumarola et al .的方法得到的头发颜色更自然。
通过组合这两种算法的输出,可以获得更好的结果:调整可见像素的位置时保持原始清晰度,即使去除了遮挡部分的像素也能获得自然的颜色。 下图说明了复合网络的体系结构。
复合网络的主体是U-Net,即合成器体系结构,它有助于处理每个像素。 然后它的输出被转换成两个蒙版和一张变化图像。 第一个蒙版用于组合两张输入图像。 然后,第二个蒙版和变化图像与上一步的输出相组合,得到最终结果。 最后一步是修改组合得到的图像,以提高质量。
为了减少内存使用量,此组合器与双算法微调器分开进行了训练。 我对所有的训练样本都执行了后者,并生成了前者的输入。 同样,我实验了两个损失函数。 第一个是L1的损失。
二是感知损失:
这个训练流程类似于人脸变形器的训练过程。 但是,为了方便,这个训练只进行了3 epoch而不是6 epoch。 如果使用L1损失,批量为20,培训消耗了一天时间。 使用感知损失时,批量为12,训练持续2天时间。
定量评价
我们使用了两个指标进行绩效评估。 第一个是网络输出和基本真实值图像之间的平均每像素均方根误差( RMSE )。 二是平均结构相似度指数( SSIM )。 分数是使用测试数据集内的10,000个样本计算的。
可见,只使用人脸旋转路径的表达通常比两种路径结合使用的表达更差。 一个值得注意的例外是PU-P,它在RMSE中的性能优于除FU-P-P之外的所有网络。 但是,在SSIM指标中,组合的效果总是很好。
可以看到另一个趋势。 使用感知损失时,这两个指标通常都会产生更好的结果。 但是,SSIM指标中最好的配置是FU-P-L1,而不是FU-P-P。 最佳配置是FU-P-L1和FU-P-P,这两个指标似乎都取得了第一和第二名的成绩。 因此,为了确定哪个更好,需要进一步检查生成的图像。
定性评估显示了配置生成的结果。
FU-P-P网络结构中渲染的人物动画
试从视觉质量方面比较各种网络结构。 PU-L1和PU-P得到的结果过于模糊,质量差。 这表明,Pumarola et al .的体系结构可以有效地修改脸部的小组件,但在需要修改大部分图像时无效。 另外,由于使用了知觉损失,观察到用PU-P得到的结果更加明确。 但这种损失的副作用是出现棋盘状伪影。
PU-L1和PU-P生成的映像
ZH-L1和ZH-P是直接复制输入图像的像素,因此可以获得非常清晰的结果。 但是,它们可能会产生使人物变形的不规则伪影。
由ZH-L1和ZH-P生成的图像
在使用所有子网的配置中,合成器从周et al .路径中选择这些像素,从而使脸部和身体的大部分区域变得清晰。 波罗亚尔.的路径比周埃尔.的路径更难以复制邻居像素,因此合成器可以从前者的像素中选择,并且可以大幅(虽然不完全)消除来自后者的干扰伪影。 因此,完全配置的网络可以提供比只使用一条路径的网络更好的图像质量。 但是,在这些输出中,消除遮挡的部分仍然很模糊。 如下图所示,在四个完整的配置中,FU-P-P获得了最清晰的结果。 但包括我在内,有些人可能不喜欢棋盘上的纹理伪像,而喜欢FU-P-L1更流畅的输出。
由FU-L1-L1、FU-L1-P、FU-P-L1和FU-P-P生成的图像
我注意到,所有的网络似乎都在一定程度上理解了人物身体的结构。 例如,大和伊织( Yamato Iori )的右眼被头发挡住,闭着眼睛的时候任何网都不会动头发。 但是,也观察到了一些由于图像分析不正确而导致的失败例子。 例如夜樱多摩( Yozakura Tama )就有一条挂在身前的长辫子。 所有网络配置都被视为两个部分,移动磁头时,只有其中上面的部分会移动。 衣服和首饰也有可能被误认为是头部的一部分。 请参照下图。
图像分析不正确导致的失败事例
一般来说,FU-P-L1和FU-P-P应该是最佳的网络配置,因为它们可以产生几乎清晰的输出,而不会产生大规模的伪像。 FU-P-P生成的图像更清晰,但有棋盘格状的伪像,FU-P-L1得到的结果更模糊,但更平滑。 但是,两个网络在分析输入图像时都会发生错误,有可能得到身体结构/物理结构上不可靠的动画。
动画这个项目的最终目标是将不是3D渲染的画制作成动画。 我用最好的网络FU-P-P评价了我的方法的表现,用Nijisanji旗下的虚拟主播评价了动画图像和Waifu Labs生成的人物。 以下是16个人物的视频:
因为网络被训练成了渲染的动画角色,所以他们可以很好地应用于同一艺术风格的绘画中。 另外,网络在处理眼睛方面特别优秀。 大多数人物即使眼睛的一部分被头发遮住了,也能正确地闭上眼睛。
GANimation论文: https://www.albertpumarola.com/research/g animation/index.html
通过外观流实现目标旋转的论文: https://arxiv.org/abs/1605.03557
完整版博客介绍: https://pkhungurn.github.io/talking-head-anime /