作者:Cheng Sun, Min Sun 等 来源:CVPR 2022 论文题目:Direct Voxel Grid Optimization: Super-fast Convergence for Radiance Fields Reconstruction 项目链接:https://sunset1995.github.io/dvgo/ 论文链接:https://arxiv.org/abs/2111.11215 内容整理:王秋文
目录
- 简介
- 后激活的密度体素栅格
- 体素栅格的表征
- 用于体渲染的密度体素栅格
- 通过后激活实现的尖锐的决策边界
- 快速直接的体素栅格优化
- 粗几何搜索
- 精细重建
- 实验结果
简介
在仅有图像及对应位姿作为输入时对三维物体或场景实现自由视点合成是一个重要的任务。最近,基于 NeRF 的方法提出了有力的场景表征方式,并在这一任务上实现了 state-of-the-art 的质量。但与此同时,这一方法在场景训练过程中所需要的大量时间导致其难以应用到许多实际场景中。尽管后续许多工作在测试阶段提出了加速渲染的方法,但在训练过程中加快场景收敛速度方面进行的工作要么在效率方面提升较小,要么在合成质量方面出现了严重的损失。
NeRF 使用 MLP 隐式地学习场景中某一三维位置的颜色和体密度以从一系列图像中重建出体素化的场景表征,本文的作者在基于 NeRF 的许多其他工作的启发下使用经典的体素块显式地存储场景的这些性质,从而可以保证场景渲染的实时性和高质量性。本文思想的核心就是使用密集的体素直接对三维几何进行建模。同时,开发与视角先关的颜色表征不包含在本文的主要工作中,本工作仅仅使用了简单地颜色混合表示来实现。为了解决对密集体素优化时可能出现的次优解情况(在实际空间中的空白区域产生了半透明的“云”以适应光度损失)。为了解决这一问题,本文提出了简单有效的解决方法:首先,作者在初始化时给每一个体素赋予了接近零的体密度值,同时对在少数视角下可见的体素赋予较小的学习率。
除此外,使用密集体素进行建模会在可伸缩性方面带来挑战。为了节省体素空间,本方法可以自动寻找一个紧密包含感兴趣区域的 BBox,并提出了后激活的插值方法,即在对密集体素进行三次线性插值之后应用激活函数,从而避免了过去的插值方法可能产生的平滑表面,并在数学上证明了所提出的后激活函数可以在单个网格单元内建模出尖锐的线性表面。最终,使用分辨率为
的密集体素就可以在大部分场景下产生超过 NeRF 的质量。
图1 本文中所提出的算法的时间和质量性能示意图
本文所提出工作的核心内容为:
- 收敛速度大约比 NeRF 快两个数量级,将使用单 NVIDIA RTX 2080 Ti GPU 的训练时间从 10-20 小时减少到 15 分钟,如图 1 所示
- 以大约快 45 倍的渲染速度获得了与 NeRF 相当的视觉质量
- 本文所提出的方法不需要跨场景训练
后激活的密度体素栅格
本文的整体算法流程如图 2 所示。
图2 算法的整体流程示意图
体素栅格的表征
体素栅格的表征方式是在每一个体素单元内对感兴趣的性质进行显式的建模。这样的显式场景表征可以通过插值的方式有效地获取任意三维位置的值:
其中,
是查询的三维点的坐标,
是体素栅格,
是所建模的特性的维度,
是体素的总数目。在本文中所使用的插值方式均为三次线性插值。
用于体渲染的密度体素栅格
体素栅格的体密度值是一种
的特殊情况,存储了用于体渲染的体密度值。在本文中,使用
用来使用体密度激活(一个
)之前的原始体密度数据。本文中所使用的激活函数是 softplus 函数:
其中,
是一个超参数。使用这一激活函数而不是 ReLU 对直接优化体素的密度至关重要,因为当体素的密度被错误的设置为负值时使用 ReLU 不能对其进行纠正,而 softplus 函数可以允许作者将体密度设为很接近0的部分。
通过后激活实现的尖锐的决策边界
对体素的体密度进行插值后得到的值还需要经过 softplus 函数的激活以及在体密度计算公式中推导光线在某一点被反射的可能性(
值)。作者考虑了三种不同实现这一流程的顺序——pre-activation, in-activation, post-activation:
经过实验可以表明,使用 post-activation 流程可以使用更少的体素栅格生成尖锐的决策边界。在图 3 中,作者使用二维栅格单元为例展示了三种流程得到的决策边界的情况,其中 post-activation 可以生成尖锐的线性边界,而其他两种只可以产生平滑的结果,并需要更多的体素单元来重建物体的表面细节。在图 4 中,作者使用二值图像回归作为例子用以比较三种顺序的能力,也证实了 post-activation 在栅格单元的使用上具有更高的效率。
图3 三种激活方式的结果比较
图4 三中激活方式以二维图像为例的结果示意图
快速直接的体素栅格优化
粗几何搜索
一般来说,场景的大部分区域都是空白区域。出于这一事实,作者希望能在重建精细细节之前得到场景的粗糙三维结构,从而节省计算资源。
粗场景表征
作者使用粗糙的体素格
,并使用后激活以建模场景的几何。本文在粗糙重建阶段仅使用与视角无关的颜色
。使用三次线性插值即可得到采样点
处的初始体密度值
和颜色值
:
体素分布
在粗糙重建阶段,作者使用一个与训练视角下相机的视锥紧密包围的 bounding box (Bbox) 表征体素的分布范围。记
分别表示 Bbox 的长度,
是一个用于表征粗糙重建阶段的体素总数的超参数。则体素的大小
,因此在每个维度上的体素数量为
。
点的采样
在每个像素渲染的光线上,作者采样得到查询点:
其中,
为相机的中心,
是光线投射的方向,
和
是相机的近边界和远边界,
是一个表示每个采样步的超参数,可以根据体素的大小进行调整。
先验设置 1:低体密度初始化
在训练的初始阶段,由于体密度公式中计算累积透射率,距离相机较远的点往往具有较小的权重,粗体密度栅格可能会在临近相机的区域出现像“云”一样的次优化解。因此,作者在初始化的时候为每个体素栅格赋予了接近 0 的体密度值,从而使得光线上的所有点都可以被相机看到。事实上,作者设置前述激活函数公式中的 bias 为:
其中,
是一个超参数。
先验设置 2:与视角相关的学习率
在划定的体素中,可能有一些体素仅能在很少的真实世界捕捉的训练视角下观察到,而作者认为物体的表面应该在许多视角中都具有一致性,而不是仅仅只能在较少的视角下解释。因此,作者为不同的体素格设置了不同的学习率。对于每一个体素
,数可以看到这个点的训练视角的个数
,并用
缩放基础学习率从而得到其自身的学习率,其中
是所有体素中可见视角数目最多的数目。
训练目标
为了对重建进行正则化,除了使用场景与合成图像间的均方误差之外,本文还使用了背景交叉熵损失以鼓励
值可以集中在前景或背景。
精细重建
在进行了粗糙的几何优化,得到
之后,算法可以关注更小的子空间以重建表面的细节以及随视角变化的场景影响。
精细场景表征
在细重建阶段,作者使用了更高分辨率的体密度体素格
,并同样使用了后激活插值。为了建模与视角相关的颜色,作者选择使用了显式隐式混合的表征,因为显式表征往往可能产生较低质量的结果,而隐式表征的训练速度较慢。本文的混合表征包括:
- 一个特征体素栅格
,其中
是一个描述特征空间维度的超参数。
- 一个参数为
的窄 MLP 最终,所查询的三维点
以及视角方向
得到的结果可以表示为:
其中,
是与视角有关的反射颜色,
是精重建阶段的原始体密度。
已知的空白区域和未知区域
如果一个查询点在经过优化后的粗体素的基础上得到的
值小于设定的阈值
,则称这个点在已知的空白区域内,否则称这个点在未知区域。
体素分布
作者通过密集地查找粗糙重建阶段的体素寻找到一个紧靠着未知区域的 Bbox,按照与粗糙重建阶段相同的方式在 Bbox 内设置体素。
渐进式缩放
作者缩放了体素格
和
。设定 checkpoint 每步的集合为 pg_ckpt,则体素的初始数目为
。当到达 pg_ckpt 中的训练步骤时,我们将体素数变为二倍,使最后一个检查点后的体素数为
。体素大小和栅格的个数也相应地更新。缩放场景表示要简单得多:在每个 checkpoint,通过三次线性插值改变体素网格的大小。
点的采样
点的采样策略与粗重建中相似,但做了一些修改。作者首先过滤掉不与已知空白区域相交的射线。对于每条射线,调整近边界和远边界到射线与边界盒的交点。如果
已经在 Bbox 中,则不调整近边界。
跳过空白区域
查询
比查询
更快;查询与视图相关的颜色是最慢的。在训练和测试中,作者通过空白区域的跳跃来提高效率。首先检查优化的
跳过已知空白区域中的采样点。其次,通过查询
,进一步跳过未知空间中激活
值较低的采样点。
训练目标
作者使用与粗阶段相同的训练损失,但对正则化损失使用较小的权重。
实验结果
使用本文提出的算法与其他视角合成算法进行定量的指标计算比较,得到的结果如图 5 中的表格所示。
图5 实验定量指标计算结果比较
从结果可以看出本文提出的算法可以与其他算法得到可比的效果,并随着体素分辨率的提高得到了更好的重建效果。作者采用以前工作中直接报告的训练时间和 GPU 规格与本文中提出的方法进行比较。与 2080Ti 相比,V100 运行速度更快,存储空间更大。根据图 6 中的方法可以看出本算法在显著减少逐场景优化时间的情况下获得了良好的 PSNR 质量。
图6 实验时间及算力比较
将本文的工作与 PlenOctree进行定性的主观性能比较,得到的结果如图 7 所示。
图7 本文工作的主观性能比较图
渲染过程训练的可视化过程:http://mpvideo.qpic.cn/0bc3rmaiyaaabeako62vljrvbc6drsfqbdaa.f10004.mp4?