大数据文摘出品
来源:github
编译:李雷、刘俊寰、陈若朦
不知道大家是否都看过动漫YouTuber上的网红主播。
有个小哥因为对动漫网红主播太着迷了,于是他用深度神经网络简化了动画生成过程。具体来说,就是将动漫人物的脸部和期望的姿势等图像输入神经网络,从而生成给定姿势的输出图像。
不仅如此,通过连接面部跟踪器,动漫人物还可以模仿他的脸部动作:
同时,还可以对现有视频中某人的面部动作进行转换:
以下是全文,快和文摘菌一起来看看吧!
可以利用深度学习使生成VTuber更容易吗?
我喜欢动漫YouTube网红主播(VTubers)已经两年了。VTubers就是由真人配音的虚拟动漫人物,他们会在YouTube上直播。要弄清楚他们是什么,最简单方法就是去看他们的直播。
我最喜欢的一个VTubers是Shirakami Fubuki:
YouTube主页
VTubers现在已经构成了一个新的娱乐圈,在日本也越来越受欢迎。
根据英国广播公司(BBC)的一篇报道,由VTubers引发的新兴产业正在萌芽之中,一家公司计划在这个领域投资数百万美元。
相关报道:
https://www.bbc.com/worklife/article/20181002-the-virtual-vloggers-taking-over-youtube
另一方面,深度学习的最新进展也令我着迷,尤其是与动漫相关的研究。2017年,一个研究团队成功地训练了生成对抗网络(GAN),可以生成高质量的动漫人物图像。
最近,一位码农Gwern发布了最大的动漫图像库,并成功训练了另一个GAN,生成的动漫人物之精美令人叹为观止。由旧金山游戏开发商Sizigi Studios创建的WaifuLabs网站,允许用户定制一个由GAN生成的女性动漫人物,并将其印在所购买的商品上。
相关链接:
https://www.gwern.net/Danbooru2018
一切似乎都在表明,人工智能将成为动漫创作的重要工具。我也想知道AI要如何才能做到,特别是,如何通过深度学习使动漫生成更为便捷?最容易的似乎是生成VTuber。
自今年初以来,我开始着手探索这个问题:可以利用深度学习使生成VTuber更容易吗?
无需提前创造2D模型就能生成2D VTuber
那么,如何成为一个VTuber呢?
你需要一个可以控制其动作的角色模型。 一种方法是创建一个全3D模型,许多著名的VTuber(例如Kizuna Ai,Mirai Akari和Dennou Shoujo Shiro)都采用了这种方法。
但是,制作这类精美的3D模型非常昂贵,因为它需要花费大量人力:首先必须有出色的角色设计师,并且还需要技能娴熟的3D建模师。 很少有人兼备两种技能,更不用说像我这样毫无艺术细胞的人,要创建一个自己的VTuber角色是不可能的。 当然,也可以用钱来解决问题,但是随便Google一下就知道佣金不菲,约为500,000日元(约合5,000美元)。
除了3D模型,创建2D模型也是方法之一。 2D模型是分层设计的动图集合,大多数VTubers都使用这种类型,它的创建成本要低得多:总体花费30,000日元(约合300美元)即可。
尽管如此,2D建模也不仅仅是设计和绘制模型,角色身体需要分为多个可活动部分,建模师必须使用专用软件(例如Live2D)将它们组装在一起,要生成身体某一部分的动作也十分费时。
不过,大多数2D VTuber的动作都非常简单,比如嘴巴开合,睁眼闭眼,挑眉或皱眉,微微侧脸,以及左右摇摆身体,很少涉及到旋转身体或移动手脚。建模时生成的2D图像集合也大都是固定的,难以合成大幅度的动作。
由于2D VTuber的动作简单且幅度小,那么我们是否可以动态生成他们,并且无需提前创建2D模型?如果能,这使成为VTuber变得更容易,我只需找人设计人物即可,花费大概不会超过20,000日元。
甚至,我可以免费使用GAN生成角色!这不仅给像我这样不会绘画的人带来好处,也减轻了设计家们的负担,他们只需设计出人物即可,而且这项技术还可以用于游戏制作,轻松实现视觉小说游戏中角色的说话等动作。
专门生成动漫角色脸部数据的数据集
现在已经确定了目标,接下来需要把问题细化。
我要解决的问题是这样的:给定一个动漫角色的脸部图像和一个“姿势”,生成根据“姿势”变化的新的脸部图像。这里,姿势是一组数字,用于指定角色的面部表情和头部朝向。要说明的是,这里的姿势是6个数字,对应于6个滑动条。
我将用深度学习来解决这个问题,这需要先解决一下以下两个问题:
- 用什么数据训练网络?
- 使用哪种网络体系结构?具体如何训练网络?
事实证明,最大的挑战是第一个问题。我需要一个数据集,其中包含带有姿势标注的脸部图像。EmotioNet是具有姿势标注的大型人脸数据集。但是,据我所知,目前还没有类似的动漫角色脸部数据集。
因此,我专门生成了一个新的数据集。我利用了一个名为MikuMikuDance的3D动画软件,它包含成千上万的动漫人物3D模型。我下载了约8,000个模型,用它们来训练网络。
我根据3D角色模型的规律设计了网络,过程分为两步。首先改变面部表情,即控制眼睛和嘴巴开合度,其次是旋转面部。
每个步骤使用一个单独的网络,第一个网络的输出作为第二个网络的输入。我将第一个网络称为面部变形器(face morpher),第二个网络称为面部旋转器(face rotator)。
对于面部变形器,我使用的是Pumarola等人在其ECCV(欧洲计算机视觉国际会议) 2018论文中提出的生成器体系结构。
神经网络通过产生代表原始图像变化的新图像来改变面部表情,并使用alpha蒙版将更改图像与原始图像合并。我发现Pumarola的体系结构在图像小范围变化方面表现出色,以本例中,就是闭上眼睛和嘴巴。
面部旋转器要复杂得多。我使用在单个网络中实现的两种算法来旋转面部,从而产生两个输出。这些算法是:
- Pumarola等人的算法:用于修改面部表情,但是现在我让网络旋转面部。
- Zhou等人(ECCV2016论文)的视图合成算法:他们的目标是旋转图像中的3D对象。他们通过让神经网络计算外观流(appearance flow)来做到这一点,外观流即输出的每个像素与输入对应颜色复制的像素的映射图。
外观流会产生保持原始纹理的清晰效果,但不利于产生被遮挡部分旋转后形成的幻象。另一方面,Pumarola等人的体系结构产生结果比较模糊,但由于其无需从现有像素进行复制就可以更改原始图像的像素,因此可以对未遮挡部分进行幻化。
为了结合两种算法的优点,我训练了一个新网络,以便通过alpha蒙版将两个输出合并。网络还输出一个“润色”图像,并通过另一个alpha蒙版将其与前面的合并图像进行组合。
上手第一步:定义范围和意义
系统的输入由动漫人物的图像和所需的姿势矢量组成,图片大小通常为256×256,具有RGBA格式,且必须具有透明背景。
更具体地说,不属于该字符的像素必须具有(0,0,0,0)的RGBA值,不属于该字符的像素必须具有非零的alpha值。角色的头部必须在垂直于图像平面的方向上笔直。头部必须在中心128×128的框中,眼睛和嘴巴必须张开。
如前所述,角色的脸部配置由“姿势”控制。本次而言,可以把它是一个6维向量,三个分量控制面部特征,在闭合间隔[0,1]中有意义。
有两个部分控制着眼睛的张开,一个用于左眼,一个用于右眼。0表示眼睛完全张开,1表示眼睛完全张开。
一个组件控制着嘴巴的张开。但是,这一次0表示嘴是完全闭合的,1表示嘴是完全张开的。眼睛和嘴巴参数的矛盾语义源于3D模型的变形权重语义。
其他三个部件控制头部的旋转方式。在三维动画中,头部由两个“关节”控制,由一根“骨头”连接。颈根关节位于颈部与身体连接的位置,颈尖关节位于颈部与头部连接的位置。在角色的骨架中,尖端是根的子级。因此,应用于根的三维变换也会影响尖端,但不会反过来。
姿势向量的三个分量的值在区间[-1,1]内。
一个部件控制围绕颈根关节的$Z轴的旋转。在这里,我使用坐标系统,Y轴指向上面,X轴指向字符的左边,Z轴指向前面。角度范围控制在正负15度之内。
一个组件控制围绕颈尖连接的X轴的旋转。从身体上看,它表示头部向上或向下倾斜的程度。再次,我们将组件值的范围[-1,1]映射到旋转角度的范围[-15°,15°],正值意味着头向上倾斜,负值意味向下倾斜,0意味着头面向平行于Z轴的方向。
最后一个组件与上一个组件具有相同的角度范围,但是它控制着围绕脖子尖端连接的Y轴的旋转。换句话说,它控制面部的水平方向。
我省略了许多运动,包括眉毛,虹膜和上身的运动。这是为了简化问题,以便可以尽快完成系统的设计,并证明它是可以工作的。
概括地说,如果输入的图像由角色的面部和6维姿势矢量组成,输出是相应摆出的另一张脸部图像。
用3D动画软件MikuMikuDance来创建模型
想要动画绘制的字符,最有效的办法是进行网络绘图训练。我通过渲染3D人物模型创建了一个训练数据集。虽然3D效果图不同于图纸,但它们更容易操作——因为3D模型是可控的。
现在我们可以想出任何姿势,应用到一个模型,并渲染一个图像显示那个姿势。此外,一个3D模型可以生成数百个训练图像,所以我需要收集数千个模型;如果用图画,则不得不收集成千上万的图画,并且用角色的姿势来注释每一个——注释成千上万的图像比处理成千上万的3D模型要困难得多。
我使用3D动画软件MikuMikuDance (MMD)创建模型。该软件上有成千上万的动漫人物模型可供下载。我也曾用该软件生成训练数据,多年来,开发了一个库来操作和呈现模型,这使得可以进行大部分数据自动化生成过程。为了创建一个训练数据集,我从Niconi Solid和BowlRoll等网站下载了大约1.3万个MMD模型,光是下载就花费了两个月的时间。
然而并不是所有的模型都是可用的——其中存在一些甚至不是角色的模型是不能通过数据库处理的。为了减少重复的训练数据,还需要主观地去掉了与其他模型太接近的模型。淘汰之后,最终只剩下大约8000个模型。
数据说明
原始模型数据不足以生成训练数据,其中存在两大问题:确定模型的头部和控制模型的眼睛。
为了知道每个模特的头部到底在哪里,我创建了一个工具,用符号注释每个模型中头部底部和顶部的位置。其中底部与下巴尖相对应,但头的顶部没有一个精确的定义。于是我将头盖骨的顶部固定起来——这样整个头骨 及头发都包括在这个范围内。如果角色戴着一顶帽子,也可被猜测位于头部位置。
第二个问题是如何准确控制每个模特的眼睛。MMD模型的面部表情由“图像变换(morphs)”(又称混合形状)实现。变形通常以特定的方式对应于面部特征。例如,其中一个变形对应于闭上双眼,另一个会对应于张开嘴巴。为了生成训练数据,需要知道闭左眼、闭右眼和张开嘴巴这三个变形。
叫做“a”的张嘴变形几乎存在于所有的模型,所以这并不是一个问题,但是闭眼的变形会使情况变得加困难。由于不同的建模者以不同的方式对它们命名,所以它们中的一个或两个可能在某些模型中缺失。MMD模型通常带有两种类型的眨眼。正常的眨眼是向下弯曲的眼睑,而微笑的眨眼是向上弯曲的眼睑。而每种眨眼方式都有三种不同的变形:闭右眼、闭左眼和同时闭上双眼。
——所以我又创造了一个工具,由此可以循环通过眼睛控制变形和标记的正确的语义。注释模型和创建工具,花费了大约4个月的时间,是项目中最耗时的部分。
姿势采样
训练数据的另一个重要部分是姿势,我们需要为每个训练示例指定一个姿势。我通过独立采样姿态向量的每个分量来生成姿态。对于眼控参数和嘴控参数,从[0,1]区间均匀采样;对于头关节参数,则从一个概率分布中采样——该分布的密度从范围中心开始线性增长,密度如下图所示。选择这个分布来增加困难训练例子的频率,例如当一些头关节参数远不是0时,头的配置和其余的姿势会有很大的不同。
采样参数概率分布
渲染
为了生成训练图像,需要确定一个模型和一个姿势。我使用了正射投影渲染了这个姿势模型,而如果使用透视投影的话,则对于绘图,尤其是块茎的绘图,似乎没有缩短的效果。
渲染3D模型需要指定模型表面的光散射特性。MMD通常使用toon着色,但是我使用的是一个根据模型数据设计的更标准的Phong反射模型,由此生成的训练图像的3d更好。
渲染还需要指定场景中的灯光。我采用了两个光源,分别是定向白光和白色环境光源。其中前者直接指向-z方向,可以减少渲染中的阴影。
数据生成过程的另一个细节是,每个训练示例由三个图像组成。首先是人物的休息姿势,第二个只包含面部特征的变化,第三个在前一个的基础上增加了面部旋转。我通过大量的数据训练设计了独立的控制面部特征和旋转面部的网络。
数据集
我将他的模型分为三个子集,分别用于生成训练、验证和测试数据集。训练集是由动画、漫画和视频游戏中的角色创建的;验证集通过使用来自Nijisanji的VTubers模型来生成。在下载模型时,可以根据原始资料将子集分配到各文件夹中。因为字符的起源不同,所以三个数据集之间没有重叠。数据生成是完全自动化的。整个过程耗时16个小时。三个数据集的数值分解如下:
神经网络系统
如概述部分所述,神经网络系统由许多子网组成,现在详细描述它们。
面部变形器
摆出角色脸部的第一步是修改其面部特征。更具体地说,就是闭上眼睛和嘴巴。
在论文中,Pumarala等人描述了一个可以根据给定的动作单位(Action Units,AU)修改人脸特征的网络,该动作单位能代表面部肌肉运动。因为AU是一个非常通用的编码系统,所以他们能做的远远不止闭上眼睛。我尝试了一下,效果的确很棒!
但是,我没有使用论文的所有内容,因为我的问题比他们的问题简单得多。尤其是,他们的训练数据并非来自具有不同面部表情的同一个人的成对面孔。因此,他们使用的是具有周期一致性损失的GAN来执行无监督学习。
而我的数据是成对的,因此我可以进行常规监督学习。
网络通过产生变化图像来修改面部表情,该变化图像通过alpha蒙版与原始输入图像结合在一起。为此,输入图像和姿势被馈送到编码-解码网络,该网络将为每个图像生成一个64维特征向量输入图像的像素。然后,使用2个卷积单元的两个单独列和适当的非线性处理特征向量的此图像,以生成alpha蒙版和更改图像。
Pumarola等人用相当复杂的损失功能训练他们的网络,但是在我的问题中,只需要计算一个简单的L1像素差异损失。
面部旋转器
面部旋转器由两个子网组成。关于人物脸部,有两种不同的算法,各有优劣。为了组合它们的强度,组合器会拍摄两个输出图像,将它们与alpha蒙版融合在一起,修饰图像以提高质量。
二算法旋转器(Two-Algorithm Rotator)
该网络可以看作是Pumarola等人发电机模型的扩展:它具有发电机的所有单元,但现在包含新的输出路径。Pumarola的网络只被要求于旋转脸部而不包括闭上眼睛和嘴巴。
新途径使用的是周等人的论文中描述的旋转对象的方法来产生输出。
旋转对象(尤其是旋转小角度)主要涉及将输入图像中的像素移动到不同位置,周等人建议计算外观流:一张映射图,该图告诉输入图像中应复制输出图像中每个像素的位置。然后再将此地图和原始图像传递到像素采样单元。
我使用两种不同的损失来训练网络。第一个只是L1像素差异损失,第二个损失是L1像素差异损失与Johnson等人的感知特征重建损失之间的总和。
同样,我用Adam训练了网络,使用了与脸部变形器相同的参数,进行了6个时期(3,000,000个例子)。当使用L1损失时,我将批次大小设置为25,并且训练又花费了大约2天的时间。但是,由于评估特征重建损失需要更多的内存,因此在进行感知损失训练时,我不得不将批次大小减小为8,在这种情况下,训练了6天。
合路器
看到两个算法旋转器的输出是有指导意义的,看看其中一个单独的输出是不够的。
在上图中可以看到,角色的脖子旋转使得被身体遮住的部分长发的可见。可以看到Pumarola等人的算法产生了一张模糊的面孔。我推测这是由于要求网络从压缩特征编码中产生所有新像素,从而丢失了原始图像的高频细节。另一方面,周等人则从输入图像中重用像素,产生了清晰的结果。
然而,很难通过复制现有像素来重建被遮挡的部分,尤其是当复制的正确位置很远时。上图中同样可以看到,周等人的算法使用手臂像素来重建被遮挡的头发。另一方面,Pumarola等人的头发具有更自然的颜色。
通过组合两种算法的输出,我们可以获得更好的结果:重新定位的可见像素将保持清晰,而被遮挡部分的像素将具有自然色。
结果评估
网络配置
网络和丢失功能的不同组合可以产生执行整个摆姿势任务的不同配置,具体而言有三种方式旋转面部:仅使用Pumarola等人的路径方法,仅使用Zhou等人的路径,或者同时使用和组合器。
此外,可以使用L1或感知损失来训练面部旋转器的每个子网。下表列出了所有的可能性:
对于上述配置,仅更改了面部旋转器,面部变色器保持固定。
定量评估
一般用于指标评估性能的有两个指标。首先是网络输出和地面真实图像之间的平均每像素均方根误差(RMSE),还有一个是平均结构相似指数(SSIM)。使用测试数据集中的10,000个示例计算分数。
可以看到,单独使用面部旋转器的方法比组合方法的效果差。但一个值得注意的例外是,就MRSE而言,PU-P的性能优于FU-PP之外的所有网络。但是,对于SSIM,组合始终可以带来更好的性能。
另一个趋势是,根据两个指标,使用感知损失通常会提高性能。但是,相对于SSIM度量标准,性能最好的配置是FU-P-L1,而不是FU-PP。
综上,似乎最好的配置是FU-P-L1和FU-PP,它们在这两个指标上均分别获得了第一和第二的成绩。因此,我们需要检查生成的图像,以便确定哪个更好。
定性评估
我使用8种网络配置以及我的MMD模型渲染器,在测试数据集中渲染了8个选定角色的视频。
我们根据视觉质量来进行对比网络配置。PU-L1和PU-P产生的结果太模糊且质量较低,这表明尽管Pumarola等人的体系结构可以有效地修饰人脸的一小部分,但当修饰覆盖了输出图像的大部分时,它的效果并不理想。
同时,还可以观察到,由于感知损失,PU-P产生了更清晰的图像,这和Park等人所观察到的结果如出一辙。
另一方面,ZH-L1和ZH-P在直接从输入图像复制像素时会产生非常清晰的结果。但是,它们会生成不规则的伪像,从而可能使字符变形。
对于使用所有子网的配置,由于组合器从周等人的途径中选择了这些像素,大多数面部和物体都是清晰的。由于Pumarola等人的路径比周的路径更不容易从相邻像素复制像素,因此合成器可以从前者的像素中进行选择,并在很大程度上(但不是完全)消除后者产生的干扰伪像。
因此,与仅使用一种途径的图像相比,完整的配置产生更好的图像。但是,被遮挡部分的输出仍然模糊。下图显示,在4种完整配置中,FU-PP产生了最清晰的结果。但是,某些观看者(包括我自己)可能不喜欢棋盘伪像,而是更喜欢FU-P-L1的平滑输出。
我还注意到,所有网络似乎都对角色的解剖结构有一定的了解。
例如,Yamato Iori的右眼被头发遮住,当她闭上眼睛时,没有网络使遮挡的头发移动。但是,由于图像解析不正确,我们还可以观察到许多有趣的失败案例。
例如,Yozakura Tama的长辫子落在她的身体前部。所有网络配置都将其切断成两部分,并且仅将顶部和头部一起移动,他们还会误认为衣服和配件是头部的一部分。
总而言之,FU-P-L1和FU-PP似乎是最好的网络配置,因为它们生成的输出几乎没有太多假象且清晰。FU-PP产生具有棋盘图案的清晰图像,而FU-P-L1产生模糊但平滑的结果。两个网络都可能错误地解析输入图像,从而导致它们创建解剖/物理上难以置信的动画。
动画图
该项目的最终目标是能够对不是3D渲染的图形进行动画处理,我通过使用最佳网络FU-PP评估了与Nijisanji关联的VTubers图像和Waifu Labs生成的字符的动画效果。
由于这些网络接受了动画人物渲染方面的训练,因此可以很好地推广到具有相同艺术风格的图纸上。对于大多数角色,即使某些部分被头发遮挡,它们也可以正确地闭上角色的眼睛。
但是,还是存在几种故障模式:
- 当角色的外观与训练数据集有很大偏差时,网络可能会错误地解析人脸,导致荒谬的动作。例如,虽然大多数人物的皮肤是黄色或棕色的,但吉尔扎伦三世的皮肤却是紫色的。在被激活后,他的眼睛和右耳不动,当旋转时,他的脸看起来完全是平的。
- 脸部变形并没有完全把一些角色的嘴闭上。当我注意到这些角色的嘴的颜色和周围的皮肤很接近时,我试着用更深的颜色重新画嘴,结果发现变形人成功地把嘴全闭上了。这表明数据集偏向于嘴巴和皮肤颜色之间的高对比度。
- 嘴巴在第0帧完全张开,在第30帧完全闭合。在最下面一排,我尝试重新画嘴,以增加嘴和周围皮肤的对比。它的结果是更好的嘴闭合,这意味着脸的形状已经过度适合高对比度的嘴和皮肤颜色。
- 脸部变形修改图像的区域不能与周围的像素平滑地混合。它们可以被看作是闭着的眼睛和嘴巴周围的圆圈,颜色比周围的皮肤略深。然而,在从测试数据集进行3D渲染时,这个问题并没有显示出来,这表明它是由我的数据集和野外绘图之间的差异造成的。
然后我观察到我的效果图看起来通常比图纸暗,所以脸形态可能已经学会输出更暗的肤色。为了测试这个理论,我改变了设置场景灯光和重新生成数据集的方式。这一次,我没有将环境光强度设置为原本的参数,而是从区间[0.5,1.2]中进行亮度采样,以便使大多数生成的图像变得更亮。使用新的训练数据集训练的面部形态设法在不引入黑眼圈的情况下闭上眼睛和嘴巴。
(a)面部变形,在恒定的环境光下进行渲染训练,往往会在闭上的眼睛和嘴巴周围产生深色的圆圈。(b)使用具有不同环境光的渲染图进行训练可以缓解这个问题。
因为这些黑眼圈非常明显,我使用了经过不同环境光训练的面部形态来生成下一部分的所有结果。
其他效果
由于神经网络以数字姿势参数作为输入,因此它可以用于任何产生这些数字的过程,例如它也允许通过GUI元素手动指定位姿参数。
位姿参数也可以从面部地标跟踪器获得。在下面的视频中,使用了一个由dlib和OpenCV实现的跟踪器来处理一个实时的网络摄像头的信息,能够让角色模仿真人的面部动作。
这个系统还能应用到公众人物的视频中。
原文发布时间:2019-11-29
本文作者:大数据文摘出品;来源:github;编译:李雷、刘俊寰、陈若朦
本文来自云栖社区合作伙伴“大数据文摘”,了解相关信息可以关注“大数据文摘”