作者:LongwayDate:2020-04-25
程式碼網址:https://github.com/hiroharu-kato/neural_renderer
論文名稱:Neural 3D Mesh Renderer(CVPR2018)
概述
對於二維影像背後的三維世界建模,哪一種三維表示最合適?現在常見的表示方法有點雲、體素和網格,其中多邊形網格具有良好的緊緻性和幾何性質。但是使用神經網路直接由多邊形網格生成影像比較困難,因為光柵化的過程阻止了反向傳播。因此,作者提出了一個近似的梯度柵格化,使渲染整合到神經網路。使用這個渲染器,可以執行帶有輪廓影像監督的單影像三維網格重建,並且該系統比現有的基於體素的方法更好。此外,作者還首次在2D監督下執行基於梯度的3D網格編輯操作,如2D到3D風格遷移和3D DeepDream。
簡介
從二維影像理解三維世界是計算機視覺的基本問題之一。人類在大腦中使用視網膜上的影像來模擬3D世界,機器也可以通過在2D影像背後顯式地建模3D世界來更智慧地工作。從3D世界生成影像的過程叫做渲染,這在計算機視覺裡面非常重要。哪種3D表示方法是最適合建模3D世界?通常有體素、點雲和多邊形網格。體素難以生成高質量的體素,因為他們是在三維空間有規律地進行取樣,並且記憶效率比較低。點雲存在紋理和照明難以應用的問題,因為點雲沒有表面。多邊形網格由一系列頂點和表面組成,因此它們是可伸縮的,並且有面,進而作者採用了這種方式。
使用網格這種表示方式有兩個好處,第一個是表示三維模型時,需要的引數少,模型和資料集也相應比較小。第二個就是它適合幾何變換。物件的旋轉、平移和縮放由頂點上的簡單操作表示。這篇文章提出了兩個應用,如下圖所示。第一個是單影像三維網格重建,第二個是基於梯度的3D網格編輯,包括風格遷移和DeepDream。
這篇論文主要有三個方面的貢獻:
1.提出了一個近似的梯度網格渲染,使渲染整合到神經網路;
2.實現了從單影像實現三維網格重建,並且沒有3D監督;
3.實現了基於梯度的三維網格編輯操作,例如風格遷移和3D DeepDream。
相關工作
1.神經網路中的三維表示:三維表示有很多方法,比如前面提到的體素、點雲等,但是它們都有一定的不足,或者不適合三維重建。其中,多邊形網格具有儲存效率高、適用於幾何變換且具有曲面等特點,因此它實際上是計算機圖形學(CG)和計算機輔助設計(CAD)中的標準形式。然而,由於多邊形網格的資料結構是一個複雜的圖形,很難整合到神經網路中。
2.單圖片三維重建:從影像中估計三維結構是計算機視覺中的一個傳統問題,大多數方法使用真實的三維模型來學習2D到3D的對映函式,有些作品通過深度預測重建三維結構,有些則直接預測三維形狀。實際上,無需3D監督即可實現三維預測,只需要待重建物體的輪廓即可。
3.通過梯度下降編輯影像:利用可微特徵提取器和損失函式,通過反向傳播和梯度下降,可以生成損失最小的影像,DeepDream就是這樣一個例子。初始影像被反覆更新,使得其影像特徵的大小變得更大,通過這個過程,像狗和汽車這樣的物體逐漸出現在影像中,影像風格轉換可能是最熟悉和最實際的例子了,給定內容影像和樣式影像,將生成具有指定內容和樣式的影像。
該渲染器提供影像相對於網格頂點和紋理的漸變。因此,利用二維影像的損失函式就可以實現網格的DeepDream和風格轉換。
渲染的近似梯度
1.渲染通道及其派生:一個3D網格由一組頂點和麵組成,每個頂點No是一個三維向量,表示這個頂點在3D物體空間中的座標,每個面F是由三個頂點所圍成的三角形。為了生成這個物件,物體空間中的頂點No被轉化為螢幕空間中的頂點Ns,這個頂點Ns是一個二維向量。
通過取樣從螢幕空間的頂點Ns和麵F生成影像,這個過程叫做光柵化。下圖說明了單個影像的光柵化:
2.單面光柵化:這一部分主要講解了當畫素點在裡面或者外面時,如何定義偏導函式。涉及到的公式比較多,後面將以視訊的方式呈現,如果想要提前瞭解的可以聯絡我。
3.多面光柵化:如果有多個面,光柵化器只在每個畫素處繪製最前面的面,這與標準方法相同。在向後傳遞的過程中,首先檢查是否繪製了交叉點Iij、Iaij和Ibij,如果它們被不包括Vi的表面遮擋,則不流動梯度。
4.紋理:紋理可以對映到面上。在這個專案中,每個面都有自己的大小為St×St×St的紋理影像。使用質心座標系確定紋理空間中對應於三角形{V1,V2,V3}上位置P的座標。換句話說,如果P表示為P=W1V1+W2V2+W3V3,則讓(w1,w2,w3)成為紋理空間中的相應座標。
5.照明:照明系統可以直接應用於網格上,在這項工作中,使用了簡單的環境光和無陰影的平行光。設la和ld分別為環境光和平行光的強度,nd為指示平行光方向的單位向量,nj為面的法向向量。然後,將表面畫素Ilj的修改顏色定義為:
神經渲染器的應用
1.單影像三維重建:基於體素的方法能夠直接生成一個3D模型,但是對於網格來說比較困難。因此,在這項工作中,作者不是從頭生成網格,而是將預定義網格變形以生成新網格。具體地說,使用一個有642個頂點的各向同性球體,並使用區域性偏置向量Bi和全域性偏置向量C將每個頂點Vi變成Vi+Bi+C的形式。分別定義輪廓損失Lsl和平滑度損失Lsm如下所示:
輪廓損失中的S表示的是二進位制mask,平滑度損失中的θ表示相鄰兩個面的夾角度數,兩個損失函式分別保證了渲染後的效果和模型的光滑。
2.基於梯度的三維網格編輯:在這項工作中,基於其渲染影像R來優化由頂點Vi、面Fi和紋理Ti組成的3D網格m,而不是生成影像進行編輯。
2D到3D的風格遷移:在本節中,作者提出了一種將影像Xs的樣式傳輸到網格Mc上的方法。對於二維影像,風格遷移是通過同時最小化內容損失和風格損失來實現的。在這裡,作者把內容指定為三維網格Mc。為了使生成的網格形狀與Mc相似,假設兩個網格的頂點到面的關係相同,我們重新定義瞭如下內容損失函式:
作者使用了與2D應用中相同的風格損失,如下所示:
同時使用正則化器來降低噪聲,設P表示影像R中所有相鄰畫素對的一組顏色:
3D DeepDream:設f(x)為輸出影像x特徵圖的函式。對於2D影像來說,通過從x=x0開始的梯度下降最小化-|f(x)|2F來實現影像x0的DeepDream。在類似的過程中,將-|f(R(m,φ))|2F相對於Vi和Ti最小化來實現DeepDream。
結果展示