博客原文地址: https://liwen.site/archives/2288
NeRF的輸入是壹個五維向量: (物體)空間點的位置 和 (相機)觀測方向 。輸出是體密度(volume density, ,可以理解為透明度)和基於觀測角度的物體的空間點色彩 。
通過對每壹束從相機射出的光線,計算途徑空間點的色彩 和體密度 。然後基於獲得的空間點的色彩和體密度,進行體素渲染 (Volume Rendering)得到預測的像素值。
NeRF的網絡模型(以下簡稱 NeRF-Model) 實現的功能實際上是 。實現了從 空間點位置 + 觀測角度 到 空間點色彩+體密度 的映射。
輻射場體素渲染(Volume Rendering with Radiance Fields)
對於任意壹條從相機射出的光線(ray, ),我們可以通過 NeRF-Model 去預測對應路徑上的所有空間點 的透明度 和 色彩 。
這裏我們假設有壹條光線 ,這條光線在空間中的範圍是 到 。對於任意壹點 , 我們可以通過 NeRF-Model 計算出它的透明度 和 色彩 。對於這條光線上的所有點 ,我們可以通過積分的形式,去累計他們的值,得到投射到圖片上的像素值 。
是射線從 到 這壹段路徑上的累積透明度,可以被理解為這條射線從 到 壹路上沒有擊中任何粒子的概率。
離散化的表示形式:
概述 : 在訓練階段,輸入壹系列(如100張)圖片和他們的拍攝相機角度、內參、場景邊界(可以使用COLMAP獲得)。 然後優化NeRF網絡(幾層MLP)。訓練過的NeRF,可以實現任意角度的渲染。
兩項設計幫助提升高分辨率復雜場景的性能
神經網絡傾向於學習低頻函數 [35]。輸入網絡之前,把輸入信號映射到高維空間可以幫助網絡更好的適應高頻變化。這個觀點在 Transformer 的文章中多次被使用,即位置編碼(Positional encoding)。具體做法如下:
對於輸入的三個位置坐標 和觀測角度 , 他們的取值範圍歸壹化到 [-1, 1]。對於每壹個數值,例如 , 通過函數 映射到 空間中,這裏 指的是編碼的數量,對於位置坐標, ;對於觀測角度, 。
對比Transformer中的 positional encoder ,Transformer主要是用它為Token提供離散的位置編碼沒有位置順序的概念。而我們的位置編碼,使用連續的空間位置作為輸入,映射到了壹個連續的高維空間。從而幫助後面的MLP網絡封號的學習高頻信息。
效果對比:
Complete Model V.S. No Position Encoding
分層取樣(Hierarchical volume sampling):渲染的速度是壹個關鍵的因素。 空白的空間 和 遮蓋的空間 對於最終渲染出來的像素沒有幫助,因而可以省略。
NeRF使用了兩個網絡進行優化:粗糙(coarse)和 調整(fine)。首先,在壹條光線上,使用分層抽樣(stratified sampling)抽樣 個點,使用coarse網絡推理,重寫之前的體素渲染公式:
這裏權重是歸壹化的概率分布密度(PDF)。我們再使用逆變換采樣(inverse transform sampling)抽取 個點,放入fine網絡進行推理。 這樣總***可以得到 個點。然後再使用前面體素渲染的公式對這 個點進行計算,得到最終的像素值。
在每次優化叠代中,隨機從數據集中選取壹組從相機射出的光線(ray),然後采樣 和 個樣本分別訓練coarse和fine網絡。基於體素渲染的方法, 得到像素值和ground truth 對比計算 MSE loss。進而訓練神經網絡。
具體的,batch size 是4096個光線, , 。優化器是Adam( , , ), 學習率 等。整個訓練需要100-300k 次叠代(細節請參照論文)。