引言
机器视觉领域中,新颖视图合成技术的核心目标是通过图像或视频构建可以被计算机处理和理解的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)
3D Gaussian Splatting和NeRF一样,主要用于新视图合成。
特点:
使用光栅化渲染方式,而不是NeRF的基于射线的体渲染(volumetric rendering along a ray)
使用多个3D高斯球显示的表达场景
训练推理速度快的同时保证质量高
本质上是一个优化问题,没有使用神经网络
1.捏雪球
3DGS是3D Gaussian Splatting的简写,3D高斯在空间中是一个椭球形状的物体,Splatting意思是喷溅,那么如何去理解Splatting呢?
Splatting中splat是一个拟声词,译为啪叽一声,想象输入是一些雪球,图片是一面墙,图像生成的过程模拟为雪球砸向墙的过程,每扔一个雪球,墙面上会有扩散痕迹,足迹(footprint),同时会有啪叽一声,因此得名。
Splatting的核心是什么呢,分为以下三步:
- 选择[雪球]
- 抛掷雪球:从3D投影到2D,得到足迹
- 加以合成,形成最后的图像
对于第一步选择雪球,为什么需要选择雪球呢,因为我们的输入是一些点,点本质是没有体积的,也是没有能量的,所以选择一个核来对他进行膨胀,这个核可以选择高斯也可以选择圆、正方形或其他;那为什么选择高斯呢,就是因为他有很多优良的数学性质,如下。
如果一个物体在所有方向都具有相同的扩散程度,那么他就有各向同性,可以参考球形,否则具有各向异性,参考椭球形。各向同性和各向异性的差异可以理解为椭球是具有不同形状的球。
可以使用协方差矩阵来控制椭球的形状。因为任意高斯都可以看做是标准高斯通过仿射变换得到,所以任意椭球都可以看作是球通过仿射变换得到。
而协方差矩阵是可以通过旋转和缩放矩阵来表达的,表示了这个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 以精确地表示场景。优化的参数包括:三维位置 p、透明度 α 各向异性协方差 Σ 和球谐系数 SH (spherical harmonic coefficients) 。这些 ⌈参数的优化⌋ 和 ⌈自适应控制高斯模型⌋ 交替进行。
注意:图中的球谐系数 SH (spherical harmonic coefficients) 来表示每个高斯的颜色 ,不同视角颜色不同。
参数优化使用 SGD 连续迭代完成,每一轮迭代时都会渲染图像并将其与真实的训练视图做比较。α使用 Sigmoid 激活函数来限制 (0, 1) 的范围;Σ使用指数激活函数激活;p使用指数衰减调度技术 (exponential decay scheduling technique) 进行优化。模型的损失函数是 L1 与 D-SSIM 项的组合:
5.整体流程
场景表达通过很多个高斯球来实现,如下图所示,每个高斯球对应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,具体而言
- 学习过程中,较大梯度(59维导数,模长大)的高斯球存在under-reconstruction和over-reconstruction问题
- under-reconstruction区域的高斯球方差小,进行clone
- over-reconstruction区域高斯球方差大,进行split
4.每经过固定次数的迭代进行一次剔除操作,剔除几乎透明(透明度接近0)的高斯球以及方差过大的高斯球
参考链接: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