Introduction
架構
- NeRF的input和output
- task
- input:目標物體,各個角度拍出來的照片(image set)
- output:3D場景(3D representation)
- model
- input:一個空間點資訊
- 這個空間點資訊是成像平面(相機)所對應出去的射線上經過的空間點
- \((x, y, z)\)
- \((\theta, \phi)\)
- \(\theta\):極坐標系的方位角,即xy平面的方位角
- \(\phi\):傾斜角,即z軸方向的垂直角
- output:該空間點(作為光源)的色彩資訊
- \((rgb, \sigma)\)
- \(\sigma\):該點的色彩密度
- 數學上的嚴格定義:光線在極小區間中停止於此空間點的機率,類似於不透明度
- 整體架構
- 我們先在物體旁邊設置很多照相機,拍出物體不同角度的相片
- 對於這些相片中,我們對相機照射出去的光線軌跡進行採樣,採樣出此路徑上的空間點資訊
- 將這些空間資訊\((x, y, z, \theta, \phi)\)輸入給模型,並輸出輸出對應的色彩資訊\((rgb, \sigma)\)
- 透過此路徑上各個點的色彩資訊,經過volume randering進行組合渲染,得到預測的成像
- 透過預測成像和Ground truth(相片)計算loss
- Gradient descent優化模型
- Three component
- 透過 Neural network 作為 implicit representation 描述場景
- 可微分的 Volume randering function
- Posiotion encoding 和 Hierarchical sampling 優化
- Plenoptic Function
- 描述眼睛如何看見世界
- 將眼睛視為光線終點
- \((x, y, z, \theta, \phi, \lambda, t)\)所對應出去的光線打入眼睛時的成像
- NeRF的概念起源便是重建此Plenoptic Function,差別在於NeRF傾向於從光粒子為起點(即重視光粒子的座標)的概念出發
Image Not Showing
Possible Reasons
- The image was uploaded to a note which you don't have access to
- The note which the image was originally uploaded to has been deleted
Learn More →
- NeRF的限制
- 需要許多相機的額外資訊
- 假設一個pixel位於相片中的\((i, j)\),相機焦距為\(f\)
- pixel 對應的 camera 3D coordinate 為\((i-\frac w2, j-\frac h2, -f)\)
- 將焦距定義為1
- camera 3D coordinate 為\((\frac{i-w/2}f, \frac{j-h/2}f, -1)\)
- 再乘上 Rotate Matrix並加上 original 便可以得到 World 3D coordinate
- viewpoint…
- 可透過SFM獲得資訊
觀察
- 直接使用座標資訊\((x, y, z)\),會造成模型無法成功表示複雜場景,會有解析度不足的問題
- 對輸入進行position encoding,可以讓模型表現得更好
- 會需要採樣大量的射線樣本
優點
- 論文方法繼承了volumetric representations的優點
- 可以表示複雜的現實3D場景
- 可微分可使用梯度下降法
- 且大幅度降低了原先高解析度場景所需的儲存空間需求
Mesh based方法
Image Not Showing
Possible Reasons
- The image was uploaded to a note which you don't have access to
- The note which the image was originally uploaded to has been deleted
Learn More →
- 一開始我們先以一個基礎形狀視為我們物體的3D表示
- 接著透過2D影像所預測出來的mesh圖,去對我們的基礎形狀做梯度下降法的更新
- 這方法受限於我們的初始基礎形狀不能和物體實際形狀相差太大,否則可能會害模型train不起來
Volumetric representations方法
- 將3D場景以voxel進行保存
- 舊方法是直接透過圖片採樣對voxel進行著色
- 較新的方法一樣是透過訓練一個模型,這個模型可以根據輸入的Mesh based圖片資料集去預測出voxel的表示,在測試時再透過alpha-compositing和learned compositing對新角度進行渲染。
- 這樣的方法成功對複雜景完成重現,但缺點是需要大量的時間訓練和空間儲存voxel
- 對比mesh,這方法雖然更好進行優化,但需要大量的空間去儲存voxel資訊
- NeRF的方法是直接訓練模型針對我們要的場景進行重建,模型被設計成輸入空間位置資訊,並輸出相關的RGB和密度
- 此方法相當於將原先的大量離散voxel資料,轉化為連續函數儲存於模型參數當中
- 大幅降低了空間需求
目前主流方法
- 並非建構出整個3D場景,而是將3D場景視為一個隱函式(model)表示
- Occupancy Network(2019)
- x, y, z -> occupancy(占有區域)
- 此方法需要有3D Ground truth來幫助訓練
- 通常透過3D形狀資料集
- DeepSDF
-
x, y, z -> distance
-
輸入一組位置資訊,模型會輸出物體的SDF
-
SDF是一種有號距離資訊
-
透過這樣的距離表示來推測物體(VAE?)
- Scene Representation Networks
- x, y, z -> lantent vector(color, distance)
- Differentiable Volumentatric Rendering
- x, y, z -> color, occurpancy
- 透過數學方法去實現渲染函式,可以僅透過2D圖片完成訓練
- 將3D模型表示為一個表面,並使用數學方法去計算每個光線表面的交點
- 使用數學方法計算每個交點導數
- 將這些資訊輸入給模型並輸出預測RGB
- 不過即使這樣,也只能模擬較為簡單的物體,對複雜形狀會無法處裡
Neural Radiance Field Scene Representation
Image Not Showing
Possible Reasons
- The image was uploaded to a note which you don't have access to
- The note which the image was originally uploaded to has been deleted
Learn More →
Volume Randering
Traditional Volume randering
- 處理真實世界建模的渲染,也就是模擬將虛擬世界投影出來以後,光線經過各種變換最終傳到我們眼睛的樣子
- e.g.一個物體本身可能反射光線、空氣中的粒子(煙、霧等)可能對粒子造成散射等等
- 由於3D渲染要處理的是一個三維空間中每個物體都會有各自的影像(光),他們在這個場景中彼此發射出的光粒子如何互相干擾、最後傳到我們的視網膜上
- 分為四個事件
- 吸收
- 放射
- 外散射(碰撞偏離)
- 內散射(碰撞吸收)
- 基本上一個光粒子最終的光度可以表示為放射+內散射-吸收-外散射
- NeRF中,為了簡化,僅考慮吸收和放射
數學推導
- 變數定義
- \(\sigma(t)\):光線在\(t\)被吸收的機率
- \(T(t)\):光線在\(t\)之前不被吸收的機率
\(T(t)\):
\(T(t + dt) = T(t)*(1-\sigma(t)dt)\)
\(T(t + dt) = T(t) - T(t)\sigma(t)dt\)
\((T(t+dt)-T(t))/dt\equiv T'(t)=-T(t)\sigma(t)\)
\(T'(t)/T(t)=-\sigma(t)\)
\(\int T'(t)/T(t)dt=-\int\sigma(t)dt\)
\(lnT(t)=-\int\sigma(t)dt\)
\(T(t)=e^{-\int\sigma(t)dt}\)

- 一個成像平面所顯示出來的每一個pixel,都是3D空間中的光粒子彼此之間互相作用最終呈現的結果
- 今天有一台相機,我們想要知道某一個pixel的顏色會是什麼,可以透過考慮一條射線的光粒子互相影響的結果
- 一個光粒子為成像所帶來的影響,我們可以視為相機的射線射出去,停在這個光粒子上,然後這個光粒子回傳給我們的顏色
- 可以寫作 \(T(t)\sigma(t)c(t, d)\)
- 光線在此粒子之前都沒有被吸收的機率x光線在此粒子上停留的機率x光粒子回傳的顏色
- 考慮光線上所有粒子的影響,寫作積分
- \(\int_{t_n}^{t_f}T(t)\sigma(t)c(t, d)dt\)
- \(t_n, t_f\) 為光線的出發點和終止點
- 實務上我們無法真正對光線上進行連續採樣,因此會將光線切成一個區域一個區域的做法
- \(\int_{t_n}^{t_f}T(t)\sigma(t)c(t, d)dt\ \approx\ \sum_{i=n}^f\int_{i}^{i+1}T(t)\sigma(t)c(t, d)\)
- 針對每個值進行特殊處理
- \(T(t)\) 因為是在到\(t\)之前不被吸收的機率,可以以獨立事件進行機率拆解
- \(\begin{align}T(t)&=T(t_0)*T(t-t_0)\\&=e^{-\int\sigma(t_0)dt}*e^{-\int\sigma(t-t_0)dt}\\&=e^{-(\int\sigma(t_0)dt+\int\sigma(t-t_0)dt)}\end{align}\)
- 針對每一個區段張開
- \(T(t)=e^{-\sum_{i=1}^n\sigma_i\delta_i}\)
- \(\sigma\) 對其進行\(\alpha\ compositing\)
- \(\alpha_i = 1-e^{-\sigma_i\delta_i}\)
- upper在1,flour在0的函數(取\(\sigma_i\in[0, 1]\))
會這樣做處理應該是因為\(\sigma\)的定義,若區間越大則粒子在此區間被吸收的機率也會跟著變高(不透明度變大)Lalalalex
- \(c\)則視為色彩在區間內為定值
- 最終公式:\(\sum_{i=1}^NT_i(1-e^{-\sigma_i\delta_i})c_i\), where \(T_i=e^{-\sum_{i=1}^{i-1}\sigma_i\delta_i}\)

Optimizing a NeRF
Position encoding
- 作者發現直接使用\((x, y, z)\)作為網路輸入,會使生成出來的場景解析度不足
- 原因是因為MLP不擅長低維度輸入
- 可以想像,若我們給了兩個position非常接近的輸入,但具有截然不同的輸出時,雖然對人類來講這兩個position就是不一樣,但在模型眼中,他們是非常接近的兩個連續輸入(畢具MLP就是數學運算,接近的position會導致模型具有接近的輸出結果)。因此當模型無法很好的區分這兩個顏色時,模型便會傾向於這兩個顏色的平均值,最後導致了輸出模糊(解析度不高)的結果
- 因此作者對輸入進行了 Position encoding
- encoding函數:\(\gamma(p)=(sin(2^0\pi p), cos(2^0\pi p)...sin(2^L\pi p), cos(2^L\pi p))\)
- 其中 \(L\) 是一個 Hyperparamater
- 實作中,座標設定\(L=10\),角度設定\(L=4\)
- 對於座標和角度的三個值都分別對它們進行此轉換
- 作者提到此轉換類似於 transformer 使用的 position encoding,但數學意義上不太相同
- transformer 是希望將離散的位置資訊編碼給不包含位置資訊的 transformer 架構
- 在此篇論文則是希望將低維度輸入映射到高維度幫助MLP訓練

Hierarchical volume sampling
- 原始的 Volume Randering 設計是透過將光線切成等距的點進行離散採樣
- 但實際上,一條光線上的各個點貢獻不一定是等價的
- e.g.許多點可能是空氣界質或甚至被遮蔽物擋住,這些點對最終成像貢獻不大
- 因此,這樣的等價採樣方式是非常沒有效率的
- Hierarchical volume sampling 是希望透過給這些採樣點一個權重,幫助模型更好的進行採樣
- 首先我們會有兩個模型
- coarse和fine
- 我們先對 Volume Randering 公式進行小小的修改
- 原始:\(\sum_{i=1}^{N_c}T_i(1-e^{-\sigma_i\delta_i})c_i\), where \(T_i=e^{-\sum_{i=1}^{i-1}\sigma_i\delta_i}\)
- 修改後:\(\sum_{i=1}^{N_c}w_ic_i\)
- 即 \(T_i(1-e^{-\sigma_i\delta_i})\) 寫作 \(w_i\)
- 接著,先正常採樣 \(N\) 個點,並將其輸入 coarse 得到結果並得到 \(w_i\)
- We first sample a setof \(N_c\) locations using stratified sampling, and evaluate the “coarse” network at these locations
- 再來使用得到的 \(w_i\),對其進行 Normalizing
- \(\hat w_i=w_i/\sum_{j=1}^{N_c} wj\)
- 接著將新的 \(\hat w_i\) 視為一組PDF,並透過 inverse transform sampling 進行採樣,得到新的採樣 \(N_f\)
- 將\(N_c\)和\(N_f\)的聯集輸入模型得到結果以後進行Volume Randering得到最終結果
- We sample a second set of \(N_f\) locations from this distribution using inverse transform sampling, evaluate our “fine” network at the union of the first and second set of samples, and compute the final rendered color of the ray \(\hat C_f(r)\) using all \(N_c\) + \(N_f\) samples
之所以要選擇以\(T_i(1-e^{-\sigma_i\delta_i})\)作為權重,概念上是因為這個地方計算出來的結果是光粒子在這個點被回傳的機率,當這個值計算出來的越大,我們可以理解為這個位置對於最終渲染出來的顏色貢獻越大。Lalalalex
Implementation details
- Hyperparamaters
- batch
- 一個batch的資料:許多ray的sample
- we randomly sample a batch of camera rays from the set of all pixels in the dataset
- batch size = 4096(rays)
- \(N\)
- optimizer
- Adam
- \(\beta_1=0.9\)
- \(\beta_2=0.999\)
- learning rate
- 5e-4
- exponential decay scheduler with final lr 5e-5
- Loss funtion設計:coarse和fine的MSE
- \(L=\sum_{r\in R}(|\hat C_c(r)-C(r)|^2+(|\hat C_f(r)-C(r)|^2)\)
- \(R\) 是一個batch的ray
- \(C(r)\)是GT,\(\hat C_c(r)\)是coarse的結果,\(\hat C_f(r)\)是fine的結果
- 模型最終結果是透過fine計算出來的
- Note that even though the final rendering comes from , \(\hat C_f(r)\)we also minimize the loss of \(\hat C_c(r)\) so that the weight distribution from the coarse network can be used to allocate samples in the fine network.
Experiment
Dataset

- Diffuse Synthetic 360
- 由四種Lambertian object組成
- 簡單的幾何模型
- 從上半球進行環狀拍攝
- 512x512 pixels
- Synthetic rendering
- Realistic Synthetic 360
- 八種複雜幾何non-Lambertian物件
- 其中六種是由上半球環狀拍攝的
- 剩下兩種是全視角拍攝
- 800x800 pixels
- Synthetic rendering
- Real Forward-Facing
- 複雜場景的真實圖像
- 由手機前向拍攝
- 1008x756
- 在這個Dataset上,論文的LPIPS表現輸給LLFF,但作者認為它們達到了更好的mulitview consistency和artifacts
- Though LLFF achieves slightly better LPIPS, we urge readers to view our supplementary video where our method achieves better multiview consistency and produces fewer artifacts than all baselines.


Ablation studies
- PE: Position encoding
- VD: View-dependence
- H: Hierarchical sampling

Conclusion
- 提出了一個使用MLP和可微分方程進行場景重建的方法
- 以5D資料作為MLP的輸入
- 達到了比過去模型都還要好的表現
Future work
- 對於sample的效率上還有優化空間
- 解釋性(interpretability)
- 過往sampled representation模型可以透過觀察voxel或是mesh,來比較清楚地了解模型效果不佳的原因
- 但今天我們使用Neural network作為3D場景的implicit representation,卻難以從模型的weight直接觀察到這點