目录
一、导言
二、相关工作
1、传统场景重建
2、神经渲染与辐射场
3、点云渲染
三、3DGS
1、SFM初始化稀疏点云
2、3D高斯椭球
3、协方差
4、球谐函数
5、3D高斯椭球集建立
6、3D投影2D
7、3D渲染公式
四、损失函数
五、基于梯度自适应改变点云的分布方式
六、快速可微光栅化
一、导言
该论文是2023年SIGGRAPH的新论文,收录于ACM T GRAPH。该论文第一次提出3DGS这一新场景表达。
(1)第一次使用3D高斯场景表示,保留了连续体积径向场的优点,同时也支持高效的优化和渲染。
(2)采用一种优化方法,交替更新3D高斯参数和自适应密度控制。
(3)3DGS也是第一个达到对于开放完整场景、无边界、1080p分辨率下实现高效渲染并达到SOTA性能的工作。
二、相关工作
1、传统场景重建
(1)基于光场的方法
最初为密集采样光场方法,通过光场相机或多个相机阵列捕捉场景光场数据(包含坐标与方向),然后通过光场估计深度信息,进一步通过深度信息和光场数据来进行三维重建,一般用于早期的VR,AR工作。但存在计算量较大,且易受到光场条件影响的问题。
之后也产生了无序采集方法,在不同时间不同位置进行采集,之后通过传统匹配算法(SIFT等)实现特征匹配,但由于时序问题,重建过程中在时间维度上存在不真实性,不连贯性,也缺失了上下文信息,这也导致快速运动物体的运动模糊,长时间容易改变的自然场景下时间连续性较差导致的重建模糊。
(2)结构恢复方法
SFM方法通过一组照片合成欧式结构下新的视角下的图片,首先通过一组图片使用SIFT算法提取特征,并进行特征匹配去除噪声影响,并使用RANSAC后处理得到位姿估计。
详细原理看下面链接:
三维重建(7)--运动恢复结构SfM系统解析_sfm三维重建-CSDN博客
(3)多视角立体算法(MVS)
MVS相比于SFM来说,生成更为稠密的点云来满足稠密重建过程,而SFM生成稀疏的点云针对于位姿估计。另外就是MVS涉及多视角图像中推断每个像素的深度(利用相机参数),并使用几何图形约束来密集化点云。
由于MVS输入特定的几何图形,当重建得到不存在的图形时不能进行恢复。
2、神经渲染与辐射场
由于使用CNN改进MVS的渲染会存在受到光线的时间闪烁现象。
NeRF解决了质量和速度的问题,对于基于NeRF的Mip-NeRF360上虽然渲染质量相当高,但渲染时间极长,所以难以做到高质量的实时渲染。
InstantNGP使用哈希网格和占用网格来加速,并且使用小的MLP来表示密度和外观,保证渲染速度,但质量略逊于Mip-NeRF。
3、点云渲染
通过点云渲染容易存在孔洞、锯齿、不连续性的问题,后续通过溅射点大于像素点来解决的,这也是3DGS的雏形。
三、3DGS
下图为3DGS的流程图示。
1、SFM初始化稀疏点云
相当于首先用colmap初始化一组点云,原理是通过输入一组图片使用sfm算法先估算一组点,作为初始稀疏点云。
2、3D高斯椭球
椭球几何形状:首先将点云的位置信息,作为椭球集中每一个椭球的中心点,椭球使用三个高斯分布来规划三个方向的长短轴。类似于下面的这个图,只不过三个高斯分布并不是相同的,也就导致了椭球的不唯一性。
高斯椭球的几何表示(协方差矩阵): ,其中代表旋转矩阵(满足正交矩阵),是缩放矩阵(对角矩阵)。
3D高斯数学表达如下,上式通过3D高斯分布概率函数积分而来,其中由于均值在椭球中心,所以可以忽略,另外前面的系数是为了高斯分布面积为1导致的,所以去除系数,达到更高的椭球伸缩性。
3、协方差
协方差物理含义:,其中是一个变换,将任意一个函数变换到均值为0,方差为1的分布中,而对于该论文定义,其中为旋转矩阵,为缩放矩阵。后续对于A进行改变即可对椭球实现放缩、旋转、方向等工作。
另外在实际实现中,旋转矩阵是使用四元数形式处理。
协方差的目的就是将椭球的几何特征存储起来。
下图为对于线性变换的理解,可以解释为先进行缩放矩阵(Y轴方向压缩),再进行旋转矩阵(顺时针旋转)。
这样设计的原因?
(1)结合旋转和缩放矩阵的嵌套,可以通过协方差矩阵将原来的标准高斯分布推到一个带有任意形状的高斯分布椭球体。
(2)另外这样的表达,可以满足仍然是一个对称半正定矩阵,保证特征值均非负,也就可以进行特征值分解。
4、球谐函数
3DGS使用球谐函数的目的:存储椭球的颜色信息。
球谐函数可以类比使用多项式或者傅里叶级数去近似拟合一条曲线,球谐函数使用不同阶的基函数(类似球体,化学的元素原子轨道围成的曲面)线性组合,去拟合一个不规则的曲面。
球谐函数的基函数定义一般是 。
将基函数降维到2维便于理解,而此处是基函数,对于拟合的曲面则需要取多个加权求和。
阶数 | 第几个 | 公式 |
0 | 1 | |
1 | 1 | |
1 | 2 | |
2 | 1 | |
2 | 2 |
参考:
https://zhuanlan.zhihu.com/p/351289217
https://www.cnblogs.com/GeraltofChina/p/15542446.html
https://zhuanlan.zhihu.com/p/681085846
对于三维情况,也类似于二维情况,取多个基函数并加权求和,在3DGS中我们取3阶内的16个基函数进行加权求和。
对于3DGS,我们使用球谐函数分别来计算RGB三个颜色值,即对于不同下距离球心的距离映射为的颜色值。所以三通道乘以基函数数量为16*3=48个参数。
如下图所示。
5、3D高斯椭球集建立
对于每一个椭球都有下面的参数:分别是椭球中心位置信息(3维),法向量信息(没有用上),颜色信息(48维),不透明度,缩放矩阵(3维),旋转矩阵(四元数4维)。
6、3D投影2D
投影变换如下: 。
其中代表三维协方差矩阵,代表投影变换雅克比矩阵(通过多元函数求导而来),是视图变换矩阵(这里就是图中使用到Camera相机参数的地方),从世界坐标系到相机坐标系的变换。这一变换目的是将世界坐标系下三维椭球变换到相机坐标系下二维的光栅化平面空间。之后也便于与相机参数进行交互。
转换后光栅化的平面空间的已进行CUDA加速以及自适应的密度控制(对于前后不透明度对颜色的影响的处理)
7、3D渲染公式
,其中。
其中指当前点不透明度,代表前i-1个透明度的和,所以值越大前面越透明。此处由于没有NeRF的光线取采样点,所以前i-1个计算一定范围内椭球集的透明度。
四、损失函数
损失函数由L1范数和D-SSIM指标构成。
L1损失:计算渲染图像与真实图像的绝对差值。下式两幅图的所有像素点值作差并取平均。
D-SSIM损失:渲染图像与真实图像之间的结构相似性差异。下式中代表图x的均值,代表图像x的方差,代表图像x和y的均方差,是为避免分母为0而引入的小常数。
其中,D-SSIM值越小,两幅图像之间相似性越高。
总损失表示:,一般取λ为0.2
五、基于梯度自适应改变点云的分布方式
由于我们不能保证初始化的点云建立椭球集一定满足当前所需要拟合的模型,可能存在以下两个问题:
(1)由于离相机距离过近的一些点而造成伪影,这里我们将不透明度低于一定阈值或者距离相机过近的点进行删除,每100次删除一次这种点。
(2)存在上图的欠采样和过重建问题,基于梯度变化来进行判断。
欠采样(方差过小)就是椭球不足够覆盖整个重建区域,过重建(方差过大)是过度覆盖整个重建区域。
这里对于欠采样问题,我们克隆一个椭球一模一样的重新加入迭代,对于过重建问题,我们分裂为两个椭球集,将分布等比除以因子1.6之后复制为两个更小集。
对于如何判断欠采样和过重建?
监控点云中Gaussian的平均位置梯度幅度是否到达阈值 (设置为0.0002)。如果超过该阈值,说明存在"欠重建"或"过重建"的区域,需要进行处理。
六、快速可微光栅化
快速可微光栅化(Tile-based Rasterizer):目的是渲染不同视角下的图像。
流程:
(1)将图像分割为16*16的tiles,每个tile视锥内挑选合适的3DGS椭球
(2)每个视锥内只取置信度大于99%的3DGS,并且按照深度排序,其中每个高斯实例化一个key,key由视空间深度和title ID组成。
(3)并行的在每个tile上进行抛雪球,逐个像素进行前向遍历以及累加不透明度和颜色值。
(4)当存在像素不透明度达到饱和则停止线程。
(5)反向传播误差按title进行遍历,计算梯度。
一个问题就是:对于这个得到2D协方差后进行光栅化得到图像的过程,不太清晰。
参考文献:https://arxiv.org/abs/2308.04079
参考代码:https://github.com/graphdeco-inria/gaussian-splatting
参考视频1:3D Gaussian Splatting原理速通(三)--迭代参数与渲染_哔哩哔哩_bilibili
参考视频2:【论文讲解】用点云结合3D高斯构建辐射场,成为快速训练、实时渲染的新SOTA!_哔哩哔哩_bilibili