純小白入門,開山之作NeRF學習筆記!
本文經自動駕駛之心公眾號授權轉載,轉載請聯系出處。
神經輻射場究竟是什么
輻射場:由光源發出的光線在場景中的傳播和反射過程中所形成的能量分布。通俗來說就是一個函數,記錄了空間某個位置處向某個方向的輻射信息,輻射信息(或者說能量分布)其實就是顏色、亮度、陰影等信息。這里的方向需要額外留意,它是NeRF實現真實重建的重要因素之一!
由此引出神經輻射場的概念。
神經輻射場:用神經網絡儲存空間位置向任意方向的輻射。原文中的描述如下:
更加規范的公式表達如下:
輸入3D位置(x,y,z)和2D的視角方向(),輸出是顏色和體密度
NeRF具體的網絡結果參考原文如下:
- 3D坐標x輸入第一個網絡fσ,包含8層全連接層,每層256個神經元,ReLU激活;
- 網絡fσ輸出體密度σ和一個256維向量,該向量與視角方向d送入fc(一層,128通道,ReLU激活)預測RGB;
由上面可知,NeRF是隱式建模,因為模型是儲存在MLP里面的,模型就是MLP的參數,這和以往點云和mesh建模不同(點云/mesh是可以直接看到模型的)。NeRF必須查詢一個個的三維點,然后渲染成一章圖像。這種查看方式或者說渲染方式就叫體渲染。
在看體渲染之前。我們先看一下網絡的效果如何:
可以看出,不同視角下顏色是不同的!這是NeRF相對于傳統重建非常重要的優勢之一~
NeRF的核心:體渲染
下面進入NeRF的第二個核心要點——體渲染。體渲染就是用來將顏色和密度渲染成2D圖像的方法!
示意圖如下:圖a展示了從相機光心位置發出射線,射線上有采樣點,將采樣點和方向送入MLP獲得顏色和體密度。圖c展示的的就是沿射線的體密度分布曲線,是通過采樣獲得的,對曲線進行積分就能獲得像素的顏色。這個過程就是體渲染
總結一下體渲染步驟:
- 從相機光心發出穿透每個像素的射線,射線上取三維采樣點;
- 將采樣點坐標和視角方向送入MLP計算顏色和體密度;
- 按體密度積分(堆疊)顏色信息,形成2D圖像
體渲染的公式如下:
當然實際使用的是離散版本公式:
隱式重建流程
在講完神經輻射場和體渲染后,現在開始完整的重建流程~
在形成一個完成的pipeline之前,還有以下兩個問題需要解決:
為了解決上述兩個問題,NeRF提出了位置編碼和分層采樣過程
位置編碼:
論文直觀展示了位置編碼的效果對比:
可以看出,去掉位置編碼,模型無法表達高頻的幾何和紋理信息~
多層采用:
訓練流程如下:
實驗和總結
評價指標:
實驗設置:
實驗結果可以看出,各種材質的小球上面的散光也可以很好的表現出來~
消融實驗:
總結
文提出的神經輻射場,從相機光心發出穿過像素的采樣射線,在射線上取點,將其三維位置和視角方向用一個MLP映射到體密度和顏色,然后用體渲染堆疊采樣射線上的體密度和顏色,獲得像素值。像素值與GT圖像求誤差后反向傳播,優化MLP參數。本文用這樣的隱式重建方法實現了照片級的具有真實感的模型重建和渲染。
缺陷:
- 渲染、訓練速度慢;
- 對視角數量和分布有較高要求;
- 難以拓展到有背景的或者較大的場景。
原文鏈接:https://mp.weixin.qq.com/s/ctDBTaLWuHTM9MONrAor4g