社群計算機視覺課程文件
神經輻射場(NeRF)
並獲得增強的文件體驗
開始使用
神經輻射場(NeRF)
神經輻射場(Neural Radiance Fields, NeRFs)是一種在神經網路中儲存3D場景的方式。這種儲存和表示場景的方式通常被稱為隱式表示,因為場景引數完全由底層的多層感知機(MLP)表示。(相比之下,顯式表示將顏色或密度等場景引數明確儲存在體素網格中。)這種新穎的場景表示方法在新視角合成任務中展現了非常令人印象深刻的結果,即從訓練集中未包含的攝像機視角插值出新視角。此外,它允許我們以比顯式表示更小的記憶體佔用儲存大型場景,因為我們只需要儲存神經網路的權重,而體素網格的記憶體大小是立方增加的。
簡史 📖
NeRF領域相對年輕,Mildenhall等人於2020年首次發表論文。自那時起,大量論文發表,並取得了快速進展。自2020年以來,已有超過620篇預印本和出版物釋出,GitHub上有超過250個程式碼庫。(截至2023年12月,資料來自paperswithcode.com)。
由於最初的NeRFs配方需要很長的訓練時間(在強大的GPU上長達數天),因此在加快訓練和推理方面取得了許多進展。一個重要的飛躍是NVIDIA於2022年釋出的Instant-ngp。儘管該方法中使用的模型架構與現有架構相似,但作者引入了一種使用可訓練雜湊表的新型編碼方法。由於這種編碼方式,我們可以顯著縮小MLP的規模而不會損失重建質量。這種新方法在訓練和查詢方面更快,同時在質量上與當時的SOTA方法不相上下。同樣在2022年釋出的Mipnerf-360也值得一提。同樣,模型架構與大多數NeRFs相同,但作者引入了一種新穎的場景收縮,使我們能夠表示在所有方向上都無限的場景,這對於實際應用非常重要。Zip-NeRF於2023年釋出,結合了Instant-ngp的編碼和Mipnerf-360的場景收縮等最新進展,以處理真實世界的情況,同時將訓練時間縮短到一小時以內。(公平地說,這仍然是在強大的GPU上測量的)。
由於NeRF領域發展迅速,我們在文章末尾添加了一個部分,將介紹NeRF的最新研究和未來可能的發展方向。
但現在歷史講夠了,讓我們深入瞭解NeRF的內在機制吧!🚀🚀
基礎方法(Vanilla NeRF)📘🔍
NeRF的基本思想是將場景表示為一個連續函式,該函式將一個位置,和一個觀察方向,對映到一種顏色和體積密度。由於神經網路可以作為通用函式逼近器,我們可以用一個簡單的多層感知機(MLP)來逼近這個表示場景的連續函式。.
一個簡單的NeRF流程可以用下圖概括:
(a) 沿著攝像機射線取樣點和觀察方向,並將其透過網路。
(b) 網路輸出是每個樣本的顏色向量和密度值。
(c) 透過體積渲染將網路輸出組合起來,從3D空間中的離散樣本生成2D影像。
(d) 計算損失並透過反向傳播更新網路梯度以表示場景。
這只是一個非常高層次的概述,為了更好地理解,我們來詳細瞭解體積渲染和所使用的損失函式。
體積渲染
體積渲染過程背後的原理在經典的計算機圖形學流程中已經很成熟,並非源於NeRF。對於NeRFs的用例來說,重要的是這一步是可微分的,以便允許反向傳播。NeRFs中最簡單的體積渲染形式可以表示如下:
在上面的等式中,是相機射線預期的顏色,其中是相機的原點,是作為3D單位向量的觀察方向,並且是沿射線的距離。和分別代表射線的近端和遠端邊界。表示沿射線累積的透射率來自到.
離散化後,上述方程可以計算為以下求和形式:
下方示意圖顯示了離散化後的相機射線,以便更好地理解上述變數。

損失函式公式
由於離散化的體積渲染方程是完全可微分的,因此可以使用渲染畫素的重建損失來訓練底層神經網路的權重。許多NeRF方法使用畫素級誤差項,其公式如下:
,其中是渲染後的畫素顏色,以及是真實畫素顏色。
補充說明
在一個章節中詳細描述整個NeRF流程非常困難。上述解釋對於理解基本概念很重要,並且在每個NeRF模型中都相似甚至相同。然而,為了獲得一個表現良好的模型,還需要一些額外的技巧。
首先,為了捕捉顏色和幾何中的高頻變化,對輸入訊號進行編碼是必要的。在將輸入透過神經網路之前進行編碼的做法並非NeRF領域獨有,在其他機器學習領域(例如自然語言處理,NLP)也廣泛採用。一個非常簡單的編碼方式,將輸入對映到更高維空間,從而能夠捕捉場景引數中的高頻變化,可能如下所示:
import torch
import mediapy as media
import numpy as np
def positional_encoding(in_tensor, num_frequencies, min_freq_exp, max_freq_exp):
"""Function for positional encoding."""
# Scale input tensor to [0, 2 * pi]
scaled_in_tensor = 2 * np.pi * in_tensor
# Generate frequency spectrum
freqs = 2 ** torch.linspace(
min_freq_exp, max_freq_exp, num_frequencies, device=in_tensor.device
)
# Generate encodings
scaled_inputs = scaled_in_tensor.unsqueeze(-1) * freqs
encoded_inputs = torch.cat(
[torch.sin(scaled_inputs), torch.cos(scaled_inputs)], dim=-1
)
return encoded_inputs.view(*in_tensor.shape[:-1], -1)
def visualize_grid(grid, encoded_images, resolution):
"""Helper Function to visualize grid."""
# Split the grid into separate channels for x and y
x_channel, y_channel = grid[..., 0], grid[..., 1]
# Show the original grid
print("Input Values:")
media.show_images([x_channel, y_channel], cmap="plasma", border=True)
# Show the encoded grid
print("Encoded Values:")
num_channels_to_visualize = min(
8, encoded_images.shape[-1]
) # Visualize up to 8 channels
encoded_images_to_show = encoded_images.view(resolution, resolution, -1).permute(
2, 0, 1
)[:num_channels_to_visualize]
media.show_images(encoded_images_to_show, vmin=-1, vmax=1, cmap="plasma", border=True)
# Parameters similar to your NeRFEncoding example
num_frequencies = 4
min_freq_exp = 0
max_freq_exp = 6
resolution = 128
# Generate a 2D grid of points in the range [0, 1]
x_samples = torch.linspace(0, 1, resolution)
y_samples = torch.linspace(0, 1, resolution)
grid = torch.stack(
torch.meshgrid(x_samples, y_samples), dim=-1
) # [resolution, resolution, 2]
# Apply positional encoding
encoded_grid = positional_encoding(grid, num_frequencies, min_freq_exp, max_freq_exp)
# Visualize result
visualize_grid(grid, encoded_grid, resolution)輸出應該看起來像下圖所示

第二個值得一提的技巧是,大多數方法都使用巧妙的方法來在空間中取樣點。本質上,我們希望避免在場景為空的區域進行取樣。有各種方法可以將在對最終影像貢獻最大的區域集中取樣,但最突出的一種是使用第二個網路,通常稱為*提議網路(proposal network)*,這樣就不會浪費計算資源。如果你對這種*提議網路*的內部工作原理和最佳化感興趣,可以深入研究Mipnerf-360的出版物,該網路首次在那裡提出。
訓練你自己的NeRF
為了獲得訓練第一個NeRF的完整體驗,我建議檢視nerfstudio團隊的絕佳Google Colab筆記本。在那裡,你可以上傳你選擇的場景圖片並訓練一個NeRF。例如,你可以建立一個模型來表示你的客廳。🎉🎉
該領域的當前進展
該領域發展迅速,新出版物的數量幾乎呈爆炸式增長。在訓練和渲染速度方面,VR-NeRF和SMERF展現了非常有前景的結果。我們相信,我們很快就能在邊緣裝置上即時流式傳輸真實世界的場景,這是邁向真實*元宇宙*的一大步。然而,NeRF領域的研究不僅關注訓練和推理速度,還涵蓋了生成式NeRF、姿態估計、可變形NeRF、組合性等多個方向。如果您對精選的NeRF出版物列表感興趣,請檢視Awesome-NeRF。
< > 在 GitHub 上更新