神經(jīng)輻射場(chǎng) (NeRF)

神經(jīng)輻射場(chǎng) (NeRF)

博客原文地址:https://liwen.site/archives/2288

參考文獻(xiàn):

基本流程

image.png

NeRF的輸入是一個(gè)五維向量: (物體)空間點(diǎn)的位置 \mathbf{x}=(x,y,z) 和 (相機(jī))觀測(cè)方向 \mathbfu0z1t8os=(\theta, \phi)。輸出是體密度(volume density, \sigma,可以理解為透明度)和基于觀測(cè)角度的物體的空間點(diǎn)色彩 \mathbf{c}=(r,g,b)。

通過(guò)對(duì)每一束從相機(jī)射出的光線,計(jì)算途徑空間點(diǎn)的色彩 \mathbf{c} 和體密度 \sigma。然后基于獲得的空間點(diǎn)的色彩和體密度,進(jìn)行體素渲染 (Volume Rendering)得到預(yù)測(cè)的像素值。

NeRF的網(wǎng)絡(luò)模型(以下簡(jiǎn)稱 NeRF-Model) 實(shí)現(xiàn)的功能實(shí)際上是 F_{\Theta}:(\mathbf{x}, \mathbfu0z1t8os) \rightarrow(\mathbf{c}, \sigma)。實(shí)現(xiàn)了從 【空間點(diǎn)位置 + 觀測(cè)角度】 到 【空間點(diǎn)色彩+體密度】 的映射。

輻射場(chǎng)體素渲染

輻射場(chǎng)體素渲染(Volume Rendering with Radiance Fields)

對(duì)于任意一條從相機(jī)射出的光線(ray,\mathbf{r}),我們可以通過(guò) NeRF-Model 去預(yù)測(cè)對(duì)應(yīng)路徑上的所有空間點(diǎn) \mathbf{x}的透明度 \sigma(\mathbf{x}) 和 色彩 \mathbf{c}(\mathbf{x})

這里我們假設(shè)有一條光線 \mathbf{r}(t)=\mathbf(o)+t\mathbf(o),這條光線在空間中的范圍是 t_nt_f。對(duì)于任意一點(diǎn) t, 我們可以通過(guò) NeRF-Model 計(jì)算出它的透明度 \sigma(t) 和 色彩 \mathbf{c}(t)。對(duì)于這條光線上的所有點(diǎn) dt,我們可以通過(guò)積分的形式,去累計(jì)他們的值,得到投射到圖片上的像素值C(\mathbf{r})。

C(\mathbf{r})=\int_{t_{n}}^{t_{f}} T(t) \sigma(\mathbf{r}(t)) \mathbf{c}(\mathbf{r}(t), \mathbfu0z1t8os) d t, \text { where } T(t)=\exp \left(-\int_{t_{n}}^{t} \sigma(\mathbf{r}(s)) d s\right)

T(t) 是射線從 t_nt_f 這一段路徑上的累積透明度,可以被理解為這條射線從 t_nt_f 一路上沒(méi)有擊中任何粒子的概率。

推導(dǎo)如下:

假設(shè)T^*(t)=\sigma(t)dt 定義為為在 t 點(diǎn)擊中粒子的概率(瞬時(shí)透明度)。則在t 沒(méi)有點(diǎn)擊中粒子的概率為 1-T^*(t)=1-\sigma(t)dt。
因此,在 t+dt 點(diǎn)前沒(méi)有沒(méi)有被擊中的概率 T(t+dt) 為, T(t) (一路上沒(méi)有擊中任何粒子的概率) 和 1-\sigma(t)dt (在t 沒(méi)有點(diǎn)擊中粒子) 的乘積:

\begin{align*} T(t+dt) &= T(t) \times (1-\sigma(t)dt)\\ T(t)+T'(t)dt &=T(t)-T(t)\sigma(t)dt\\ \frac{T^{\prime}(t)}{T(t)} dt &=-\sigma(t) d t\\ log(T(t)) &=-\int_{t_{0}}^{t} \sigma(s) d s\\ T(t)&=exp(-\int_{t_{0}}^{t} \sigma(s) d s)\\ \end{align*}

離散化的表示形式:

image.png

優(yōu)化神經(jīng)輻射場(chǎng)

image.png

概述: 在訓(xùn)練階段,輸入一系列(如100張)圖片和他們的拍攝相機(jī)角度、內(nèi)參、場(chǎng)景邊界(可以使用COLMAP獲得)。 然后優(yōu)化NeRF網(wǎng)絡(luò)(幾層MLP)。訓(xùn)練過(guò)的NeRF,可以實(shí)現(xiàn)任意角度的渲染。

兩個(gè)提升

兩項(xiàng)設(shè)計(jì)幫助提升高分辨率復(fù)雜場(chǎng)景的性能

1. 位置編碼

[35] Rahaman, N., Baratin, A., Arpit, D., Dr ? axler, F., Lin, M., Hamprecht, F.A., Bengio, Y., Courville, A.C.: On the spectral bias of neural networks. In: ICML (2018)

神經(jīng)網(wǎng)絡(luò)傾向于學(xué)習(xí)低頻函數(shù) [35]。輸入網(wǎng)絡(luò)之前,把輸入信號(hào)映射到高維空間可以幫助網(wǎng)絡(luò)更好的適應(yīng)高頻變化。這個(gè)觀點(diǎn)在 Transformer 的文章中多次被使用,即位置編碼(Positional encoding)。具體做法如下:

對(duì)于輸入的三個(gè)位置坐標(biāo) \mathbf{x}=(x,y,z) 和觀測(cè)角度 \mathbfu0z1t8os=(\theta, \phi), 他們的取值范圍歸一化到 [-1, 1]。對(duì)于每一個(gè)數(shù)值,例如 p\in\mathbb{R^1}, 通過(guò)函數(shù)\gamma(\cdot)映射到 \mathbb{R^{2L}} 空間中,這里L指的是編碼的數(shù)量,對(duì)于位置坐標(biāo),L=10;對(duì)于觀測(cè)角度,L=4。

\gamma(p)=\left(\sin \left(2^{0} \pi p\right), \cos \left(2^{0} \pi p\right), \cdots, \sin \left(2^{L-1} \pi p\right), \cos \left(2^{L-1} \pi p\right)\right)

對(duì)比Transformer中的 positional encoder,Transformer主要是用它為Token提供離散的位置編碼沒(méi)有位置順序的概念。而我們的位置編碼,使用連續(xù)的空間位置作為輸入,映射到了一個(gè)連續(xù)的高維空間。從而幫助后面的MLP網(wǎng)絡(luò)封號(hào)的學(xué)習(xí)高頻信息。

效果對(duì)比:
Complete Model V.S. No Position Encoding

image.png

2. 分層取樣

分層取樣(Hierarchical volume sampling):渲染的速度是一個(gè)關(guān)鍵的因素。 空白的空間 和 遮蓋的空間 對(duì)于最終渲染出來(lái)的像素沒(méi)有幫助,因而可以省略。

NeRF使用了兩個(gè)網(wǎng)絡(luò)進(jìn)行優(yōu)化:粗糙(coarse)和 調(diào)整(fine)。首先,在一條光線上,使用分層抽樣(stratified sampling)抽樣 N_c 個(gè)點(diǎn),使用coarse網(wǎng)絡(luò)推理,重寫之前的體素渲染公式:

分層隨機(jī)抽樣:一般地,按一個(gè)或多個(gè)變量把總體劃分成若干個(gè)子總體,每個(gè)個(gè)體屬于且僅屬于一個(gè)子總體,在每個(gè)子總體中獨(dú)立地進(jìn)行簡(jiǎn)單隨機(jī)抽樣,再把所有子總體中抽取的樣本合在一起作為總樣本,這樣的抽樣方法稱為分層隨機(jī)抽樣,每一個(gè)子總體稱為層。
摘自: https://zhuanlan.zhihu.com/p/478685602

image.png

這里權(quán)重是歸一化的概率分布密度(PDF)。我們?cè)偈褂媚孀儞Q采樣(inverse transform sampling)抽取 N_f 個(gè)點(diǎn),放入fine網(wǎng)絡(luò)進(jìn)行推理。 這樣總共可以得到 N_c+N_f 個(gè)點(diǎn)。然后再使用前面體素渲染的公式對(duì)這N_c+N_f 個(gè)點(diǎn)進(jìn)行計(jì)算,得到最終的像素值。

逆變換采樣:如何通過(guò)均勻分布來(lái)采樣服從目標(biāo)函數(shù)(體素密度分布)分布的樣本集。
https://blog.csdn.net/anshuai_aw1/article/details/84840446

具體實(shí)現(xiàn)

在每次優(yōu)化迭代中,隨機(jī)從數(shù)據(jù)集中選取一組從相機(jī)射出的光線(ray),然后采樣N_cN_c+N_f個(gè)樣本分別訓(xùn)練coarse和fine網(wǎng)絡(luò)?;隗w素渲染的方法, 得到像素值和ground truth 對(duì)比計(jì)算 MSE loss。進(jìn)而訓(xùn)練神經(jīng)網(wǎng)絡(luò)。

具體的,batch size 是4096個(gè)光線,N_c=64,N_f=128。優(yōu)化器是Adam(\beta_1=0.9, \beta_2=0.999, \epsilon=10^{-7}), 學(xué)習(xí)率 5 \times 10^{-4}等。整個(gè)訓(xùn)練需要100-300k 次迭代(細(xì)節(jié)請(qǐng)參照論文)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容