3D Gaussian Splatting for Real-Time Radiance Field Rendering
新视角合成任务,nerf的后继之作,相比较nerf大大减小了开销。
主要特性:可微分的volume表示,非结构化,显式,
优化
首先从SfM得到的稀疏点云开始,定义:
$$ G(x) = e^{-\frac{1}{2}(x)\Sigma^{-1}(x)} $$
通过直接优化协方差矩阵$\Sigma$以获得表示辐射场的3D高斯,协方差矩阵只有在其为半正定时才具有物理意义,3D高斯所有参数都是用梯度下降进行优化,这缺失了半正定约束,所以采取:
$$ \Sigma = RSS^T R^T $$
其中S,R分别为缩放和旋转矩阵,最终的$\Sigma$类似于描述一个椭球体的构型。为了允许独立优化这两个因子,将它们分开存储:一个用于缩放的3D向量s和一个用于表示旋转的四元数q。它们可以轻松地转换为各自的矩阵并组合,确保归一化q以获得有效的单位四元数。
对α使用sigmoid激活函数,将其限制在[0-1)范围内并获得平滑的梯度,并且对协方差的缩放使用指数激活函数,原因类似。将初始协方差矩阵估计为各向同性高斯,其轴等于到最近三个点的距离的平均值。损失函数是L1和D-SSIM的组合:
$$ \mathcal{L} = (1 - \lambda)\mathcal{L}_1 + \lambda\mathcal{L}_{\text{D--SSIM}} $$
高斯自适应控制
每100次迭代进行一次密集化,并移除任何基本透明的高斯.
对于处于欠重建区域的小高斯,需要覆盖必须创建的新几何体。为此,最好克隆高斯,即简单地创建一个相同大小的副本,并沿位置梯度方向移动它。
另一方面,在高方差区域的大高斯需要被分割成更小的高斯。用两个新的高斯替换这样的高斯,并将其缩放比例除以一个因子.
高斯快速可微分光栅化器
首先将屏幕划分为16×16的分块(tiles),然后继续对视锥体和每个分块进行3D高斯的剔除。具体来说,只保留与视锥体相交且有99%置信区间的高斯。此外,使用一个保护带(guard band)来简单地拒绝处于极端位置的高斯(即那些均值靠近近平面且在视锥体之外的高斯),因为计算它们投影后的2D协方差会不稳定。然后,我们根据每个高斯重叠的分块数量实例化它,并为每个实例分配一个组合了视图空间深度和分块ID的键。使用单个快速的GPU基数排序 [Merrill and Grimshaw 2010] 基于这些键对高斯进行排序。注意,没有额外的每像素点排序,混合是基于这个初始排序执行的。因此,我们的α混合在某些配置中可能是近似的。然而,随着泼溅接近单个像素的大小,这些近似变得可以忽略不计。这种选择极大地提高了训练和渲染性能,并且在收敛的场景中不会产生可见的伪影。
在对高斯进行排序后,通过识别投影到给定分块的深度排序条目的第一个和最后一个,为每个分块生成一个列表。对于光栅化,为每个分块启动一个线程块。每个块首先协作地将高斯数据包加载到共享内存中,然后对于给定的像素,通过从前往后遍历列表来累积颜色和α值,从而在数据加载/共享和处理方面最大化并行性增益。当像素的α达到目标饱和度时,相应的线程停止。在固定的间隔,查询分块内的线程,当所有像素都饱和时(即α达到1),整个分块的处理终止。
在光栅化过程中,α的饱和度是唯一的停止标准。与先前工作不同,我们不限制接收梯度更新的混合图元数量。我们强制执行这一属性是为了让我们的方法能够处理具有任意、变化深度复杂度的场景并准确学习它们,而无需依赖于特定场景的超参数调整。在反向传播过程中,我们必须因此在前向传播中恢复每像素混合点的完整序列。一种解决方案是在全局内存中为每个像素存储任意长的混合点列表 [Kopanas et al. 2021]。为了避免由此带来的动态内存管理开销,我们选择再次遍历每个分块的列表;我们可以重用前向传播中的排序高斯数组和分块范围。为了便于梯度计算,我们现在从后往前遍历它们。
遍历从影响分块中任何像素的最后一个点开始,并且将点加载到共享内存再次协作进行。此外,每个像素只有在点的深度小于或等于前向传播中对其颜色有贡献的最后一个点的深度时,才会开始(昂贵的)重叠测试和点处理。第4节中描述的梯度计算需要原始混合过程中每一步的累积不透明度值。我们无需在反向传播中遍历一个显式的逐渐减小的不透明度列表,而是可以通过仅存储前向传播结束时的总累积不透明度来恢复这些中间不透明度。具体来说,每个点在前向过程中存储了最终累积的不透明度α;我们在从后往前的遍历中将其除以每个点的α,以获得梯度计算所需的系数。