点击下方
卡片
,关注
「3DCV」
公众号
选择
星标
,干货第一时间送达
作者:holk | 编辑:3DCV
https://www.zhihu.com/people/holk-h
添加微信:cv3d008,备注:方向+单位+昵称,拉你入群。文末附行业细分群
1.引言
1.1 任务
文章涉及到的任务是三维重建+渲染。
文章提出了一种新方法实现了辐射场的实时渲染,能够在较少的训练时间中,实现SOTA级别的视觉效果,针对用多张照片和视频拍摄的场景,允许以 1080p 分辨率进行高质量的实时(≥30fps)新视图合成。
可以先用一句话表达3D Gaussian Splatting干了什么:
使用3D Gaussian球表示三维模型,并通过 Splatting 技术渲染出来。
事实上,用椭球集来表示三维模型不是一个很新鲜的事儿,早在 1994 年的游戏《魔城迷踪ecstatica》中,就出现了:
1.2 对比
对比Nerf和传统的Mesh:一个是纯连续的、隐式表达在可微空间内;一个是纯离散的(虽然可以插值)、显式表达在三维空间内,3DGS 是在离散和连续间的一个平衡:在高斯球内部是连续的、可微的;在整个空间中,每个高斯球又是离散的。所谓中庸之道也。
1.3 可视化
我们可以使用论文作者们提供的可视化工具来直观地看看如何使用椭球表示三维模型:
可以看到,随着
scale
的增加,一个个椭球体从原来的圆点逐渐变化成更“高级”的椭球体,而这些变化之后的椭球体,就组成了整个模型。如果你觉得这很酷,请接着往下看。
2.动机
传统的3D模型表示方法,如离散的Mesh和点云,以及连续的Nerf,通常面临着一个主要问题:随机采样过程中产生的噪声,这直接影响了渲染质量。此外,这些方法在渲染速度和渲染质量之间不可兼得。
为了解决这一问题,论文提出了3D Gaussian Splatting(3DGS)。这种技术通过结合离散和连续表示方法的优势,不仅克服了传统方法在噪声和渲染质量方面的限制,而且极大地提高了渲染速度。
3.贡献
引入3D gaussian作为3D表示,高效,准确,无结构。
3D gaussian的优化算法:Clone和剪枝。
4.方法
在介绍具体的实现方法之前,我们先来拆解一下论文的标题《3D Gaussian Splatting for Real-Time Radiance Field Rendering》:
3D Gaussian
: 是文章构建模型的核心元素,即三维高斯球。
Splatting
:是一种传统的3D->2D的光栅化渲染方式 。不过,文章中的 Splatting 方法和传统的有所区别,之后会讲到。
Radiance Field
: 即辐射场。辐射场(RF)是用于表达三维空间中光的分布和光强的一个模型(你也可以认为是一种光场)。另外,之前一直大火的NeRF模型,就是一种面向这种场,在三维隐式空间中建模的深度学习模型。在基于Nerf的表示方法下,三维空间被表示为一组可学习且连续的辐射场,输入视角+位置学习后,可以得到密度+色彩。从数学上来说,辐射场可以被描述为一个函数 L ,将空间中的一个点
和一个由球坐标
指定的方向映射到一个非负的辐射值。3D 高斯表示的辐射场公式如下:
Real-Time Rendering
: 实时渲染,即从三维重建后的模型,渲染到二维的显示。这是非常重要的一步。实时是指这种方法的速度非常快,可以达到实时级别(>30 FPS)。
4.1 3D Gaussian
4.1.1 引入
就像给3个顶点能表达任意一个3D三角形,继而很好的构建三维模型(Mesh的思想),研究者自然希望构建三维模型的基础元素能覆盖足够多样的几何体,而椭球就是一种很好的基础元素。
但是,只使用一个个实椭球来构建模型,就会像引言中的魔城迷踪游戏一样,远远不够。这时,我们就想寻找一种方式,来将椭球这种元素变得“强大”一点——能够构建出多样的表示。
那么,如果将椭球的边界变得不清晰,成为一个渐变的,可以融合的呢?如同真实世界中的“黑滴效应”:当你将两个物体慢慢相互靠近直到重叠时,这两个物体的影子之间的颜色会慢慢变深,形成黑滴状:
我们可以看到,如果这样的话,椭球就不再是那个有清晰边界的椭球了。继而,我们可以构建出更多样的表达。由此,我们便会想到概率分布,再由椭球的形状,我们又会想到同样是椭球状的三维高斯分布。
4.1.2 构建
既然我们想到可以用三维高斯分布来构建基础元素,那么这个元素有什么属性,如何构建生成新的椭球呢?
论文中,三维高斯体的属性有其中心(位置)
、不透明度
、三维协方差矩阵(表示缩放程度)
和颜色
。
用球谐函数表示,以呈现视角依赖的外观。所有属性都是可学习的,并通过反向传播进行优化。
论文给出了初始化方法是使用放缩变换S和旋转变换R组合得到
由于放缩变换都是沿着坐标轴,所以只需要一个3D向量
,旋转则用四元数
表达。机器学习通常使用梯度下降对参数进行优化,但直接优化
难以保证半正定,所以论文的方法是继续将梯度传递到
进行优化。
4.2 Splatting
在这一步中,三维高斯椭球体被投影到二维图像空间椭圆形,以进行渲染。
Splatting的中文翻译为:抛雪球法。很形象,我们可以想象一下,把一个雪球(高斯球)扔到一个玻璃盘子上,雪球散开以后,在撞击中心的雪量(对图像的贡献)最大,而随着离撞击中心距离的增加,雪量(贡献)减少。脑补一下盘子上的图像,其实我们可以自然而然的想到二维高斯分布的密度函数。
对比示意图如下,抛雪球的图由ChatGPT4使用DALL-E绘制:
抛雪球
二维高斯分布
而这个把椭球投影到平面后得到的2D图形,就是Splatting渲染方法,如下图(摘自A Survey on 3D Gaussian Splatting)
4.2.1 原理
数学上来说,给定视图变换
和三维协方差矩阵
,计算投影的二维协方差矩阵
使用以下公式:
其中
是射影变换的仿射近似的雅可比矩阵。
4.2.2 渲染
论文的渲染方法为Tiled-based Rasterizer,其流程为:
预处理
:在这一步骤中,3D高斯的参数(协方差、位置、不透明度、球谐函数)被优化,以适应给定的图像序列和视角。这一步骤可以使用梯度下降或其他优化算法来实现,目标是最小化重建误差。此外,还可以使用自适应密度控制(ADC)来调整 3D 高斯的数量和分布,以达到最佳的渲染效果。
投影
:在这一步骤中,3D高斯(椭球)被投影到2D图像空间(椭圆)中进行渲染。给定视图变换
和3D协方差矩阵
,投影的2D协方差矩阵
可以使用以下公式计算:
其中
是一个将3D向量转换为2D向量的矩阵。投影的2D高斯的中心位置和颜色可以直接从3D高斯的参数中得到。投影的2D高斯的不透明度需要根据3D高斯的不透明度和协方差矩阵进行调整。具体来说,投影的2D高斯的不透明度
可以使用以下公式计算:
排序:在这一步骤中,投影的2D高斯被按照其深度值进行排序,以便在后续的渲染过程中正确地处理遮挡关系。为了提高排序的效率,可以使用空间划分或其他加速技术来减少排序的复杂度。例如,可以将图像平面划分为多个块,然后对每个块内的 2D 高斯进行排序。
渲染:在这一步骤中,投影的2D高斯被用于生成最终的合成图像。
4.2.2.1 分块
在处理图像时,为了减少对每个像素进行高斯运算的计算成本,论文采用了一种不同的方法:它不是在像素级别进行精确计算,而是将精度降低到了更宏观的图块级别。这个过程首先涉及将整个图像划分成多个不重叠的小块,这些在原始的研究论文中被形象地称为“砖块”。按照原始论文的建议,每个砖块包括16
16个像素。
接下来,会进一步识别出哪些砖块与特定的高斯投影相交。考虑到一个高斯投影可能会覆盖多个砖块,一种有效的处理方式是复制这个东西,并为每个复制出的高斯分配一个唯一的标识符,即与之相交的Tile的ID。这样,每个砖块都与一个或多个高斯相关联,这些高斯标识了该砖块在图像中的位置和重要性。通过这种方式,3DGS能有效地降低计算复杂度,同时还保持了图像处理的效率和准确性。
另外,论文的官方实现代码使用了多种加速方式,如并行渲染。具体请去看官方仓库。
4.2.2.2 排序&Alpha Blending
给定像素位置
,通过视图变换
,可以计算与所有重叠高斯体的距离,即这些高斯体的深度,形成高斯体的排序列表
。然后,进行Alpha Blending,也就是混合alpha合成来计算整体图像的最终颜色:
其中
是学到的颜色,最终的不透明度
是学到的不透明度
与高亮的亮度:
其中
和
是投影到同一的坐标系。
另外,如果不透明度为1的话,每个椭球体就是有着清晰边界的椭球了,就像这样:
4.3.3.3 由3D到2D
3D Gaussian->2D Gaussian的过程是非常重要的。
论文中引用的核心文章《EWA volume splatting》描述了如何将3D高斯通过仿射变换转换为新的3D高斯分布,并与画布像素对齐。这一变换后,通过沿第三维积分,可以计算出椭球在特定像素上的着色。由于3D高斯分布沿任一轴线积分的结果是2D高斯,因此可以用2D高斯来简化积分过程。
我认为这个过程是3D Gaussian Splatting的一个关键创新点。传统的基于体积和积分的渲染方法需要选择采样点来查询隐式几何形状,并将其属性变换累加以计算像素颜色。这不仅要保证渲染质量和隐式几何的连续性,还要维持细节的还原度,且不可避免地存在误差。因此,通常需要增加采样量,这会导致性能下降。3D高斯的轴向积分与2D高斯等价,从数学角度解决了对大量采样的需求,将计算量限制在高斯数量上,这实在是非常的Cooool!
另外,这些高斯可以通过光栅化管线进行快速并行渲染,进一步提高效率。
从相机空间到光线空间是一个非仿射变换,这意味着不可能使用单一的线性变换矩阵来转换所有点的坐标。这是因为每个点在光线空间的坐标是一个以其在相机空间坐标为自变量的非线性函数,所以不存在一个通用的变换矩阵。
所以作者使用了一个近似方法。这个方法使用每个三维高斯的中心点坐标经过的变换矩阵来近似整个高斯的变换矩阵。通过这种方式,每个高斯的变换可以被视为一个仿射变换。这种特定的变换矩阵被称为雅可比矩阵(
):
最后,对于每个给定的三维高斯的协方差矩阵
,以及其world space下的中心点坐标(
),我们可以求得ray space下的高斯协方差。由于给的是world space下的坐标,所以得先乘以旋转平移矩阵
转化为相机空间坐标,然后通过中心点坐标求出雅可比矩阵
,光线空间下的高斯协方差就如下:
在正投影下,三维高斯协方差矩阵的前两行和两列直接构成了投影到图像平面的二维高斯协方差矩阵。二维高斯的中心点坐标是通过将相机空间中的
和
坐标除以第三维坐标
来获得,即中心点坐标为:
通过这种方法,我们就可以把三维空间中的高斯分布转换成图像平面上的二维高斯分布。
5. 总体的 pipeline
5.1 总体流程
论文中的总流程图:
系统首先对SfM点云进行了初始化,得到3D高斯球们,然后借助相机外参将点投影到图像平面上(即Splatting),接着用可微光栅化,渲染得到图像。得到渲染图像Image后,将其与Ground Truth图像比较求loss,并沿蓝色箭头反向传播。蓝色箭头向上,更新3D高斯中的参数,向下送入自适应密度控制中,更新点云。
5.2 SfM
SfM (Structure from Motion,运动恢复结构) 是一种从一组图像中估计出点云的方法。
SfM 初始化点云过程的主要步骤如下:
对每一张图像,使用 SIFT、SURF、ORB 等算法提取特征点,并计算特征描述子。
对相邻的图像,使用 KNN、FLANN 等算法进行特征匹配,筛选出满足一致性和稳定性的匹配对。
对匹配的特征点,使用 RANSAC、LMedS 等算法进行异常值剔除,提高匹配的准确性。
对匹配的特征点,使用多视图几何的约束,如基础矩阵、本质矩阵、单应矩阵等,进行相机位姿的估计,以及三维坐标点的三角化。
对估计的相机位姿和三维坐标点,使用 BA(Bundle Adjustment)等算法进行优化,以减少重投影误差和累积误差。
初始点的示例:
5.3 自适应密度控制