神經(jīng)輻射場(chǎng) (NeRF)
博客原文地址:https://liwen.site/archives/2288
- 網(wǎng)站: https://www.matthewtancik.com/nerf
- 論文:https://arxiv.org/pdf/2003.08934.pdf
- 代碼:https://github.com/bmild/nerf
參考文獻(xiàn):
基本流程

NeRF的輸入是一個(gè)五維向量: (物體)空間點(diǎn)的位置 和 (相機(jī))觀測(cè)方向
。輸出是體密度(volume density,
,可以理解為透明度)和基于觀測(cè)角度的物體的空間點(diǎn)色彩
。
通過(guò)對(duì)每一束從相機(jī)射出的光線,計(jì)算途徑空間點(diǎn)的色彩 和體密度
。然后基于獲得的空間點(diǎn)的色彩和體密度,進(jìn)行體素渲染 (Volume Rendering)得到預(yù)測(cè)的像素值。
NeRF的網(wǎng)絡(luò)模型(以下簡(jiǎn)稱 NeRF-Model) 實(shí)現(xiàn)的功能實(shí)際上是 。實(shí)現(xiàn)了從 【空間點(diǎn)位置 + 觀測(cè)角度】 到 【空間點(diǎn)色彩+體密度】 的映射。
輻射場(chǎng)體素渲染
輻射場(chǎng)體素渲染(Volume Rendering with Radiance Fields)
對(duì)于任意一條從相機(jī)射出的光線(ray,),我們可以通過(guò) NeRF-Model 去預(yù)測(cè)對(duì)應(yīng)路徑上的所有空間點(diǎn)
的透明度
和 色彩
。
這里我們假設(shè)有一條光線 ,這條光線在空間中的范圍是
到
。對(duì)于任意一點(diǎn)
, 我們可以通過(guò) NeRF-Model 計(jì)算出它的透明度
和 色彩
。對(duì)于這條光線上的所有點(diǎn)
,我們可以通過(guò)積分的形式,去累計(jì)他們的值,得到投射到圖片上的像素值
。
是射線從
到
這一段路徑上的累積透明度,可以被理解為這條射線從
到
一路上沒(méi)有擊中任何粒子的概率。
推導(dǎo)如下:
假設(shè)
定義為為在
點(diǎn)擊中粒子的概率(瞬時(shí)透明度)。則在
沒(méi)有點(diǎn)擊中粒子的概率為
。
因此,在點(diǎn)前沒(méi)有沒(méi)有被擊中的概率
為,
(一路上沒(méi)有擊中任何粒子的概率) 和
(在
沒(méi)有點(diǎn)擊中粒子) 的乘積:
離散化的表示形式:

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

概述: 在訓(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) 和觀測(cè)角度
, 他們的取值范圍歸一化到 [-1, 1]。對(duì)于每一個(gè)數(shù)值,例如
, 通過(guò)函數(shù)
映射到
空間中,這里
指的是編碼的數(shù)量,對(duì)于位置坐標(biāo),
;對(duì)于觀測(cè)角度,
。
對(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

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)抽樣 個(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

這里權(quán)重是歸一化的概率分布密度(PDF)。我們?cè)偈褂媚孀儞Q采樣(inverse transform sampling)抽取 個(gè)點(diǎn),放入fine網(wǎng)絡(luò)進(jìn)行推理。 這樣總共可以得到
個(gè)點(diǎn)。然后再使用前面體素渲染的公式對(duì)這
個(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),然后采樣和
個(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è)光線,,
。優(yōu)化器是Adam(
,
,
), 學(xué)習(xí)率
等。整個(gè)訓(xùn)練需要100-300k 次迭代(細(xì)節(jié)請(qǐng)參照論文)。