下一代實時渲染——基於深度學習的渲染
導語: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
相關文章
- PBR(基於物理的渲染)學習筆記2筆記
- 實時渲染:更優的渲染選擇
- 什麼是實時渲染,實時渲染是如何工作的
- 關於遊戲中的實時渲染遊戲
- 基於virtual dom 的canvas渲染Canvas
- 深度學習和圖形學渲染的結合和應用深度學習
- 基於pytorch的深度學習實戰PyTorch深度學習
- 基於TensorFlow的深度學習實戰深度學習
- 什麼是實時渲染,3D實時渲染的優缺點3D
- faced:基於深度學習的CPU實時人臉檢測深度學習
- 預渲染與實時渲染:有什麼區別?
- 實時渲染和預渲染有什麼區別
- React服務端渲染實現(基於Dva)React服務端
- 基於物理的渲染(PBR)白皮書(二) PBR核心理論與渲染光學原理總結
- 實時渲染:KeyShot Pro for macMac
- 基於 Nuxt 的 Vue.js 服務端渲染實踐UXVue.js服務端
- Vue學習筆記(三)條件渲染和迴圈渲染Vue筆記
- 實時深度學習深度學習
- 基於VUE的伺服器端渲染(SSR)Vue伺服器
- 關於雲流化系統-實時雲渲染延時性的討論
- CAD和實時渲染之間的差距
- 【深度學習-基於Tensorflow的實戰】公開課實況深度學習
- 基於深度學習的時間序列分類[含程式碼]深度學習
- 基於CPU的深度學習推理部署優化實踐深度學習優化
- 一種基於KVO的頁面載入,渲染耗時監控方法
- 基於React的SSG靜態站點渲染方案React
- 基於 SSR 的預渲染首屏直出方案
- 基於深度學習的影像分割在高德的實踐深度學習
- 實時雲渲染有哪些優勢
- 實時渲染路徑追蹤概述
- 實時雲渲染有哪些優勢?
- Vue 基礎自查——條件渲染和列表渲染Vue
- ThreeJs學習筆記——渲染(render)分析JS筆記
- React學習筆記-條件渲染React筆記
- JS學習:建立一個演示用的渲染庫4(渲染表面,畫素格式等)JS
- 【機器學習基礎】關於深度學習的Tips機器學習深度學習
- Vue 3深度探索:自定義渲染器與服務端渲染Vue服務端
- 美團如何基於深度學習實現影像的智慧稽核?深度學習