> 技术文档 > 3DGS较真系列_3dgs模型

3DGS较真系列_3dgs模型

目录

引言

三维高斯飞溅(3DGS)

总体流程

SFM算法

1.特征提取:

2.特征匹配:

3.图像对优选:

4.相机位姿估计及空间点坐标获取:

5.三角化确立新图像地图点:

6.重建场景及其约束:

3DGS

1.捏雪球

2.抛雪球

3.雪球颜色

4.高斯自适应控制

5.快速光栅化

6.交叉优化

7.整体流程

4DGS和Deformable 3DGS

引言

机器视觉领域中,新颖视图合成技术的核心目标是通过图像或视频构建可以被计算机处理和理解的3D模型。该技术被认为是机器理解真实世界复杂性的基础,催生了大量的应用,包括3D建模、虚拟现实、自动驾驶等诸多领域。回顾其发展历史,针对真实世界场景重建的研究早在深度学习诞生之前就已经兴起。

早期研究主要集中在光场和结构性数据的恢复上,受限于早期计算机对密集采样和结构化捕获的算力限制,在处理复杂光照场景和不规则结构方面出现了巨大技术瓶颈。2006年,运动结构恢复算法(Structure from Motion,后文简称SFM)和多视图立体算法(multi-view stereo,后文简称MVS)的出现打破了这一僵局,为后续新颖视图合成技术提供了强大的基础框架。2020年,ECCV 2020,隐式神经辐射场技术(NeRF)诞生,实现了这一技术的阶段性飞跃。NeRF利用深度神经网络,实现空间坐标到图像色彩及密度的直接映射,构建了连续、立体场景功能,实现了该领域中三维模型前所未有的细节和真实感,但代价也十分明显:1)计算强度极高:NeRF的场景构建方法为计算密集型,单一场景构建需要大量的算力资源和时间成本,尤其是高分辨率输出时;2)可编辑性差:单一场景的编辑需要重新训练整个流程。操纵隐式表达的场景具有较大挑战,中间环节的神经网络参数都需手动调控。

针对上述NeRF存在的困境,三维高斯飞溅技术(3D Gaussian Splatting,后文简称3DGS)应运而生。其主要思想在于使用3D Gaussian椭球表示三维模型,并通过Splatting技术渲染模型图像。该方法实现了辐射场的实时渲染,能够在较少的训练时间内,实现SOTA级别的视觉效果。3DGS针对多张图像或视频拍摄的场景时,允许以1080P分辨率进行实时(≥30FPS)的新视图渲染。

三维高斯飞溅(3DGS)

总体流程

3DGS原始的代码仅支持静态场景的重建。其大致流程包括:

1)输入一组静态场景的图像。由SFM算法,获取场景中的稀疏点云及所有图像对应的相机位姿。

2)对获取的每个稀疏点云创建初始化3D高斯椭球,其由位置(平均值)、协方差矩阵(XYZ轴缩放因子、旋转因子等)、不透明度和球谐函数系数(后文简称SH系数)所定义。该定义允许3D场景合理紧凑的表示,并通过调节参数紧凑化表示精细化场景结构。

3)基于相机位姿,选取位于相机视椎体之内的3d gaussian椭球,节省计算量

4)将3D gaussian椭球投影到2D图像空间中

5)通过固定的场景图像与原始输入图像(真值图像)进行比对优化,对初始化后的参数(位置、协方差矩阵、SH系数、高斯球密度的自适应控制)进行优化,并使用了快速GPU排序算法,受到基于tile的光栅化的启发构建光栅化实时渲染。

5)允许高斯球和高斯球之间重合,设计了跟踪快速后向通道,自适应调控高斯梯度。

SFM算法

运动结构恢复(Structure from motion),即给出多幅图像及其图像特征的一个稀疏对应集合,估计3D点的位置,这个求解过程通常涉及3D几何(结构)和摄像机姿态(运动)的同时估计。由于图像之间可能是无序的,并且图像数据量大,数据来源广而丰富。针对以上特点,出现了三种SFM策略,包括增量式、层级式以及全局式。增量式即先选出两张图像进行初始化,接着一张张图像进行配准及点的三角化;全局式即一次性将所有的影像进行配准与重建;层级式先将影像进行分组,每组进行配准,再对上一步的结果进行配准重建。其中,增量式在无序图像数据集重建中应用最广泛,其应用包括Bundler、VisualSfM、COLMAP等优秀的SFM开源软件,为SFM的应用与研究提供了基础。

3DGS的初始化流程中,严格遵循COLMAP增量式SFM的点云初始化流程。COLMAP是当今最受关注的主流SFM开源软件,其为3DGS提供稀疏点云,相机位姿以及对应图像参数。COLMAP的整体流程可简单归纳为以下环节:特征提取,特征匹配,相机位姿估计,三角测量,场景重建。

1.特征提取

这里的特征提取环节并不是神经网络中所提到的图像特征,而是特征描述子。在该环节中,需要提取图像间的共有特征点,该特征点需具备克服跨模态、跨尺度、跨视角、跨帧的能力,同时可以有效规避非线性辐射干扰、大气辐射干扰、运动模糊干扰、形变干扰等。在COLMAP中一般会采取经典的ORB、SIFT、SURF等特征点描述获取作为优先选项。针对不同的情况,我本人推荐HOPC、SuperGlue、SuperPoint、D2-Net等全新的特征点获取方式,并加入神经网格规整特征描述子的形状及X-Y坐标。

2.特征匹配

由于COLMAP采取的是增量式SFM算法流程,整体以视频的时间帧进行图像间的特征点匹配。匹配环节符合SIFT、SURF的暴力匹配模型。在整体匹配中,为了规避无关点和误匹配的出现,采用KNN、FLANN等优化算法进行点与点间的连线,并加入RANSAC、LMEDS进行GOOD MATCHING(最佳匹配点)提纯。

3.图像对优选

在获取了逐帧图像间的特征匹配关系后,利用特征点间的描述向量得到重叠图像对(≥2张)。该环节的在于对时间复杂度下的多重叠图像进行优化,去除不必要的图像,寻找相似度及图像信息囊括最多的图像帧。该环节在COLMAP中仍以RANSAC作为常用手段,但其本身的优化算法非常多。

4.相机位姿估计及空间点坐标获取

这个环节非常重要。首先,针对场景重建的问题。对于单一范围内的场景,我们选取上述操作中获取的重叠图像,并进行图像间的双目初始化。由于重叠图像的数量大多为两张以上,因此,我们获取的数据冗余非常高,这会使得重建的精度和细节更加丰富。接下来,我们进行图像的空间配准。通过特征点匹配所获取的变换矩阵,我们求解出图像与图像间特征点所在的相对三维空间坐标,并利用2D和3D关系,利用RANSAC算法及最小位姿解算器,求解计算机视觉中常见的PNP(Perspective-n-Point)问题,进而求解出多图像间的相机位姿。

5.三角化确立新图像地图点

该环节是COLMAP的主要创新点之一。三角化过程即前方图像交汇,通过配准已有场景的强特征点,获取已存在的空间三维点(即单一场景里的相对三维坐标)并校准新的空间三维点(即选取单一场景的XY坐标为原点,校准合成三维场景的坐标)。在COLMAP中,使用了光束法平差进行该环节的优化。通过校准配准场景间的反向投影误差,提高三角化过程的准确性,并在训练过程中,增加了Huber、Tukey等损失函数。

6.重建场景及其约束

在完成了所有的地图点获取后,此时所有的场景点云已经全部获取完毕。该场景点云全部由图与图之间的特征点所构成,点与点之间存在明确的空间对应关系。同时,单一点对应多个相机位姿和图像信息。为了进一步优化相机位姿和三维坐标点。COLMAP提出使用BA(Bundle Adjustment)算法对生成的稀疏点云和相机位姿进行监督优化。该算法可有效减少重投影误差和累积误差。BA问题是机器视觉中的经典求解问题,可选取严格方式和不严格方式进行求解。严格方式即通过相机稀疏矩阵与特征点稀疏矩阵优化参数;非严格方式即通过简单的迭代求解器,估算参数并与当前参数比对。在COLMAP中,提出了一种BA优化方法,即针对场景与场景间的图像配准关系,都只进行局部图像块的BA求解。当整体的场景重建完成后,再进行一次全局BA求解,从而减少计算代价。

3DGS

1.捏雪球

3DGS是3D Gaussian Splatting的简写,3D高斯在空间中是一个椭球形状的物体,Splatting意思是喷溅,那么如何去理解Splatting呢?

Splatting中splat是一个拟声词,译为啪叽一声,想象输入是一些雪球,图片是一面墙,图像生成的过程模拟为雪球砸向墙的过程,每扔一个雪球,墙面上会有扩散痕迹,足迹(footprint),同时会有啪叽一声,因此得名。

Splatting的核心是什么呢,分为以下三步:

  • 选择[雪球]
  • 抛掷雪球:从3D投影到2D,得到足迹
  • 加以合成,形成最后的图像

对于第一步选择雪球,为什么需要选择雪球呢,因为我们的输入是一些点,点本质是没有体积的,也是没有能量的,所以选择一个核来对他进行膨胀,这个核可以选择高斯也可以选择圆、正方形或其他;那为什么选择高斯呢,就是因为他有很多优良的数学性质,如下。

如果一个物体在所有方向都具有相同的扩散程度,那么他就有各向同性,可以参考球形,否则具有各向异性,参考椭球形。各向同性和各向异性的差异可以理解为椭球是具有不同形状的球。

3D椭球集的创建:

可以使用协方差矩阵来控制椭球的形状。因为任意高斯都可以看做是标准高斯通过仿射变换得到,所以任意椭球都可以看作是球通过仿射变换得到。

而协方差矩阵是可以通过旋转和缩放矩阵来表达的,表示了这个3D高斯在各个坐标轴的缩放以及旋转。由于3D高斯的协方差矩阵必须满足半正定,而直接学习协方差矩阵很难满足这个条件,不能用传统梯度下降法,或者说不能将协方差矩阵作为一个优化参数直接优化。所以在之后的实现中,也是先学习高斯的旋转矩阵和缩放矩阵,再通过他们构造对应的协方差矩阵;那么不直接对协方差矩阵优化,而是将R,S作为优化参数优化,就可以保持协方差矩阵的正半定。

  • R是四元数表示的旋转矩阵(此矩阵要保持normalization)

  • S是一个对角缩放矩阵,其对角线上是协方差矩阵三个特征值的平方根

通过定义R,S以及location(也就是均值),我们可以得到三维空间中所有形式的3D Gaussian。 

所以说,捏雪球的过程就是形成一个3D高斯的过程,3D高斯本身是一个椭球,可以通过协方差零矩阵来控制椭球的形状,而可以通过旋转和缩放矩阵来控制协方差矩阵。

2.抛雪球

是计算机图形学中用三维点进行渲染的方法,该方法将三维点视作雪球往图像平面上抛,雪球在图像平面上会留下扩散痕迹,这些点的扩散痕迹叠加在一起就构成了最后的图像,是一种针对点云的渲染方法)的方法进行渲染。

我们需要实现某种方式,能够将多个3D Gaussian投影到2D image上来渲染结果。

抛雪球即为从3D到像素的一个过程,这个变化主要是通过一些变换来做的,比如正交投影,是与z无关的一种投影;透视投影,是与z有关的一种投影。

具体来说,仿照渲染管线的流程,假如一个初始的3D Gaussian是在模型空间的话,协方差矩阵就相当于模型变换,将3D Gaussian转换到了世界空间。然后W是View Transform Matrix,将3D Gaussian转换到了相机空间。J是Jocobian Matrix,是用来近似Project Transfor Matrix实现Project Transform。 

3.雪球颜色

4.高斯自适应控制

在 3D Gaussian Splatting (3DGS) 里,由于每个点云高斯都有可优化参数,如位置、各向异性协方差、颜色、透明度、旋转。高斯自适应控制的核心目标是动态调整高斯分布的参数,以优化 3D 表现,确保渲染效果既高效又准确。

我们从SfM的初始稀疏点集开始,然后应用我们的方法自适应地控制单位体积内的高斯数量和密度,这样就能从初始稀疏的高斯集变为更密集的高斯集,从而以正确的参数更好地表现场景。在优化预热之后,每迭代100次就会进行一次高斯致密化处理,并移除基本透明的高斯,即α小于阈值的高斯。

对于重建不足区域的小高斯,我们需要覆盖必须创建的新几何体。为此,最好通过简单地复制高斯,创建一个相同大小的副本,并沿位置梯度方向移动。

另一方面,当某个高斯过于模糊,无法细化局部细节,需要更精确的形态表示时,高方差区域的大高斯需要分割成更小的高斯。我们使用两个新的高斯来替换这些高斯,让局部区域变得更细腻。

在第一种情况下,我们检测并处理增加总体积和高斯数量的需求,在第二种情况下,我们会保留总体积并增加高斯数量。和其他体积表示法类似,我们的优化可能会陷入靠近输入相机的漂浮物上的情况;这可能会导致高斯密度的不合理增加。缓和高斯数量增加的有效方法是,每3000次迭代后,将α数值设置为接近于0。然后,优化会在需要的地方增加高斯的密度,同时允许去除α 的高斯。高斯可能会缩小或增大,并与其他高斯有重叠,但我们会定期移除世界空间中非常大的高斯和视图空间中占用较大的高斯。这种策略可以很好地控制高斯总数。我们模型中的高斯函数始终保持欧式空间中的原语;和其他方法不同,这里不需要对远距离或大型高斯进行空间压缩、扭曲或投影策略。

5.快速光栅化

在 3DGS 渲染过程中,快速光栅化(Fast Rasterization)是核心步骤之一,负责将 3D 高斯投影到 2D 屏幕,实现高效渲染,并计算其贡献。

 在 3DGS 里,每个高斯点都有一个 3×3 的协方差矩阵Σ (在世界坐标系下表示高斯分布的形状),当其经过投影后,其在屏幕空间的协方差矩阵。其中

  • W是透视投影矩阵
  • J 是透视投影的雅可比矩阵(用于调整尺度和方向)

这样,透视投影后的高斯点可以正确地在屏幕上渲染出符合透视缩放规律的 2D 形状。

光栅化的gpu高度并行

每个 3D 高斯点 在被投影到 2D 视图 之后,需要进行深度排序(Depth Sorting),因为在远处的高斯点和在近处的高斯点对结果的影响是不同的(想象一下离墙很近抛雪球和离墙很远抛雪球对墙的影响),需要确保**从最远到最近(Back-to-Front)**排序,以正确混合颜色。类似于 体渲染(Volume Rendering),累积颜色遵循公式来计算透明度混合(Alpha Blending)

如果每一帧都对所有高斯点进行全局排序,计算复杂度为 O(Nlog⁡N),会影响渲染效率。因此采用 Tiled Sorting:在小块区域内并行排序,提高效率。

Tiled Sorting(块排序)指的是:

  1. 将 2D 视图划分为多个小块(Tile),每个小块独立进行排序。

  2. 仅对 属于同一 Tile 的高斯点 进行 局部排序(按照 Z 值从大到小)。由于每个 Tile 只包含一小部分高斯点,排序的计算量大幅减少

  3. 排序方式仍然是 Back-to-Front(从远到近),保证透明度混合的正确性

简单解释就是,先按深度远近进行排序,比如按照从近到远的顺序分别为绿、蓝、粉色的3D高斯,将图像划为多个不重叠的图像块,每块包含16x16像素,由b图可知绿色高斯椭球投影之后占据了两个图像块,分别为Tile1和Tile2,蓝色占据四个,粉色占据一个,这也对应着c图左侧的序列,那么再按照图像块的角度进行排序,Tile1对应绿色蓝色高斯椭球,Tile2对应绿色蓝色高斯椭球,Tile3对应粉色蓝色椭球,Tile4对应蓝色椭球。到此,之后的独立绘制就是Tile1只负责Tile1的部分,各司其职,负责自己的部分即可,每个线程之间的运行就不进行打扰了。

片元着色(Fragment Shading)

  • 计算每个屏幕像素的颜色:对覆盖该像素的多个高斯点进行加权平均(类似于 alpha blending)。

  • 计算公式:

其中:

  • Ci​ 是第 i 个高斯点的颜色

  • αi​ 是它的不透明度

6.交叉优化

优化的目的是创建一组密集的 3D Gaussian 以精确地表示场景。优化的参数包括:三维位置 p、透明度 α 各向异性协方差 Σ 和球谐系数 SH (spherical harmonic coefficients) 。这些 ⌈参数的优化⌋ 和 ⌈自适应控制高斯模型⌋ 交替进行。

注意:图中的球谐系数 SH (spherical harmonic coefficients) 来表示每个高斯的颜色 ,不同视角颜色不同。

参数优化使用 SGD 连续迭代完成,每一轮迭代时都会渲染图像并将其与真实的训练视图做比较。α使用 Sigmoid 激活函数来限制 (0, 1) 的范围;Σ使用指数激活函数激活;p使用指数衰减调度技术 (exponential decay scheduling technique) 进行优化。模型的损失函数是 L1 与 D-SSIM 项的组合:

7.整体流程

场景表达通过很多个高斯球来实现,如下图所示,每个高斯球对应59个参数。

其中决定一个高斯球需要59个系数来表达,这些也是优化问题要求解的状态:

中心位置:3dof
协方差矩阵:7dof
透明度:1dof
球谐系数:48 dof(J = 3,16 * 3)
整体流程

1)Initialization: 输入为3D点云,可以 通过colmap得到,(NeRF也会用到colmap,使用位姿), 基于这些点云初始化高斯球,每个点云位置放置一个高斯球,中心点位置设置为点云位置,其他随机初始化
2) Projection: 根据相机内外参数(图像位姿),把高斯球splatting到图像上把能看到99%的所有高斯球投影到图像上(参考“将3D 高斯投影到2D像素平面”)使用下面3个公式

3)Differentiable Tile Rasterizer:在投影重叠区域进行光栅化渲染(Differentiable Tile Rasterizer),使用α \\alphaα blending,这是确定的函数,不需要学习。把这些高斯球进行混合,过程可微,公式就是:

4)与gt计算loss,更新每个高斯球的59维系数
在这里插入图片描述
损失函数为:

其中:

  • L1 loss:基于逐像素比较差异,然后取绝对值

  • SSIM loss(结构相似)损失函数:考虑了亮度 (luminance)、对比度 (contrast) 和结构 (structure)指标,这就考虑了人类视觉感知,一般而言,SSIM得到的结果会比L1,L2的结果更有细节,SSIM 的取值范围为 -1 到 1,1 表示两幅图像完全一样,-1 表示两幅图像差异最大。

5)梯度回传

  • 更新每个高斯球的属性(59维系数)-这是个优化问题

  • Adaptive Density Control:根据梯度实现3D高斯球的clone和split,具体而言
  1. 学习过程中,较大梯度(59维导数,模长大)的高斯球存在under-reconstruction和over-reconstruction问题
  2. under-reconstruction区域的高斯球方差小,进行clone
  3. over-reconstruction区域高斯球方差大,进行split

4.每经过固定次数的迭代进行一次剔除操作,剔除几乎透明(透明度接近0)的高斯球以及方差过大的高斯球

4DGS和Deformable 3DGS

1.简述

 对论文4D Gaussian Splatting for Real-Time Dynamic Scene Rendering中的思想与相关代码的简单讨论,主要贡献在于将3DGS引申到了针对动态场景的重建领域,参考了一些动态NeRF领域中HexPlane、K-Planes[2,3]中的思想,创新性地提出了高斯变形场的模型,在减小模型体积的同时提高了模型渲染速度。下面为4DGS模型的主要结构:

3DGS的作用是建立了一个显式的模型来表示整个3D空间,有点类似点云模型,但是给每个xyz点加上了3DGS特征来表示其所占据的体积,并且使用了不透明度与SH球谐函数来表示该点位置处的不透明度与光照特征,最后使用传统计算机图形学中的splatting方法渲染得到特定观测位置处的二维图像。在这个模型中,每个点的3DGS特征与不透明度还有SH系数均为待优化的变量,在训练过程中使用pytorch的梯度反向传播框架进行优化。3DGS是一个关于3D图像的纯显式的模型,具有很好的可解释性,与NeRF这种纯隐式模型相比其训练速度和渲染质量均得到大幅度的提高。

​ 3DGS的要求是:成像场景是静止的。如果场景发生运动,那么训练得到的3DGS模型就会出现模糊与伪影。如果我们想对动态场景进行建模的话,必须考虑时间维度上的信息,把3DGS的思想放到对动态空间的建模上面,就产生了4DGS的这样一个概念。

论文中创新性地提出了高斯变形场的概念,通俗一点的理解就是,将视频中的动态场景看作是对一个静态场景在时间维度上的变形。在针对静态场景的3DGS模型中,将一个点的xyz坐标以及旋转与缩放系数代入静态场景模型中即可得到该点的不透明度与SH系数,但是在4DGS模型中,将一个点的xyzt坐标先代入一个时空结构编码器(这个编码器的结构我们放在下文讨论),随后将编码器输出的值代入一个多头的高斯变形解码器中进行解码,得到x、y、z、r、s的“变形值”,将x、y、z、r、s的原值与“变形值”相加后,按照3DGS的老方法代入静态场景模型中得到该点的不透明度与SH系数,渲染后即可得到2D观测图像。

​ 这个模型能够大大降低模型体积并提高渲染速度,对此,我的理解是时空结构编码器很好的学习了动态场景运动中的先验知识,并通过多头的解码器分别解码出x、y、z、r、s的“变形值”,这种思想有点类似D-NeRF。这个模型的关键在于时空结构编码器的设计,下面是我对于这个时空结构编码器的理解。

2.高斯变形场:

我们的目标是在保持训练和渲染效率的同时构建一个紧凑的表示,即4D高斯飞溅(4D-GS)。为此,我们建议通过包含多分辨率HexPlane和极微小的MLP的高效变形场来表示高斯运动和形状变化。只维护一组规范的 3D 高斯。对于每个时间戳,规范的 3D 高斯将由变形场转换为具有新形状的新位置。变换过程表示高斯运动和变形。

2.1时空结构编码器 

参考了CVPR2023上发表的论文HexPlane与K-Planes中有关时空结构张量分解的思想。HexPlane这篇文章提出了一个4D空间张量辐射场,简单理解就是把一个xyzt四维张量看作xy、zt、yz、xt、zx、yt这六个二维张量的组合,K-Planes这篇文章在接近同一时间点也提出了类似的思想(我个人感觉这两篇文章的差别点在于xy、zt、yz、xt、zx、yt这六个二维张量的组合形式,HexPlane采用了类似张量VM分解的方式来组合,而K-Planes则采用了Hadamard积来组合)

HexPlane与K-Planes利用4D空间张量场对时空信息进行编码,随后利用多头解码器解码出不透明度与颜色,随后使用与NeRF中相同的体积射线法渲染图像。在4DGS的这篇论文中,作者使用和K-Plane论文中一致的4D空间张量场与一个小型MLP组合成时空结构编码器(4DGS代码使用的是来自K-Planes的4D空间张量场模型,但论文中将该组件称为HexPlane,这里存在疑问)。

2.2Multi-head Gaussian Deformation Decoder

​ 与HexPlane和K-Planes不同的是,4DGS接下来通过一个由多个独立的MLP组成一个多头高斯变形解码器将时空结构编码信息分别解码成x、y、z、r、s的“变形值”,而不是解码成不透明度和RGB颜色,转而使用3DGS的方法进行处理。

编码后的特征被输入到一个轻量级MLP中,进一步合并所有特征。再通过MLP对HexPlane编码的时空特征进行解码,生成高斯函数的变形值(包括位置x, y, z和旋转r、缩放s的变形值)。将变形值与高斯函数的原始值相加,得到变形后的高斯函数,表示其在时间和空间上的新位置和形状。

有关4D Gaussian Splatting论文思想与代码的讨论_4d gaussian splatting for real-time dynamic scene -CSDN博客

Deformable 3D Gaussians 与4D Gaussian Splatting实现细节梳理和工程环境配置与运行-CSDN博客

参考链接:https://blog.csdn.net/m0_37604894/article/details/137864723?spm=1001.2101.3001.6650.8&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-8-137864723-blog-135397265.235%5Ev43%5Epc_blog_bottom_relevance_base4&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-8-137864723-blog-135397265.235%5Ev43%5Epc_blog_bottom_relevance_base4&utm_relevant_index=16