想象你是一位主编,想给一栋老宅出一本 3D 图鉴。你雇了一位学识渊博、但回答每道题都要现场心算的“老学者”(也就是 MLP 神经网络)。你递给他一个位置坐标和观察方向,他闭目推理片刻,报出那个点的颜色和密度。问题是:出一张 800×800 的图,你要问他六千多万次;而他为了背熟这栋宅子,要先对着几张照片反复推导好几个小时,甚至好几天。这就是原版 NeRF——效果惊艳,但慢到劝退。 Instant-NGP 的骚操作,像给这位学者配了一套“多级速查卡”:把空间切成粗、中、细好几档网格,每档配一本哈希字典,输入坐标直接翻卡取特征,再交给一个轻量小网络收尾;沿途还挂满“此处为空”的指示牌(占位场),光线经过空房间直接穿过,连卡都不用翻。于是训练时间从小时级被压缩到秒级。本文就用“学者 + 速查卡”的故事,带你拆解哈希编码、碰撞容忍、占位场加速,以及 Plenoxels、Mip-NeRF 等变体的取舍。

岗位关联

对 AI 图形学从业者而言,掌握 Instant-NGP 等于掌握了把科研原型落地成实时产品的核心加速套路——无论做数字人、自动驾驶仿真还是沉浸式内容,“分级查找 + 稀疏跳过”这套思想都能直接迁移复用。

目录
  1. 可视化演示
  2. 1. 原版NeRF原理:博学的“心算学者”
  3. 2. 训练为什么这么慢:根因分析
  4. 3. 哈希编码加速:多级速查卡
  5. 4. 碰撞处理机制:会串味的便签
  6. 5. 占位场加速:空房间指示牌
  7. 6. 经典变体对比:Plenoxels 与 Mip-NeRF
  8. 7. 实现权衡要点:把旋钮拧到刚好
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

动态演示NeRF及其变体Instan的核心机制,通过全局/局部/动态/静态四种模式展示关键概念与交互流程。

本节配有交互动效(进入视口后自动加载,约 3KB)。

NeRF及其变体Instan:NeRF NeRF原版原理与体渲染方程 多分辨率哈希网格编码 核心机制可视化 NeRF及其变体Instan整体架构与关键组件

1. 原版NeRF原理:博学的“心算学者”

老宅图鉴计划启动后,你给学者布置的第一项任务是:记住整栋老宅。于是你发明了一套“提问协议”——递给他一个三维坐标,再告诉他视线从哪个方向看过去,他就要报出那个位置的颜色和密度。颜色决定你看到什么,密度决定这个点是否挡光、挡多少光。这其实是 NeRF 的全部契约:一个把“空间 + 视角”映射到“颜色 + 密度”的函数。

把这个提问协议写成数学式,就是 NeRF 的核心定义:

把提问协议讲清楚后,还要回答一个工程问题:怎么从一堆“点答案”合成一张图?做法叫“体渲染”——从相机出发,朝每个像素射出一条光线,沿路每隔一小段取一个采样点让学者读数,再用密度做权重,把所有采样点的颜色一层层加权累加,就得到这个像素的颜色。为了让学者能看清高频细节,NeRF 还会先把坐标展开成一组不同频率的正弦、余弦对再输入网络,这就是位置编码,相当于给学者配了一副能在不同尺度上变焦的“放大镜”。训练时,让“学者 + 渲染器”输出的图片尽量接近真实照片,反向传播不断调整学者的内部参数。

所以原版 NeRF 的道理并不复杂——用一位博学的“学者”把整个场景背下来。问题是,这位学者每答一题都要从头心算,慢得让人抓狂。这正是下一节要拆解的痛点。

F(x,d)→(σ,c)\text{F}(\mathbf{x},\mathbf{d})\to(\sigma,\mathbf{c})
  1. F整个 MLP 网络,即“学者”本人——一个可微分的多层感知机,训练就是让它的“学识”越来越准:F\text{F}
  2. x空间点坐标,用 x、y、z 表示物体在三维空间里的位置:x=(x,y,z)\mathbf{x}=(x,y,z)
  3. d观察方向,用 θ、φ 两个角度表示视线从哪个方向打过来——同一位置从不同角度看,颜色可能不同(高光、镜面效应):d=(θ,ϕ)\mathbf{d}=(\theta,\phi)
  4. σ体密度,一个标量,表示该点“挡光”的程度,就像房间里的雾浓度:σ\sigma
  5. c出射颜色,RGB 三通道,决定这个点最终渲染成什么颜色:c\mathbf{c}

2. 训练为什么这么慢:根因分析

学者虽然博学,但每道题都从第一性原理推演:你问 1 号点,他算一遍;问 2 号点,再算一遍;同一个位置换个观察角度,又要重算。渲染一张 800×800 的图,他要被问 64 万个像素乘上每像素上百个采样点——将近一亿次心算。这还没完,训练时他要反复“刷题”几万轮,每轮都在重算。

把总提问次数量化成一个公式:

慢有三个叠加的原因:第一,每个采样点都要完整过一遍几十层的 MLP,前向传播本身昂贵;第二,点和点之间没有任何缓存可以复用,前一轮迭代刚算完,更新权重后全部作废重来;第三,位置编码把输入扩到几十维,进一步加重首层计算量。这些因素乘在一起,让原版 NeRF 训练动辄数小时甚至好几天,渲染一帧也要等几十秒。

一句话总结:学者能力再强,也架不住“每题都重新心算”。要让训练从小时级掉到秒级,就得让他把常用答案直接“背”下来——这正是 Instant-NGP 的哈希编码要做的事。

Nquery=H×W×S×IN_{\text{query}} = H \times W \times S \times I
  1. N_query训练或渲染过程中对 MLP 的总提问次数,也就是学者被“打扰”的总次数:NqueryN_{\text{query}}
  2. H、W图像的像素规模,800×800 的图就是 64 万个像素:H×WH \times W
  3. S每条光线的采样点数,通常取 64 到 128:SS
  4. I收敛需要的迭代轮数,往往数万到数十万:II

3. 哈希编码加速:多级速查卡

与其让学者每次都从头心算,不如提前准备一套“速查卡”:把场景空间切成小格子,每个格子对应的特征值存进一本大目录。提问时,把坐标换算成目录编号,直接翻卡取出特征,学者只需对特征做极轻量的收尾加工。翻卡比心算快几个数量级,这就是 Instant-NGP 的核心思路。

哈希编码把三维坐标映射成整数槽位,数学上长这样:

光有一张卡不够:格子太粗,细节糊成一片;格子太细,格子数量爆炸。所以 Instant-NGP 用“多分辨率”——L 级网格逐级翻倍,每级都配一本独立的哈希表。查询时,每一级取出所在格 8 个角点的特征做三线性插值,再把各级特征拼接成一个长向量,喂给一个只有几层的小 MLP。这相当于同时持有“世界地图、城市图、街区图”:大地图管大局,小地图管细节,各取所需。

从“每题心算”到“翻卡取数”,学者的负担骤减,训练速度提升数百倍。但这套速查卡有个天生的小毛病——目录不够大,两个不同位置可能挤进同一张卡。碰撞了怎么办?下一节细说。

h(x1,x2,x3)=(⌊x1⌋ π1⊕⌊x2⌋ π2⊕⌊x3⌋ π3) mod Th(x_1,x_2,x_3)=\bigl(\lfloor x_1\rfloor\,\pi_1 \oplus \lfloor x_2\rfloor\,\pi_2 \oplus \lfloor x_3\rfloor\,\pi_3\bigr)\bmod T
  1. 向下取整把连续坐标离散化到网格的整数格点上:⌊xi⌋\lfloor x_i \rfloor
  2. 质数乘子三个方向分别乘以不同的大质数,打散坐标的规律性,避免相邻点挤在一起:π1,π2,π3\pi_1,\pi_2,\pi_3
  3. 异或混合把三个方向的哈希值做异或运算,让结果分布更均匀:⊕\oplus
  4. 取模映射对表大小 T 取模,把任意坐标压进固定大小的哈希表,内存可控: mod T\bmod T

4. 碰撞处理机制:会串味的便签

便签纸不够用了,两个地点写在同一个槽位里,查卡时信息会“串味”。直觉告诉我们这是 bug,应该尽量避免。但 Instant-NGP 的选择很反直觉:接受碰撞,甚至不专门处理它。

碰撞到底有多频繁?这其实是个经典的“生日悖论”问题。n 个点随机映射到 T 个槽位,至少发生一次碰撞的概率是:

Instant-NGP 为什么敢容忍碰撞?因为哈希表里的特征是可学习的。碰撞意味着几个不同坐标共享同一个槽位的特征向量,反向传播时它们的梯度会累加在一起“平均化”——互相串味,但谁也不至于太离谱。更重要的是分工:低分辨率层只负责粗略结构,撞一撞无伤大雅;高频细节交给高分辨率层,而那层哈希表更大、碰撞概率低得多。原论文的实验证明,碰撞对最终渲染质量的影响很小,训练过程会自动补偿串味。

于是“串味便签”不是缺陷,反而是内存与精度之间一次精妙的妥协。除了哈希卡,Instant-NGP 还有一块“空房间指示牌”——占位场,让光线直接绕开空气。

P≈1−exp⁡(−n(n−1)2T)P \approx 1-\exp\left(-\frac{n(n-1)}{2T}\right)
  1. n被映射的采样点个数,点数越多越容易撞:nn
  2. T哈希表的槽位总数,表越大越不容易撞:TT
  3. 组合数n 个点两两配对的组合数,决定“可供碰撞的机会”有多少:n(n−1)2\frac{n(n-1)}{2}
  4. 指数近似用泊松近似算出至少一次碰撞的概率,随点数增长无限逼近 1:exp⁡(−n(n−1)2T)\exp\left(-\frac{n(n-1)}{2T}\right)

5. 占位场加速:空房间指示牌

学者翻卡虽然快,但要是光线穿过一片空房间,沿途几十个采样点全在“翻空气”,纯属浪费。解决办法很朴素:给每个小格子挂一块“空/实”指示牌,光线路过空气格直接穿过,连翻卡都省了。

占位场是一个低分辨率的三维布尔网格,记录每个格子的密度是否超过占用阈值:

采样时先查占位场:标记为空的格子,其内的采样点直接跳过,不查哈希表、不进 MLP。一个典型室内场景里,光线穿过的大半是空区,跳过之后有效查询数常常只剩原来的三分之一甚至更少。更妙的是,这个占位场不需要人工标注——训练过程中每隔若干步,把当前网络预测密度很低的格子重新标为“空”,从粗略到精细,越训越准。

“空房指示牌”让光线只在真正有内容的地方停留,配合哈希速查卡,训练被压缩到秒级。把这两招合起来,Instant-NGP 用几 MB 显存换来几百倍提速。而它的“亲戚们”——Plenoxels 和 Mip-NeRF——则在另外两条路上探索。

Ncompute=∑i=1S1{σi≥τ}N_{\text{compute}}=\sum_{i=1}^{S}\mathbb{1}\{\sigma_i\ge\tau\}
  1. S一条光线上全部采样点的总数:SS
  2. σ_i第 i 个采样点处网络预测的体密度:σi\sigma_i
  3. τ占用阈值,密度低于它就算“空”:τ\tau
  4. 指示函数条件成立记 1、不成立记 0,把所有“需要计算”的点求和得到最终计算量:1{σi≥τ}\mathbb{1}\{\sigma_i\ge\tau\}

6. 经典变体对比:Plenoxels 与 Mip-NeRF

Plenoxels 的思路更激进:既然速查卡这么好用,干脆别请学者了,直接让卡片堆当答案——每个体素格子里直接存颜色参数。为了颜色能随视角变化,每个格子存一组球谐系数,渲染时按视角现算颜色:

没有网络 = 没有前向传播,Plenoxels 渲染时纯查表加插值,速度极快,是“速度极值”路线的代表。但代价是显存:体素密度必须足够支撑场景精度,它的显存用量往往是哈希方案的数倍甚至数十倍。Mip-NeRF 则调转方向解决“质量”问题:原版 NeRF 对远处物体按单条光线采样,容易锯齿、闪烁;Mip-NeRF 把光线换成锥体,按锥体覆盖范围做积分平均,相当于给学者戴上“自适应眼镜”,多尺度抗锯齿,代价是更慢。

三条路线各占一极:Mip-NeRF 保质量、Plenoxels 保速度、Instant-NGP 取中间。工程上怎么选,本质是“显存—精度—速度”三角的权衡。

c(d)=∑l=0L∑m=−llclm Ylm(d)\mathbf{c}(\mathbf{d})=\sum_{l=0}^{L}\sum_{m=-l}^{l}\mathbf{c}_{lm}\,Y_{lm}(\mathbf{d})
  1. c_lm每个体素格存的一组球谐系数向量,是“可学习的颜料配方”:clm\mathbf{c}_{lm}
  2. Y_lm球谐基底函数,随方向 d 变化,是“视角调制器”:Ylm(d)Y_{lm}(\mathbf{d})
  3. L球谐阶数,通常取 2 到 3 就够表达大部分视角变化:LL
  4. 双重求和把各阶系数与基底加权叠加,得到该观察方向下的颜色:∑l=0L∑m=−ll\sum_{l=0}^{L}\sum_{m=-l}^{l}

7. 实现权衡要点:把旋钮拧到刚好

速查卡也不是免费发的——卡越多,书柜越贵。Instant-NGP 落地时,最关键的几颗旋钮都直接对应真金白银的显存和算力。好消息是,哈希方案的显存账可以精确算出来:

按默认配置 L=16、T=2^19、F=2 粗算,整张表约 16 MB,非常克制。实战调参要抓三件事:第一,base_res(首层网格疏密)决定能表达的最细空间粒度,大场景要开大;第二,max_entries 决定碰撞压力和显存预算,显存吃紧时优先砍它;第三,特征维度和 MLP 宽度遵循“小而美”,F=2 在多数场景已经够用。务必警惕“越大越好”的冲动——更高的分辨率需要更多训练样本喂饱,数据稀疏的场景里反而容易欠拟合。

Instant-NGP 的工程哲学,就是把这些旋钮拧到“刚好够用”:哈希表管压缩、占位场管跳过、多分辨率管细节。当你理解了“学者 + 速查卡 + 空房牌”这套组合拳,就掌握了神经渲染落地的核心心法。

M=L×T×F×4 bytesM = L \times T \times F \times 4\ \text{bytes}
  1. L分辨率层数,默认 16 级:LL
  2. T每层哈希表的槽位数,如 2^19:TT
  3. F每个槽位存储的特征维度,通常 2 到 8:FF
  4. 字节数32 位浮点数占 4 个字节:4 bytes4\ \text{bytes}

AI 应用场景

电商与文博的秒级三维重建

阶段:数据驱动渲染 / 推理加速

解决的问题:传统摄影测量重建一个物体要数小时到数天,人工修模成本极高;Instant-NGP 把几十张手机照片的训练压到秒级,实现“边拍边建”。

具体案例:电商团队用手机环绕拍摄商品 80 张照片,NGP 训练约 30 秒就能得到可 360 度旋转的模型,直接上线商品详情页;博物馆把馆藏文物快速数字化,做成网页 3D 浏览,观众拖动鼠标就能“把玩”文物。

自动驾驶与机器人的实时占用感知

阶段:感知与场景理解

解决的问题:传统占用网格需要手工设定分辨率、难以随环境更新;占位场思想让模型在训练中动态标记空实信息,天然适配“边探索边建图”。

具体案例:巡检机器人用低成本相机绕房间一圈,秒级建出带占用信息的局部地图;路径规划时直接跳过空区,只对占用格做精细碰撞检测,导航响应从秒级降到毫秒级。

影视虚拟资产与神经渲染管线

阶段:内容生成与离线烘焙

解决的问题:传统 CG 资产建模需要大量美术工时,实景转数字场景尤其昂贵;NeRF 系列作为“采集到资产”的桥梁,把实拍素材快速变成可渲染的数字场景。

具体案例:剧组用无人机环绕拍摄实景,NGP 在几分钟内生成数字场景作为背景板,合成进镜头做虚拟制片;广告团队用 Plenoxels 生成高保真商品模型,离线烘焙后放进实时引擎。

Python 演示

python87 行
import random PRIMES = (73856093, 19349663, 83492791) def hash_coord(ix, iy, iz, size):    h = (ix * PRIMES[0]) ^ (iy * PRIMES[1]) ^ (iz * PRIMES[2])    return h % size class HashGrid:    def __init__(self, base=4, levels=4, size=64):        self.levels_n = levels        self.size = size        self.tables = [[[random.uniform(-0.1, 0.1) for _ in range(2)] for _ in range(size)]                       for _ in range(levels)]        self.res = [base * (2 ** l) for l in range(levels)]     def encode(self, x, y, z):        out = []        for l in range(self.levels_n):            r = self.res[l]            gx, gy, gz = x * (r - 1), y * (r - 1), z * (r - 1)            x0, y0, z0 = int(gx), int(gy), int(gz)            tx, ty, tz = gx - x0, gy - y0, gz - z0            acc = [0.0, 0.0]            for dx in (0, 1):                for dy in (0, 1):                    for dz in (0, 1):                        idx = hash_coord(x0 + dx, y0 + dy, z0 + dz, self.size)                        feat = self.tables[l][idx]                        w = ((1 - tx) if dx == 0 else tx)                        w *= ((1 - ty) if dy == 0 else ty)                        w *= ((1 - tz) if dz == 0 else tz)                        acc[0] += w * feat[0]                        acc[1] += w * feat[1]            out.extend(acc)        return tuple(out) class OccGrid:    def __init__(self, res=32):        self.res = res        self.cells = [0] * (res * res * res)     def mark_sphere(self, cx, cy, cz, r):        for i in range(self.res):            for j in range(self.res):                for k in range(self.res):                    x, y, z = i / self.res, j / self.res, k / self.res                    if (x - cx) ** 2 + (y - cy) ** 2 + (z - cz) ** 2 <= r * r:                        self.cells[i * self.res * self.res + j * self.res + k] = 1     def query(self, x, y, z):        r = self.res        i = min(r - 1, int(x * r))        j = min(r - 1, int(y * r))        k = min(r - 1, int(z * r))        return self.cells[i * r * r + j * r + k] == 1 def collision_rate(grid, n=100):    seen = set()    hits = 0    for _ in range(n):        x, y, z = random.random(), random.random(), random.random()        r = grid.res[0]        h = hash_coord(int(x * (r - 1)), int(y * (r - 1)), int(z * (r - 1)), grid.size)        if h in seen:            hits += 1        seen.add(h)    return hits / n def main():    random.seed(7)    g = HashGrid()    print("编码特征维度:", len(g.encode(0.3, 0.6, 0.2)))    print("哈希碰撞率:", round(collision_rate(g), 3))    o = OccGrid(32)    o.mark_sphere(0.5, 0.5, 0.5, 0.3)    comp = skip = 0    for i in range(50):        y = 0.3 + 0.4 * i / 49        if o.query(0.3, y, 0.5):            comp += 1        else:            skip += 1    print("沿光线: 计算", comp, "跳过", skip) if __name__ == "__main__":    main()
目的:用几十行代码复现 Instant-NGP 的两大核心——多分辨率哈希编码查表与占位场跳过空区,直观看到碰撞率和采样压缩比。
  1. h = (ix * PRIMES[0]) ^ (iy * PRIMES[1]) ^ (iz * PRIMES[2])三个坐标分别乘不同大质数后异或,打散空间规律性
  2. return h % size取模映射到固定大小的哈希槽位,控制内存上限
  3. self.res = [base * (2 ** l) for l in range(levels)]每层分辨率翻倍,形成从粗到细的多级网格
  4. idx = hash_coord(x0 + dx, y0 + dy, z0 + dz, self.size)取当前格 8 个角点的哈希特征
  5. w = ((1 - tx) if dx == 0 else tx)三线性插值权重,让特征随坐标连续变化
  6. out.extend(acc)把各级插值结果拼接成最终编码特征,喂给轻量 MLP
  7. self.cells[i * r * r + j * r + k] = 1把球体占据的格子标记为“实”,构成占位场
  8. if o.query(0.3, y, 0.5)沿光线逐点查占位场,跳过空区只算占用格

常见误区

误区两个不同坐标挤进同一个哈希槽,特征互相污染,渲染图肯定会出现花斑、重影之类的明显缺陷,所以必须想尽办法消除碰撞。

正解碰撞是 Instant-NGP 的特性而非 bug。槽位特征是端到端可学习的,碰撞位置共享特征后,梯度会平均化,互相“谦让”;高分辨率层哈希表更大、碰撞少,负责细节,低分辨率层碰撞多但只负责粗略结构。原论文默认几乎不做显式碰撞处理,实验证明对最终质量影响很小。就像便签串味,大方向不会错。

为何常见:人们习惯把“共享内存”等同于“数据损坏”,忽略了端到端训练的自适应补偿能力。

误区要先用激光扫描或立体视觉做一遍三维重建,才知道哪里空哪里实,所以占位场只是一个“事后优化”。

正解占位场随训练动态更新——每隔若干步,把当前网络预测密度低于阈值的格子重新标为“空”,越训越准,从粗略到精细,完全不需要额外的人工标注或传感器输入。

为何常见:把“占用”想象成真实物理测量,误以为必须先拿到精确几何才能标记空实。

误区把 max_entries 设到 2^30,碰撞几乎为零,画面质量肯定更高,显存反正可以加。

正解哈希表大到一定程度收益骤减,显存却线性上涨。Instant-NGP 默认表大小在 2^19 附近;高频细节主要由最高分辨率层决定,大表只是减少碰撞,而碰撞本身影响很小。显存是 GPU 上最贵的资源,与其加表,不如调分辨率层数或特征维度。

为何常见:“内存管够”的心态让人们忽视表尺寸与场景实际复杂度的匹配关系,把单调递增的配置误当成最优解。

误区把 base_res 从 16 调到 128,所有场景都会更清晰,反正多分辨率网格不占多少内存。

正解高分辨率细网格需要足够多的训练样本去“喂饱”,数据稀疏的区域会欠拟合甚至过拟合出噪点;大场景该提高网格范围,小而简单的场景反而低分辨率更快更稳。NGP 默认 base_res=16、逐级翻倍共 16 级,是经过大量实验的均衡点。

为何常见:把“空间网格分辨率”等同于“显示器像素密度”,忽略了三维网格随分辨率立方级膨胀的数据需求。

误区NeRF 名字里带"Neural",任何加速方案都只是把 MLP 变小,网络始终是必需的。

正解Plenoxels 完全去掉神经网络,用体素加球谐系数直接表示场景,渲染只做查表和插值;没有 MLP 反而更快,代价是显存暴涨。NeRF 的本质是“可微渲染 + 隐式表示”,网络只是其中一种载体。

为何常见:“Neural“一词带来思维定势,让人忽略了这个领域早已走向”显式存储 + 可微优化”的混合路线。

面试题

Q1. 原版 NeRF 中,MLP 网络(学者)的输入输出是什么?

单选题 · easy

  • A.输入像素坐标,输出深度值
  • B.输入坐标方向,输出色和密度← 正确答案
  • C.输入光照方向,输出高光强度
  • D.输入相机参数,输出重建点云

答案:B。NeRF 的输入是三维空间坐标加观察方向,输出是该点的体密度和颜色。A 缺方向,C 缺坐标,D 是三维重建任务的输入输出,均不符合 5D 辐射场定义。

Q2. Instant-NGP 加速的核心思路是什么?

单选题 · easy

  • A.用更大更深的多层感知机提升算力
  • B.用多级哈希速查表替代昂贵逐点计算← 正确答案
  • C.用 CPU 并行分摊 GPU 的渲染压力
  • D.减少每张训练图像的像素数量

答案:B。Instant-NGP 用多分辨率哈希编码把坐标映射到查表特征,替代 MLP 对每个采样点的昂贵计算,再交给轻量网络收尾。加大网络是背道而驰,换 CPU 和减像素都不是核心思路。

Q3. 占位场(Occupancy Grid)的主要作用是什么?

单选题 · easy

  • A.记录物体的照片纹理并直接贴图
  • B.标记空实格让光线跳过空区域← 正确答案
  • C.替代摄像机采集场景的深度信息
  • D.把渲染分辨率降低一半省显存

答案:B。占位场是低分辨率布尔网格,标记每个格子空实。采样时跳过标记为空的格子,减少无效查询。它不存纹理、不采集深度、不降渲染分辨率。

Q4. 关于哈希碰撞的处理,哪种说法正确?

单选题 · mid

  • A.必须显式检测并消除否则无法收敛
  • B.训练梯度会在共享槽位上平均化← 正确答案
  • C.碰撞会让模型损失函数直接发散
  • D.碰撞只会发生在最高分辨率层

答案:B。碰撞的多个坐标共享同一槽位特征,反向传播时梯度累加平均,模型自动妥协补偿。Instant-NGP 默认容忍碰撞,碰撞也不会导致发散,且低分辨率层碰撞更频繁。

Q5. 多分辨率哈希网格中,各层分工是什么?

单选题 · mid

  • A.每层独立渲染一张完整输出图像
  • B.低层负责粗结构高层提供高频细节← 正确答案
  • C.各层完全冗余只为增大显存开销
  • D.只有中间层参与最终颜色计算

答案:B。低分辨率层覆盖面大、捕捉场景粗略结构;高分辨率层格子小、补充高频细节。各层特征拼接后共同输入轻量 MLP,不存在独立渲染或冗余设计。

Q6. Mip-NeRF 针对什么问题做了改进?

单选题 · mid

  • A.训练速度太慢导致无法实时部署
  • B.远景多尺度下出现的锯齿与模糊← 正确答案
  • C.显存占用过高导致训练直接溢出
  • D.相机标定误差引起的几何漂移

答案:B。Mip-NeRF 用锥体代替单条光线采样,对锥体覆盖范围做积分平均,解决远处物体随尺度变化产生的锯齿与闪烁。它不以加速或省显存为目标。

Q7. 哈希编码中的“多分辨率”指的是什么?

单选题 · mid

  • A.输出图片支持多种分辨率显示
  • B.从粗到细的多套空间网格哈希表← 正确答案
  • C.训练数据包含多个图像分辨率
  • D.网络内部多层特征图分辨率不同

答案:B。Instant-NGP 构建 L 级分辨率逐级翻倍的空间网格,每级各配一张哈希表,查询时逐级插值并拼接特征。它指空间网格的粗细层级,与输出图片或数据分辨率无关。

Q8. 关于 Plenoxels 方案,哪些说法正确?

多选题 · hard

  • A.完全去掉神经网络只用体素表示← 正确答案
  • B.用球谐系数表达随视角变化的颜色← 正确答案
  • C.显存占用通常比哈希编码方案更高← 正确答案
  • D.必须依赖 Instant-NGP 的哈希表

答案:ABC。Plenoxels 用体素直接存球谐系数,渲染时查表加插值,完全不依赖 MLP 和哈希表,因此 A 对、D 错;球谐叠加产生视角相关颜色,B 对;体素表示需要足够密度支撑精度,显存通常显著高于哈希方案,C 对。

Q9. Instant-NGP 落地时的权衡点有哪些?

多选题 · hard

  • A.哈希表尺寸上限决定显存预算← 正确答案
  • B.网格层数影响细节与内存开销← 正确答案
  • C.特征维度影响精度与训练成本← 正确答案
  • D.相机数量对训练时长毫无影响

答案:ABC。显存可精确表示为 L×T×F×4 字节,表尺寸、层数、特征维度都是核心权衡旋钮。相机数量直接影响训练数据量和收敛速度,D 明显错误。

Q10. 关于多级哈希特征插值,哪些说法正确?

多选题 · extreme

  • A.每级取所在格 8 个角点的哈希特征← 正确答案
  • B.三线性插值保证特征随坐标连续← 正确答案
  • C.各级特征拼接后送入轻量 MLP← 正确答案
  • D.插值会导致反向传播梯度归零

答案:ABC。每级网格取 8 个角点哈希特征并按权重三线性插值,保证连续可微,梯度能正常回传,D 错;各级插值结果拼接成最终特征向量,交给轻量网络解码,A、B、C 均正确。