Skip to content

NeRF 神经辐射场重建

NeRF(Neural Radiance Fields)用神经网络隐式表示 3D 场景,通过体渲染(Volume Rendering)从任意视角生成照片级真实图像,开创了神经隐式表示的新范式,对 3D 重建、新视角合成和场景理解产生了深远影响。

NeRF架构示意

核心原理

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)$ 是透射率。

python
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 环境
  • 自动驾驶仿真:生成逼真的驾驶场景

相关资源

最近更新