基於深度學習的渲染  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()。

 

 

神經元網絡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算子等等)。因爲卷積計算很適合簡單的表示,並且並行的對像素進行計算。

 

如果對卷積的概念模糊,可以參考這篇知乎https://www.zhihu.com/question/22298352。簡單來講,對兩個函數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 temproral gradiant)。

3 RNN

因爲前面在處理圖像渲染中反走樣的問題的時候要考慮時序問題,所以有另外一類CNN可以更好的解決有這種時序關係的問題,即RNN(Recurrent Neural Networks,遞歸的神經網絡),它的結構如下圖

 

它的時序上相鄰的樣本之間是有依賴關係的,即前一個樣本的輸出同時也會成爲後一個樣本的輸入,他將CNN加入了時序關係。

因爲引入了時序關係,RNN相比CNN更能“捕捉”到特徵的移動,而不是靜止圖像上的特徵,如下圖這個三角形在幀序上移動,我們傾向去捕捉這個特徵。

 

但是這裏面又有一個問題,就是卷積核的大小問題,卷積核太小,可能我們根本就捕捉不到超過它大小的重要特徵,尤其是特徵隨時序縮放的情況,卷積核太大,運算成本又增大,且不能適應圖像的縮放。

      這時又有人提出來一種變種的RNN來解決,叫WRNN(Warped Recurrent Neural Networks),它的結構如下,它對前面一個樣本的輸出做了一次包裝,使它能夠適應後面一幀的新特徵。

 

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的運行效率只是一些卷積核的像素操作,也有着很高的運行效率。

 

5.Hello Tensorflow

     當我們看到基於TendorFlow的渲染已經在某些領域取得更好更高效的效果的時候,可以想到它能應用於更多問題,並有理由相信很快會對傳統渲染算法說再見,當然這些傳統算法不是不見了,而是直接書寫應用於各種TensorFlow的代碼的訓練過程中,在運行時只是一些不能直觀理解的卷積核操作,比如當我們看到一個遊戲的後處理應用了GI,AO,校色,bloom等各種效果,但是截幀發現其ps shader只是幾個卷積核的操作的時候,不用驚訝,因爲已經有這方面的工作了,畢竟所有的後處理也是一次神經網絡能夠模擬的“操作”。

在基於深度學習的渲染中,除了TAA,後處理,已經有的一些其他工作進展包括:

簡單的path tracing和基於加強學習的path tracing

 

基於RNN的體積雲

 

此外還包括實時的自動模型LOD,Animation Blend,高品質材質等等。

機器學習爲實時渲染開了一扇窗,並且很可能成爲下一代圖形學的基礎,機器學習的神奇之處是不用一個具體的算法流程處理渲染,而是用提取的特徵表達一個看上去的渲染,畢竟看上去對是圖形學的第一定律,這種顛覆性的革新會帶來很多令人激動的機會,很多老的渲染問題可以思考用DL更好的實現(尤其是性能不好的移動平臺上),對這些新的算法的開拓如果躍躍欲試的話,就現在開始學習TensorFLow吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章