Hi!请登陆

Unity通过训练人工智能,实现画面的实时风格化变换和渲染优化

2021-2-24 22 2/24

深度学习功能为现在日常生活中的许多人工智能技术提供了动力,使用卷积神经网络(CNNs)可以高速处理复杂的图像。Unity目前正在研发使用卷积神经网络推论在3D渲染通道中的无缝集成。Unity实验室致力于改进一项最先进的研究,并开发出一个高效的神经系统推理引擎——Barracuda。在本篇文章中,我们尝试了一个具有挑战性的案例:在游戏内实现多风格变换。

深度学习长期以来一直局被限于超级计算机和离线计算之中,但由于计算能力的不断提高,它们在消费者级硬件上的实时可用性也在快速提升。有了Barracuda,Unity实验室希望Barracuda能快速的进入到创作者手中。得益于ML-Agents,神经网络已经被用于一些游戏开发中的人工智能应用中,但还有许多应用需要在实时游戏引擎中演示。比如:深度学习超采样,环境遮挡,全局光照,风格变换等等。我们选择后者来演示从训练卷积神经网络到在Unity渲染循环中集成完整管道的一系列过程。

图像的风格类型变换

风格变换顾名思义是将一个图像的风格转换到另一个图像风格上的过程。比较有名的例子是将一些世界名画的风格变换到真实的照片上来。自2015年以来,由于使用了卷积神经网络,案例的质量正在显著提高。最近,该项目的研究社区花费了很大努力来训练卷积神经网络完成了一次性处理任务:选定的图像被作为网络输入,网络在不到一秒钟的时间内(在GPU上)输出它的风格化版本。在这项工作中,我们使用这样一个网络的小版本,我们训练多种风格的变换。之后,我们将该网络插入到Unity渲染管道中,以便将它输入到帧缓冲区,并最终将其实时转换为最终风格化的其他版本。

游戏的图像会在游戏进行过程中实时的进行风格转换。在这里,我们看到了来自《死亡之书》 环境的风格化类型变换。在当前高端电脑硬件上,图像以30帧/秒的速度实时应用于神经网络,具有动态切换风格。

实时的全高清风格转换,由Barracuda提供的《死亡之书》场景演示

训练深度卷积神经网络

我们选择最先进的快速风格变换神经网络。该网络由两部分组成:

1)样式图像,它使用神经网络预估的紧凑样式

2)我们将这种紧凑样式图像注入到网络中。这样,人们可以在运行时改变样式图像,实现样式的转换。

该网络由两部分组成:样式推理网络从样式图像推导出紧凑描述,而样式传递网络则使用该描述将样式传递到其输入图像上。

我们的风格变换网络由下采样和对称的上采样层两部分组成,中间有五个追加模块。

一旦我们选择了此架构,我们首先需要离线预训练这个完整的网络(一旦训练好,它将可以在运行时使用)。为此,我们需要使用从视频和计算机动画电影中获取带有“内容”图像,带有“风格”图像将会从大约8万幅绘画的数据库中被获取到。神经网络的权重会被优化,当给定样式和内容图像时,输出的图像会显示出对样式的高保真度,并且内容具有高可识别度。

此外,连续的帧可以进行不同的风格化,用于制造出连续闪烁的效果。所以我们需要训练网络来处理时间维度上的图像。实际上,这是一个训练目标,它迫使两个连续的帧被类似地风格化(在应用位移向量之后)。

这些不同的约束之间的平衡是微妙的,这个过程中可能会出现相当多次数的尝试和错误。

使用一张带有Cuda/CuDNN后端张量流库的NVidia RTX 2080 GPU进行培训,需要持续约2-3天。经过训练后,网络体系结构及其训练后的参数都会被保存到磁盘上,准备随后加载到Unity中以供运行时使用。

运用Barracuda进行Unity功能的整合

有了Barracuda,Unity实验室已经成功的构建了一个跨平台的神经网络推理引擎。神经网络可以通过Barracuda在Unity中导入和运行,它需要在你选择的库中预先训练并保存到磁盘上。文件详细介绍了如何在Pytorch或Tensorflow上培训网络。Barracuda的能力来自于Unity的多平台设计,可以在多种CPU或GPU上运行。所有使用Unity的平台都支持CPU推理功能,而GPU推理功能则需要运用到Unity计算着色器和其他的一切功能,除了WebGL以外。

Barracuda推荐的输入途径是经由开放神经网络交换,这是大多数深度学习库可以导出到的开放格式。对于用户来说,导入的过程就像将文件拖放到你的Unity项目中一样简单。然后,资产检查器会向您提供输入、输出和网络层等信息。例如下图:

然后就变成了向网络提供输入(内容图像和风格图像)并向显示风格化输出的问题。在Unity中,只需创建一个自定义的后处理脚本,将Barracuda加载到神经网络中,然后每帧获取相机的渲染图像,根据输入推断网络,并将输出复制到屏幕上。

综上所述,我们现在有了一个完整的渲染管道,其中通常的渲染过程会被写入到帧缓冲区,随后由神经网络进行转换,Barracuda的推断过程如下图所示:

风格变换渲染是一个两阶段的过程:渲染阶段会计算通常的游戏图像,而后期处理阶段的风格变换取决于所提供的风格。

视觉效果和性能

我们在美丽而复杂的《死亡之书》场景中展示了实时风格转换。在3D渲染阶段,尤其是神经网络推理(即后期处理)阶段计算量非常大,因此我们的演示需要非常高端的硬件。

通过使用分辨率为1080p的NVidia RTX 2080 GPU,每帧花费的总时间为23毫秒(渲染阶段为6-9毫秒,神经网络推理阶段为14毫秒)。使用AMD Vega RX 64,每帧花费的总时间为28毫秒,包括渲染场景的7-10毫秒和推理的18毫秒。在这两种情况下,演示都以30帧/秒的速度运行。这些数字包括对神经网络和Barracuda进行的优化。

从上面的记录中可以看出,观众可以像在游玩《死亡之书》一样:自由导航,欣赏复杂而美丽的植被。但是现在观众也可以选择另一种风格来进行欣赏:比如毕加索的画。然后游戏会根据用户选择的风格进行风格的实时转化。

需要注意的是,神经网络中推断紧凑样式表示的部分仅在样式改变时运行一次,甚至可以从磁盘加载;这就意味着改变风格时没有滞后时间。

神经网络的当前版本可以处理各种各样的风格。然而,提高风格变换的质量和处理风格的多样性,同时保持在实时可用的高效网络的范围内,到目前为止还是一个开放的研究性问题。

优化在PS4 Pro上的性能表现

Barracuda为多平台而设计,我们可以切换到PS4 Pro平台来展示风格转换,而无需对代码或网络进行任何修改。然而,与我们在PC端的RTX 2080相比,PS4 Pro硬件目标用于推理的计算能力要少得多。因此,我们首先需要切换到经典的Unity维京人村场景,以减少花费在3D渲染阶段的时间。

风格化的维京人村庄场景,显示了应用的风格

对于这个更轻便的场景,风格化渲染最初需要大约166毫秒(1080p时的3D渲染为10毫秒,720p时的神经网络推理为156毫秒)。此外,将推理分辨率提高到1080p会使演示耗尽内存。因此,我们需要大幅提高速度和减少内存大小,才能以30 fps的速度在1080p的全分辨率下运行。作为概念的证明,我们通过三种方式优化了这个演示,以1080p的速度达到每帧28毫秒:Barracuda
GPU级优化、更小(因此更快)的神经网络和屏幕空间时间化。这些优化在PC上也是有效的,并且有助于达到我们上面看到的画面效果,但是,在最近推出的GPU上并不需要屏幕空间临时化以及以画面在30 fps的速度运行。

BarracudaGPU级别优化

Barracuda在算法上还实现了对于GPU级别的优化效果。优化内容如下:

内存布局从最后一个通道更改为第一个通道,增加了内存一致性。

在可能的情况下,ReLUs与其他操作单元融合在一起。

编写了新的卷积核来覆盖上/下采样情况和残差情况。

实例规范化内核被重写。

在PS4 Pro上,这些优化使得在720p的参考网络上的推断时间从166毫秒降低到了70毫秒。

减小神经网络的规模

神经网络的架构被设计成可以处理任何场景中的任意风格。Unity列出了在卷积神经网络的每一层上花费的时间(在个人电脑上,人们可以简单地使用Unity GPU profiler,而在PS4上,我们使用了索尼专用的分析工具),并进行了几次实验来证明画面质量与速度的关系。最后,他们通过两种方式优化了网络:

1、对于上采样和下采样,当数据处于较高分辨率时,卷积的数量实现减少(从3个减少到2个),并且通道数保持较小。

2、网络的频道数从48个减少到32个。

为了进一步提升速度,Unity还改进了上下采样,并将卷积神经网络滤波器从48个通道减少到32个通道。

现在我们可以在PS4 Pro上以1080p的分辨率在56毫秒内推断出简化的神经网络(而不是720p时的70毫秒)。优化效果非常明显。

时间上采样

进一步减少推理时间的一个显而易见的方法是降低渲染分辨率,因为网络的复杂性与其成正比。然而,这是一个我们不能做出的妥协,因为风格化的结果往往在低分辨率下看起来模糊不清,这样使得最终渲染出来的场景失去了许多的细节。那么,让我们看看Unity是如何应用游戏开发手册中的另一个技巧来实现这一效果优化的吧。

我们可以利用这样一个事实,即我们的风格转换演示完全集成为Unity的常规后期效果,就像环境遮挡方法一样。这让我们能够将计算机图形技术应用到更深层神经网络中,因为像Unity这样的游戏引擎给我们的每一帧信息都比最终渲染的信息要多得多。

当前的游戏通常使用时间化方案来提高昂贵的屏幕空间效果(如时间抗锯齿)的质量或性能。其思想是利用连续帧之间的一致性,重新使用先前渲染帧中的信息来改进或完成当前帧。与Barracuda原理相同的是,神经网络推断可以逐层手动调度,因此我们可以将完整的推断分成相等的时间份额,并在几帧内对图像进行风格化。

为了在Barracuda计算下一个风格化帧时显示中间帧,我们选择使用重新投影,就像计算机图形学中的其他时间方法一样。具体来说,我们需要使用图像空间双向场景中的重新投影,以在每个网络输出帧之间生成高质量的中间帧。

我们将此应用于计算四帧的风格化,如在PS4 Pro上的30 FPS帧预算:切片推断每帧14毫秒+重新投影4毫秒+场景渲染10毫秒=总共28毫秒。这是在控制台上运行捕获的最终结果!

然而,在风格转换上使用这种时间优化方案确实存在问题。例如,样式转换会改变对象边界的形状,并在其周围添加光晕,使边缘周围的深度和运动矢量失效。这将会导致重新投影的中间帧中出现重影。在演示中,我们通过获取每个像素附近的最小深度的运动矢量来解决这个问题。这使得光晕附着在它们所在的物体上,我们虽然减少了伪像,但却没有完全消除它。

未来:渲染循环中的卷积神经网络

在前面的部分中,我们利用了Unity中的集成功能实现了游戏画面风格的转化与性能优化。这使我们能够在Unity的渲染管道中即时使用卷积神经网络作为后期效果,以帮助减少画面的运算时间。实际上我们还可以走得更远:我们可以想象应用一个神经网络,在延迟流水线中使用多个G缓冲区作为输入,用于实现去噪、加强纹理、抗锯齿和全局照明等任务。

我们还看到了将卷积神经网络与计算机图形技术相结合带来了一些全新的挑战。在案例中,风格变换会改变图像的形状,使得重新投影容易出错,且成本较高。这些问题是实时图形和深度学习之间形成了新的交叉前景,得益于Barracuda,Unity实验室现在可以完全投入到新功能的研究之中。

据悉Unity目前已经使用这个演示方案推动了神经纹理合成和风格变换的研究以及Barracuda的应用及发展。

相关推荐