3DGS(3D gaussian splatting)

一言以蔽之:3DGS是将三维空间用3D高斯椭球建模,并且通过splatting的方式映射到一个二维平面上。

image

一 sfm初始化稀疏点云

SfM初始化稀疏点云是重建三维场景的第一步,其目的是从一组无序的二维图像中,恢复相机的姿态以及场景中稀疏的三维点集(云)

1. 特征点检测与描述

在每张输入图像中检测具有代表性和可重复性的2D特征点(用SIFT和SURF)

为每个检测到的特征点生成一个描述符,这是一个紧凑的数值向量,用于唯一标识该特征点

2. 特征点匹配

对于每一对图像,通过比较它们各自的特征点描述符来找出匹配点对,即在两张图像中对应于场景中同一物理点的2D特征点

  • 最近邻匹配:找到描述符距离最近的匹配点
  • 比率测试:如果最近邻与次近邻之间的距离比率低于某个阈值,则认为该匹配有效,以消除歧义
  • RANSAC:使用RANSAC算法来剔除错误的匹配点,并估计图像间的几何关系

3. 两视图几何

在至少两张图像之间建立几何关系

计算本质矩阵或基础矩阵: 对于一对匹配的图像,通过这些匹配点可以计算出本质矩阵(如果已知相机内参)或基础矩阵(如果相机内参未知)。

这些矩阵编码了两幅图像之间的相对旋转和平移信息

如果计算得到本质矩阵,可以将其分解为四组可能的相机相对旋转和平移。通过检查哪个 组合使得三维点位于两个相机前方(即具有正深度),可以确定唯一的相机相对姿态

可以在下面极线几何部分找到具体说明

4. 三角测量

一旦确定了两张图像的相对相机姿态,就可以对匹配的2D特征点进行三角测量,从而恢复它们在三维空间中的坐标

三角测量利用了两个相机中心和匹配的2D点构成的光线在三维空间中相交的原理,计算出对应三维点的准确位置

详细可参考下面的详解三角检测方法部分


极线几何

对于场景中的一个三维点 ,它在两张图像中分别投影为 和 。极线几何揭示了 和 之间的几何约束

三维点 :场景中的一个真实三维点 相机中心 :两个不同视角的相机在三维空间中的位置 图像平面 :两个相机各自的成像平面 图像点 :三维点 在图像平面 上投影为 ,在图像平面 上投影为 光线:从相机中心穿过图像点并延伸到三维空间中的直线。例如,从 穿过 的光线,这条光线上的所有三维点都会投影到 。

image

这个约束可以用以下两个矩阵表示:

在不考虑相机内参的情况下:

基础矩阵 是一个 的秩为 2 的矩阵,对于一对对应的齐次图像点 和 ,它们满足极线约束: 有 7 个自由度(R(4个自由度)+t(3个自由度)),可以通过至少 7 对匹配点来估计

在考虑向量内参的情况下:

本质矩阵 是一个 的秩为 2 的矩阵,如果已知相机的内参矩阵 和 ,我们可以将图像点 和 转换为归一化相机坐标 和 。则极线约束变为:

和 之间的关系为:

说明

以左侧相机为参考系:设此时,设左右两相机之间有变换关系,

那么右侧相机坐标系中,

那么左右两点,分别在图像上面的投影为:

代入上文关系得到:

我们可以将上式重新整理为:

为了消除等式右边的加法项 ,我们可以用向量 对整个等式做左叉乘: 利用叉乘的分配律 和性质 :

观察等式左侧的向量 。根据叉乘的定义,这个向量同时垂直于 和

因此,我们用向量 对整个等式做点乘,使得等式左边为 0: 深度 ,因此:

这个等式在几何上被称为共面性约束。它表明向量 、 和 位于同一个平面上。这三个向量分别代表:从第二个相机光心指向物点的方向、两个相机光心之间的连线方向、以及第一个相机坐标系下的物点方向旋转到第二个相机坐标系下的方向。这三者共面是极线几何的基本原理

为了得到矩阵的表达式,我们将上述点积和叉乘运算转换为矩阵运算。

一个向量 与另一个向量 的点积可以写成 。 一个向量 与另一个向量 的叉乘 可以用一个反对称矩阵 来表示: 将这个表示法代入我们的共面性约束方程 中:

我们可以立即得出结论: 这就是本质矩阵 的最终表达式。它完全由两个相机之间的相对旋转 和平移 所决定。这个 的矩阵封装了两个视图之间的对极几何关系.

本质矩阵 的分解

本质矩阵 可以通过奇异值分解进行分解,以恢复两相机之间的相对旋转 和平移


详解三角检测方法

有如下已知条件和待求目标:

已知

通常,我们将第一个相机设置在世界坐标系的原点,其姿态是单位矩阵和零向量

第二个相机的位姿是相对于第一个相机的,由旋转矩阵 和平移向量 描述

为了简化推导,我们直接在归一化相机坐标下进行,忽略相机内参(即令 )。此时投影矩阵简化为:

相机的投影矩阵:相机的投影矩阵:

匹配的图像点: 一对匹配好的、归一化后的齐次坐标点

待求

三维点坐标

几何直观

第一个相机的光心 和图像点 定义了一条射线 第二个相机的光心 和图像点 定义了另一条射线 在理想情况下,这两条射线会在三维空间中交于一点,这个交点就是我们想要求解的物点 但是实际上,这两条射线在空间中往往不会精确相交。因此,三角测量问题就变成了:找到一个三维点 ,使得它到这两条射线的距离之和(或距离的平方和)最小。

直接线性变换 (DLT) 方法

我们从相机的投影方程入手。一个三维点 (齐次坐标为 ) 被投影到图像上,其关系如下:

这里的 是该点在相机坐标系下的深度, 是归一化图像点的齐次坐标, 是 的投影矩阵。

对于相机1

投影矩阵是 。 设点 在相机1下的深度为 : 我们得到: 即,三维点 就是其在相机1中投影方向 的 倍(即深度倍)

对于相机2

投影矩阵是 。设点 在相机2下的深度为 即

现在,我们将相机1得到的关系 代入到相机2的方程中:

这个方程中有两个未知数(深度 和 ),直接求解比较困难。我们可以利用向量的性质来构建一个关于 的线性方程组。

构建方程组

由投影方程 的几何意义: 向量 和向量 平行的 那么有: 令 , 记投影矩阵 的三行分别为 ,有: 将叉乘展开得: 由于叉乘运算,我们取前两个:

代入投影矩阵

将两个相机的投影矩阵,代入:

点 ,点 : 投影矩阵 的三行是:。 投影矩阵 的三行设为

代入得到矩阵, 是一个 的矩阵,由两个相机的投影矩阵和图像点坐标构成

求解

我们理想状态下,方程 意味着 位于矩阵 的零空间 (Null Space) 中

然而,由于实际数据中存在噪声和误差,通常 并不是一个严格奇异的矩阵(即它可能没有一个严格意义上的非零零空间)。这时,我们寻找的 就变成了使得 最小的那个向量,也就是近似零空间中的向量。

奇异值分解 提供了一种强大的方法来分析矩阵的结构,特别是它的零空间(或近似零空间)

当奇异值按降序排列时,矩阵 的列向量(称为右奇异向量)与奇异值一一对应

较大的奇异值对应的 的列向量,表示数据在这些方向上有较大的方差或能量,是数据的主要成分

最小的奇异值对应的 的列向量,表示数据在这些方向上的能量最小

当一个奇异值非常接近于零时,它对应的 的列向量就近似地处于 的零空间中。因为 作用于这个向量时,产生的结果几乎为零(或者说,它是最不被 影响的方向)。这个向量就是我们寻找的 ,因为它最小化了

即对矩阵 进行SVD分解:

解 就是对应于 的最小奇异值的 矩阵的最后一列向量

最后,将解出的齐次坐标 转换回非齐次坐标:

优化方法

DLT方法虽然直接,但它最小化的是一个代数误差,不具有明确的几何意义,因此对噪声比较敏感。更精确的方法是最小化重投影误差 (Reprojection Error)。

  • 以DLT的解作为初始值。
  • 将这个三维点 分别投影回两个相机,得到投影点 和 。
  • 计算投影点与观测点之间的距离(误差):
  • 使用Levenberg-Marquardt等非线性优化算法,调整三维点 的坐标,使得这个总误差最小

手性约束检查

一个物理上有效的重建点必须位于两个相机的前方。这意味着该点在两个相机坐标系下的深度(Z坐标)都必须为正。

检查条件:

  • 对于相机1,要求 。
  • 对于相机2,点在相机2坐标系下的坐标是 。要求 的第三个分量为正。

在计算出 后,必须进行此项检查。如果不满足,说明这个匹配点对是错误的,应该被剔除。


二 基于点云生成3D高斯椭球集

何为3D高斯椭球

给定一个三维高斯分布(三维正态分布):

给定中心:,协方差矩阵

: 表示任意三维点 : 表示高斯分布的中心(均值向量) : 协方差矩阵,必须是对称正定矩阵 : 协方差矩阵的行列式,控制归一化因子的大小 : 协方差矩阵的逆

服从的是一个三维高斯分布,到中心的距离越远,其概率密度越小,各个方向的延展由进行控制

这个公式即可以用来表示概率,也可以用来定义一个“软体积”或者说“模糊体积”的感知范围

我们知道:

且 ,

,令,

令 仍为常数

设

那么有约束关系:

也就是说,一直是一个椭球面,那从变化到就是一个椭球体

为何在三维空间中使用3D高斯椭球建模

1. 3D高斯在仿射变换下仍为3D高斯(仿射不变性)

定义

设有三维高斯分布的随机向量:

对其进行仿射变换:

则 仍服从高斯分布,且:

证明

对于仿射变换后的随机变量 :

均值:

协方差:

因此:

该变换作用于高斯分布后,不会改变其指数函数的结构,因为: 在仿射变换下仍保持为二次型。因此,变换后仍为高斯分布

几何解释

三维高斯分布可以看作一个由中心 和协方差矩阵 决定形状与方向的椭球体。

仿射变换: 包含两个部分:

:线性变换,包含旋转、缩放、剪切等;

:平移,改变椭球的中心。

在 3D Gaussian Splatting 中的意义

在 3D Gaussian Splatting 中,每个高斯分布表示一个椭球形状的体素,其协方差矩阵常构造为: 其中:

是对角矩阵,表示三个方向上的缩放(也可以认为是放缩变换)

是旋转矩阵(方向)

该构造可视为对单位高斯施加仿射变换,但其本质仍为高斯分布

2. 3D高斯降维为2D后仍然为高斯

特殊形式

设三维高斯随机向量如下:

其中:

我们现在想要求二维边缘分布,需要一个比较复杂的矩阵运算:

为了积分,我们可以借助联合高斯的标准分块逆公式,写成:

这是联合高斯的分解公式。对 积分:

由高斯分布的边缘化性质可知: 也就是说,从一个联合高斯分布中,积分掉一个维度(即降维),剩下的边缘分布仍是一个高斯分布

联合高斯的标准分块逆公式推导(*)

我们令:

则联合协方差矩阵为: 使用分块逆公式

若 可逆,则 的分块逆公式为: 其中: 是补 令

则联合高斯密度的二次型项为:

整理成关于 的完全平方形式(注意此时,均为标量):

由此我们读出条件高斯分布的均值与协方差为:

最终我们得到条件分布:

球谐函数

球谐函数是一组定义在球面上的正交基函数

球谐函数通常用 表示,其中:

是阶数, 可以是 的整数;

是索引,对于给定的 , 可以取 的整数值,因此,每个 阶有 个不同的 值;

是极角,通常是从Z轴正方向到点P的夹角,范围是 ;

是方位角,通常是从X轴正方向在XY平面逆时针旋转到点P在XY平面投影的夹角,范围是 ;

(零阶) 只有一个函数 。它是一个常数,表示球面上均匀分布的颜色

(一阶):有三个函数 。它们是线性函数,在球面上呈现出从一极到另一极的渐变,就像一个沿着某个轴的光照。

(二阶): 有五个函数 。它们是二次函数,形状更加复杂,能够捕捉到更多的细节

这些函数与像 等二次多项式相关

随着 的增加,球谐函数的数量 也会增加,并且它们能够捕捉到的球面细节也会越多

相机与球心的连线向量的方向向量则是上文提到的

阶球谐函数表达颜色有个参数

不透明度

定义为当前3d高斯椭球的不透明度

那么投影到2D高斯的不透明度可以使用以下公式

数据结构:一个高斯椭球集里面都有些什么

高斯椭球集以椭球为单位

每个椭球包含:

  • 中心点坐标(3个参数)
  • 法向量信息(3个参数)
  • 颜色信息(3(基础0阶)+ 45(1,2,3阶)=48个参数)
  • 不透明度
  • 缩放矩阵(协方差矩阵中的S)(3个参数)
  • 四元数(对应协方差矩阵中的R)(4个参数)

三 Splattiing过程

总的而言,就是三维高斯椭球体被投影到二维图像空间椭圆形,进行渲染。

image

而这种三维高斯分布,投影到二维平面后,我们可以想象到这是一个二维的高斯分布,形象一点就是这样——

image

具体的Splatting过程推导

1. 从世界坐标系到相机坐标系(仿射变换)

设一个3d高斯:中心(均值)为 ,形状(协方差)为

在相机坐标系,有视图矩阵和平移向量和,那么对于任意世界坐标系下的有变换:

,这里的 就是我们通常理解的深度

变换后

2. 从相机坐标系到光线空间(投影变换)

标准的透视投影公式是 和 ,这个“除以”的操作是非线性的,会破坏高斯函数的结构

定义投影变换

前两项是标准的透视除法。它将相机空间中的一个点投影到成像平面上。所有在同一条从相机原点出发的光线上的点,经过这个变换后,前两个坐标值都是相同的。这正是我们想要的“投影”效果

第三项用了点到相机中心的欧几里得距离,可以使得在任意一条光线上等距采样的点,在变换后的空间里,它们之间的距离(由第三维决定)也是等间隔的

我们可以假设,对于一个高斯椭球,在其中心 的一个很小的邻域内,这个复杂的非线性变换 可以通过泰勒展开被一个线性(仿射)变换很好地近似 是Jacobian矩阵

所以最后的协方差矩阵为:

在 2D 屏幕上,直接关心 左上角的 2 * 2 部分即可

中心点坐标则直接使用 即可

即:

3. 视口变换

image 在上一阶段,通过包含雅可比矩阵 的复杂变换,我们成功地将世界坐标系中的3D高斯椭球,转换为了一个位于“投影空间”或“裁剪空间 (Clip Space)”中的2D高斯椭圆。

这个2D高斯椭圆由两部分描述:

一个2D的均值(中心点)

一个的协方差矩阵 ,描述了椭圆的形状、大小和方向

重要的是,此时的坐标是标准化的,与最终屏幕的分辨率无关。这个标准化的空间通常被称为NDC

在2D情况下,NDC空间通常被定义为:

x 坐标范围: (-1代表左边界,+1代表右边界)

y 坐标范围: (-1代表下边界,+1代表上边界)

视口变换的任务就是将NDC空间中的坐标,映射到最终要显示的屏幕像素坐标上。

例如,我们需要将NDC中 映射到屏幕的第0列像素,将 映射到屏幕的第 列像素

假设:

是NDC空间中的坐标 是最终的屏幕像素坐标 是视口(窗口)的宽度 是视口(窗口)的高度 是视口在屏幕上的起始点(左下角)的像素坐标。通常为

从NDC的 范围映射到屏幕的 范围:

对于我们的高斯椭圆,我们就是用这个公式来变换它的中心点,得到它在屏幕上的像素中心

视口变换不仅移动了椭圆的中心,还拉伸了它的形状。平移不影响协方差,但缩放会。

视口变换的缩放部分可以被一个缩放矩阵 表示: 这个矩阵表示在x方向上缩放 倍,在y方向上缩放 倍。

根据仿射变换的性质,变换后的协方差矩阵 的计算方式如下: 因为 是一个对角矩阵,所以 。展开后得到: 这个新的协方差矩阵 现在描述了高斯椭圆在像素空间中的确切形状和大小

4. 光栅化

image

光栅化的核心任务是根据几何信息,确定最终图像中哪些像素被覆盖,并计算这些像素的最终颜色贡献

光栅化器会计算出2D高斯椭圆的轴对齐包围盒 (AABB),并计算出包围盒内的每一个像素


四、渲染过程

准备过程

首先这个准备过程并非是像素级精度的,而是将精度降到了patch级。

会进一步识别出哪些patch与特定的高斯投影相交,投影的 2D 高斯被按照其深度值进行排序,以便在后续的渲染过程中正确地处理遮挡关系

即:

对于给定的一个patch,首先通过“观察变换” 计算所有与该patch重叠的高斯体的距离(即这些高斯体的深度),形成一个有序列表。这意味着离相机近的高斯体排在前面,远的排在后面。

image

image

alpha-blender

根据上面不透明度的排序,有如下计算过程:

其中 是学习到的高斯颜色 是最终的不透明度,它是由学习到的二维不透明度 和高斯函数的衰减结果相乘得到的

最终不透明度 的计算:

解释了如何计算每个高斯对像素的最终不透明度贡献 :

和 是在投影空间中的坐标 这个公式中的指数部分正是二维高斯分布的概率密度函数,它表示了像素 距离高斯中心 的远近以及高斯形状 对不透明度的影响 距离越近,不透明度贡献越大;距离越远,贡献越小


五、loss比对过程

image

其中:

计算渲染像素值与真实像素值之间绝对差的总和

:SSIM值详解如下:

SSIM 指数将图像质量评估分解为三个主要组成部分:

(1)亮度比较: 其中 和 分别是图像块 和 的平均亮度, 是一个小的常数,用于避免分母为零

(2)对比度比较: 其中 和 分别是图像块 和 的标准差, 是一个小的常数

(3)结构比较: 其中 是图像块 和 的协方差, 是一个小的常数

最终的 SSIM 值是这三个分量的乘积: 在实际应用中,通常取 ,得到简化形式: SSIM 值通常在一个局部窗口内计算,然后对所有窗口的结果取平均,得到整幅图像的 SSIM 值。SSIM 的取值范围是 ,其中 表示两幅图像完全相同。


六、基于梯度自适应的点云分布方式

点密集化

视图空间中具有较大位置梯度的高斯

  • 在未充分重建的区域克隆小高斯

  • 过度重建的区域分裂大高斯

点的剪枝

移除冗余或影响较小的高

  • 几乎是透明的高斯(低于指定阈值)

  • 在世界空间或视图空间中过大的高斯