几何表示前沿
为了实现更高效的几何处理, 并将深度学习技术应用到几何处理中, 研究人员开发出许多新的几何表示.
1 八叉树与哈希表
1.1 八叉树的构建
八叉树 (octree) 可以看作是对体素 (voxel) 的一种改进. 与体素的均匀网格不同, 八叉树只对非空的区域进行细分 (自适应分辨率), 得到一个层级结构.
在 CPU 上, 可以通过递归的方法构建八叉树, 即哪个子节点非空, 就对它进行劈分, 一分为八, 直到指定的最大深度为止. 该递归方法简单直接, 但缺点是不易并行化, 效率很低.
考虑一维的情形. 假设直线 \(\R\) 上有点列 \(\{x_1,\dots,x_n\}\) (\(x_i\leq x_{i+1}\)), 我们想为之构建一棵深度为 \(3\) 的二叉树, 则我们可以采取如下 "自底向上" 的策略.
- 将区间 (即点列的包围盒) \([x_1,x_n]\) 平均分成 \(2^3=8\) 个子区间, 编号 \(0,\dots,7\).
- 所有包含着某个 \(x_i\) 的子区间就是叶子结点. 由此得到所有的叶子结点 \(0,1,2,6,7\).
- 对于每个叶子结点 \(j\), 注意到
\(\lfloor j/2\rfloor\) (即 \(j\) 右移一位) 就是其父节点的编号.
由此就得到了所有的父节点 \(0,1,3\).
- 注意父节点 \(1\) 只有一个子节点 \(2\), 需要把另一个子节点 \(3\) 补上 (空节点).
- 以此类推, 得到父父节点 \(0,1\) 和根节点 \(0\).
可以将该方法推广到二维和三维. 其中需要解决的关键问题是如何给节点排序. 这就要引入 shuffled key 与 z-order curve 了. 这里以二维的四叉树为例, 三维的八叉树是类似的.
参照下图
如下图右侧, 将 shuffled key 转化为十进制整数, 再将其从小到大连起来, 可以发现它们形成了一条有结构的曲线! 这称为 z-order curve.
![]() |
![]() |
![]() |
---|
Z-order curve 也叫 Monton curve 或者 Lebesgue curve,
是一种空间填充曲线, 它的极限可以填满整个正方形. 下图展示了其自相似结构
Shuffled key 与 z-order curve 有如下特点:
- 叶子结点右移 \(3\) 位 (二维则是 \(2\) 位) 就得到了父节点的 shuffled key.
- 空间局部性: 父节点的所有叶子结点都是连续排列的.
八叉树的自底向上构建算法:
- 计算点云的包围盒, 将每个方向离散化为 \(2^{d}\) 个格子.
- 对点云中的每个点计算 shuffled key 并排序、去重, 就得到了该层节点的 z-order curve.
- 将所有节点的 shuffled key 右移 \(3\) 位以得到父节点的 shuffled key. 排序后得到了 z-order curve. 注意需要补全缺失的子节点.
- 以此类推, 直到根节点.
1.2 八叉树的节点信号
对于输入的点云, 八叉树的每个节点中都可以存储平均法向量 \(n\) 和平均偏移量 \(d\) (平均点离格子中心点的距离), 进而就得到了局部平面 \[ \lr{n,x-c} + d = 0. \] 对于输入的 SDF, 八叉树每个节点可以存储顶点处的 SDF 值, 进而任意一点的 SDF 可以通过三线性插值计算. 也可以通过局部基函数重建 SDF.
查找领域: 计算该点的 shuffled key, 右移不同位数可以得到不同尺度的邻域 (不同深度的八叉树节点).
1.3 哈希表
在一些图形学应用 (尤其是模拟与交互) 中, 需要更快的邻域查找. 在 2011
年, 图形学研究人员开发了 GPU 上的哈希表
哈希表通过哈希函数 \(h:X\to\{0,1,\dots,N\}\) 将待插入元素映射到一个 index, 然后将元素插入到对应的 index 处. 哈希表的重点是找到一个哈希函数让哈希值尽可能均匀分布. 一般取 \[ h(k) = (ak+b) \mathbin{\rm mod} p \mathbin{\rm mod} N, \] 对于哈希值冲突的情况,
- 可以在将哈希表的元素变成子列表指针, 哈希值相同的元素放入同一个子列表中.
- 也可以不使用子列表, 直接把冲突的元素放入 index 之后的第一个空位置上.
在 CPU 上, 哈希表检索 / 插入的平均时间复杂度是 \(\mathcal{O}(1)\).
然而在 GPU 上, 如果多个线程同时对哈希表进行插入, 后面的线程必须等待前面的线程插入完毕后才能执行插入, 效率很低.
提升效率的答案是 2001 年提出的 Cuckoo 哈希算法
- 计算第一个哈希表的哈希值 \(h_1(x)\), 直接将 \(x\) 插入该处. 如果该处已经有元素 \(y_1\), 则把 \(y_1\) 拿出来 (鸠占鹊巢
Cuckoo 即杜鹃. 有些杜鹃会把自己的蛋放到其他鸟类的巢中, 替代原本的蛋. 论文用 Cuckoo 的这一行为来比喻该算法. [5]). - 计算 \(y_1\) 在第二个哈希表的哈希值 \(h_2(y_1)\), 直接将 \(y_1\) 插入该处. 将该处已经存在的元素插入第三个哈希表, 以此类推...
- 如果达到最大迭代深度, 但仍有元素没有插入表中, 则只能 "重启" (重新选择哈希函数).
可以证明, 该算法大概率能找到一个不冲突的配置. 对于元素查找, 只需计算 \(d\) 个哈希值, 然后在每个表中查找即可. 该操作是完全可并行的.
优点:
- 构建速度和基数排序相当
- 在查找元素数目大于 6M 时, 比二分查找快 \(2.5\) 倍以上
- 并行场景下,查找元素具有常数复杂度
缺点:
- 实现比较复杂, 基本无法使用 PyTorch 等深度学习框架实现.
- 构建时可能需要重启.
- 内存一致性不足, 查找排序好的元素时, 速度和二分查找相当.
实际上, 在对邻域查找效率要求不那么苛刻的情况下, 没有必要使用 GPU 哈希表.
2 基于 MLP 的几何表示
2.1 基于全连接神经网络的表示
使用一个全连接的 MLP 拟合 SDF
可以直接用 MLP 做曲面重建
损失函数的第一项令 \(f\) 的零点尽量接近点云, \(\nabla f\) 尽量接近法向量; 第二项 (Eikonal term) 令梯度为单位向量 (\(x\) 服从 \(\R^3\) 上的某个分布).
MLP 还可以拟合空间中的颜色场
2.2 随机 Fourier 特征
原论文: Fourier Features Let Networks Learn High Frequency Functions in Low Dimensional Domains (NeurIPS 2020).
尽管 MLP 可以任意逼近任何连续函数 (universal approximation thm.),
在实际场景中, MLP 更倾向于学习信号的低频分量而非高频分量
这一缺陷在三维重建 MLP 上的体现就是重建出的结果非常模糊 (如下图第一行, 图自原论文).
该论文提出, 让 MLP 的输入 \(x\in\R^d\) (比如空间坐标和角度等) 先经过一个 Fourier 特征映射 \[ \Align{ \gamma:\R^d&\to\R^{2L}, \\ x &\mapsto \bqty{ a_1\cos(\omega_1\T x+b_1),a_1\sin(\omega_1\T x+b_1),\dots, a_L\cos(\omega_L\T x+b_L),a_L\sin(\omega_L\T x+b_L) }\T. } \] 其中 \(a_i,\omega_i,b_i\) 都是可调的权重, 通常 \(2L\) 远大于 \(d\). 映射 \(\gamma\) 将输入映到了高维空间中的一个超球面上, 而且包含各个频率的信息, 让 MLP 容易学到高频成分. (原本靠得比较近的 \(\gamma\) 像彼此远离, 更容易让 MLP 区分两者.) 使用 Fourier 特征映射得到的结果如上图第二行所示.
实际上, 此前的 NeRF 就采用了类似的 Fourier 位置编码, 即让空间坐标 \((x,y,z)\) 和方向向量 \((n_x,n_y,n_z)\) 经过一个位置编码映射: \[ \gamma(x) := \bqty{ \sin(2^0\pi x),\cos(2^0\pi x),\dots \sin(2^{L-1}\pi x),\cos(2^{L-1}\pi x) }. \] 类似的 position encoding 在 Transformer 中也有.
2.3 SIREN
原论文: Implicit Neural Representations with Periodic Activation Functions (NeurIPS 2020).
随机 Fourier 特征的正弦函数内的频率都是写死的, 我们不妨将其当作神经网络的参数, 优化学习这些参数, 或许能达到更好的结果. 换言之, 可以使用正弦函数作为 MLP 的激活函数: \(y=\sin(Wx+b)\).
论文作者还推导出了正弦层参数初始化的策略.
图自 Wikimedia, 作者 David Eppstein, 原图链接 (CC-BY-SA 3.0).↩︎
Efficient hash tables on the gpu (SIGGRAPH 2011).↩︎
Rasmus Pagh, Flemming Friche Rodler, Cuckoo Hashing.↩︎
Cuckoo 即杜鹃. 有些杜鹃会把自己的蛋放到其他鸟类的巢中, 替代原本的蛋. 论文用 Cuckoo 的这一行为来比喻该算法.↩︎
DeepSDF: Learning Continuous Signed Distance Functions for Shape Representation (CVPR 2019).↩︎
IGR: Implicit Geometric Regularization for Learning Shapes (ICML 2020).↩︎
Texture Fields: Learning Texture Representations in Function Space (ICCV 2019).↩︎
NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis (ECCV 2020).↩︎
On the Spectral Bias of Neural Networks (ICML 2018).↩︎