摘要 近年來隨著圖形硬件的快速發(fā)展, 渲染技術和深度學習技術都飛速發(fā)展, 可微渲染作為二者之間的橋梁受到了廣泛關注. 隨著許多可微渲染方法的提出, 逆渲染等借助可微渲染工具的應用也隨之蓬勃發(fā)展. 本文從傳統(tǒng)渲染管線開始介紹, 逐步引入可微渲染的主要思想、基本原理和方法, 對它們進行介紹、分析和比較. 并介紹基于路徑跟蹤的可微渲染, 隨后列出開源的可微渲染工具供大家參考并進行比較. 本文后半部分介紹可微渲染的廣泛應用, 分為人臉、人體、人手和物體 4 個方面. 最后列舉了一些可微渲染可能的發(fā)展方向.
本文源自葉子鵬; 夏雯宇; 孫志堯; 易冉; 余旻婧; 劉永進, 中國科學:信息科學 發(fā)表時間:2021-06-17
關鍵詞 可微渲染, 逆渲染, 三維重建, 人臉重建, 渲染
1 引言
渲染是從三維場景得到二維圖像的過程, 如圖 1 所示, 它在動畫、游戲、電影和虛擬現(xiàn)實中有豐富的應用. 傳統(tǒng)的渲染理論和方法已經(jīng)趨于成熟, 在工業(yè)上已經(jīng)有許多成熟的軟件, 比如 OpenGL, 3ds Max 等. 在游戲行業(yè), 隨著圖形處理器 (graphics processing unit, GPU) 的發(fā)展, 已經(jīng)能夠實時渲染高質量高真實感的畫面. 在動畫和電影行業(yè), 基于物理的高真實感渲染能夠達到以假亂真的效果. 在計算機圖形學中, 一般用三角網(wǎng)格表示三維模型, 所以一般的渲染方法都是針對三角網(wǎng)格模型提出的. 除了一般的渲染方法之外, 還有許多專門針對某些特殊應用的特殊渲染方法, 比如對體素 [1]、點云 [2]、毛發(fā) [3] 和流體 [4] 等的渲染. 本文只討論針對三角網(wǎng)格模型的渲染及其可微渲染, 所以渲染在本文中特指三角網(wǎng)格模型的渲染.
傳統(tǒng)的渲染模型分為局部光照模型和全局光照模型, 局部光照模型只考慮光源到物體表面的照射效果, 全局光照模型不僅考慮光源到物體的照射效果, 還考慮物體之間的相互影響. 最簡單的局部光照模型是蘭伯特 (Lambert) 模型, 它只考慮環(huán)境光和漫反射, 并假設物體朝著各個方向均勻地漫反射.
Phong 模型是影響深遠的經(jīng)典局部光照模型, 它假設環(huán)境光是常量, 不考慮物體之間的相互反射, 只考慮環(huán)境光、漫反射和鏡面反射, 許多復雜的光照模型都是基于 Phong 模型改編而來的. 全局光照模型一般是基于物理的方法, 使用物理世界的規(guī)律來模擬計算光在各處的傳播和強度, 經(jīng)典的算法有輻射度法、光線跟蹤和光子映射. 這些全局光照模型的結果有非常高的真實感, 但時間花費高. 為了實時渲染出高真實感的結果, 許多方法使用近似的全局光照, 比如使用預處理得到的環(huán)境光照, 為了適應實時變化的光照, 一般使用球諧函數(shù)作為基底, 根據(jù)光照的變化來組合.
與渲染相反的過程叫做逆渲染, 該過程從圖片中獲得物體的形狀與材質信息、場景中的光照信息及相機參數(shù)等. 逆渲染是個不適定問題, 比正向渲染難度大得多, 它不僅涉及到計算機圖形學中的許多問題, 也涉及到計算機視覺的很多問題. 為了正則化這個不適定問題, 一般會使用逆渲染對象的先驗知識, 比如對于人體組成部分 (人臉[5∼17]、人體[18∼27]、人手[28∼31] ) 或是規(guī)則的人造物體[12, 19, 32∼44] . 對于某些特別的任務, 對應有專門的研究方向, 比如逆渲染人臉的研究方向稱為人臉重建. 近年來, 為了更好地解決逆渲染問題, 同時減少對訓練數(shù)據(jù)的依賴, 許多可微渲染 (differentiable rendering) 的方法被提出 [9, 18, 19, 32, 45∼49] . 可微渲染是一個可以微分求導的渲染過程, 它的正向是渲染, 逆向是求像素對場景參數(shù)的微分. 由于傳統(tǒng)的渲染不可微, 難以設計基于優(yōu)化和基于深度學習神經(jīng)網(wǎng)絡的逆渲染方法, 可微渲染技術的提出大大地增加了這些方法的設計空間.
可微渲染是近年來的研究熱點, 已經(jīng)建立了相應的理論基礎, 并且它的應用也日益廣泛. 本文從傳統(tǒng)的抽象渲染管線 (第 2 節(jié)) 開始介紹, 逐步分析其中每個步驟, 然后介紹可微渲染的基本原理和主流方法 (第 3∼5 節(jié)) 以及開源的可微渲染工具 (第 6 節(jié)), 之后介紹可微渲染的應用 (第 7 節(jié)), 最后介紹可微渲染未來可能的發(fā)展方向 (第 8 節(jié)). 最近已有關于可微渲染的綜述論文 [50] , 和文獻 [50] 不同, 本文旨在讓讀者回顧傳統(tǒng)渲染管線, 快速地理解可微渲染的思想, 并可以迅速判斷可微渲染是否適合自己當前的工作, 找到最適合的可微渲染方法以及開源工具.
2 傳統(tǒng)渲染管線
傳統(tǒng)渲染管線被抽象為幾個固定的步驟, 每個步驟有著固定且單一的任務. 我們以 OpenGL 使用的可編程渲染管線 (本文中簡稱為渲染管線) 為例介紹傳統(tǒng)渲染管線, 它使用的是局部光照模型. 如圖 2 所示, OpenGL 的渲染管線依次分為頂點著色器、圖元裝配、幾何著色器、光柵化、片段著色器、測試與混合 6 個步驟. 在三角網(wǎng)格模型渲染過程中, 幾何著色器僅輸出三角片元, 假設不開啟深度測試和混合, 一個簡單的渲染管線如圖 3 所示, 它主要由頂點著色器、光柵化和片段著色器 3 個部分組成.
頂點著色器的輸入是模型的頂點屬性 (包括局部坐標系的坐標、法向、材質等) 和全局的信息 (相機參數(shù)、光照等), 輸出是模型經(jīng)過變換之后的屬性 (全局裁剪空間的坐標等). 頂點著色器負責對頂點進行坐標變換, 輸入的模型數(shù)據(jù)的頂點在局部空間, 需要乘以模型矩陣、視圖矩陣和投影矩陣再進行透視除法和視口變換最終到屏幕空間. 其中模型矩陣、視圖矩陣和投影矩陣需要根據(jù)場景計算得到, 透視除法和視口變換和場景無關, 會根據(jù)窗口大小自動處理. 模型頂點經(jīng)過這些變換后, 從局部空間, 依次到世界空間、觀察空間、剪裁空間、標準化設備坐標系空間和屏幕空間. 頂點變換的過程包括平移、縮放、旋轉和投影, 均為線性變換, 天然可微, 所以可微渲染的方法一般會使用和上述完全相同的頂點變換的方法.
圖元裝配是把頂點裝配成不同的幾何結構 (比如三角形、折線段等), 一般我們輸入的模型是三角網(wǎng)格, 所以這一步把頂點裝配成一系列三角形. 幾何著色器的輸入是一個圖元及其頂點, 輸出是一個或多個圖元, 一般用來做細節(jié)層次 (levels of detail).
光柵化是從圖元轉化為片段的過程, 也就是從幾何數(shù)據(jù)轉化為光柵顯示的像素的過程, 它計算與每個圖元 (對于三角網(wǎng)格是三角形) 相關的像素. 由于它是從連續(xù)空間到離散空間的一步轉化, 所以會帶來許多問題, 在傳統(tǒng)渲染技術中一個常見的問題就是反走樣 (也稱為抗鋸齒), 可微渲染的難點也在光柵化這一步驟, 但和反走樣不同的是, 困擾著我們的是另一個問題: 如何從像素對頂點求導. 所有的可微渲染研究都是圍繞著這個問題進行的, 我們將在第 4 節(jié)詳細介紹這個問題.
片段著色器負責計算出片段的顏色, 它使用一系列頂點屬性和全局的參數(shù). 我們首先找到片段所在的三角形并計算片段中心的重心坐標, 通過重心插值把頂點的屬性賦給每個片段. 為了實現(xiàn)不同的效果, 不同的著色器可能使用不同的算法來計算片段的顏色, 片段著色器是一個著色器程序的核心, 由用戶定義且可能非常復雜, 但可以將其計算過程抽象成一個黑盒, 輸入是插值得到的屬性和全局參數(shù), 輸出是片段的顏色. 比如紋理貼圖的過程, 使用插值得到的紋理坐標和全局的紋理圖片, 通過采樣得到片段的顏色; 比如 Phong 模型, 使用插值得到的法向和材質以及全局的光照參數(shù), 計算出每個片段的漫反射成分和鏡面反射成分, 并和常量環(huán)境光疊加得到片段的顏色; 比如投影歸一化坐標碼 (projected normalized coordinate code, PNCC)[51] , 它利用一張圖片的三通道顏色來表示三維模型的三維坐標, 我們可以通過片段著色器直接輸出該片段插值得到的三維坐標來得到. 由于片段著色器可以非常復雜, 可能包含可微的過程和不可微的過程, 所以可微渲染的方法一般會對這個步驟加以限制, 只采用可微的片段著色器. 因為許多常用的模型都是天然可微的, 只要稍加限制, 這個步驟往往無需修改即可應用到可微渲染中.
測試與混合是處理物體之間的遮擋關系以及透明物體和它背后其他物體如何顯示的問題, 本質上都是處理物體重疊時產(chǎn)生的問題, 一般采用 Z-buffer 算法來解決. Z-buffer 算法對每個像素維護一個深度信息的緩沖區(qū), 每次判斷新片段的深度和緩沖區(qū)內的深度, 保留更靠前的片段. 由于遮擋關系對頂點坐標敏感, 但 Z-buffer 算法本身不可微, 所以這一步也為渲染的可微帶來了一個障礙. 為了解決這個問題, 需要對這一步驟進行修改, 我們將在第 4 節(jié)詳細介紹這個問題.
3 可微渲染的基本原理
在介紹可微渲染的方法之前, 我們首先簡要地介紹可微渲染的基本原理. 可微渲染是可以微分求導的渲染過程, 分為正向和逆向的過程, 正向過程和傳統(tǒng)渲染相同, 輸入模型和參數(shù)得到一張圖片, 逆向是像素對場景參數(shù)求導數(shù), 可微渲染需要兼具這兩個過程, 不僅需要得到渲染結果, 還要得到渲染結果對輸入的導數(shù). 可微渲染不能離開傳統(tǒng)的渲染模型, 但傳統(tǒng)的渲染方法不可微, 所以可微渲染往往是基于某種傳統(tǒng)渲染模型, 通過引入新的技術, 使得我們可以得到渲染結果對輸入的導數(shù). 主流的可微渲染方法往往基于以下兩類思想, 一類是使用近似的方法, 求得近似導數(shù)用于反向傳播; 另一類是改編傳統(tǒng)渲染模型, 讓像素對頂點可導.
上述第 1 類方法不改變傳統(tǒng)渲染的正向過程, 雖然傳統(tǒng)渲染方法天然不可微, 但使用近似的方法, 能求得近似導數(shù)用于反向傳播. 這類方法的核心在于如何更好地近似渲染過程的導數(shù), 使得導數(shù)在某種觀點下是一種有效的近似, 或是使得導數(shù)對優(yōu)化輸入有著指導意義. 為了使得導數(shù)對優(yōu)化輸入有著指導意義, 有時導數(shù)會和應用相關, 會根據(jù)損失函數(shù)的不同而不同.
對于上述第 2 類方法, 由于傳統(tǒng)渲染方法天然不可微, 需要對其進行改編, 使得改編后的渲染方法依然擁有渲染的能力, 渲染結果不發(fā)生較大變化, 但其過程完全可微, 可以求得精確導數(shù). 這類方法通常改編其中光柵化的步驟, 因為這一步從連續(xù)空間映射到離散空間, 是導致傳統(tǒng)渲染不可微的原因.
4 基于局部光照模型的可微渲染
最近, 許多工作使用近似的方法, 求得近似導數(shù)用于反向傳播 [9, 18, 32] , 或是改編了傳統(tǒng)渲染管線中的步驟 (一般是光柵化和測試與混合步驟), 讓像素對頂點可導 [19, 45∼47] . 本節(jié)我們會詳細介紹幾種有代表性的可微渲染的方法及其理論, 從近似傳統(tǒng)渲染方法的導數(shù)逐漸過渡到改編渲染方法, 然后簡要介紹其他可微渲染的方法, 并將這些可微渲染方法進行對比分析. 它們都使用局部光照模型, 和 OpenGL 的渲染管線有著類似的步驟. 我們稱渲染的過程為正向過程, 求導的過程為反向過程.
4.1 局部近似導數(shù)的方法
OpenDR [18] 提出了一種對渲染過程求近似導數(shù)的方法, 求得近似導數(shù)用于反向傳播. 它對渲染過程進行了一定的限制, 傳統(tǒng)的渲染管線中, 片段著色器是使用用戶定義的函數(shù)逐片段地確定顏色, 而 OpenDR 要求顏色是逐頂點確定的, 頂點的顏色在光柵化之前已經(jīng)計算完成, 之后片段著色器只是對頂點顏色進行插值得到片段的顏色. 雖然它限定了計算顏色的過程, 但無需修改光柵化的過程. 假設渲染的輸入為模型的幾何信息 (V ), 模型的外表信息 (A) 和相機參數(shù) (C), 其中模型的外表信息可能受到幾何信息的影響, 如圖 4 所示, 渲染過程為 f(V, A, C), 正向過程從模型的數(shù)據(jù)和相機參數(shù)得到圖片, 逆向過程分別求出 f 對 V, A, C 的導數(shù). 設 U 為模型頂點投影到屏幕上的坐標, 可以理解為頂點著色器的輸出, 它可以由模型的幾何信息和相機參數(shù)計算得到.
如圖 4 所示, 為了求得 f 對 V, A, C 的導數(shù), 由鏈式法則, 我們總共需要求 ∂f ∂A , ∂f ∂U , ∂U ∂V , ∂U ∂C , ∂A ∂V 五組偏導數(shù). 由于其中 ∂U ∂V 和 ∂U ∂C 是頂點變換, 天然可微. 對于 ∂f ∂A , 由于 OpenDR 對頂點顏色進行插值得到片段的顏色, 所以像素對頂點顏色的導數(shù)就是該像素對應的可見片段在其三角形的重心坐標, 我們只需在正向過程中保存每個片段的重心坐標以及每個像素對應的可見片段即可. ∂A ∂V 是對用戶定義的函數(shù)求導, 它可能是常數(shù)也可能是復雜的函數(shù), 這取決于用戶如何定義計算顏色的函數(shù), 只要用戶定義的函數(shù)可微, 那么它的導數(shù)存在. 通常用戶定義的計算顏色的函數(shù)都是初等函數(shù), 導數(shù)很容易計算. 下面我們詳細介紹對 ∂f ∂U 的計算.
由于從 U 到 f 需要經(jīng)過光柵化和測試與混合, 所以 ∂f ∂U 是天然不可微的, 而 OpenDR 不改變光柵化和測試與混合的步驟, 而是求近似導數(shù). OpenDR 根據(jù)像素和遮擋邊界的關系, 把像素分為內部像素和邊界像素, 邊界像素包含遮擋邊界, 內部像素不包含遮擋邊界. 遮擋邊界是一條邊在屏幕上的投影, 且其兩側對應的曲面發(fā)生了劇烈的變化, 這往往分為兩種情況: 一種是在深度測試的過程中發(fā)生了突變 (由遮擋產(chǎn)生), 另一種是這條邊連接了兩個法向相反的三角形 (由輪廓產(chǎn)生). OpenDR 具體又根據(jù)像素跨越遮擋邊界的數(shù)目, 將它們分為三類: 內部像素、單邊界像素和多邊界像素, 對這三類像素分別討論, 采用不同的方法近似. 其中內部像素的范圍內不包括遮擋邊界; 單邊界像素僅和一個遮擋邊界相交; 多邊界像素和超過一個遮擋邊界相交. OpenDR 采用圖像空間的一階泰勒 (Taylor) 展開的方法來近似顏色對水平方向的導數(shù), 考慮模型的局部往右移動了一個像素的距離, 那么每個相關的像素都被它左邊的像素替代. 我們可以用相鄰像素之差來近似導數(shù), 以水平方向為例, 比如用 1 2 [−1, 0, 1] 來濾波, 這個過程和對圖像做一次 Sobel 濾波非常類似, 實現(xiàn)的時候也可以用類似的方法來實現(xiàn).
至此, 我們已經(jīng)求出或近似求出了所需的五組導數(shù), 梯度流得以從輸出傳遞回輸入. OpenDR 采用的近似導數(shù)的方法不改變渲染過程, 使用像素之間的離散導數(shù)來近似頂點坐標的變化對像素產(chǎn)生的影響. 我們發(fā)現(xiàn), 這五組導數(shù)中最復雜的是 ∂f ∂U , 因為光柵化天然不可微, 導致梯度流無法從像素傳播到頂點坐標. 之后介紹的方法, 它們都是圍繞光柵化這個步驟進行近似或改編的, 從而使梯度流能夠從像素傳播到頂點坐標.
4.2 用平滑的光柵化近似導數(shù)
如圖 5 所示, 標準的光柵化像素對頂點坐標沒有梯度流 (導數(shù)幾乎處處為 0), 為了使得像素對頂點坐標的梯度流存在, 一種平滑的光柵化方法 [32] 被提出, 它不改變正向渲染的過程, 而是在反向傳播梯度流時, 通過把頂點移動對像素的影響進行平滑, 得到一種近似像素對頂點坐標導數(shù)的方法, 下面將詳細介紹這種平滑的光柵化方法.
假設我們要得到某個像素 Pj 的顏色 Ij 對某個頂點 vi 的屏幕空間的坐標 (xi , yi) 的導數(shù), 這里只討論水平方向的導數(shù), 對于垂直方向的微分完全類似. 我們考慮頂點 vi 在沿著水平方向移動時, 該像素顏色的變化, 對于標準的光柵化, 如圖 5 第 2 行所示, 隨著頂點位置的變化, 像素的顏色在某個臨界位置發(fā)生了突變. 如果三角形的顏色與頂點位置 vi 無關, 那么 ∂Ij ∂vi 幾乎處處為 0, 損失函數(shù)得到的誤差無法從像素的顏色傳播到頂點的坐標. 梯度流無法傳播的根本原因在于, 顏色沒有隨著頂點坐標平滑地變化, 而是所有的變化都集中在發(fā)生突變的地方. 基于這一點, 平滑的光柵化相對標準的光柵化, 在頂點移動時像素發(fā)生突變的地方進行平滑, 如圖 5 第 4 行所示, 在初始位置和臨界點之間使用了線性插值. 下面分兩類情況給出詳細定義, 一類是像素初始在三角形外, 另一類是像素初始在三角形內.
當像素初始在三角形外時, 如圖 5 左半部分所示. 我們記 vi 的初始位置為 x0, 此時 Pi 的顏色為 I(x0), 當 vi 向右移動到 x1 時, 三角形的邊和像素接觸, 此時 Pi 的顏色為 I(x1), 我們記 δ x i = x1 − x0, δ I j = I(x1) − I(x0), 我們將突變改為漸變, 也就是在 x0 和 x1 之間用 δ I j δ x i 來近似 ∂Ij ∂vi . 由于 x0 是一個拐點, 在 x0 的導數(shù)的定義需要特別定義, 其實我們最關心的正是導數(shù)在 x0 處的定義. 為了讓梯度流更好地傳播, 在 x0 的導數(shù)如下定義:
其中 δ P j 為損失函數(shù)反向傳播的梯度信號, 它表示該像素是否過量或過暗. 梯度信號 δ P j > 0 表示, 為了優(yōu)化損失函數(shù)像素需要更暗. 如果頂點向右移動, 像素會變得更亮, 即 δ I j > 0, 但為了優(yōu)化損失函數(shù)像素需要更暗, 即 δ P j > 0, 此時向左向右移動均無效, 所以在這種情況下, 導數(shù)定義為 0.
當像素初始在三角形內時, 如圖 5 右半部分所示. 我們記 vi 的初始位置為 x0, 此時 Pi 的顏色為 I(x0), 當 vi 向左移動到 x a 1 時, 三角形的邊和像素接觸, 此時 Pi 的顏色為 I(x a 1 ), 我們記 δ a x = x a 1 − x0, δ I a j = I(x a 1 ) − I(x0), 當 vi 向右移動到 x b 1 時, 三角形的邊和像素接觸, 此時 Pi 的顏色為 I(x b 1 ), 我們記 δ b x = x b 1 − x0, δ I b j = I(x b 1 ) − I(x0). 類似像素初始在三角形外時的情形, 在 x0 和 x a 1 之間用 δ I a j δ a x , 在 x0 和 x b 1 之間用 δ I b j δ b x , 來近似 ∂Ij ∂vi . 由于 x0 為拐點, 在 x0 的導數(shù)的定義需要特別定義. 為了讓梯度流更好地傳播, 在 x0 的導數(shù)如下定義:
其中 ∂Ij ∂xi a xi=x0 和 ∂Ij ∂xi b xi=x0 的定義和式 (1) 類似, 都是根據(jù)損失函數(shù)反向傳播的梯度信號 δ P j 來定義的, 分別判斷頂點向左和向右移動是否有利于損失函數(shù)降低. 如圖 5 第 6 行右半部分所示, 總共分為 4 種情況.
上面討論了對于單個三角形, 如何進行光柵化以及對光柵化求導. 對于多個三角形, 繪制的時候和傳統(tǒng)渲染管線一樣, 需要經(jīng)過測試與混合, 每個像素的顏色由深度最小的三角形決定 (這可以用 Zbuffer 算法實現(xiàn)). 在反向傳播梯度流時, 我們需要計算某個像素對某個頂點位置的導數(shù), 該導數(shù)可能與和該頂點相鄰的所有三角形有關, 對于每個和該頂點相鄰的所有三角形, 我們首先判斷頂點移動到臨界位置時像素是否會被遮擋 (可以利用存儲的深度信息來判斷), 如果像素總是被不包含該頂點的面遮擋, 也就是說無論如何移動該頂點, 像素的顏色都不會變化, 說明該頂點無法影響該像素的顏色, 那么我們將它的梯度設為 0.
4.3 基于概率分布的光柵化
由于傳統(tǒng)的光柵化對頂點坐標不可微 (導數(shù)幾乎處處為 0), 為了使得梯度流能夠反向傳播, 一種基于概率分布的光柵化方法 SoftRas[19] 被提出. 不同于前面介紹的兩種近似導數(shù)的方法, 該方法使用概率分布的方法改編了光柵化和測試與混合兩個步驟, 使得渲染的正向過程完全可微, 所以能夠求出精確的導數(shù).
SoftRas 的渲染管線如圖 6 所示. 它的輸入是頂點屬性 V , 光照參數(shù) L 和相機參數(shù) C. 頂點著色器對頂點坐標進行變換, 得到投影坐標 U 和投影深度 Z, 并根據(jù)光照參數(shù)逐頂點計算顏色 A, 我們容易得到它們的微分, 梯度流可以反向傳播. SoftRas 利用投影坐標計算每個三角形在圖片上的概率分布 D 代替?zhèn)鹘y(tǒng)的光柵化過程, 之后使用投影深度將這些分布疊加代替?zhèn)鹘y(tǒng)的測試與混合過程, 最終得到渲染結果 f. 下面分別介紹如何計算每個三角形在圖片上的概率分布, 以及如何疊加不同三角形的概率分布.
對于某個三角形 tj , 我們估計它在圖片上的概率分布 Dj , 對于某個像素 pi , 我們定義 tj 在 pi 上的概率為 D i j = sigmoid ( δ i j d 2 (pi , tj ) σ ) , (3) 其中 σ 用于表示概率分布的銳利程度, 它的不同取值產(chǎn)生的效果如圖 7 所示, δ i j 為符號函數(shù), 若 pi 在 tj 內則為 +1, 否則為 −1; d(pi , tj ) 表示 pi 到 tj 的距離, 它可以采用不同的度量, 一個常用的選擇是歐式距離. 我們不僅計算每個像素的概率分布, 還計算它的重心坐標, 對于三角形內的像素, 重心坐標正常定義, 對于三角形外的像素, 重心坐標截取到 [0, 1] 的范圍內. 如圖 7 所示, RGB 值表示重心坐標. 我們用重心坐標插值頂點顏色得到三角形在像素上的顏色 C i j .
當?shù)玫搅怂腥切卧趫D片上的概率分布之后, 我們將它們按概率疊加, 這個過程需要用到深度信息. 離屏幕越近的三角形我們希望它的權重越高 (特別地, 對于傳統(tǒng)渲染使用的 Z-buffer 算法, 只有最近的三角形權重為 1, 其他三角形權重都為 0). 對每個像素 pi 求出每個三角形 tj 的權重 w i j :
其中 z i j 為三角形 tj 在像素 pi 的歸一化深度, ? 為表示環(huán)境光的參數(shù), γ 為表示疊加銳利程度的參數(shù), 它的不同取值產(chǎn)生的效果如圖 8 所示. 我們可以按如下公式計算像素顏色: I(pi) = w i bCb + ∑ j w i jC i j , (6) 其中 Cb 為環(huán)境光顏色. 可以看到像素顏色的計算過程完全可微, 梯度流可以傳播回輸入.
4.4 其他的方法
前面幾節(jié)詳細介紹了 3 種主流的可微渲染方法, 本小節(jié)將簡要介紹幾種其他的可微渲染方法. TF Mesh Renderer[9] 和傳統(tǒng)的渲染相同, 使用重心坐標插值頂點屬性來計算像素的顏色. 它記錄每個像素最近的三角形, 使用重心坐標來計算導數(shù), 在三角形內的像素正常計算, 對于三角形外的像素, 使用負的重心坐標. 這種方法相當于把物體局部看作平的, 是對遮擋邊界的導數(shù)的一種近似. 實踐上, 對于具有光滑的遮擋邊界且數(shù)目較少的情況處理較好, 難以處理遮擋邊界復雜, 互相遮擋的情況.
DIB-R [46] 對前景和背景分開處理. 對于被至少一個三角形覆蓋到的像素稱為前景, 對于沒有被三角形覆蓋到的像素稱為背景. 對于前景, 它采用和 TF Mesh Renderer[9] 類似的方法, 渲染時和傳統(tǒng)的渲染相同, 求導時使用最靠近的三角形的重心坐標. 對于背景, 它改編了渲染的方法, 和 SoftRas [19] 類似, 它用概率分布近似三角形對三角形外的影響, 影響大小和像素到三角形的距離相關, 通過這些影響進行計算得到背景像素的 Alpha 值. 對于前景像素, 它將梯度傳播回所在三角形的頂點; 對于背景像素, 它會將梯度傳播回每一個頂點.
DEODR [45] 在遮擋邊界上使用重畫不連續(xù)邊技術 (discontinuity-edge-overdraw) [52] , 把渲染改編成可微的形式. 它是一種可微的抗鋸齒的方法, 通過沿著遮擋邊界線性混合前面的三角形和后面的三角形, 使得當頂點運動時渲染結果連續(xù)變化. 它的整個渲染過程是可微的, 并且可以處理遮擋邊界的變化對損失函數(shù)的影響, 也就是說損失函數(shù)的梯度流可以精確地傳播回輸入.
Versatile Scene Model [47] 提出了一種光滑的場景表示, 得到了一種可微的渲染方法, 它和傳統(tǒng)的渲染完全不同, 有些類似于 SoftRas. 它把物體表示成一系列各向同性高斯 (Gauss) 分布, 每個高斯分布有各自的反射率, 并針對這種表示提出了特別的渲染模型和渲染方法. 這樣場景函數(shù)是解析的, 渲染的過程可以看作光滑函數(shù), 渲染的結果是較為模糊的圖片.
4.5 不同方法之間的對比
首先, 本小節(jié)介紹的可微渲染方法均基于局部光照模型, 使用的方法大致分為兩類, 一類是求得近似導數(shù)用于反向傳播 [9, 18, 32] , 另一類改編了傳統(tǒng)渲染管線中的步驟, 使得像素對頂點可導 [19, 45∼47] .
從上述可微渲染方法的渲染結果來看, 使用近似導數(shù)的方法 [9, 18, 32] 的渲染結果和傳統(tǒng)渲染方法的結果相同, 但近似中使用的方法不能支持所有的渲染方式, 比如文獻 [18] 只能支持逐頂點計算屬性和顏色. 對于改編了渲染步驟的方法, 渲染結果一般會和傳統(tǒng)渲染不同. DIB-R [46] 的渲染結果在前景上和傳統(tǒng)渲染結果相同, 在背景上顏色和傳統(tǒng)渲染相同, 但會有一定的透明度; DEODR [45] 的渲染結果在內部和傳統(tǒng)渲染相同, 但在遮擋邊界上會更加光滑; SoftRas [19] 的渲染結果會把不同三角形的顏色混合在一起, 帶有一定的透明度和混合效果, 它的透明度和混合效果可以根據(jù)參數(shù)來調整, 當參數(shù)較大時, 它和傳統(tǒng)渲染有明顯差異, 當參數(shù)較小時, 它接近傳統(tǒng)渲染的結果; Versatile Scene Model [47] 的渲染結果會比較模糊, 就像對圖片做了一次高斯模糊. 我們在圖 9 中展示了 3 種方法 [19, 32, 45] 的渲染結果供讀者參考.
可微渲染的最終目的, 不同于傳統(tǒng)渲染, 不是盡可能渲染出逼真的圖片, 也不是為了求出盡可能精確的導數(shù), 而是為了作為一個工具, 使得頂層應用 (一般是一個優(yōu)化問題) 優(yōu)化得更好 (渲染出逼真的結果以及求出精確的導數(shù), 往往有助于優(yōu)化問題). 具體表現(xiàn)為損失函數(shù)的梯度流能夠傳播回輸入, 指導整個優(yōu)化過程. 所以衡量可微渲染方法的重要指標就是, 梯度流是否能夠很好地傳播回輸入, 是否能夠正確地引導輸入朝著損失函數(shù)更低的方向改變. 這個問題需要結合應用具體分析, 不同的應用有不同的需求, 實踐的時候可以參考成功的案例, 詳見第 7 節(jié). 這里我們一般化地分析一下不同方法梯度流的行為. 首先對于近似導數(shù)的方法 [9, 18, 32] 和某些改編了傳統(tǒng)渲染的方法 [45, 46] , 它們的梯度只能傳播到最近的三角形, 不能傳播到被遮擋的三角形; 并且由于只考慮了深度之間的遮擋關系, 沒有考慮深度的大小與尺度, 所以只能在 xOy 平面上優(yōu)化坐標, 它們的梯度也不能傳播到深度信息來優(yōu)化深度 z. SoftRas[19] 使用深度信息來混合不同深度的三角形, 所以梯度可以傳播到被遮擋的三角形, 也可以優(yōu)化深度; Versatile Scene Model [47] 使用高斯模型來表示場景, 光線會隨著深度衰減, 所以可以優(yōu)化深度. 對于 xOy 平面上的坐標, 對于優(yōu)化幾何的應用 (或是同時優(yōu)化幾何、材質和其他參數(shù)的應用), 這是我們最關心的部分, 也是不同方法之間區(qū)別的體現(xiàn). 不同方法的感知范圍不同, 文獻 [18] 使用局部來近似梯度, 所以感知范圍很小; 文獻 [32] 使用光滑臨界點之間的范圍來近似梯度, 文獻 [45] 使用了重畫不連續(xù)邊技術, 所以感知范圍會更大; 文獻 [9] 對遮擋邊界做了平坦的近似, 雖然感知范圍很大, 但無法很好反應遮擋邊界; 文獻 [19, 46, 47] 使用概率分布來表示場景或渲染背景, 可以感知到整張圖片, 也能處理遮擋邊界. 對于具體梯度流在 xOy 平面上如何傳播, 圖 10 展示了不同方法下像素對頂點的梯度. 對于顏色和相機參數(shù), 由于不同方法用它們計算的方法類似, 所以梯度流的行為也較為相似, 并且梯度流的行為也和渲染方法相關.
5 基于全局光照模型的可微渲染
本節(jié)介紹基于全局光照模型的可微渲染. 傳統(tǒng)的 OpenGL 渲染管線及根據(jù)其改編的可微渲染使用的是局部光照模型, 而全局光照模型和局部光照模型有很大區(qū)別, 相較于局部光照模型更加復雜但能渲染出更具有真實感的結果. 路徑跟蹤算法[53] 是基于全局光照的可微渲染方法[48, 49, 54] 的基礎. 其基于蒙特卡洛 (Monte Carlo) 方法采樣并跟蹤進入眼睛的光線, 對于從眼睛出發(fā)的每一根光線, 在場景中遇到每一個物體, 根據(jù)物體的材質, 按概率得到一個方向進行反射或折射, 直到遇到光源, 超出場景范圍或達到最大迭代次數(shù). 也就是按概率分布采樣光線所有可能的路徑, 最后根據(jù)貢獻進行積分, 這種渲染方法是一個無偏的全局光照渲染模型, 可以得到極具真實感的渲染結果. 下面介紹 3 種基于路徑跟蹤的全局光照可微渲染方法: 基于邊采樣的蒙特卡洛路徑跟蹤方法 [48]、重參數(shù)化不連續(xù)的被積函數(shù)方法 [49] 和路徑空間的可微渲染 [54] .
5.1 基于邊采樣的蒙特卡洛路徑跟蹤
基于邊采樣的蒙特卡洛路徑跟蹤方法[48] 可以分為兩個階段來理解, 第 1 階段只考慮首要可見性, 在屏幕空間采樣, 類似于局部光照模型, 第 2 階段把該方法擴展到次要可見性, 可以處理陰影和全局光照, 這個階段需要考慮不同的視角, 在三維空間采樣, 還需要借助精妙設計的數(shù)據(jù)結構來處理更復雜的情況, 但主要思想類似.
在第 1 階段主要考慮屏幕空間, 且只考慮像素對水平方向和垂直方向的偏導數(shù), 對其他參數(shù)的偏導數(shù)可以通過鏈式法則和一些天然可微的部分求出. 我們寫出路徑跟蹤算法計算某個像素值 I 的公式: I = ∫∫ f(x, y; Φ)dxdy, (7)
其中 Φ 為場景中需要優(yōu)化的參數(shù), f(x, y; Φ) 為場景函數(shù). 由于上述積分一般沒有閉形式解, 一般采用蒙特卡洛法來估計積分的結果. 我們的目的是求出像素 I 對場景參數(shù) Φ 的導數(shù), 但場景函數(shù) f 不一定對場景參數(shù) Φ 可導, 所以我們無法通過蒙特卡洛法進行采樣來直接計算導數(shù). 這是傳統(tǒng)的按面積采樣方法導致的, 在三角形的邊上可能會產(chǎn)生不連續(xù)的結果, 比如像素顏色不隨著頂點位置連續(xù)變化, 而是在某個臨界位置發(fā)生突變, 這和局部光照模型有類似的結論. 該方法的核心思想就是在不連續(xù)的邊上進行采樣來計算積分, 對于某條邊 (在屏幕空間) 我們用 αi(x, y) 來表示這條邊所在的直線, 它把平面分成兩個半平面, 我們借助階躍函數(shù) θ 重寫式 (7):
這里按照三角形的邊把場景函數(shù) f 劃分成若干個子場景函數(shù) fi . 對上式求微分有 ∇ ∫∫ θ(αi(x, y))fi(x, y)dxdy = ∫∫ δ(αi(x, y))∇αi(x, y)fi(x, y)dxdy + ∫∫ θ(αi(x, y))∇fi(x, y)dxdy, (9) 其中 δ 為沖激函數(shù). 該梯度分為兩部分, 每個部分可以分別使用蒙特卡洛采樣來估計. 第 1 部分包含沖激函數(shù), 只在三角形的邊上非零, 是積分中不連續(xù)的部分, 使用邊采樣來估計; 第 2 部分和渲染過程完全相同, 只是把場景函數(shù)換成了它的梯度, 是積分中連續(xù)的部分, 使用傳統(tǒng)的面積采樣來估計. 下面詳細介紹如何對上述第 1 部分進行估計.
由于式 (9) 的第 1 部分包含沖激函數(shù), 我們首先用沖激函數(shù)的性質把它改寫成不包含沖激函數(shù)的形式, 考慮到只在三角形的邊上非零, 我們重新參數(shù)化并把它改寫成線積分: ∫∫ δ(αi(x, y))∇αi(x, y)fi(x, y)dxdy = 1 li ∫ b a ∇αi(x, y)fi(x, y)ds, (10) 其中 li 為邊的長度, s 為這條邊的弧長參數(shù), [a, b] 為這條邊在像素范圍內的部分, 0 6 a 6 s 6 b 6 li . 該積分是在三角形邊上積分, 所以不再使用傳統(tǒng)的面積采樣, 而是使用邊采樣.
5.2 重參數(shù)化不連續(xù)的被積函數(shù)
一般化的路徑跟蹤的積分如下所示: I = ∫ X f(x; Φ)dx, (11) 其中 X 為積分的域, 一般為單位球面. 它在可見性發(fā)生變化時會變得不連續(xù), 并且不連續(xù)的位置并非固定不變的, 它和場景參數(shù) Φ 有關. 一種重參數(shù)化不連續(xù)的被積函數(shù)方法 [49] 被提出, 它通過重新參數(shù)化路徑跟蹤的積分, 使得不連續(xù)的位置和場景參數(shù)無關 (并非完全消除不連續(xù)性). 其核心思想是在 Φ 的鄰域 U(Φ) 內找到一個參數(shù)變換 T : Y × U(Φ) → X 來重新計算積分: ∫ X f(x; Φ)dx = ∫ Y f(T(y, Φ); Φ)|detJT |dy, (12) 其中 JT 為 T 的雅可比 (Jacobi) 矩陣. 為了不影響渲染的正向計算, 參數(shù)變換被要求在當前場景參數(shù) Φ 下為恒等變換. 參數(shù)變換也相當于一種新的采樣過程, 該方法通過參數(shù)變換, 使得采樣過程中不連續(xù)的位置不隨場景參數(shù)變化而變化.
下面我們介紹如何得到這個參數(shù)變換, 下面的討論假設積分的域 X 為單位球面 S 2 . 對于某些場景只需要在非常小的角度內積分, 比如點光源加上很小的立體角, 這個時候積分中不連續(xù)的地方集中在物體的輪廓上, 此時可以用球面的旋轉來近似參數(shù)對不連續(xù)物體輪廓的擾動, 將這個擾動也作用到采樣過程上, 從而抵消擾動的影響. 在這種情況下, 假設存在一個旋轉 R(ω, Φ) 使得 f(R(ω, Φ); Φ) 在 ω 取任何值下都與 Φ 連續(xù), 此時雅可比矩陣的行列式的絕對值為 1. 計算這個旋轉不需要知道這個積分包含了哪些輪廓, 只需要知道場景參數(shù)在微小擾動下輪廓上點的變化量, 實現(xiàn)上使用幾束光線來采樣這個變化量. 對于需要在更大角度內積分的場景, 需要更復雜的參數(shù)變換才能抵消參數(shù)的影響, 這個復雜的參數(shù)變換可以通過首先對場景進行一次卷積, 在卷積之后再進行旋轉得到. 考慮到一個事實, 下述積分等于進行卷積之后積分: ∫ S2 f(ω)dω = ∫ S2 ∫ S2 f(µ)k(µ, ω)dµdω, (13) 其中 k 是一個球面上的卷積核, 對任何 ω 滿足 ∫ S2 k(µ, ω)dµ = 1, (14) 這個卷積操作不會改變渲染的結果, 但會影響計算導數(shù)的過程. 原論文中使用 κ = 1000 的 von MisesFisher 分布作為卷積核.
5.3 路徑空間的可微渲染
在路徑空間對路徑積分進行微分的方法 [54] 的核心思想是推導出微分路徑積分公式, 使用這個積分公式設計出一種蒙特卡洛法來無偏地估計像素值 (或輻照度) 對任意場景參數(shù)的微分. 由于該方法的推導過于復雜, 本小節(jié)只介紹核心方法和核心結論.
記場景為 M(π), π 為場景參數(shù), 一條從光源到眼睛的路徑表示為 x¯ = (x0, x1, . . . , xN ), 其中 N > 1, xi ∈ M(π), 路徑空間為 ? = ∪∞ N=1?N , ?N = M(π) N+1 . 路徑積分可以表示為 I = ∑∞ N=1 ∫ ?N f(¯x)dµ(¯x), (15) 其中 dµ(¯x) = ∏N n=0 dA(xn) 為估計的路徑密度, 它是表面面積 dA(xn) 的乘積, f(¯x) 是這條光線路徑的能量, 它是每個點 xn 的雙向散射分布 (bidirectional scattering distribution function, BSDF) 在路徑中的對應入射角出射角的值 g(xn+1; xn, xn−1) 的乘積再乘上權重.
路徑積分 I 對場景參數(shù) π 求微分, 結果分為內部和邊界兩項, 這個微分原文中有兩種形式, 一種是空間形式 (spatial form), 另一種是客觀形式 (material form). 由于原文中的蒙特卡洛法使用的是客觀形式, 我們這里寫出客觀形式. 我們首先簡要介紹參考布局 (reference configuration), 它是一個抽象的二維流形 B, 某個特定的參數(shù) π 存在一個從 B 到 M(π) 的雙射, 可以理解為抽象的參數(shù)空間. 客觀形式是在參考布局上計算微分: ∂I ∂π = ∫ ?ˆ ( ˆf) ′ (¯p)dµ(¯p) + ∫ ∂?ˆ ? ˆfK(¯p)V?BK (pK)dµ ′ (¯p), (16) 其中第 1 項是內部項, 第 2 項是邊界項, ?ˆ 是和參數(shù) π 無關的在參考布局上的客觀路徑空間, ∂?ˆ 是其中至少有一個頂點在邊界上 (進行微小擾動產(chǎn)生的變化不連續(xù)) 的路徑, ˆf 是在客觀路徑空間上定義的對光線路徑能量的計算函數(shù), 可以由 f 重新參數(shù)化后得到, 對應地其中的 BSDF g 重新參數(shù)化為 gˆ, V 是和 π 無關的標量法向速度 (scalar normal velocity), ?BK 由一系列 gˆ 對參數(shù) pK 不連續(xù)的邊界曲線組成
下面介紹對內部項和邊界項的估計算法. 由于內部項的形式和路徑積分相似, 對內部項的估計可以在計算路徑積分時同時求出, 算法流程和路徑跟蹤算法相同, 論文中采用單向路徑跟蹤算法. 單向路徑跟蹤的算法是一個采樣過程, 每次在參考布局中采樣一條路徑, 通過跟蹤路徑計算這條路徑的能量. 對于邊界項的估計, 論文中給出了一種新的基于蒙特卡洛法的無偏估計算法: 多向路徑采樣算法 (multi-directional sampling). 由于邊界點是路徑中間的某一段導致的, 如何采樣這樣的邊界路徑是這個問題最大的挑戰(zhàn), 單向的路徑跟蹤需要每一步都變換視角來尋找邊界點, 為了回避這個困難, 這個算法的核心思想是: 根據(jù)邊界點把路徑分成兩部分, 前一段是連接光源的子路徑, 后一段是連接視點的子路徑, 在采樣的過程中, 先在場景曲面上采樣一個點和一個方向, 過這一點作這個方向的直線, 向兩端延伸得到兩個頂點, 將這兩個頂點加入路徑, 采樣點本身不屬于這條路徑, 然后從這兩個頂點出發(fā)采樣兩個子路徑, 這樣采樣得到的路徑為邊界路徑. 計算邊界項的過程依然是路徑跟蹤框架, 其中采樣的過程使用多向路徑采樣算法, 被積函數(shù)可以由參考布局上的路徑計算得到.
5.4 比較和分析
上述 3 種方法 [48, 49, 54] 分別提出了一種不同于傳統(tǒng)路徑跟蹤的采樣過程. 邊采樣的方法把路徑積分中不連續(xù)的部分剝離出來, 在不連續(xù)的邊上進行采樣來計算積分的不連續(xù)部分, 在連續(xù)的部分使用傳統(tǒng)的面積采樣; 重參數(shù)化的方法通過對積分進行參數(shù)變換, 使得采樣過程中不連續(xù)的位置不隨場景參數(shù)變化而變化; 路徑空間的可微渲染把路徑積分的微分拆成內部項和邊界項兩項, 分別在路徑空間使用蒙特卡洛法進行估計. 其中邊采樣的方法具有完全可微的正向過程, 所以它的導數(shù)是完全精確的, 但它對場景有一定的限制和假設, 比如不包含點光源; 重參數(shù)化的方法求得的是近似導數(shù), 并且對某些場景并不能很好地支持, 求得的導數(shù)有很大的誤差; 路徑空間的可微渲染不改變路徑跟蹤的算法, 并且微分的過程也是路徑跟蹤的框架, 在路徑空間求得路徑積分的微分的無偏估計.
6 開源的可微渲染工具
已經(jīng)有許多開源的可微渲染工具, 比如 DEODR [45]1), SoftRas [19]2), OpenDR [18]3), DIRT [55]4) , PyTorch3D[56]5), Neural 3D Mesh Renderer[32]6), TF Mesh Renderer[9]7), Tensorflow Graphics[57]8), DIBR [46]9), Redner [48]10), Mitsuba2 [49]11) 等. 它們的特性如表 1 所示, 其中 DEODR, SoftRas, OpenDR, DIRT, Neural 3D Mesh Renderer, TF Mesh Renderer, Tensorflow Graphics, 和 DIB-R 使用的是局部光照模型, Redner 和 Mitsuba2 使用的是全局光照模型, 其渲染的結果更接近現(xiàn)實世界, 對輸入為現(xiàn)實世界的照片的應用可能會有更好的效果, 但時間開銷會更大, 而且參數(shù)更多更難優(yōu)化. 其中 SoftRas, DIB-R, PyTorch3D 和 Neural 3D Mesh Renderer 基于深度學習框架 PyTorch; TF Mesh Renderer, DIRT 基于深度學習框架 Tensorflow; Tensorflow Graphics 是 Tensorflow 的圖形庫; DEODR 和 Redner 同時適用于深度學習框架 PyTorch 和 Tensorflow; OpenDR 是 Python 的包; Mitsuba2 是 C++ 的庫, 也有深度學習框架 PyTorch 的接口. 其中 DEODR, SoftRas 和 Redner 使用的方法具有完全可微的正向過程, 所以能求出精確的導數(shù); OpenDR, DIRT, Neural 3D Mesh Renderer 和 TF Mesh Renderer 使用不同的方法對導數(shù)進行近似, 而不改變渲染的正向過程; TF Mesh Renderer 和 Tensorflow Graphics 無法很好地處理遮擋邊界的梯度, 有一定的局限性; Redner 和 Mitsuba2 使用的是全局光照模型, 能夠對間接光照求導, 但由于需要對光線的分布進行大量采樣, 計算花費的時間也是巨大的, 不過 Redner 支持使用局部光照的模式來加速, 只考慮主要可見性, 在這個模式下依然具有完全可微的正向過程和精確的導數(shù).
紋理貼圖在渲染中很重要, 我們簡要地介紹不同的開源工具對紋理貼圖的支持. 其中 DEODR, SoftRas, OpenDR, Neural 3D Mesh Renderer, DIB-R, DIRT, Redner, Mitsuba2 支持帶紋理貼圖的可微渲染, TF Mesh Renderer, Tensorflow Graphics 不支持帶紋理貼圖的可微渲染, 其中 OpenDR 采用 Mipmap, Neural 3D Mesh Renderer 使用特殊的按重心坐標訪問的紋理, 每個三角形的紋理是一個立方體.
7 可微渲染的應用
可微渲染有著廣泛的應用, 主要集中在逆渲染上, 包括幾何重建、材質和紋理估計、相機參數(shù)估計和光照參數(shù)估計等. 如表 2 [5∼44, 58∼62] 所示, 我們把不同的工作按照使用的開源可微渲染工具、研究對象的類別和領域分類.
7.1 物體
從二維到三維的重建任務通常可以定義為, 希望根據(jù)輸入的一張或多張圖片推導得到場景中出現(xiàn)的物體的三維模型 (包括幾何、紋理和材質) 以及物體的位置等信息, 即從渲染的輸出得到渲染的輸入. 對于渲染的每一類輸入, 都有專門的應用模型.
7.1.1 幾何和位置優(yōu)化
幾何是指關于一個物體的形狀的信息, 一般表現(xiàn)為三角網(wǎng)格 (mesh), 對于具有先驗信息的一類物體, 可能有參數(shù)表示的形式. 位置由物體在場景中的模型矩陣進行表示, 包括平移、旋轉和放縮變換. 三維重建的一類重要的方法是合成分析 (analysis-by-synthesis), 即根據(jù)三維參數(shù)渲染得到二維圖片, 與真實圖片進行對比, 從而不斷調整三維參數(shù)直到二者接近相同. 如果采用傳統(tǒng)的渲染方法, 為了訓練網(wǎng)絡則需要大量的關于場景中物體的三維標注或者多視角標注, 而可微渲染可以做到將像素的導數(shù)反向傳播至三維模型的頂點, 因此網(wǎng)絡可以接受單張圖片作為輸入, 直接利用更容易得到的二維標注信息, 甚至讓弱監(jiān)督乃至無監(jiān)督訓練成為可能.
為了根據(jù)合成圖片與真實圖片幾何的差異計算損失函數(shù), 最常使用的二維標注是物體的掩膜 [33, 38∼40] , 也有模型在掩膜的基礎上計算語義關鍵點的距離 [38, 40] . 除了利用手工標注的數(shù)據(jù)集之外, 由于計算機視覺在一些特定任務下對于處理圖片存在一些成熟的模型, 也有一些工作選擇利用目前最高水平的既有模型自動標注, 進一步降低了數(shù)據(jù)集構造的成本, 例如文獻 [33] 利用現(xiàn)有的語義分割的模型對輸入圖片處理得到掩膜和包圍盒. 除此之外, 還有模型利用了現(xiàn)有的真實感渲染器, 在合成圖片的數(shù)據(jù)集上訓練, 因此可以直接保留包括掩膜、語義關鍵點、位置、材質等渲染參數(shù)作為標注[40] . 計算兩張圖像之間像素級的距離是最直接的設計損失函數(shù)的方式, 例如掩膜[33, 38∼40]、像素的強度[12] . 然而如果僅僅直接利用像素數(shù)據(jù), 可能導致對小的幾何瑕疵敏感, 導致重建圖片模糊. 為此一些模型引入感知損失, 即將合成圖片與真實圖片輸入訓練后的神經(jīng)網(wǎng)絡模型, 在多個隱層的特征圖上定義距離 [12, 39, 40] .
7.1.2 紋理和材質優(yōu)化
在渲染管線中, 著色器會利用物體表面材質、光照、視角等信息, 計算待渲染物體表面像素的顏色. 一種常用的著色方式是使用紋理貼圖 (texture mapping). 根據(jù)用途不同, 紋理貼圖可分為法向貼圖、漫反射貼圖、粗糙度貼圖、高光貼圖等, 其包含了物體表面的材質信息. 傳統(tǒng)的紋理材質建模需要采集大量不同光照、視角下目標物體的圖片, 以進行數(shù)據(jù)驅動的重建. 而近年來, 基于深度學習的重建方法使得僅從少量甚至單張圖片估計物體的紋理材質信息成為可能. 其中, 可微渲染器的使用保證了此類方法的可行性.
紋理材質重建通常是三維模型重建問題的一部分, 為了獲取真實的紋理材質信息, 研究者們提出了大量的方法. 一類方法 [38, 40, 43] 基于紋理流. Kanazawa 等 [38] 提出了一種從單張圖片重建特定類別的物體的三維模型的方法, 在紋理重建部分, 其采用了預測紋理流的方法, 即預測從輸入圖像上采樣的坐標值, 然后通過采樣和雙線性插值生成紋理貼圖, 克服了直接回歸像素值產(chǎn)生的紋理貼圖較為模糊的缺點. Li 等 [43] 對文獻 [38] 的方法提出了兩點的改進. 其提出了 EM 式的漸進訓練方法, 迭代地提升預測紋理流的準確度; 同時提出了一種基于投影閉環(huán)的紋理一致性誤差, 解決了紋理流預測中具有相近顏色的面的紋理從同一個像素采樣的問題. Zuffi 等 [40] 與文獻 [38] 有類似的思路, 但在回歸網(wǎng)絡給出預測結果后, 還增加了優(yōu)化步驟. 另一類方法則從建立高質量的紋理模型入手. 文獻 [10, 17] 在解決人臉重建的問題時, 將紋理生成對抗網(wǎng)絡引入到重建網(wǎng)絡中替代三維可變形模型 (3D morphable model, 3DMM) 的紋理模型, 使得重建的紋理細節(jié)豐富, 具有較高的保真度.
7.2 人體相關
相比于普遍意義下的物體, 與人相關的重建問題受到人們格外的關注, 理解人在圖片或視頻中幾何與位置的三維信息在自動駕駛、機器人、虛擬現(xiàn)實等大方向中有重要的應用價值. 專注于人的重建問題的模型與其他模型有著相同的基本思路, 與此同時人也有一系列特有的性質, 使得一些針對性的解法可以達到更佳效果, 這些性質包括: 人作為整體以及各個部位基本形狀已知, 有多種成熟的參數(shù)模型; 除了多角度拍攝, 人可以自主做出動作, 重建模型的輸入可能是一段視頻序列; 人有定義在生理結構上的關節(jié), 關節(jié)包含了重要的幾何信息. 與人相關的重建問題中最受關注的主要包括人臉、人體, 以及人手重建.
7.2.1 人臉
從二維圖像重建人臉的三維模型是近期計算機視覺和圖形學領域的研究熱點之一. 帶標注的三維人臉數(shù)據(jù)的缺乏, 使得采用無監(jiān)督或弱監(jiān)督的方式訓練三維重建網(wǎng)絡的方法受到了大量的關注. 其中, 部分工作 [9, 10, 13, 17] 在網(wǎng)絡中引入了諸如 3DMM [63] 的三維人臉模型來對三維人臉數(shù)據(jù)進行表示, 部分工作 [12] 則不涉及現(xiàn)成模型.
圖 11 [64, 65] 展示了基于參數(shù)模型重建三維人臉模型的無監(jiān)督或弱監(jiān)督網(wǎng)絡的典型框架. 輸入圖像通過回歸網(wǎng)絡預測參數(shù), 由可微渲染器合成圖片, 再利用輸入圖像與輸出圖像計算損失, 從而更新回歸網(wǎng)絡的參數(shù). 在具體實現(xiàn)上, 每一部分可能有不同的實現(xiàn)方式, 也可能存在結構和步驟的新增與替換.
文獻 [9] 提出的方法采用編碼器 – 解碼器結構, 利用合成圖像和無標注的二維真實圖像進行訓練. 其使用了可微渲染器 [9] 來計算并反向傳播損失函數(shù), 損失函數(shù)包括像素損失、關鍵點損失、身份損失和內容 (人臉識別網(wǎng)絡的隱藏層特征) 損失. 文獻 [13] 提出了一種基于 CNN 的從二維人臉圖像重建精確的三維人臉模型的弱監(jiān)督方法. 其使用 3DMM 模型表示人臉, 采用 ResNet-50 [66] 來預測三維模型參數(shù)及成像參數(shù), 然后通過可微渲染器生成重建人臉的二維圖像. 該方法采用圖像和認知兩個層面的損失函數(shù)以及 3DMM 系數(shù)的正則項指導網(wǎng)絡的訓練, 其中, 圖像層面采用了結合注意力機制的像素誤差和人臉的關鍵點誤差, 認知層面采用 FaceNet [67] 提取人臉特征計算誤差. 文獻 [12] 提出了一種無監(jiān)督的不依賴現(xiàn)有模型重建具有對稱性的物體的方法. 其思想是從單張圖像分解出圖像的構成信息, 即深度、反照率、視角與光照, 然后結合對稱性以及置信圖, 采用可微渲染器 [32] 重建二維圖像, 然后使用輸入圖像與生成圖像的重建誤差作為損失函數(shù).
可微渲染理論在為三維人臉重建的問題提供新的范式的同時, 也促進了無監(jiān)督或弱監(jiān)督的三維人臉重建網(wǎng)絡在相關領域的模塊化應用. 文獻 [11] 在提出的人臉視頻去模糊網(wǎng)絡中, 創(chuàng)新性地集成了使用可微渲染器的三維人臉重建網(wǎng)絡以提供人臉的先驗信息. 通過借助重建網(wǎng)絡渲染的清晰人臉結構和提取的人臉身份信息, 該方法克服了傳統(tǒng)方法定位面部結構不準確、結果不夠自然的缺點, 能夠產(chǎn)生高質量的去模糊視頻. 文獻 [5] 使用可微渲染器的三維人臉重建網(wǎng)絡到替換身份的生成網(wǎng)絡中. 其借助重建網(wǎng)絡從輸入圖像重建三維人臉模型, 然后替換身份參數(shù)渲染具有不同身份信息的二維人臉圖像, 再經(jīng)過生成對抗網(wǎng)絡的修正, 生成身份信息已混淆的、具有較好細節(jié)和真實感的圖像, 達到保護隱私的目的.
7.2.2 人體
人體可以被視為一類形狀特定且位姿服從一定規(guī)律的物體, 在單目圖片作為輸入導致問題不適定的情況下, 利用人體相關的先驗知識可以提升模型性能. 人體參數(shù)模型到面片模型的相互轉化過程可微, 可以參與重建管線的整體訓練. 人體的關節(jié)是天然的語義關鍵點, 通過關節(jié)往往就可以獲得足夠的信息重建人體幾何. 根據(jù)二維關節(jié)標注, 以及預測的三維關節(jié)在二維上的投影, 我們可以計算它們的距離來設計損失函數(shù). 文獻 [25] 在應用可微渲染之后, 損失函數(shù)定義在有二維標注的掩膜和關節(jié)上. 文獻 [20] 在應用可微渲染之后, 重建部分的損失函數(shù)僅定義在關節(jié)標注上.
7.2.3 人手
人手重建問題對機器手控制、虛擬現(xiàn)實手勢識別等方向有著重要意義. 人手的手指與手掌構成精巧的結構、自遮擋、背景雜亂和與物體的互動等復雜場景給重建帶來多種困難. 目前缺乏有完整三維標注的數(shù)據(jù)集, 可微渲染的出現(xiàn)提高了二維標注信息的可用性, 一方面可以使用可微渲染搭建利用二維標注的重建模型, 另一方面可以將可微渲染視為產(chǎn)生三維標注的一步. 如果有模型可以從二維標注信息恢復高質量的三維信息, 就可以生成更多的標注數(shù)據(jù). 即便模型結果的質量不足以作為標注投入使用, 也可以在交互的過程中降低成本.
8 可微渲染未來可能的發(fā)展方向
8.1 下一代可微渲染的方法
現(xiàn)有的可微渲染方法的研究和應用主要集中在局部光照模型上, 因為局部光照模型對于簡單的場景已經(jīng)十分有效. 全局光照模型計算開銷過大, 也會大大增加訓練過程的時間花費. 對于局部光照模型的可微渲染, 它的定位應當是主要處理具有高度先驗信息的簡單場景, 比如人臉或是人手, 除此以外還可以用來渲染某些屬性, 比如 PNCC 或是法向投影. 所以它的發(fā)展趨勢應當是: (1) 梯度流更精確且更具有指導意義; (2) 對渲染模型的假設和限制更少, 比如不再要求對顏色的計算是逐頂點的; (3) 對一些先進的實時渲染技術進行支持, 比如陰影和近似的全局光照; (4) 支持先進的抗鋸齒技術, 得到無鋸齒的合成圖片, 從而在物體邊界上有更精確的結果. 對于全局光照模型的可微渲染, 最迫切的需求是進行加速, 比如減少對采樣的次數(shù)的需求, 或是對渲染質量和渲染速度進行折衷. 對于全局光照模型在逆渲染的應用, 由于我們已經(jīng)有積分的結果, 也就是輸入的真實圖片, 所以基于全局光照的可微渲染方法不一定需要局限于路徑跟蹤的框架, 利用積分的結果來估計參數(shù)和導數(shù)可能存在更簡單的方法.
可微渲染的一大應用是逆渲染, 對于逆渲染這個特別的應用, 往往已經(jīng)具有真實的渲染結果了, 我們可能還有對渲染輸入的一個初始估計. 但通常可微渲染方法都沒有考慮到我們已經(jīng)有這樣一個渲染結果了, 在渲染時只考慮了渲染的輸入, 因為大多數(shù)可微渲染方法在設計時并不局限于逆渲染的應用. 對于固定逆渲染應用, 設計可微渲染方法的一個可能的嘗試是, 將這個真實的渲染結果利用上, 使渲染速度更快并讓渲染結果更好.
一個某些模塊可以自由編程的可微渲染平臺也是非常具有價值的, 這種平臺類似于 OpenGL 的可編程管線, 又類似于自動求導的工具. 因為現(xiàn)有的可微渲染工具, 大多步驟和模塊都是固定的, 這可能是由于現(xiàn)有的可微渲染方法對渲染模型的假設和限制過大. 所以當一個足夠通用的可微渲染方法被提出, 這樣的可編程可微渲染平臺也會隨之出現(xiàn).
8.2 可微渲染的應用
可微渲染已經(jīng)有豐富的應用, 在第 7 節(jié)已經(jīng)進行了詳細的介紹. 除了這些應用之外, 可微渲染還有很大的潛力等待被發(fā)掘. 可微渲染應用的發(fā)展不能離開可微渲染方法和理論的發(fā)展, 也促進了可微渲染方法和理論的發(fā)展. 在我們之前提到的應用中, 逆渲染 (包括重建幾何和位置、紋理和材質、光照和相機等參數(shù)) 是最主要也是最自然的一類應用; 除此之外使用可微渲染合成圖片 (包括語義分割和圖片合成) 則更進了一步, 它利用可微渲染的正向過程來生成結果; 使用可微渲染生成對抗樣本則跨度更大, 解決了看似不相關的問題. 許多毫不相關的問題實際上可以通過某種精妙設計的方法聯(lián)系起來, 而可微渲染本身就是圖形學和計算機視覺之間的橋梁, 也是三維模型和二維圖片之間的橋梁, 它更可能被用于各種意想不到的應用, 比如可能用作分析數(shù)據(jù)分布和結構的工具. 除此以外, 利用可微渲染制作生成數(shù)據(jù)或是帶標注的數(shù)據(jù)集是一件有意義的事情.
對于現(xiàn)有的應用, 依然有許多未解決的問題. 對于從單張照片進行重建的應用, 由于信息的缺失, 一方面只能恢復部分的三維模型; 另一方面, 如何完全解耦光照相機等全局參數(shù)和形狀紋理參數(shù)依然是一個大問題, 比如人臉重建領域, 在弱透視投影下無法解耦位姿參數(shù)和表情參數(shù) [68] . 現(xiàn)有的許多方法都是借助可微渲染來訓練一個深度神經(jīng)網(wǎng)絡的, 通過神經(jīng)網(wǎng)絡預測出參數(shù), 但神經(jīng)網(wǎng)絡的穩(wěn)定性、魯棒性和可解釋性都有待提高. 對于不同視角的照片或是對照片進行微小旋轉, 預測的結果變化很大. 對于視頻應用, 許多預測的結果不夠光滑從而產(chǎn)生大量抖動, 或是不同幀的結果差異較大. 可微渲染本身具有穩(wěn)定性、魯棒性和可解釋性, 今后可能借助可微渲染來設計通用具有穩(wěn)定性、魯棒性和可解釋性的神經(jīng)網(wǎng)絡或是其他方法.
8.3 分析數(shù)據(jù)的工具
對于解析的可微的渲染方法, 我們可以利用它來分析數(shù)據(jù)分布的結構, 比如數(shù)據(jù)的概率分布和流形結構. 許多機器學習的方法對數(shù)據(jù)都有一定的假設, 比如概率分布的假設或是流形結構的假設, 但這些假設很難驗證, 也很難去確認它的結構. 一方面是因為得到的數(shù)據(jù)只是數(shù)據(jù)真實分布的一些采樣點, 對于維度非常高的數(shù)據(jù)空間, 很難用少量采樣點來描述. 生成的數(shù)據(jù)能夠很好地幫助我們解決這個問題, 比如對于圖片相關的工作, 利用傳統(tǒng)渲染方法生成數(shù)據(jù)能夠有效地幫助我們解決許多問題, 但還不足以幫助我們完全了解數(shù)據(jù)的真實分布和結構. 我們可以把傳統(tǒng)的渲染方法當作黑盒的數(shù)據(jù)采樣器, 解析的可微渲染方法就是白盒的數(shù)據(jù)采樣器. 想要完全了解數(shù)據(jù)的真實分布, 黑盒的數(shù)據(jù)采樣器還不足夠, 因為數(shù)據(jù)分布和結構可能很復雜. 使用可微渲染器生成對抗樣本 [41, 42] 可能已經(jīng)是這個方向的萌芽. 假設數(shù)據(jù)具有流形結構, 了解數(shù)據(jù)的內在維度, 是了解數(shù)據(jù)的一種方法. 對于生成一類數(shù)據(jù), 可能有很多輸入?yún)?shù), 但相比于數(shù)據(jù)的內在維度可能要多很多, 因為許多參數(shù)之間互相耦合并不獨立. 如果我們有一個完全解析的渲染過程, 我們可以借助這個渲染過程來分析數(shù)據(jù)的內在維度. 當我們對數(shù)據(jù)的分布和結構有一定的理解之后, 一方面能幫助我們設計更好的模型來解決實際問題, 另一方面也能幫我們解釋某些黑盒模型.
9 總結
本文首先介紹了傳統(tǒng)渲染管線, 以 OpenGL 的可編程渲染管線為例, 介紹了傳統(tǒng)渲染管線中每個步驟的任務. 隨后逐步引入可微渲染的主要思想、基本原理和方法, 對它們進行介紹、分析和比較. 其中詳細介紹了 3 種主流的可微渲染方法和幾種其他的可微渲染方法, 大致可以分為兩類, 一類是求得近似導數(shù)用于反向傳播, 另一類是改編了傳統(tǒng)渲染管線中的步驟, 讓像素對頂點可導. 本文介紹了 3 種基于路徑跟蹤的可微渲染, 一種是基于邊采樣的蒙特卡洛路徑跟蹤的方法, 一種是重參數(shù)化不連續(xù)的被積函數(shù)的方法, 另一種是路徑空間的可微渲染方法. 本文隨后列出了一些開源的可微渲染工具, 并整理了它們的特性, 供讀者參考并進行比較. 本文介紹了可微渲染的廣泛應用, 分為人臉、人體、人手和物體 4 個方面. 本文在最后列舉了一些可微渲染可能的發(fā)展方向以及對未來進行展望. 希望本綜述能幫助讀者快速理解可微渲染的思想, 找到最適合的可微渲染方法以及開源工具.
論文指導 >
SCI期刊推薦 >
論文常見問題 >
SCI常見問題 >