之前博客介绍了NeRF-SLAM,其中对于3D Gaussian Splatting没有太深入介绍。本博文对3D Gaussian Splatting相关的一些工作做调研。
实验笔记之——基于COLMAP的Instant-NGP与3D Gaussian Splatting的对比-CSDN博客文章浏览阅读1k次,点赞23次,收藏18次。之前博客进行了COLMAP在服务器下的测试实验笔记之——Linux实现COLMAP-CSDN博客学习笔记之——NeRF SLAM(基于神经辐射场的SLAM)-CSDN博客NeRF 所做的任务是 Novel View Synthesis(新视角合成),即在若干已知视角下对场景进行一系列的观测(相机内外参、图像、Pose 等),合成任意新视角下的图像。传统方法中,通常这一任务采用三维重建再渲染的方式实现,NeRF 希望不进行显式的三维重建过程,仅根据内外参直接得到新视角渲染的图像。https://blog.csdn.net/gwplovekimi/article/details/135406537?spm=1001.2014.3001.5501本博文,意在记录本人调研3D Gaussian Splatting的时候做的学习记录(同时也记录了与本人研究方向相关的两个主要领域SLAM与Autonomous Driving中3DGS的paper),部分资料来源于网络,本博文仅仅供本人学习记录用~
目录
GS-SLAM: Dense Visual SLAM with 3D Gaussian Splatting
SplaTAM: Splat, Track & Map 3D Gaussians for Dense RGB-D SLAM
Gaussian-SLAM: Photo-realistic Dense SLAM with Gaussian Splatting
Street Gaussians for Modeling Dynamic Urban Scenes
DrivingGaussian: Composite Gaussian Splatting for Surrounding Dynamic Autonomous Driving Scenes
什么是3D Gaussian Splatting
3D Gaussian Splatting for Real-Time Radiance Field Rendering
3D Gaussian Splatting for Real-Time Radiance Field Rendering
3D Gaussian Splatting是最近NeRF方面的突破性工作,它的特点在于重建质量高的情况下还能接入传统光栅化,优化速度也快(能够在较少的训练时间,实现SOTA级别的NeRF的实时渲染效果,且可以以 1080p 分辨率进行高质量的实时(≥ 30 fps)新视图合成)。开山之作就是论文“3D Gaussian Splatting for Real-Time Radiance Field Rendering”是2023年SIGGRAPH最佳论文。
首先,3DGS可以认为是NeRF的一种,做的任务也是新视图的合成。
对于NeRF而言,它属于隐式几何表达(Implicit Geometry ),顾名思义,不表达点的具体位置,而表示点与点的关系。通过选取空间坐标作为采样点输入,隐式场景将输出这些点的几何密度是多少,颜色是什么。而所谓的神经隐式几何则是用神经网络转换上述输入输出的方法(输入三维空间坐标和观测视角,输出对应点的几何密度和颜色)。把光线上的一系列采样点加权积起来就渲染得到一个像素颜色,这便是NeRF神经辐射场渲染的流程。
此外,何的隐式表达可以分为体积类表达和表面类表达两种:
- 体积类表达:NeRF 属于体积类表达,通过几何密度决定采样点颜色的贡献度。
- 表面类表达:在表面类表达方式中,输入采样点,符号距离函数 SDF 输出空间中距离该点最近的表面的距离,正值表示表面外,负值表示表面内,表面类方法判定越靠近表面的采样点颜色贡献度越高。
既然有隐式,那么就有显式几何表达( Explicit geometry),就是类似点云、三角mesh这类可以沿着存储空间遍历所有元素。(通过某些方式,真正的把物体上的点都表示出来)
- 对于渲染,NeRF是非常典型的backward mapping过程,即计算出每个像素点受到每个体素影响的方式来生成最终图像,对每个像素,投出一条视线,并累积其颜色和不透明度
- 而3DGaussian Splatting是forward mapping的过程,将每个体素视作一个模糊的球,投影到屏幕上。在Splatting中,我们计算出每个体素如何影响每个像素点
什么是3D高斯?
对于高常说的高斯函数,其实是1D的高斯,也就是正态分布:
它所表达的图像就是一条对称曲线,如下图所示。均值控制对称轴进而控制图形位置,标准差
控制密度集中程度。
对于一段x区间,进行积分可以得到分布中的数据落在这一区间的概率,其中绝大多数落在区域(概率是0.9974)。因此,一组
和
可以确定一个1D高斯分布函数,进而确定一条1D线段
,通过改变这两个值就可以表达1D数轴上的一根线段。
类似地,将这个思路从1D拓展到3D,那么就可以确定一个椭球的图形,这个椭球分别以xyz轴对称,从对称轴的垂直面切出来的横截面都是椭圆(或圆)。不过由于这个椭球可以旋转移动,所以它的xyz对称轴不一定和世界坐标系重叠。对于标准的3D Gaussians标准形式,是:
它能涵盖空间中任意形状的椭球(包括平移旋转)。其中是三维列向量坐标,
是椭球中心(控制世界空间位置平移),至于协方差矩阵
则是控制椭球在3轴向的伸缩和旋转(模型空间),其中协方差矩阵的特征向量就是椭球对称轴。
但是论文中的3D Gaussians表达却不一样:
和标准形式对比可以看到去掉了指数部分前面的尺度系数(不影响椭球几何);默认模型坐标中心在原点,方便旋转放缩,放入世界空间时再加上平移。那么对于初始化这个高斯椭球,目前就只有协方差矩阵这一个参数了。论文给出了初始化的方法如下表达
其中的S是放缩变换(沿着坐标轴的3D向量s);R是旋转变换(可以用四元数q来表达)。这是因为椭球是可以通过将圆球按轴向放缩再旋转。而在使用梯度下降对参数进行优化的时候,就是将梯度传递到s和q中进行优化的。
什么是Splatting?
Splatting(抛雪球(splatting):是计算机图形学中用三维点进行渲染的方法,该方法将三维点视作雪球往图像平面上抛,雪球在图像平面上会留下扩散痕迹,这些点的扩散痕迹叠加在一起就构成了最后的图像,是一种针对点云的渲染方法)的方法进行渲染。
传统光栅化(rasterization)的主要内容之一是将三维三角形映射到投影平面并像素化(将图形或图像的矢量数据转换为像素数据,从而能够在计算机屏幕上显示的过程。通过将图形转换为像素级别,计算机可以更容易地处理和显示图形,同时确保图像在屏幕上以高速率绘制)。光栅化是实现计算机屏幕上图形显示和渲染的关键步骤,能够以非常高的速度生成图像,适用于实时渲染,例如视频游戏和模拟器。
- 光栅化就是把顶点数据转换为片元的过程。片元中的每一个元素对应于帧缓冲区中的一个像素。光栅化其实是一种将几何图元变为二维图像的过程。该过程包含了两部分的工作。第一部分工作:决定窗口坐标中的哪些整型栅格区域被基本图元占用;第二部分工作:分配一个颜色值和一个深度值到各个区域。光栅化过程产生的是片元。
- 之所以是三角形是因为它在图形学中可以看做是几何体的基本形状。三角形在图形学中有很多很好的性质:(1)三角形是最基本的多边形,并且任何其他的多边形都可以拆分为三角形。(2)三个点可以保证他在一个平面如果是四边形四个点就不能保证。(3)它可以很好地用叉积判断一个点是不是在三角形内部(三角形的内外定义特别清晰)。
而对于椭球(就是上面3D高斯获得的表达)的光栅化则需要开发者自己用GPU实现,其中把椭球投影到投影平面后得到的2D图形称为Splatting。Splatting算法与光线投射法不同,是反复对体素的投影叠加效果进行运算。它用一个称为足迹的函数计算每一体素投影的影响范围,用高斯函数定义点或者小区域像素的强度分布,从而计算出其对图像的总体贡献,并加以合成,形成最后的图像。由于这个方法模仿了雪球被抛到墙壁上所留下的一个扩散状痕迹的现象,因而取名为“抛雪球法”。所以,所谓的Splatting就是对高斯进行光栅化~
对于3D高斯的分布函数,在模型空间原点用协方差矩阵确定了形状与旋转,然后用椭球的中心
确定平移到世界空间。为了渲染到画布上需要先view变换(视角的变换)到相机空间,再project变换(透视投影模型?)将透视空间变得和像素对齐才能进行光栅化。而所谓的栅格化可以理解伟将三维投射到平面并进行像素化。论文把这个过程用下面公式