1. 程式人生 > 其它 >NeRF 核心思想簡記

NeRF 核心思想簡記

NeRF 核心思想簡記

Overview

  • 輸入:空間中的位置 x,相機的方向 d
  • 輸出:x 位置的顏色和體密度 \(\sigma\)
  • 對映:\(F_{\theta}(x,d)->(c,\sigma)\),c是顏色,\(\theta\)是網路的引數。

這個輸出不是最終畫素的顏色,而是空間中一點的顏色和密度,還需要用體渲染的演算法將顏色混合,才能得到最終的畫素顏色。

網路結構

很簡單,x 經過一定層數的 MLP,輸出一個特徵向量和 \(\sigma\),然後將特徵向量和相機方向向量拼接,進入MLP,輸出顏色c,(c, \(\sigma\)) 作為網路最終的輸出。

體渲染

常見的體渲染的方法,網路的輸出只是解決了空間一點的密度和顏色問題,還需要對他們進行累加。這裡只截取了論文的離散後的公式,分別討論一下符號的意義。

  • \(\sigma\) 表示密度,密度越大代表當射線遍歷到這裡的時候,被阻擋的概率越大,所以後面的顏色可能就看不見了,也能理解為不透光率。
  • \(T_i\) 累計的透光率,從j出發一直累計到i-1,計算出i點之前的透光率,這個值越大,代表能看到此點顏色概率越大。其實和密度意思差不都,只是這裡用exp做了變換,將其壓縮在0-1之間,而且\(\sigma\)表示是不透光率,這裡取個反。
  • \(c\) 是當前點的顏色。
  • \(r = O + dt\),代表沿著觀察射線取一點空間位置
  • \(\delta\) 代表差分,兩次取樣的距離 \(t_{i+1} - t_{i}\)
  • 所以前面的式子表示 “當前點之前的透光率 X 當前點的不透光率 X 當前的顏色”。為什麼是當前的不透光率?因為如果當前的不透光率越大,代表射線大概率會終止在這個地方,所以此點的顏色應該貢獻也越大。所以\(c\)
    之前的係數,相當於這個點對最終畫素顏色值得貢獻。

如何將連續空間的體渲染離散?

體渲染可以選定固定的步長,例如\(t_{i+1} - t_{i}\)可以選擇固定的數值例如0.001,但是這會損失多樣性,因為場景是連續,因為可能恰好細節被跨過了。 文中採用的分層抽樣的方法。

\(t_n\)\(t_f\)劃分成\(N\)個區間,然後每次從這個\(N\)個區間均勻取樣,得到取樣點。

優化

位置編碼

直接將位置和方向資訊輸入網路,根據論文裡描述會降低生成的質量,因此將低維的輸出編碼到高維空間。

其中\(p\)是位置資訊,用這個函式進行編碼,位置和方向在論文中都進行了編碼,詳細的引數可以參考論文。

層次化取樣

有些地方可能被遮擋或者是空的空間,因此可以不採樣那麼多點,而是在細節豐富的地方進行取樣。基於此,論文中提出了訓練兩個網路,一個是coarse一個是fine,粗網路選擇\(N_c = 64\)個分段取樣,正常利用體渲染混合公式輸出顏色。得到一個射線上所有點的貢獻值後,進行歸一化,做成一個PDF,然後fine網路在進行取樣的時候,用這個PDF取樣,這樣就會在細節豐富的地方多采樣,而且取樣點也多 \(N_f = 128\)。他們的聯合取樣點混合成最終的顏色。

損失函式

MSE作為損失,其中coarse和fine輸出的顏色和GT進行比較來監督,coarse參與損失是為了讓PDF更準確。

參考

  • NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis
  • FastNeRF: High-Fidelity Neural Rendering at 200FPS