NeRF — Neural Radiance Fields
- Description:NeRF 论文笔记 (读 arXiv 全文后所写) — 用 5D MLP 表示连续辐射场,体渲染积分、位置编码、分层采样。NeRF-SLAM 系列的基石
- Paper:Mildenhall, B., Srinivasan, P. P., Tancik, M., Barron, J. T., Ramamoorthi, R., & Ng, R. (2020). NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis. ECCV (Oral). arXiv:2003.08934
- K2E-B ID:[K2E-B-G6-1]
- Max3 PDF:
[K2E] SLAM/[K2E-B-G] Geometry & Rendering/[K2E-B-G6] Radiance Field Foundations/[K2E-B-G6-1][2020] NeRF Representing Scenes as Neural Radiance Fields for View Synthesis.pdf - Notion ID:(待创建)
- Created:2024-03-31
- Updated:2026-06-02
- License:转载欢迎 — 请署名 Yu Zhang 并链回 yuzhang.io 原文
Table of Contents
1. NeRF 概述
NeRF (Neural Radiance Fields) — Mildenhall et al. 2020。用一个 MLP 表示连续的 5D 辐射场,配合可微体渲染做新视角合成 (novel view synthesis)。输入只需一组已知相机位姿的图像。
三大贡献:
- 5D 神经辐射场 — MLP 参数化几何 + 视角相关材质
- 可微体渲染 + 分层采样加速
- 位置编码 — 让 MLP 表达高频细节
是后续 NeRF-SLAM (iMAP / NICE-SLAM / NeRF-LOAM...) 的表示基石。
2. 5D 神经辐射场
MLP $F_\Theta: (\mathbf{x}, \mathbf{d}) \to (\mathbf{c}, \sigma)$:
- 输入 5D:3D 位置 $\mathbf{x} = (x,y,z)$ + 视角方向 $\mathbf{d}$ (概念上 2D 球面角 $(\theta, \phi)$,实现用 3D 笛卡尔单位向量)
- 输出:颜色 $\mathbf{c} = (r,g,b)$ + 体密度 $\sigma$
关键约束:密度 $\sigma$ 只依赖位置 $\mathbf{x}$,颜色 $\mathbf{c}$ 依赖位置 + 方向 (保证多视角几何一致,同一点不同视角密度相同但颜色可变 — 模拟高光等)。
网络结构
- 位置 $\mathbf{x}$ 先过 8 层全连接 (256 通道, ReLU);第 5 层有 skip connection,把位置编码 $\gamma(\mathbf{x})$ 再次拼接到该层 → 输出 $\sigma$ (经 ReLU 保非负) + 256 维特征向量
- 特征向量 拼接位置编码后的视角方向 $\gamma(\mathbf{d})$ → 再过 1 层 (128 通道, ReLU) → sigmoid 输出 RGB $\in [0,1]$
视角方向"晚注入"是为了强制密度与方向无关。
3. 体渲染
沿相机光线 $\mathbf{r}(t) = \mathbf{o} + t\mathbf{d}$ 积分颜色:
$$ C(\mathbf{r}) = \int_{t_n}^{t_f} T(t) , \sigma(\mathbf{r}(t)) , \mathbf{c}(\mathbf{r}(t), \mathbf{d}) , dt $$
其中透射率 (光走到 $t$ 还没被挡住的概率):
$$ T(t) = \exp\left( -\int_{t_n}^{t} \sigma(\mathbf{r}(s)) , ds \right) $$
离散化 (求积 + alpha 合成)
$$ \hat{C}(\mathbf{r}) = \sum_{i=1}^{N} T_i , (1 - e^{-\sigma_i \delta_i}) , \mathbf{c}i, \quad T_i = \exp\left( -\sum{j=1}^{i-1} \sigma_j \delta_j \right) $$
$\delta_i = t_{i+1} - t_i$ 是相邻采样点间距。令 $\alpha_i = 1 - e^{-\sigma_i \delta_i}$ → 退化为标准 alpha 合成 (前到后混合,与 3DGS 的混合公式同源)。
4. 位置编码
MLP 直接吃低维 $(x,y,z)$ 会偏向低频 (糊)。位置编码把每个标量映射到高维三角函数:
$$ \gamma(p) = \left( \sin(2^0 \pi p), \cos(2^0 \pi p), \dots, \sin(2^{L-1} \pi p), \cos(2^{L-1} \pi p) \right) $$
- 位置 用 $L = 10$,方向 用 $L = 4$
- 坐标归一化到 $[-1, 1]$
这让 MLP 能表达高频细节 (后来 Instant-NGP 用多分辨率哈希编码替代,见 Instant-NGP 那篇)。
5. 分层采样
均匀采样浪费算力 (大部分点在空/被遮挡区)。NeRF 用粗 + 细两个网络:
粗网络 — $N_c$ 个分层 (stratified) 采样点,渲染并得权重:
$$ w_i = T_i (1 - e^{-\sigma_i \delta_i}), \quad \hat{w}_i = \frac{w_i}{\sum_j w_j} $$
细网络 — 把 $\hat{w}_i$ 当概率分布,重要性采样 $N_f$ 个点 (集中在有物体的地方),用 $N_c + N_f$ 个点渲染。
默认 $N_c = 64$, $N_f = 128$ (每条光线 256 次查询)。
6. 损失与训练
粗 + 细网络渲染颜色与真值的平方误差:
$$ \mathcal{L} = \sum_{\mathbf{r} \in \mathcal{R}} \left[ | \hat{C}_c(\mathbf{r}) - C(\mathbf{r}) |_2^2 + | \hat{C}_f(\mathbf{r}) - C(\mathbf{r}) |_2^2 \right] $$
(粗网络也算 loss,虽然最终只用细网络渲染 — 为了让粗网络的权重分布可靠)
训练:Adam (lr $5\times10^{-4} \to 5\times10^{-5}$ 指数衰减),batch 4096 光线,单 V100 跑 100-300k 迭代。
7. 贡献与影响
- 开创神经辐射场表示 — 整个场景仅需约 5 MB 网络权重 (相比 LLFF 约 3000× 压缩),连续可微
- 体渲染 + 位置编码 + 分层采样成为后续标配
- 局限:慢 (每场景在单 V100 上训练约 1-2 天)、需精确位姿、静态场景、单场景不泛化
- 衍生:Instant-NGP (快)、Mip-NeRF (抗锯齿)、Nerfies (可变形)、NeRF-SLAM 系列 (iMAP/NICE-SLAM/...)、最终被 3DGS 在速度上超越 (见 3D Gaussian Splatting 那篇)
References
- Mildenhall, B., et al. (2020). NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis. ECCV. arXiv:2003.08934 — 论文 (本笔记读 arXiv 全文整理)
- 项目页: matthewtancik.com/nerf
- 体渲染 alpha 合成与 3DGS 同源 (见 3D Gaussian Splatting);位置编码的后继见 Instant-NGP