# 3DGS论文解读 SIGGRAPH 2023
NeRF 隐式:是计算密集型的;体渲染;使用了MLP
3DGS混合:利用了显式辐射场和隐式辐射场的优势;快速光栅化;未用神经网络
(COLMAP 是一个常用的工具,它可以通过输入多张图像自动估计相机的外参(相机位置和朝向),并生成稀疏点云。NeRF 和 3DGS 都可以用 COLMAP 得到输入)
3D高斯显式部分:每个高斯分布的中心点在三维空间中的位置是显式存储的。
3D高斯隐式部分:高斯椭球的形状、大小、颜色、不透明度等性质通常由连续函数表示。
为什么(x,y,z)点的显式在Nerf中是隐式,而在3DGS中归为了显式?
- 3DGS中点的空间坐标直接作为模型的一部分,这些坐标定义了高斯函数的中心,其显式地参与到最终的场景重建中。虽然3DGS中点的空间坐标高斯函数本身提供了一种平滑和连续的空间影响(隐式的部分),但每个高斯函数的中心位置(即数据点的坐标)仍然是显式给定的。
- 高斯函数用来模拟数据点对其周围空间的影响,这种影响是平滑并连续分布的(这是“隐式的部分”),但是每个高斯函数的中心位置,也就是它影响的起点,是由数据点的坐标直接确定的(这是“显式的部分”)。
自己的一些疑问?
1.稀疏点云的重建精度 是不是 会比Nerf千万个光线的重建效果差?
3D高斯受限于稀疏点云,如果sfm的效果并不好呢?比如点云如果较为稀疏、分布不均呢?所以它的准确性主要取决于初始化的准确性和后续的优化算法。但3DGS相对于Nerf提供了一种简效且快速的场景重建方法。
# 摘要:
- 解决问题:实时显示速率、大场景高分辨率渲染(高质量实时新视图合成)
# Related work
- Traditional Scene Reconstruction and Rendering: 基于光场的密集采样(1996)→sfm(2006)→MVS【但MVS在新视图合成领域表现效果差,通常不能“过度重建”】→神经渲染算法(2022)【大大较少了伪影、计算成本】
- Neural Rendering and Radiance Fields:新视图体积表示(2017)被提出→随后可微分光线行进算法(2019)→体渲染Nerf(2020)→MipNerf360渲染图像质量是最出色的,但训练时间仍高;InstantNGP、Plenoxels【后面两者都使用到了球谐函数,一个表示方向、一个表示颜色】
- Point-Based Rendering and Radiance Fields:点渲染【可以解决非结构化离散数据,如点云,但会有空洞,进而混叠】→splatting泼溅(2005)→点渲染的尝试(2019-2022)【但是都基于MVS进行新视图合成,继承了伪影,会过重建、欠重建】→快速光栅化(2021)→3D高斯
# OVERVIEW

1.初始化Initalization
- 得到稀疏点云(带有相机位姿):
- 初始化3D高斯:包括位置,协方差矩阵(变换),透明度还有颜色。

单个高斯椭球的颜色与不透明度:每个高斯球通常具有统一的颜色值,而透明度则在球的不同位置不同,中心最不透明,向外逐渐变得更透明。【这种不透明度的变化是数学性质,公式自然发生的】颜色在高斯椭球上是均匀分布的,透明度的不均匀分布影响观察者的颜色感知
各向异性:指的是在不同的方向上属性表现不同。在3D高斯模型中,如果一个高斯分布在三维空间的三个主轴(x, y, z轴)上有不同的扩散程度,则称为各向异性高斯分布。
2.投影Projection(三维坐标→二维坐标 椭球→椭圆 )
利用相机模型将每个3D高斯从三维空间投影到二维屏幕空间。
1) 相机(camera):定义一个虚拟相机的位置和方向,这将用于后续的投影步骤。通过相机的视角参数,确定如何将3D高斯投影到二维平面上。
1) 通过相机的视角参数,确定如何将3D高斯投影到二维平面上。(使用透视投影矩阵)
3.自适应密度控制 (与GT图像比较优化2D椭圆,进而优化3D椭球的参数 )
- 根据投影结果和渲染需求调整3D高斯的密度和分布。如 α, μ, Σ,c。
- 欠重建→方差小→克隆 过重建→方差大→分割根据什么判断是 clone 与 split 的条件到底是什么
原文5.2节
根据文中描述,可以得出结论,高斯函数的增删主要依据两个标准
- 不透明度 α:确实是一个主要的标准。文中提到高斯函数的删除(culling)基于其不透明度 α 是否低于某个阈值 ϵ^α。如果 α 值很低(即高斯函数基本透明),这些高斯函数将被删除。
- 视点空间位置梯度 τ^pos:另一个关键标准是视点空间中的位置梯度。文中提到,对于那些位置梯度大于 τ 的区域,高斯函数会被密集化(增加更多的高斯函数)。这意味着并不仅仅通过 α 来决定是否增加高斯函数,还考虑了视点空间中的位置变化率。
- “平均视点空间位置梯度” 位置梯度表示的是高斯函数在视点(观察角度)变化时,其位置发生变化的程度。如果某个区域的高斯函数位置梯度较大,意味着在这个区域内,高斯函数的位置可能有较大的不稳定性,可能需要通过增密高斯函数来提高该区域的重建精度。
- 视点变化指的是相机或者观察者的角度在改变时,高斯函数如何从不同的视角下进行表现。
4.快速微分光栅化 (Differentiable Tile Rasterizer)(2D 椭圆转换成2D图像 )
目的:在3D渲染的流程中,虽然高斯模型通过透视投影从三维空间映射到二维平面上,形成高斯椭圆,但这并不直接产生最终的2D图像。投影后的高斯模型只是一个中间表示,它需要进一步处理才能生成可视的图像。这一步骤就是光栅化过程,其中“可微分瓦片光栅化器”扮演了关键角色。
光栅化流程:光栅化渲染直接将3D物体的几何顶点投影到二维屏幕上,再将投影的几何形状(通常是三角形)转换为屏幕像素涉及密度的集成和颜色的混合。
- tile处理:屏幕空间被划分为多个小瓦片,光栅化器并行处理这些瓦片。→提高效率
- 计算颜色和透明度信息:每个像素的颜色和透明度是通过整合多个高斯椭圆(即多个告诉分布重叠)的贡献得出的。通过Alpha混合技术,计算得到最终颜色和透明度。
- 导数计算和反向传播:利用计算得到的导数信息,更新输入数据(如高斯中心位置、大小、颜色等)或模型参数,以最小化损失函数。
球谐函数补充:
球谐函数主要描述从某个方向观察时的光照强度或颜色变化,与物体的形状(球体或椭球体)无关。
5.3DGS梯度更新流程
在3D Gaussian Splatting(3DGS)中,每个高斯椭球的参数(位置、形状、大小、颜色等)都会通过梯度下降法进行优化。这个优化过程包括以下步骤:
误差计算:首先,将当前的高斯椭球的渲染结果与目标点云或目标图像进行比较,计算两者之间的误差。误差通常通过某种损失函数(如L2损失或其他误差度量)来衡量。
梯度计算:根据损失函数,计算出各个高斯椭球参数对误差的梯度。梯度是指误差随参数变化的方向和大小,表示如果调整某个参数,误差是增大还是减小。
参数更新:根据计算出的梯度,调整高斯椭球的参数,使得误差朝着最小化的方向变化。通常的做法是使用梯度下降法,即在每次迭代时,根据梯度的负方向对参数进行小幅度调整。公式如下:

在自适应iter内,主要进行的是对梯度超过阈值、scaling超过阈值的椭球进行split、clone和部分的prune【绿色方框】。
在非自适应iter内,主要进行的是梯度反向传播,不涉及高斯的添加或删除,而是优化现有高斯的配置。【橙色方框】
