NeRF: Neural Rendering 的革命性方法(—)


Posted by pomelyu on 2020-12-20

NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis. 是 UC Berkeley 和 Google 在 2020 ECCV 上剛提出的 novel view synthesis 新技術,提出不到一年,就有大量的研究以它為基礎提出(awesome-nerf),可說是這個領域的一大躍進。首篇會先以個人的想法簡介 NeRF,接著補充研究上的細節,最後再快速的彙整最近一個月內出現的最新研究。許多內容都包含筆者自己的見解,可能有不當或錯誤的地方,歡迎討論。


由標題 Representing Scenes as Neural Radiance Fields for View Synthesis 就可以知道 NeRF 將環境視為一個光場,我們看到的 2D 圖片就是收集這些光場得來的結果。將這樣的一個光場「存到」 類神經網路中就是 NeRF 所做的事情。以下是 NeRF 所表達的數學式

$$(RGB, \sigma) = \mathbf{F_{\Theta}}(x, y, z, \theta, \phi)$$

$$C(\mathbf{r}) = \int_{t_n}^{t}\mathbf{T}(t)\sigma(\mathbf{r}(t)) \mathbf{c}(\mathbf{r}(t), \mathbf{d})dt$$

$$\mathbf{T}(t) = \exp(-\int_{t_n}^{t}\sigma(\mathbf{r}(t))dt)$$

${\Theta}$ 代表「存入」環境光場的類神經網路,透過 \mathbf{F_{\Theta}},我們可以提取空間中每一個點的光場強度和顏色。根據電腦圖學中針孔相機(pin hole camera)的模型,2D 圖片中的每一個像素都可以視為一道光線在成像平面的投影結果。

以實作上來看,每個像素的數值 ($C(\mathbf{r})$),就是從這個像素 $\mathbf{r}$ 打出一道角度為 $\mathbf{d}=(\theta, \phi)$ 的光 $\mathbf{r}(t)=\mathbf{o} + t \mathbf{d}$,沿途經過光場的各個位置,接著將各個位置的數值 $\sigma(\mathbf{r}(t)) \mathbf{c}(\mathbf{r}(t), \mathbf{d})$ 收集加總求得。$\sigma$ 代表透明度,而係數 $\mathbf{T}(t)$ 代表隨著光線已穿過的不透明部分越大,加總的權重越小。

再強調一次,這邊的類神經網路代表的就是光場本身,也因為這樣每個靜止場景都需要對應到一個網路,這是這個方法應用在影片上的缺陷,也是後續幾篇研究的方向之一。

到這裡,對於熟悉電腦圖學的人來說,應該會直接聯想到 ray-tracing 這個經典的渲染方法,我想這是 NeRF 的優點:對於被描述的物體或場景並沒有假設,而且直接利用到圖學的知識,而不是像處理黑盒子般,套用沒有空間意義的 2D convolution。也因此在作者專案頁面的這個範例,可以清楚的看到金屬水龍頭上反射影像隨著視角的變化。

簡單的整理自己認為這個方法的優缺點
優點:

  • 對於被描述的場景沒有任何假設,可以處理金屬和半透明物體
  • 網路非常的小。NeRF 的網路是由 MLP(multi-layer perceptron) 構成,論文只用了 5MB 的網路就可以生成 1008x752 的高解析度影像。
  • 透過積分,可以直接取得場景的 depth map。
  • 訓練時對於 RAM 的需求不高。
  • 非常適合用漸進式的訓練 (progressive training) 產生高解析度的影像。

缺點:

  • 一個類神經網路只能描述一個場景,而且需要同一個場景多個角度的影像。但在後續的研究中,PixelReNF 提出以 few-shot 的方式建立 NeRF、Neural Scene Flow Fields for Space-Time View Synthesis of Dynamic Scenes 提出影片版的 NeRF、NeRF in the wild 則利用不同光影條件下的資料訓練網路。
  • 生成影像耗費時間。因為數值積分需要對光場取樣本點,而且取點的個數直接和品質相關,造成影像生成耗時。不過後續的研究 NVSF,利用 voxel 的輔助可以大幅的縮短生成時間。
  • 網路在訓練初期不容易穩定。因此上述的幾篇論文各自用不同的 supervised 方式來輔助初期的訓練,另外也有論文利用 meta learning 的方式初始化。

最後列出目前 GitHub 上已有的實作以供參考

  • bmild/nerf NeRF 作者在 TensorFlow 上的實作:寫的非常的好,許多部分都有註解
  • yenchenlin/nerf-pytorch: Github 上 pytorch 最早的實作,同時作者也彙整了相關的研究到 awesome-nerf
  • kwea123/nerf_pl,訓練很快,也有許多的註解,可以補充原作者的實作。

#Deep Learning #Computer Graphics #Neural Rendering #Radiance Field







Related Posts

誰是「大家」?

誰是「大家」?

用C++做資料分析 | CERN ROOT 教學[03] - 函數與函數擬合

用C++做資料分析 | CERN ROOT 教學[03] - 函數與函數擬合

[Week 2] JavaScript - 判斷式、迴圈

[Week 2] JavaScript - 判斷式、迴圈


Comments