论文地址:https://arxiv.org/abs/2308.04079
代码地址:graphdeco-inria/gaussian-splatting: Original reference implementation of "3D Gaussian Splatting for Real-Time Radiance Field Rendering" (github.com)
概要
提出一个实时且能够高质量渲染场景的方法,通过结合离散和连续表示方法的优势,不仅克服了传统方法在噪声和渲染质量方面的限制,而且极大地提高了渲染速度。
辐射场:辐射场是三维空间中光分布的表示,它捕捉光如何与环境中的表面和材料相互作用。
显式辐射场:相反,显式辐射场直接表示离散空间结构中的光分布,
隐式辐射场:隐式辐射场表示场景中的光分布,而不明确定义场景的几何体。
显式表达方法(点、网格、体素)的连续性质有助于优化,但渲染所需的随机采样成本高昂,并且可能会导致噪声。隐式表达(NeRF)耗费计算资源巨大,运行速度慢。3D GS 表示从隐式辐射场到显式辐射场的转变。它通过利用3D高斯作为灵活高效的表示,利用了这两种方法的优势。
Motivation
- 引入各向异性3D高斯球作为辐射场的高质量、非结构化表示。
- 一种3D高斯属性的优化方法,与自适应密度控制交织在一起,为捕获的场景创建高质量的表示。
- 一种适用于GPU的快速可微渲染器。
系统框架
本论文的核心在于3D高斯函数的场景表达方式以及快速渲染的方法。3D高斯的表达方式能够准确、紧凑、可微地表达三维场景。而基于分块的快速渲染方法保证了渲染质量的同时提高了训练和渲染速度。给定输入:经过SFM 校准后的图像以及SFM输出的稀疏点云。该方法整体如下图所示:首先从SFM得到的稀疏点云构建三维高斯函数,在训练过程中通过可微的快速渲染器对3D高斯函数的属性进行优化,并交替进行自适应密度控制。
输入:点云
输出:渲染图像
-
从初始的sfm点云出发,以每个点为中心生成3DGS。
-
用相机参数把点投影到图像平面上(splatting)。
-
从splatting的痕迹中tile-based光栅化,得到渲染图像,将渲染图像和GT求LOSS,反向传播。
-
自适应的密度控制模块根据传递到点上的梯度,来决定是否需要对3DGS做分割或者克隆。梯度传递到3DGS里面对其存储的那几个参数进行更新。
技术细节
可微三维高斯表达方式
这一部分的目标是从无法向量先验的SFM点云中构建出可以渲染出高质量新视图的场景表达方式。
三维高斯的自适应密度优化
该方法的核心是优化过程的设计,除了优化三维高斯属性中的位置 、不透明度 以及协方差矩阵 外,还会优化 球谐系数以捕获视角相关的外观和颜色 。这些参数的优化与自适应密度控制交替进行。
最终的loss是通过二维图像计算得到的,而在三维投影到二维的过程中必然会产生歧义。因此本方法采用的三维高斯表达方式能够在网络的优化过程中能自适应的调整高斯核的数量,即自适应密度控制。
具体来说,这样一种自适应密度控制的方法能够识别出缺失几何特征的“未完全重建区域”以及高斯函数覆盖过广的“过度重建区域”。实验观察表明,出现这两种重建的错误的区域中,视图空间的位置梯度都很大,这是由于网络优化尝试移动高斯分布以纠正这种情况。这也就为识别这些重建错误的区域提供了便利,该方法将位置梯度阈值 设为0.0002,下图3是该方法针对这两种情况作出的不同处理的示意图:
首先,对于“未完全重建区域”,我们需要覆盖3D高斯到需要重建的几何处。因此该论文中采用的方法是将原有的3D高斯克隆一份相同大小的,并沿位置梯度方向移动到新的位置。其次,对于“过度重建区域”,该论文中采用的方法是将过大的3D高斯分解为两个小的,缩小幅度 为1.6,同时使用原有3D高斯的PDF来进行采样初始化新3D高斯的位置。
为了防止产生过量的3D高斯以及floater,本论文中还采用周期性重置不透明度 为零以及移除较大的3D高斯用于避免重叠。
用于三维高斯的快速可微光栅化
为了实现高效的高斯函数光栅化和渲染,该论文提出了一种基于瓦片的光栅化器,主要包括以下几个步骤和特点:
1. 瓦片划分与高斯剔除
- 将屏幕划分为16x16的区域(瓦片),然后在每个区域内进行高斯剔除。
- 剔除的原则是只保留那些与视锥体内相交,且置信度达到99%的高斯函数,这样避免了不必要的计算。
- 引入了保护带(guard band),用于剔除处于极端位置、不必要的3D高斯函数,进一步提升剔除效率。
2. 排序与实例化
- 剩余的高斯函数依据它们覆盖的区域数量实例化,每个实例被分配了一个“键值”(key),该键值包含视图空间中的深度信息以及瓦片区域的ID。
- 使用快速的GPU基数排序算法对这些高斯函数进行排序,这一操作确保渲染过程中从前至后处理更为有效。
3. 区域列表与线程并行
- 排序完成后,为每个瓦片区域分配一个列表,列表包含了按深度排序的高斯函数的第一个和最后一个条目。
- 在光栅化阶段,每个区域启动一个GPU线程块,首先将对应高斯函数的数据加载到GPU共享内存中。
- 线程块通过从前到后遍历高斯函数列表,为像素累积颜色和不透明度值,并在像素达到目标饱和度时停止相应的线程,从而提高并行处理效率。
4. 高效的梯度计算
- 论文还提出了一种新的反向传播中高效计算梯度的方法。
- 在前向过程中,只需存储每个点累积的总透明度 α\alphaα,而不是每个点的具体α\alphaα值。
- 在反向传播过程中,通过将该点的总透明度除以每个点的透明度来计算梯度系数,从而减少了内存消耗和计算复杂度。
小结
总共13个真实场景上测试了算法,这些场景取自以前发布的数据集和合成的Blender数据集。特别是,在Mip-Nerf360 [Barron 2022] (NeRF渲染质量目前处于最先进水平)中提出的全场景、来自坦克和寺庙数据集的两个场景[Knapitsch 2017]和深度融合[Hedman 2018]提供的两个场景上测试了所提出方法。
近年来,在计算机视觉和三维重建领域,NeRF受到了越来越广泛的关注。虽然NeRF能够渲染出高质量的图像,但受到神经网络训练速度以及体渲染速度的限制。这类方法经常会面临速度和质量的抉择难题,同时渲染的实时性也是个限制NeRF使用扩展的重大问题。本工作首先基于SFM的点云设计了能快速精确表达场景的3D高斯函数,并以此开发了可由CUDA加速的渲染算法,实现了辐射场的实时渲染。这是其他基于点云的NeRF类方法无法做到的。
该工作兼具高效与质量的优越性,在未来结合该3D高斯表示形式,可以进一步用运在动态场景、三维生成以及SLAM-based的NeRF运用场景中。