K2E-B-G6-2 · Paper Note

Instant-NGP

Created 2024-03-31Updated 2026-06-11slam / papers / g-geometry-rendering / g6-radiance-field-foundations

  • Description:Instant-NGP 论文笔记 — 多分辨率哈希编码 + 小 MLP,把 NeRF 训练从数小时压到秒级(NeRF 任务 15 s 起、1–5 min 达 mip-NeRF 质量),validated 四个任务;多个 NeRF-SLAM 的渲染后端
  • My Notion Note ID:K2E-B-G6-2
  • Created:2024-03-31
  • Updated:2026-06-11
  • License转载欢迎:转载请注明作者 Yu Zhang 并附原文出处(yuzhang.io

Table of Contents


1. Summary

Title: Instant Neural Graphics Primitives with a Multiresolution Hash Encoding Authors: Thomas Müller, Alex Evans, Christoph Schied, Alexander Keller (NVIDIA) Paper: arXiv:2201.05989 (ACM ToG / SIGGRAPH 2022) Github: NVlabs/instant-ngp

Instant-NGP 用多分辨率哈希编码 (multiresolution hash encoding) 替代 NeRF 的大 MLP + 正弦位置编码,把训练时间从数小时压到秒级(NeRF 任务 15 s 即与 NeRF/NSVF 竞争,1–5 min 达 mip-NeRF 质量),同时在四个图形原语任务 (NeRF、gigapixel 图像、SDF、NRC(神经辐射缓存,路径追踪渲染器中实时在线训练的网络,预测第一个非镜面顶点的出射辐射,Müller 2021)) 上保持竞争力。核心思路:把"表达能力"从参数量大的 MLP 转移到可学习的多分辨率特征哈希表,MLP 只做轻量解码。

在 NeRF Synthetic 数据集,5 分钟训练达到 33.18 dB(mip-NeRF 需数小时才到 33.09 dB);东京 gigapixel 全景 2.5 分钟达到 38.59 dB(ACORN 同质量需 36.9 小时)。速度提升主要来自两端:哈希编码让 MLP 大幅缩小(原 8层×256 → density 1隐层×64 + color 2隐层×64,约 ~20× 参数减少),加上自研 CUDA "全融合" 框架 tiny-cuda-nn 消除中间内存搬运。

在 SLAM 生态里,Instant-NGP 成为多个实时 NeRF-SLAM 的渲染后端:Orbeez-SLAMGO-SLAMNeRF-SLAM 均用它替换原始慢速 NeRF 做实时 mapping。后被 3D Gaussian Splatting 在部分场景进一步超越。

Instant-NGP 重建的石像鬼 (gargoyle),展示多分辨率哈希编码捕获的细节:眼球纹理与鳞片微结构


2. Key Contributions

  • 多分辨率哈希编码LL 个可学习哈希表 × 不同空间分辨率,O(1)/层查找,特征拼接后喂小 MLP;task-agnostic,只需调 TTNmaxN_{\max} 两个超参
  • 自动碰撞消歧:固定大小哈希表不显式解碰撞,靠梯度平均 + 多分辨率跨层互补自动聚焦重要区域,不需树结构/稀疏体素
  • tiny-cuda-nn:全融合 CUDA kernel,level-by-level 流式处理 + 半精度存储 + 稀疏 Adam,实现端到端 ~10× 加速
  • 速度–质量 Pareto 前沿:20–60× 快于频率编码,质量与 mip-NeRF 相当或更好
  • 多任务验证:同一框架覆盖 NeRF、gigapixel、SDF、NRC 四类,仅改 loss 函数和输出 head

3. Method

3.1 多分辨率哈希编码

核心结构:LL 个哈希表,每表分辨率按几何级数排列。

分辨率公式(Eq. 2–3):

Nl=Nminbl,b=exp ⁣(lnNmaxlnNminL1)(2–3)N_l = \lfloor N_{\min} \cdot b^l \rfloor, \quad b = \exp\!\left(\frac{\ln N_{\max} - \ln N_{\min}}{L - 1}\right) \tag{2–3}

NlN_l:第 ll 层网格分辨率;NminN_{\min}:最粗分辨率(默认 16);NmaxN_{\max}:最细分辨率(NeRF 场景 512–524288);bb:公比;LL:层数(默认 16)。

空间哈希函数(Eq. 4):

h(x)=(i=1dxiπi)modT(4)h(\mathbf{x}) = \left(\bigoplus_{i=1}^{d} x_i \pi_i\right) \bmod T \tag{4}

\bigoplus:按位 XOR;xix_i:整数坐标分量;πi\pi_i:质数 (π1=1, π2=2,654,435,761, π3=805,459,861\pi_1=1,\ \pi_2=2{,}654{,}435{,}761,\ \pi_3=805{,}459{,}861);TT:哈希表大小(2142^{14}2242^{24})。质数 XOR 去除空间相关性,不同坐标方向碰撞模式相互独立。

3.2 查找流程(每输入点)

对输入坐标 xR3\mathbf{x} \in \mathbb{R}^3,逐层执行:

  1. 按第 ll 层分辨率 NlN_l 缩放 x\mathbf{x},取包围体素的 2d=82^d = 8 个整数角点
  2. 对每个角点做哈希 h()modTh(\cdot) \bmod T,从表 θl\theta_lFF 维特征
  3. 按体素内位置做三线性插值,得该层 FF 维输出
  4. 拼接所有 LL 层 (LFL \cdot F 维) + 辅助输入 (view dir 等) → 小 MLP 解码

默认参数:T[214,224]T \in [2^{14}, 2^{24}]F=2F=2L=16L=16(消融实验确定的 Pareto 最优)。

3.3 哈希碰撞的隐式消解

哈希表大小固定 → 不同空间点可能映射同槽。Instant-NGP 不显式解碰撞,而是:

  • 碰撞点梯度自然平均;对 loss 贡献大的点(有表面的地方)梯度更大,优化自动聚焦
  • 不同层碰撞模式不同 → 多分辨率跨层互补消歧
  • MLP 额外消歧:消融实验(Fig. 11)显示线性层 vs MLP 差距 — 线性层背景噪声明显,MLP 处理高光细节显著更好(+15% 计算但质量大幅改善)

3.4 tiny-cuda-nn

自研 CUDA 全融合框架(Müller 2021)。关键优化:

  • Level-by-level 流式:先查所有输入的第 1 层,再查第 2 层,最大化 L2 cache 命中率(避免随机访问)
  • 半精度存储:哈希表条目 2 byte(fp16),保 full-precision master copy 做稳定 Adam 更新
  • 稀疏 Adam:跳过零梯度的槽,稀疏场景 ~10% 加速
  • 避免控制流分歧:不像八叉树/BVH 需要条件分支和指针追逐,全规整访问模式

3.5 NeRF 体渲染(任务应用)

哈希编码输出的多分辨率特征经小 MLP 解码为体密度 σi\sigma_i 和颜色 ci\mathbf{c}_i,用标准 NeRF 体渲染积分合成像素颜色:

C^(r)=iTi(1exp(σiδi))ci,Ti=exp ⁣(j<iσjδj)\hat{C}(r) = \sum_i T_i\bigl(1-\exp(-\sigma_i\delta_i)\bigr)\mathbf{c}_i, \quad T_i = \exp\!\Bigl(-\sum_{j<i}\sigma_j\delta_j\Bigr)

σi\sigma_i:第 ii 采样点体密度(MLP density head 输出,与视角无关);δi\delta_i:相邻采样点步长;ci\mathbf{c}_i:该点颜色(MLP color head 输出,依赖视角方向 d\mathbf{d} 的球谐编码);TiT_i:透射率(到达第 ii 点前未被遮挡/吸收的累积概率)。训练 loss:C^(r)C(r)22\|\hat{C}(r) - C^*(r)\|^2_2(对真值像素颜色 CC^* 的 L2 光度损失)。

MLP 分两段:density MLP(仅用位置哈希特征,输出 σi\sigma_i + 中间几何特征)→ color MLP(几何特征 + SH 方向编码 γ(d)\gamma(\mathbf{d}),输出 ci\mathbf{c}_i)。Instant-NGP 将原版 NeRF 的正弦位置编码替换为多分辨率哈希特征,其余体渲染框架相同。换 loss 即支持其他任务(SDF:截断距离损失;gigapixel:2D 坐标直接→像素颜色)。


4. Experiments & Results

NeRF Synthetic 数据集(Table 2)

方法 训练时间 平均 PSNR
NeRF (原版) ~数小时 31.01 dB
mip-NeRF ~数小时 33.09 dB
Instant-NGP(1 分钟) 1 min 32.64 dB
Instant-NGP(5 分钟) 5 min 33.18 dB

5 分钟超过 mip-NeRF 数小时水平;单场景 Mic 15 秒达 34.76 dB、1 分钟达 35.92 dB。

Gigapixel 图像

东京全景(18,000×9,000 像素):2.5 分钟达 38.59 dB;4 分钟达 41.9 dB。ACORN 达到同级质量需 36.9 小时。

渲染性能

训练完成后 NeRF 任务 60 FPS @ 1920×1080(RTX 3090),支持景深 / 抗锯齿等实时效果。

Instant-NGP 的 NeRF 渲染效果(机器人场景),展示可微分渲染的视角合成质量


5. Ablation & Discussion

哈希表大小 TT(Fig. 4)

TT2142^{14} 增到 2242^{24}:质量随 TT 亚线性提升,在 T219T \approx 2^{19}(约 6 MB,L2 cache 上限)后进入平台期。更大的 TT 不再有益,推荐范围 2192^{19}2212^{21}

特征维度 FF 与层数 LL(Fig. 5)

固定总参数量 FTL=224F \cdot T \cdot L = 2^{24},测试 F{1,2,4,8}F \in \{1,2,4,8\}L{4,8,16,32}L \in \{4,8,16,32\}(F=2,L=16)(F=2, L=16) 在 gigapixel / SDF / NeRF 三任务上全部取得最优 Pareto 点。F=1F=1 在 RTX 3090 上因半精度 atomic 效率低而变慢。

MLP 规模(Fig. 10)

测试 {1,2,3}\{1,2,3\} 层 × {16,32,64,128,256}\{16,32,64,128,256\} 宽:64 宽时 Pareto 最优。最终架构:density MLP 1 隐层 × 64color MLP 2 隐层 × 64(非对称)。更深的 density MLP 无质量改善,更宽则计算冗余。

线性 vs MLP 解码器(Fig. 11)

哈希编码后接线性变换(不用 MLP)背景噪声明显,镜面高光质量明显差;MLP 仅增加 ~15% 计算但质量显著提升。说明哈希输出本身需要非线性消歧,不是直接可用的特征。


6. Strengths / Limitations / Future Work

优势:

  • 速度:NeRF 任务 15 s 即与 NeRF/NSVF 竞争、1–5 min 达 mip-NeRF 质量,60 FPS 实时渲染
  • 任务无关:四类图形原语同一框架,仅改 loss
  • 内存有界:哈希表大小固定,不随场景复杂度增长
  • 易扩展:tiny-cuda-nn 作为独立库可嵌入任何神经渲染管线

局限:

  • 哈希碰撞在极细节区域可能引入噪声(大场景 + 小 TT 时更明显)
  • 无拓扑/几何约束:表示纯隐式,提取 mesh 需额外后处理(Marching Cubes 等)
  • tiny-cuda-nn 强依赖 NVIDIA GPU,跨平台受限
  • 无界 NeRF 场景(outdoor)需额外 contraction 等处理,paper 实验均为有界场景

后续影响:

  • 催生一批实时 NeRF-SLAM(Orbeez-SLAM / GO-SLAM / NeRF-SLAM)
  • 3D Gaussian Splatting 在部分室外/动态场景进一步突破,但 Instant-NGP 仍是隐式表示的速度标杆
  • tiny-cuda-nn 作为独立开源框架被广泛复用

7. Code Walkthrough

仓库:NVlabs/instant-ngp。PyTorch 绑定通过 NVlabs/tiny-cuda-nn 提供。

入口

# C++ GUI 模式(NeRF 任务,直接拖数据集目录)
./instant-ngp data/nerf/fox

# Python 脚本模式(支持超集命令行参数)
python scripts/run.py --scene data/nerf/fox --mode nerf

scripts/run.py 是灵活接口:命令行参数超集,可指定 snapshot 保存路径、训练步数、评估 PSNR 等。

核心模块

模块 位置 作用
哈希编码 tiny-cuda-nn include/tiny-cuda-nn/encodings/grid.h 多分辨率哈希表 + 三线性插值,全 CUDA
小 MLP tiny-cuda-nn include/tiny-cuda-nn/networks/fully_fused_mlp.h 全融合矩阵乘,half precision
NeRF 场景 include/neural-graphics-primitives/nerf_network.h 哈希编码 + density MLP + color MLP 组合
训练循环 src/testbed_nerf.cu 射线采样、volume rendering、loss、Adam 步骤
数据集 scripts/colmap2nerf.py COLMAP → transforms.json 转换

关键超参

哈希编码参数(L,T,F,Nmin,NmaxL,T,F,N_{\min},N_{\max})来自 Table 1;Adam 参数与训练步数来自 Section 4 正文,不在 Table 1。

参数 符号 默认值 出处
层数 LL 16 Table 1
哈希表大小 TT 2142^{14}2242^{24}(范围;2192^{19}2212^{21} 为 Fig. 4 消融推荐区间) Table 1
特征维度 FF 2 Table 1
最粗分辨率 NminN_{\min} 16 Table 1
最细分辨率 NmaxN_{\max} 512–524288(NeRF 场景) Table 1
Adam β1,β2,ε\beta_1, \beta_2, \varepsilon 0.9, 0.99, 101510^{-15} Section 4 正文
训练步数 31000 (NeRF/gigapixel) Section 4 正文

Paper vs Code

  • Paper 描述哈希函数用质数 XOR;代码在 grid.h 中实现完全一致
  • Paper 声称 60 FPS @ 1080p;实际帧率因场景/GPU 不同有较大浮动(RTX 3090 全速时)
  • tiny-cuda-nn GridEncoding 支持多种 grid 类型(HashGridDenseGridTiledGrid),paper 主实验用 HashGrid

References