简介
Instant Neural Graphics Primitives(cuda):https://github.com/NVlabs/instant-ngp
Instant Neural Graphics Primitives(pytorch):https://github.com/kwea123/ngp_pl
该项目提出一个称为Multiresolution Hash Encoding的技术,能够大大提升NeRF网络的训练速度,使之可以从几分钟缩短到几秒钟
计算机图形学与神经网络交叉融合的基本观点:将神经网络的输入映射到一个高维空间,进而从压缩模型中提升拟合结果的质量。优点包括可训练,特定于任务的数据结构,解决了大量的学习任务,使得小样本MLP可用。但是,这个过程启发式的,结构化的调整,进而造成因调整产生的性能下降,泛化性差,并行设计开销大。Instant-ngp的建立则是为了解决上述问题。基于由粗到细的哈希搜索实现网格到特征向量的分级对应,提供了该项技术的适应性与效率。
Instant-ngp主要用于解决NeRF在对全连接神经网络进行参数化时的效率问题。该方法提出一种编码方式,使得可以使用一个较小规模的网络来实现NeRF同时不会产生精度的损失。该网络由特征向量的多分辨率哈希表实现增强,基于随机梯度下降执行优化。多分辨率结构有助于GPU并行,能够通过消除哈希冲突减少计算。该方法最大的亮点是将NeRF以小时计的时间开销提升到秒级。下图为一些渲染样例,可以看到渲染时间有显著的提升。
位置编码
不同位置编码导致不同的效果
- No encoding
由图中看出,不使用位置编码的网络效果感人 - Frequency
在原始NeRF中,使用下图位置编码公式,将输入映射到高维空间,这种数据结构依赖启发式和结构性修改,这导致效率降低且使用与特定任务
- Dense grid
小网络加密集网格,资源浪费。它在空白区域分配的特征与在靠近地表的区域分配的特征一样多。参数的数量增长为O(𝑁3),而感兴趣的可见表面的表面积只增长为O(𝑁2)
自然场景表现出平滑性,促使人们使用多分辨率,在图d中,插值特征存储在八个分辨率网格中,然后连接一起形成十六维向量输入网络。参数数量不到©的一半,重建质量相似
- Hash table
将可训练特征向量存放在紧凑哈希表中,训练时不依赖空间数据结构和先验几何结构
不同分辨率索引存放与独立哈希表,与dense grid相比,参数数量减少了20倍,但质量不减
多分辨率哈希编码
首先我们知道哈希搜索是数据经过哈希函数编码后映射到存储空间的特定位置,可以根据内容就能直接定位数据位置。即使需要二次搜索相同哈希值下的候选,只要在设计时保持数据分布的平衡,依然可保持高效计算
超参数经典值
- 分辨率划分
L对应的是特定分辨率体素对应的编码层,按照之前表格给出的超参数,层数被设置为16,即体素分辨率变化分为16级,对应的分辨率Nl 随级别变化的公式为
b是成长参数,设定的b值在1.38到2之间。考虑L层中的一个单层l。
在上面的二维图中,红色方框表示的是分辨率较高的体素网格,蓝色方框对应的是分辨率较低的提速网格,我们可以看到x点在不同分辨率的体素网格中周围的格点是不一样的,是通过下面公式,利用x*Nl向上和向下取整得到
- 哈希映射
将x周围的格点对应到各层的哈希表
对于粗网格,不需要T个参数。这样映射就能保证一对一的关系。对于精细网格,使用一个哈希映射函数来索引到数组,没有显示的碰撞处理。
运算⊕表示XOR(异或)运算,𝜋𝑖是独一无二的大素数。该计算在每一维产生线性同余排列,以解除维度对散列值的影响
- 网络
从不同的哈希表中获取到格点信息,根据x在格点围成的体素里的相对位置,实现对体素内格点的特征向量线性插值,将所有插值结果进行拼接并拼接上附加输入(view direction)最终得到模型输入数据
线性插值权重为
神经网络训练实现
-
性能考量
为了提升反向传播性能,作者提出存储哈希表条目在一个半精度浮点数中,即每个条目两个字节。另外,算法维护了一个全精度的参数主副本,以便稳定的混合精度参数更新。为了优化使用的GPU缓存,作者逐层的评估哈希表:当处理一个batch的输入位置时,作者安排计算来查看第一层所有输入的第一层哈希编码,跟随对应的第二层所有输入,逐层查找。因此只有少量连续的哈希表不得不驻留在缓存,依赖于GPU的并行计算能力 -
MLP结构
除了NeRF,使用具有两个隐层的MLP,包含64个神经元以及ReLU函数构建网络结构,如下图所示。损失和输出激活的选择是特定于任务的,将在相应的子节中详细说明。NeRF也是包含两个串联的MLP,一个密度MLP与一个颜色MLP。密度MLP映射哈希编码位置y=enc(x,θ)到一个16位的输出值,将其视为对数空间密度。颜色MLP添加视点相关的颜色变化。该结构的输出是一个颜色的三元组,当训练数据具有低动态范围(sRGB)时,我们使用sigmoid激活;当训练数据具有高动态范围(线性)时,我们使用指数激活(线性HDR)。相比之下,作者推荐HDR training data。
hash冲突的隐式解决
较粗的层次,是单射的,它们根本没有发生碰撞,只能代表场景的低分辨率版本,因为它们提供的特征是由大量点组成的网格线性插值而成的。相反,由于精细的网格分辨率,精细的级别可以捕获小的特性,但是会遇到许多冲突
冲突是随机发生的,统计上来讲不会在每个层次上都发生,在训练时,梯度达到平均水平(最大梯度占据主导地位)
在比较精细的层,很多点都在优化同一个feature,但是最重要的点,比如物体表面的点,他对应的梯度会比空间中那些空的点更大,因此他也会对这个feature的优化起到主导作用,从而让真正重要的点的信息去支配这个最精细feature的学习
Online adaptivity
在训练时,输入x的分布随时间变化,他们逐渐集中在一个小区域,更精细的网络级别将产生更少的碰撞,学习到更精确的函数,即多分辨率哈希编码自动适应训练数据分布
哈希表初始值
使用均匀分布,提供少量随机性并使初始值接近于零