都2022年了,我不允許你還不懂NeRF
作者丨mathfinder@知乎
https://zhuanlan.zhihu.com/p/569843149
NeRF,即Neural Radiance Fields(神經(jīng)輻射場(chǎng))的縮寫。研究員來自UCB、Google和UCSD。
Title:NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis
Paper:https://arxiv.org/pdf/2003.08934.pdf
Code:https://github.com/bmild/nerf
寫這篇文章的動(dòng)機(jī)是,一方面NeRF實(shí)在太重要了代表著計(jì)算機(jī)視覺、圖像學(xué)結(jié)合的未來重要方向;另一方面NeRF對(duì)于計(jì)算機(jī)視覺背景的同學(xué)有一定的理解門檻,這篇文章試圖以最小背景知識(shí)補(bǔ)充、最少理解成本為前提介紹NeRF。
整體介紹
NeRF的研究目的是合成同一場(chǎng)景不同視角下的圖像。方法很簡(jiǎn)單,根據(jù)給定一個(gè)場(chǎng)景的若干張圖片,重構(gòu)出這個(gè)場(chǎng)景的3D表示,然后推理的時(shí)候輸入不同視角就可以合成(渲染)這個(gè)視角下的圖像了。
「3D表示」有很多種形式,NeRF使用的是輻射場(chǎng),然后用「體渲染」(Volume Rendering)技術(shù),給定一個(gè)相機(jī)視角,把輻射場(chǎng)渲染成一張圖像。選用輻射場(chǎng)+體渲染的原因很簡(jiǎn)單,全程可微分。這個(gè)過程很有意思,可以理解為把一個(gè)空間朝一個(gè)方向上拍扁,空間中的顏色加權(quán)求和得到平面上的顏色。
輻射場(chǎng)
所謂輻射場(chǎng), 我們可以把它看做是一個(gè)函數(shù):如果我們從一個(gè)角度向一個(gè)靜態(tài)空間發(fā)射一條射線, 我們可以查詢到這條射線在空間中每個(gè)點(diǎn) 的密度 , 以及該位置在射線角度 下 呈現(xiàn)出來的顏色 , 即 。其中密度是 用來計(jì)算權(quán)重的, 對(duì)點(diǎn)上的顏色做加權(quán)求和就可以呈現(xiàn)像素顏色。實(shí)際上, 對(duì)于輻射場(chǎng)我們只要維 護(hù)一個(gè)表, 給定一個(gè) 直接查表獲得RGB值和密度, 給體渲染方法用就好了。而 NeRF提出了更好的方法:用神經(jīng)網(wǎng)絡(luò)來建模這個(gè)映射。
體渲染
所謂體渲染,直觀地說,我們知道相機(jī)的焦點(diǎn),焦點(diǎn)和像素的連線可以連出來一條射線,我們可以對(duì)這條射線上所有的點(diǎn)的顏色做某種求和就可以得到這個(gè)像素的顏色值。
理論上,我們可以對(duì)這條射線經(jīng)過空間上的每個(gè)點(diǎn)的密度(只和空間坐標(biāo)相關(guān))和顏色(同時(shí)依賴空間坐標(biāo)和入射角)進(jìn)行某種積分就可以得到每個(gè)像素的顏色。當(dāng)每個(gè)像素的顏色都計(jì)算出來,那么這個(gè)視角下的圖像就被渲染出來了。如下圖所示:

從相機(jī)焦點(diǎn)出發(fā),往一個(gè)像素連出一條射線,獲取射穿過空間中每個(gè)點(diǎn)的屬性,進(jìn)行積分得到這個(gè)像素的顏色
為了順利完成上面過程,我們可能需要維護(hù)碩大無朋Tensor來表示輻射場(chǎng),查表獲取RGB和密度。這里一個(gè)問題是空間有多大表就有多大,同時(shí)只能是離散表示的。NeRF要做的事情是用一個(gè)神經(jīng)網(wǎng)絡(luò)來建模輻射場(chǎng),這樣無論空間有多大,不影響我們表示輻射場(chǎng)的所需要的存儲(chǔ)量,而且這個(gè)輻射場(chǎng)表示是連續(xù)的:.

用神經(jīng)網(wǎng)絡(luò)來代替查表的方式表示輻射場(chǎng)
整體過程
因?yàn)?strong>神經(jīng)網(wǎng)絡(luò)是可微分的,選取的體渲染方法是可微分;體渲染得到的圖片和原圖計(jì)算MSE Loss。整個(gè)過程可端到端地用梯度回傳來優(yōu)化非常漂亮。整個(gè)訓(xùn)練Pipeline如下圖所示:

看到這,讀者就已經(jīng)大致理解NeRF的原理了,后面章節(jié)是NeRF的具體細(xì)節(jié)。
用輻射場(chǎng)做體渲染
前面我們已經(jīng)大致理解體渲染的過程是怎么做了。可是怎么沿著射線對(duì)空間中的顏色進(jìn)行積分呢?如果我們把射線看作是光線,可以直觀得到這個(gè)積分要滿足的兩個(gè)條件:
一個(gè)點(diǎn)的密度越高,射線通過它之后變得越弱,密度和透光度呈反比 一個(gè)點(diǎn)的密度越高,這點(diǎn)在這個(gè)射線下的顏色反應(yīng)在像素上的權(quán)重越大
因此, 我們?nèi)绻麖慕裹c(diǎn)到一個(gè)像素上連的射線為:, 其中 是原點(diǎn), 是時(shí)間。時(shí) 間起點(diǎn) (near bound) 和時(shí)間終點(diǎn) (far bound) 為 和 。我們有沿著這條射線積分得到像素顏色的公式如下:

觀察這個(gè)式子積分里面是 、密度 和顏色 的乘積, 其中 是累積透光率, 表示光線射到這"還剩多少光"。
因此對(duì)于這個(gè)像素的顏色, 這個(gè)點(diǎn)的顏色的權(quán)重為 , 即光線射到這個(gè)點(diǎn)還剩多少光, 以及這個(gè)點(diǎn)的密度是多少。
那么, 我們繼續(xù)觀察 的表示, 它是密度在射線上的積分后, 取反后, 取指數(shù)。直觀上也是比較好理解的, 前面經(jīng)過的點(diǎn)密度越高, 后面剩余的光越少。嚴(yán)格的推導(dǎo)在這里不再贅述, 感興趣的讀者可以查看文獻(xiàn)《Ray tracing volume densities》。
而實(shí)際渲染過程,我們只能把射線平均分成N個(gè)小區(qū)間,每個(gè)區(qū)間隨機(jī)采樣一個(gè)點(diǎn),對(duì)采樣得到的點(diǎn)的顏色進(jìn)行某種加權(quán)求和:


其中, 。這里值得注意的是, 原來積分的權(quán)重是 , 這里的求和權(quán)重是 。而 和密度 是呈正比的。具體的推導(dǎo)過程參考: 《Optical models for direct volume rendering》。
神經(jīng)輻射場(chǎng)的兩項(xiàng)優(yōu)化點(diǎn)
Positional encoding
類似Transformer的做法,把坐標(biāo)和視角用更高維度的表示作為網(wǎng)絡(luò)輸入,來解決渲染圖像比較糊的問題:

Hierachical volume sampling
因?yàn)榭臻g中的密度分布是不均勻的,射線均勻隨機(jī)采樣的話,渲染效率會(huì)比較低:射線射了半天可能經(jīng)過高密度的點(diǎn)比較少。從上面的分析我們可以看到,整個(gè)渲染過程無非是對(duì)射線上的采樣點(diǎn)的顏色進(jìn)行加權(quán)求和。其中權(quán)重 .
我們可以用渲染公式中對(duì)顏色加權(quán)權(quán)重 作為在對(duì)應(yīng)區(qū)間采樣的概率。我們訓(xùn)練兩個(gè)輻射場(chǎng)網(wǎng)絡(luò), 一個(gè)粗糙網(wǎng)絡(luò) (Coares) 一個(gè)精細(xì)網(wǎng)絡(luò) (Fine)。粗糙網(wǎng)絡(luò)是在均勻采樣得到比較少 )的點(diǎn)進(jìn)行渲染并訓(xùn)練的網(wǎng)絡(luò), 用來輸出 進(jìn)行采樣概率估計(jì)。對(duì) 進(jìn)行歸一化, 把它看作是概率值:


以 為概率分布采樣 個(gè)點(diǎn), 用 個(gè)點(diǎn)來訓(xùn)練精細(xì)網(wǎng)絡(luò)。
Architecture
如下圖所示, 把坐標(biāo) 映射出60維的向量, 輸入到全連接網(wǎng)絡(luò)得到密度 ; 視角 映射得到的24維向量和 的前一層輸出特征拼接在一起, 經(jīng)過兩層MLP得到RGB值。值得注意的是, 為了加強(qiáng)坐標(biāo)信信, 坐標(biāo)的信息會(huì)在網(wǎng)絡(luò)中間再輸入一次。這里的網(wǎng)絡(luò)結(jié)構(gòu)設(shè)計(jì)體現(xiàn)了, 密度和視角無關(guān), 顏色和視角相關(guān)。

【DASOU學(xué)習(xí)圈】已經(jīng)成立,旨在分享AI算法崗的最強(qiáng)八股文(覆蓋數(shù)學(xué),機(jī)器學(xué)習(xí)基礎(chǔ),機(jī)器學(xué)習(xí)模型,NLP,CV),各大廠的面經(jīng),簡(jiǎn)歷修改。同時(shí)提供一對(duì)一提問,幫你更好的入門深度學(xué)習(xí),拿到更好的算法崗offer。
感興趣的可以戳這里了解,或者直接掃描下方二維碼加入。
