NeRF 神经辐射场重建
NeRF(Neural Radiance Fields)用神经网络隐式表示 3D 场景,通过体渲染(Volume Rendering)从任意视角生成照片级真实图像,开创了神经隐式表示的新范式,对 3D 重建、新视角合成和场景理解产生了深远影响。
核心原理
NeRF 将 3D 场景表示为一个连续的 5D 函数:
$$F_\theta: (x, y, z, \theta, \phi) \rightarrow (\mathbf{c}, \sigma)$$
其中 $(x,y,z)$ 是 3D 位置,$(\theta,\phi)$ 是观察方向,$\mathbf{c}$ 是 RGB 颜色,$\sigma$ 是体密度。
体渲染
沿每条射线积分,合成像素颜色:
$$C(\mathbf{r}) = \int_{t_n}^{t_f} T(t) \sigma(\mathbf{r}(t)) \mathbf{c}(\mathbf{r}(t), \mathbf{d}) dt$$
其中 $T(t) = \exp\left(-\int_{t_n}^{t} \sigma(\mathbf{r}(s)) ds\right)$ 是透射率。
import torch
import torch.nn as nn
class NeRF(nn.Module):
"""简化的 NeRF 模型"""
def __init__(self, pos_dim=63, dir_dim=27, hidden=256):
super().__init__()
# 位置编码后的维度
self.pos_mlp = nn.Sequential(
nn.Linear(pos_dim, hidden), nn.ReLU(),
nn.Linear(hidden, hidden), nn.ReLU(),
nn.Linear(hidden, hidden), nn.ReLU(),
nn.Linear(hidden, hidden), nn.ReLU(),
nn.Linear(hidden, hidden), # 跳跃连接输入
)
self.sigma_layer = nn.Linear(hidden, 1)
self.feature_layer = nn.Linear(hidden, hidden)
self.color_mlp = nn.Sequential(
nn.Linear(hidden + dir_dim, hidden // 2), nn.ReLU(),
nn.Linear(hidden // 2, 3), nn.Sigmoid()
)
def forward(self, pos_enc, dir_enc):
h = self.pos_mlp(pos_enc)
sigma = self.sigma_layer(h)
feature = self.feature_layer(h)
color = self.color_mlp(torch.cat([feature, dir_enc], dim=-1))
return color, sigma
def volume_rendering(colors, densities, deltas):
"""体渲染合成"""
# 计算透射率
alpha = 1.0 - torch.exp(-densities * deltas)
weights = alpha * torch.cumprod(
torch.cat([torch.ones_like(alpha[:, :1]), 1.0 - alpha[:, :-1]], dim=1),
dim=1
)
# 加权求和
rgb = torch.sum(weights * colors, dim=1)
depth = torch.sum(weights * torch.arange(colors.shape[1]), dim=1)
return rgb, depth位置编码
NeRF 使用位置编码将低维输入映射到高维空间,使 MLP 能够学习高频细节:
$$\gamma(p) = [\sin(2^0 p), \cos(2^0 p), \sin(2^1 p), \cos(2^1 p), \ldots, \sin(2^{L-1} p), \cos(2^{L-1} p)]$$
位置编码的重要性
没有位置编码,MLP 倾向于学习低频函数(Neural Tangent Kernel 理论解释了这一现象)。位置编码将输入映射到多个频率尺度,使网络能够同时学习粗结构和精细细节。
NeRF 变体演进
| 变体 | 核心改进 | 训练速度 | 渲染速度 |
|---|---|---|---|
| Mip-NeRF 360 | 抗锯齿编码 | 慢 | 慢 |
| Instant-NGP | 哈希编码 | 快(5s) | 实时 |
| Nerfacto | 组合最优模块 | 中 | 实时 |
| 3DGS | 高斯溅射 | 快 | 极快 |
Instant-NGP:哈希编码
Instant-NGP 的多分辨率哈希编码是 NeRF 加速的关键突破:
- 将可学习特征存储在多分辨率哈希表中
- 三线性插值查询特征,替代 MLP 处理位置编码
- 配合小型 MLP,训练时间从小时级降到秒级
NeRF 的应用
- 新视角合成:从有限照片生成任意视角图像
- 3D 场景重建:从 2D 观察恢复 3D 结构
- 虚拟现实:构建可交互的 3D 环境
- 自动驾驶仿真:生成逼真的驾驶场景