下一代实时渲染——基于深度学习的渲染

作者:Leonn腾讯互动娱乐,游戏客户端开发 腾讯GWB游戏无界 2019-07-23
作者:Leonn腾讯互动娱乐,游戏客户端开发

导语:AI已然成为下个时代的主角,AI让计算机拥有了对复杂算法的决策能力,这是解决很多复杂问题的终极武器。而实时渲染图形学恰好存在大量复杂、可并行计算的问题,且方便使用已有经验预测和预处理新的结果,因此基于AI的实时渲染已经带来了许多新方法解决过往的问题。事实上诸如NVIDIA等公司也投入了大量的人力进行研究,17年左右有很多相关的算法产生。这里简要梳理基于Deep Learing渲染的基本原理,并综述几个最基本的DL应用于实时渲染的例子。

本文系Leonn对SIGGRAPH17上《Deep Learing:The Futrure of Real-Time Rendering》的整理笔记。

1 Deep Learning

这是AI领域的基本知识,对于从事实时渲染工作但没有做过太多AI经验的朋友,我们再从头简单梳理一下。

人工智能需要解决的问题可以简单地使用下图表示,即如何算出一个可能超级复杂的函数f(),使它将输入数据集合A,转换成数据集合B,各种AI方法就是为了找到这样的函数f()。渲染中存在太多这样的问题,例如如何找到一个把montecarlo积分算出来的满是噪点的图像转成一个时间稳定空间平滑的图像的f()、把一个原始的渲染图像转成AA后的图像的f()。之前我们使用各种AA算法、各种数学图形学trick做这个f(),现在我们可以用AI。甚至整个图形渲染都是一个AI问题,找到对已知输入光线和最终2D图像之间的f()。



神经元网络Neural Networks,是机器学习问题的一大类重要的算法,NN的基本结构如下:


蓝色节点代表输入数据集,红色节点代表输出的数据集,绿色节点代表中间层layer,每个中间节点跟每个输入节点连接,且存在数值关系,同理每个输出节点同每个中间层节点连接存在数值关系,这就像人脑的神经元连接。当输入和输出已知的情况,用大量既有事实的输入和输出数据对,找到正确的每条连接线的数值矩阵,就找到了这个转换f(),有了f(),可以对类似问题的任意输入,得到问题的输出。找这个矩阵的过程就是对NN进行训练的过程,至于怎样训练,可以参阅NN的相关知识,但是作为图形学渲染使用明白这个简单的道理就够了,怎样训练有很多相关的框架如TensorFlow等。

上图的关系比较简单,还不能描述任意复杂的函数过程,如果把中间层加深成下面的图,就可以解决更复杂的问题,因为中间层数变深了,所以这种NN就叫做Deep Learning。

我们用DL去解决实时渲染问题。


2 CNN

在深层NN中,又有一类变种CNN(Convolutional Neural Network,卷积神经网络)尤其适合解决图像空间的问题。

为什么这样说呢,因为图形渲染很多时候在解决2D或3D的矩阵像素,通常是对这些像素做各种变换。我们在学习数字图像处理的时候,遇到过卷积的概念,我们对图像进行许多处理(模糊、提取边缘、更改色相等)通常都会使用一个2D的卷积蒙版,比如sobel算子,laplas算子等。因为卷积计算很适合简单的表示和对像素进行并行计算。


简单来讲,对两个函数f和g的卷积操作,首先是对这两个函数求一种乘积f()g(),但是这里面两个函数的输入的合相加相等,且最终求和所有可能,即求F和g在0的卷积就是 ,上图的边缘检测算子里,f()是左侧2D原图,g()是右侧2d蒙版(卷积核),他们求在0上的卷积,就是右侧的图。

既然卷积大量应用于图像处理,所以对于前面提到的deep learning的中间层的每个节点,就可以用一些卷积核来表示,这种中间层节点都是卷积核的DL就是传说中的CNN,如下:


详细解释一下,最左侧是输入是原始图像的2D像素,大小假设是N*N,中间的第一层是大小为M1*M1的卷积核,并且这层卷积核处理输入的时候是有跨度的,即可能不会一个挨着一个像素处理,而是跨越处理,这样经过第一层中间层,原始的N*N的数据集就会变成了更小的N1*N1,然后继续往更深层次处理,逐渐变小到最终的Nk*Nk的数据集,对Nk*Nk的数据集进行最终的几层处理将得到一个输出,上面的输入是一个轿车图像,输出是“Audi A7”。当CNN通过大量的样本学会了这中间的所有卷积核,他就拥有了识别其他轿车品牌的能力。其实这些卷积核就是对这种图像最有利的一些特征分类器,而中间过程的每一层图像,都是在那一尺度级别提取到的关键特征。CNN用来学习怎样找到区别汽车品牌的关键特征。

有了CNN,不只可以识别80万起售价的Audi A7,还可以解决一些渲染问题,比如一些渲染问题可以用Autoencoder自动编解码器来解决,Autoencoder的结构如下:


这是一个典型的CNN,只是每层经过卷积核处理后的不再是2D图像特征,而是3D图像特征,一个平坦的2D图像,最终变成了一个细长的3D特征,这就是一个图像数据的压缩过程,然后通过另外一堆卷积层,它还原成了2D图像,这就是一个图像数据的解压过程。

因为解压过程是对数据升维的过程,因此天然对图像的高频信号做了过滤,平滑了图像,因此类似的Autoencoder同时也能解决图形渲染的一些去燥问题,典型如后处理过程的反走样AA。


用于反走样的CNN通常可以这样训练出来:

1)因为超采样永远是AA的ground truth,所以我们用一些场景中预先渲染好的1倍采样的图像及其对应的16倍超采样的图像做输入输出。

2)卷积核采用比如192*192的大小,对这些卷积核在图像上进行一定跨度的卷积操作,并旋转0,90,180,270各做卷积操作。

3)特征卷积核的筛选要基于比较CNN对原图的输入和真实超采样图之间的差异函数loss function,使差异函数衡量的差异在容忍的程度下最小化,用于图像后处理的loss function通常不能只考虑空间上的一致性,还要考虑时域上的一致性,不然会产生连续渲染的闪烁。所以事实上用于训练的输出不是一张图像,而是8张连续的序列帧,用于量化时域差异的函数要考虑计算某一刻的参考超采样图和用CNN预测出来的的输出图的时间梯度的L2范数(L2 norm of the temproralgradiant)。

3 RNN

因为前面在处理图像渲染中反走样的问题的时候要考虑时序问题,所以有另外一类CNN可以更好的解决有这种时序关系的问题,即RNN(Recurrent Neural Networks,递归的神经网络),它的结构如下图:


它的时序上相邻的样本之间是有依赖关系的,即前一个样本的输出同时也会成为后一个样本的输入,他将CNN加入了时序关系。

因为引入了时序关系,RNN相比CNN更能“捕捉”到特征的移动,而不是静止图像上的特征,如下图这个三角形在帧序上移动,我们倾向去捕捉这个特征。


但是这里面又有一个问题,就是卷积核的大小问题,卷积核太小,可能我们根本就捕捉不到超过它大小的重要特征,尤其是特征随时序缩放的情况,卷积核太大,运算成本又增大,且不能适应图像的缩放。

这时又有人提出来一种变种的RNN来解决,叫WRNN(Warped Recurrent Neural Networks),它的结构如下,它对前面一个样本的输出做了一次包装,使它能够适应后面一帧的新特征。


4 TensorFlow

有了前面Dl,CNN,RNN的基本知识,就能够实际上去发掘很多渲染问题的老题新解了,有的解法是效率更高效果更好的。而TensorFlow又是一个非常强大的DL的框架,可以让AI的入门初学者快速的应用这个核武器,比如NV用TensorFlow去实现一个RNN版本的TAA,可以看到下面原始图像,TAA的处理,基于RNN的Taa,基于RNN的Autoencoder的AA(RAE),和16倍超采样的对比,我们看到RAE的效果比taa更多细节更锐利,更接近于16spp,然而RAE的运行效率只是一些卷积核的像素操作,也有着很高的运行效率。


5 Hello Tensorflow

当我们看到基于TendorFlow的渲染已经在某些领域取得更好更高效的效果的时候,可以想到它能应用于更多问题,并有理由相信很快会对传统渲染算法说再见,当然这些传统算法不是不见了,而是直接书写应用于各种TensorFlow的代码的训练过程中,在运行时只是一些不能直观理解的卷积核操作,比如当我们看到一个游戏的后处理应用了GI、AO、校色、bloom等各种效果,但是截帧发现其psshader只是几个卷积核的操作的时候,不用惊讶,因为已经有这方面的工作了,毕竟所有的后处理也是一次神经网络能够模拟的“操作”。


在基于深度学习的渲染中,除了TAA,后处理,已经有的一些其他工作进展包括:

简单的path tracing和基于加强学习的path tracing,


基于RNN的体积云,


此外还包括实时的自动模型LOD,Animation Blend,高品质材质等等。

机器学习为实时渲染开了一扇窗,并且很可能成为下一代图形学的基础,机器学习的神奇之处是不用一个具体的算法流程处理渲染,而是用提取的特征表达一个看上去对的渲染,毕竟“看上去对”是图形学的第一定律,这种颠覆性的革新会带来很多激动人心的机会,很多老的渲染问题可以思考用DL获得更好的实现(尤其是性能不好的移动平台上)。对这些新算法的开拓如果跃跃欲试的话,就现在开始学习TensorFLow吧。


来源:腾讯GWB游戏无界
原地址:https://mp.weixin.qq.com/s/muirOMI8-hjuW7M9Dhq6Xw

最新评论
暂无评论
参与评论

商务合作 查看更多

编辑推荐 查看更多