Instant Neural Graphics Primitives with a Multiresolution Hash Encoding
Instant Neural Graphics Primitives with a Multiresolution Hash Encoding
InstantNGP:通过在多尺度哈希上的特征插值优化隐式神经表示参数量和训练时间
代码仓库
动机
通过MLP实现的隐式神经表示模型,其训练耗时与推理速度与MLP的参数量相关。本文的目标是通过哈希表存储大量的多尺度特征,以此减小MLP的参数量。同时,利用哈希表本身的\(O(1)\)访问效率,可以加速推理。
方法
模型框架
设最低分辨率(尺度)与最高分辨率为\([N_{min}, N_{max}]\),共分为\(L\)层。第\(l\)层的分辨率为\(N_l := \left \lfloor N_{min} \cdot b^l \right \rfloor\)。
其中,\(b^l:=\exp(\frac{\ln{N_{max} - \ln{N_{min}}}}{L-1})\)。

以上图为例,假设只有\(N_0\)和\(N_1\)两个尺度,对于输入坐标\(x\),在两个分辨率下的网格分别找到周围四个点,并获取相对应的特征进行插值,级联后得到长度为\(L\cdot F\)的特征向量。一些场景下还需要相机参数之类的辅助信息,以长度为\(E\)的\(\xi\)的形式一同级联。
随后,将总长度为\(LF+E\)的特征向量送入网络回归得到目标信号。
Hash表

- Hash表的可训练参数量为\(T\cdot L \cdot F\),其中\(T\)为每层尺度对应的Hash表大小。
- 对于点数量小于\(T\)的尺度,Hash的映射为\(1:1\)
- 对于点数量大于\(T\)的尺度,不处理映射冲突
- 哈希函数使用:\(h(x)=(\oplus^{d}_{i=1}x_i \pi_i) \ \mathrm{mod} \ T\),其中\(\oplus\)表示按位异或,\(\pi_i\)表示不重复的大质数。
实验


训练速度块,同时精度高。
总结
本文提出的方法通过多个Hash表建立多尺度的码本,将隐式神经表示建模中的大量参数转移到读取效率为\(O(1)\)的Hash表上。在实际实现中,单层尺度的特征维度都较小,例如设置为\(2\)或\(3\),通过多尺度的级联获得更长的特征。
Hash表码本使得模型的训练及推理速率都很高,然而“坐标-特征”的映射关系是通过查表实现,也就导致了在这个过程中不可导,一定程度上损失了隐式神经表示的一些特质。
由于Hash表的大小固定,且通常情况下最精细尺度的分辨率设置要小于原图尺寸,因此显然模型回归误差的一大来源就是Hash表的容量不足。在此情况下,不同Hash表大小下得到的图像所展现出来的“模糊”与过往常见的模糊或者噪声不太相同,非常有趣。然而,更大的Hash表也会导致更大的显存开销,所以需要在精度与存储之间进行平衡。
本文方法的官方代码仓库基于CUDA实现,因此不太方便作精细的修改。网上也有非官方的复现以及其他库或算子的实现,但具体效率笔者没有验证过。

浙公网安备 33010602011771号