基于深度学习的渲染 Deep Learning Based Rendering

        此文作为siggraph17的《Deep Learing:The Futrure of Real-Time Rendering?》的整理笔记。

        就像《必然》中说的那样,如同这个时代的互联网一样,AI已然成为下个时代的主角, AI让计算机拥有对复杂算法的决策能力,是解决很多复杂问题的终极武器。它尤其擅长解决这样的问题:复杂的、可并行计算的、能用已有经验推测任意结果并使结果看起来正确的。而实时渲染图形学恰好存在大量复杂的,可并行计算的问题的,且方便用已有经验预处理预测新的结果,因此基于AI的实时渲染已经在尝试各种新的方法解决那些老的问题,事实上诸如NV等也在投入大量的人在研究,17年左右有很多类似算法产生,这里简要梳理基于Deep Learing的渲染的基本原理,并综述几个最基本的DL应用于实时渲染的例子。

1 机器学习,Neural Networks, Deep Learning

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

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

 

基于深度学习的渲染 Deep Learning Based Rendering_第1张图片

 

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

 

基于深度学习的渲染 Deep Learning Based Rendering_第2张图片

 

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

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

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

基于深度学习的渲染 Deep Learning Based Rendering_第3张图片

 

2 CNN

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

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

 

基于深度学习的渲染 Deep Learning Based Rendering_第4张图片

如果对卷积的概念模糊,可以参考这篇知乎https://www.zhihu.com/question/22298352。简单来讲,对两个函数f和g的卷积操作,首先是对这两个函数求一种乘积f()g(),但是这里面两个函数的输入的合相加相等,且最终求和所有可能,即

求F和g在0的卷积就是求上图的边缘检测算子里,f()是左侧2D

原图,g()是右侧2d蒙版(卷积核),他们求在0上的卷积,就是右侧的图。

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

 

基于深度学习的渲染 Deep Learning Based Rendering_第5张图片

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

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

基于深度学习的渲染 Deep Learning Based Rendering_第6张图片

 

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

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

 

基于深度学习的渲染 Deep Learning Based Rendering_第7张图片

用于反走样的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 temproral gradiant)。

3 RNN

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

基于深度学习的渲染 Deep Learning Based Rendering_第8张图片

 

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

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

基于深度学习的渲染 Deep Learning Based Rendering_第9张图片

 

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

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

基于深度学习的渲染 Deep Learning Based Rendering_第10张图片

 

4.TensorFlow based Rendering

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

基于深度学习的渲染 Deep Learning Based Rendering_第11张图片

 

5.Hello Tensorflow

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

基于深度学习的渲染 Deep Learning Based Rendering_第12张图片

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

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

基于深度学习的渲染 Deep Learning Based Rendering_第13张图片

 

基于RNN的体积云

基于深度学习的渲染 Deep Learning Based Rendering_第14张图片

 

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

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

你可能感兴趣的:(图形学/3D技术,机器学习)