Gaussian Splatting 全面导读(二):从照片到训练模型——如何创建 Gaussian Splat
在第一部分我们拆解了这个术语。我们讲解了“splat”是什么意思,“高斯”是什么意思,技术的来源(那么是辐射场)NeRFs(国家雷达电磁器)2020年,随后INRIA三维高斯喷涂论文在2023年SIGGRAPH上),以及为什么有人一开始要发明它。
一个词的答案就是速度。NeRF要求神经网络每帧回答“从这个位置、这个方向来,是什么颜色和多少光”。高斯Splats用一堆模糊的彩色椭球体替代了它,你可以通过普通GPU光栅器处理。
第一部分是“做什么”。这是“怎么做”。
任务是:你有一个场景的照片文件夹,或者你切分成帧的视频。你需要一组训练好的高斯分布,能从任何视角再现那个场景。没人给你摄像机位置,没人给你3D模型,照片也不会附带坐标系。
你从像素开始,最后只有几百万个发光的小斑点停在三维空间里。这篇文章讲的是中间发生的一切。
有两个阶段,通常由两个完全不同的软件运行。首先你恢复每台相机的位置以及它通过的镜头。然后你优化一组高斯分布,直到它们产生的图像与你最初拍摄的照片相匹配。
第一阶段是旧的,完全借鉴了摄影测量技术。第二阶段是新部分,这里有有趣的机械设备。
先找到摄像头(也就是COLMAP和朋友们)
这里有一点是人们第一次见到高斯碎片时跳过的。高斯分布在三维空间中的某个位置。为了通过比较渲染和照片来优化这个位置,你需要准确知道相机拍摄时的位置、指向哪个方向,以及它是如何将世界投射到传感器上的。
这些都不存在于照片中。JPEG是一个平面的颜色网格。快门一响,3D信息就被抛弃了。
所以在出现任何溅落之前,你必须仅凭照片重建相机。这个技术是Motion的结构,普遍缩写为SfM,它比高斯碎片早了几十年。这也是构建经典摄影测量稀疏点云的数学原理,我们在第一部分中对比过它与碎片。
对于碎片化,SfM不是可选的预处理细节。它是负载性。如果做错了,下游的一切都会悄悄地错。

在两张照片中发现相同的特征点
SfM首先在每张图像中寻找独特的小斑块。不是边缘,不是平坦的墙壁,而是角落、斑点、带有可识别局部图案的纹理。经典的探测器是SIFT(尺度不变特征变换)尽管已有较新的学习型探测器,SIFT及其亲属仍是通用工具中的主力。
有趣的是,SIFT是单色的,色相和饱和度通常被舍弃。
每个关键点都有一个描述符,一个数字矢量,能够以能够经受旋转、缩放和亮度适度变化的方式总结周围的像素。描述符就是全部的诀窍。
它让你从左边拍摄窗台的一个角落,就能识别出它和从右边拍摄的同一个角落,尽管原始像素看起来完全不同。
SIFT关键点以比例和方向向量绘制。图片来源卢卡斯·马赫,已获许可CC 3.0.
成对匹配,然后丢弃大部分
现在你比较图像对之间的描述符。图像A中的一个描述符与图像B的关键点非常接近,则是候选匹配。对每对(或者对于大型集合,选择由词汇树选定的智能子集,这样就不会比较所有N平方对),你会得到大量候选对应。
大多数是错误的。描述符会碰撞,重复纹理会欺骗一切(砖墙和栅栏臭名昭著),反射则有害(后文会详细说明)。下一步是几何验证。
对于一对图像,所有真实匹配必须与单一刚性相机运动一致。该约束由极极几何:如果你还不知道校准,那就是基本矩阵,一旦知道了,就用本质矩阵。
一张图像中的一点必须位于另一张图像的特定直线上。违反这一点的匹配在几何上是不可能的,会被丢弃。
区分好匹配和垃圾的工具是RANSAC(随机样本共识).它反复从极小的随机匹配子集中猜测摄像头关系,检查剩余匹配中有多少匹配与该猜测一致,并保留最多匹配者投票支持的猜测。
同意匹配的匹配是不列量;其余的则被剔除。RANSAC正在做一些听起来像随机搜索的事情,我们稍后会对比它。RANSAC是几何步骤的稳健估计器,而不是训练splat的优化方法。
这两种过程是不同的,这里很容易混淆。
三角测量
一旦你知道两台相机相对于彼此的位置,并且你有一个它们都看到的特征,你就可以在三维中恢复该特征的位置。从每个相机中心通过该特征在传感器上的位置绘制一束光线。
在理想情况下,两条光线恰好在空间中的一个点交叉,那个点就是特征。在现实中它们几乎会交叉,你会采取最接近的方法。三角测量是为什么你至少需要两个视角才能让一个点有三维位置。

增量重构与丛调整
你无法一次性解决整个场景,所以标准方法是逐步构建。选择一对宽基线和大量匹配的起始镜头。重建这两个摄像机,并三角定位它们共享的点。
然后找一张能看到你已有的许多点的图像。因为你知道这些点在三维中的位置和它们在新图像中落在哪里,你可以解出该摄像头的位置。
那个子问题是透视点,PnP(一位坚定的计算机视觉),这也是每个新摄像机如何被记录进不断扩展的重建过程。三角定位摄像机新增的点,然后重复。
反复重复。
如果仅此而已,误差就会堆积。每个三角测量点都有一点误差,每个注册的相机都有一点误差,而添加一个摄像头让这些误差漂移,直到重建的另一端偏离现实。
解决办法是丛调整随着重建的增长,周期性运行。丛调整是一种大型非线性最小二乘优化,同时调整每个摄像机姿态和每个三维点,以最小化总重投影误差:即每个三维点实际落点与当前估计值应落点之间的像素数距离。
这与我们即将构建的碎片训练循环相同,运行在不同的未知数集合上。“丛”是汇聚在每个摄像机中心的光束,目标是迭代最小化对准误差。
完成后,你拥有了三个你开始时没有的东西,全部集中在一个一致的坐标系里:每个相机的姿态(它的外部指标,也就是位置和方向)、相机校准(它的内在参数),以及一个稀疏三维点云。
这种稀疏的云是为相机解题的免费副产品,也成为了碎片的种子。
相机校准并不被精确测量
内在因素值得专门写一段,因为人们总以为相机“天生知道”它们。其实并不可靠。内在因素包括焦距(镜头放大程度,以像素为单位)、主要点(光轴击中传感器的位置,通常接近但不完全在中心)、以及镜头畸变(镜头弯曲直线的程度,在广角和运动相机拍摄的边缘最严重)。
你可以从图像文件中的EXIF元数据中做种这些。EXIF通常包含毫米的焦距和传感器尺寸,这两者结合起来能初步估算像素的焦距。但EXIF可能会被编辑工具剥离,裁剪图像缺少或错误,且对失真没有有用的说明。
所以流水线不信任已生产的内在元件,把它们当作未知物来恢复。这就是自我校准:内在元件在束内与其他元件一起被细化,因为同一个重投影误差目标同样敏感于焦距和畸变的准确性。
真是太棒了!
有一个有用的假设使得这个问题变得可理解。如果你所有照片都来自同一台固定镜头的物理相机,它们共享一组内征。你不必在每张图像中独立求解焦距,而是求解一个贯穿整组的焦点距离,这样受约束得多。
常用工具允许你按相机型号分组图像,并在组内共享内在光源。
但是,如果你在拍摄过程中中途拉近了镜头,一半的图像内在特征和另一半不同,而共享内在特征的假设就成了谎言(就像蛋糕一样)。
滚动快门传感器(大多数手机、大多数无人机)在快速运动时会模糊几何形状,因为画面的上下曝光时间不同,所以这些工具假设的针孔模型有微妙错误(通常只对从移动视频提取的帧有影响)。
如果你输入的是拍摄后裁剪或调整尺寸的图像,主点和焦距就不再与原始传感器对应,所以请在实际操作中避免使用。
COLMAP及其亲属组织,以及视频案件
上述所有方法的事实标准工具是COLMAP(联合行动计划),一款开源的SfM和多视图立体声包(Schönberger 和 Frahm,CVPR 2016).当有人说他们“运行了COLMAP”时,他们的意思是他们完成了特征检测、匹配、验证和增量重建等过程,得到了摄像机姿势和稀疏点云。
这个原始3DGS代码期望输出COLMAP,而大部分生态系统仍然使用该格式。现在有更快的亲戚,这一点显著全球地图(Pan 等,ECCV 2024),它全局解决重建,而非增量式,且在大型集上速度显著加快,同时还有各种学习前端替代SIFT匹配阶段。
它们产生的输出类型相同:姿态、内在变量、点。幸运的是,GLOMAP能生成兼容COLMAP的输出数据文件,供所有人使用。
视频让一些事情变得复杂,也简化了其他事情。在简化的一端,连续的视频帧已经有顺序,彼此之间只有一点点差别,所以匹配邻居很容易且可靠。
复杂点是,视频会给你太多几乎相同的帧,处理这些帧是浪费工作,甚至可能有害,因为成千上万个极小的基线对几乎不给你新的三角定位信息,同时计算量会大增。
所以你做子采样:每N拉一帧,或者更好的是,根据摄像机移动的程度自适应拉取帧。
视频更大的问题是动态模糊。模糊的画面特征点模糊,模糊的特征匹配度差,三角定位效果更差。手持视频和无人机画面充斥着动态模糊。
实际操作是在开始前检测并删除最模糊的帧,如果能控制拍摄,就用高速快门拍摄。一百帧锐利的画面胜过一千张模糊的画面。这是那种最终溅射质量在拍摄时就决定的,之后再多的巧妙优化也无法恢复源头中不够清晰的细节。
稀疏到密集?
此时你看到的点云稀疏。“稀疏”是准确的。只有特征点通过匹配和三角剖分幸存下来,所以数量有数千到几十万个点,而且充满了漏洞。
无纹理区域(空白墙壁、晴朗天空、玻璃)不产生特征,因此不产生点。如果你只做过经典摄影测量,你的本能是让它变得密实。(“Luke,I是你的Densify。“)
在摄影测量学中,密度化指的是多视角立体(MVS)。在SfM给你相机后,MVS会回到图像,基本上对每个像素,通过比较可见视角中的小块来估算深度。
COLMAP通过PatchMatch立体实现这一点,然后通过融合步骤将每个视角的深度图合并成一个密集的云。结果是数量级更多的点,密度足够高,可以通过将共面多边形面合并成更大的平面三角形来将其网格化成实体表面。
这就是经典的摄影测量流程:稀疏云,然后密集云,再网格。
高斯散拍不需要密集的云。再读一遍。高斯散射不需要密集云。原始的3DGS工作是直接从以下稀疏SfM 会点,而且它运行得很好。事实上论文显示即使从随机点云初始化,除了摄像机姿态外没有任何SfM结构,最终也能收敛到不错的结果,只是收敛速度更慢,且在覆盖稀疏的区域质量稍差。
优化过程会在运行过程中创造自己的细节,正如我们将看到的,因此它不依赖MVS赋予它密集的起始几何体。在溅落前运行MVS大多是浪费时间,更糟的是,MVS点本身就带有错误,你会把这些误差当作起始偏差。
这就像做一个派,然后把小石子混进馅料里。
那么你什么时候还会运行密集重建?有三种情况。首先,如果你还想用同一个捕获方式做传统网格,比如物理、碰撞、测量或3D打印,这些都是我们在第一部分提到的splat做不好的事情。
其次,在一些混合管线中,将splat转换成网格(比如米洛或者使用稠密前置来正规化几何体,特别是我们接下来会讲到的面向表面的二维碎片方法。第三,当你的图像覆盖非常薄,稀疏云几乎没有某个区域时,你想给优化器一个更好的起点。对于普通情况(大量重叠照片,你想要的是碎片且只有碎片),跳过MVS,从稀疏点初始化。
将点转为起始高斯分布
现在高斯特例部分开始。你有相机姿势和稀疏的云层。你转身每人点数变为高斯图。
单个三维高斯由少数参数定义,我们来涵盖这些参数。

- 职位(均值):三维中斑点中心所在的位置。直接从SfM点初始位置初始化。
- 协变性:椭球体的大小和形状。与其存储一个原始的3x3协方差矩阵(该矩阵在每个优化步骤中都必须保持半正定,否则会变成几何上的无意义),而是将参数拆分为比例尺(三个数字,椭球沿自身轴的半径)以及旋转(a四元数,四个数字,将这些轴在空间中定向)。协方差可根据需要从这些数字重建。这种分割保持每个梯度步骤生成有效的椭球体。它被初始化为各向同性,是一个小圆球(一个胖点),大小从距离到最近的邻点,使得密集区域从较小的高斯开始,稀疏区域从较大的高斯开始,以充分覆盖和填充空间。
- 不透明度:斑点的固态程度,从透明到完全不透明。初始化较低,所以高斯分布开始时很弱,优化器必须证明其不透明度是必要的,即证明它们实际上能降低误差度量。
- 颜色,存储为球面谐波系数,使颜色可以随视角变化。初始化时只设置常数项(直流分量,平面平均色),取自SfM点的颜色。产生视角依赖着色的高阶项从零开始,并在训练过程中增长。球面谐波在本系列后面有独立部分;目前只需知道颜色是视野方向的小函数,而非单一固定的RGB值。
所以入门模型是每个SfM点一个模糊、圆形、颜色大致的高斯。看起来很糟糕,而且本来就应该如此。所有好结果都在循环迭代中发生。
起泡,冲洗,重复,渲染,比较,正确
培训的核心是一个循环,虽然每个步骤内部的机制并不复杂,但概念上很简单。

从你输入的照片中选一张。我们知道它的精确相机姿态,因为SfM恢复了它。从那个精确姿势渲染当前的高斯分布集合(基本上是SfM稀疏点云,起始处)。
你现在有两张大小相同的图像:渲染图和原始照片。逐像素比较,计算误差指标。利用这个误差调整每个高斯分布参数,使渲染看起来更像照片。
切换到另一张照片,再做一次。重复数万次。
这就是整个循环:渲染已知视图,测量它的错误程度,然后稍微修正它。这篇帖子的后半部分将讲述这三个步骤的运作方式,因为“测量错误”,尤其是“正确”,在这里起了巨大的提升作用。
误差度量、每幅图像和每场景误差
那个per——图片错误是将一个渲染结果与一张照片进行比较。3DGS损失是两个术语的混合。第一个是直接的L1损失:对应像素颜色之间的平均绝对差值。
L1很简单,并且对处处错误会稍微惩罚。第二个是D-SSIM,源自结构相似指数(SSIM),它关注局部结构、对比度和纹理,而非每像素的原始颜色差异。
SSIM更接近人类观察两幅图像是否相似的方式;L1保持颜色的正确性。原始纸张用λ值约0.2加权,因此损失大约是L1的0.8倍加结构项的0.2倍。
这种特定的混合是各种方法调整的众多旋钮之一。
每次训练通常只针对一台相机,随机从集中选取,这样优化器就不会过度拟合到照片的顺序。全场景误差就是损失的平均值全部训练视图。
你观察整个场景的数字,以判断整个训练是否在进展;你用每张图片的数字来生成修正那具体视角。
什么时候才算“足够好”可以停止?
人们期望损失达到某个目标,流程宣告胜利。但事实并非如此。实际上,3DGS训练的迭代预算固定,通常约3万次,因为损失曲线会随着收益递减缓慢而下降,且很少有明确的阈值代表“完成”。
迭代预算是关键,你只需根据拍摄场景的经验来选择预算。
话虽如此,误差指标绝对能告诉你结果是否好。正确的判断方式是展示一些优化器从未训练过的照片,渲染那些保持的相机姿势的“啪”,并与它从未看到的真实照片进行比较。
标准评分是PSNR(基于像素误差得出的分贝度量,越高越好),SSIM(结构相似度,接近1越好),以及LPIPS(这是一种习得的感知距离,与人类所谓的“看起来对”相符,越低越好)。
如果保留的分数良好,splat会推广到新的视角,而不是仅仅记忆训练照片。如果训练视角误差低但保留误差较高,说明你过拟合,通常是因为你没有对场景的足够覆盖。
所以这个指标驱动两个决策:是否在一次拍摄中继续迭代(很少,因为预算通常决定),以及完成的喷溅是否真的可用,还是需要重拍[呃]。
渲染器必须是可微的。什么是可微的?
循环中的“正确”一词隐藏了整个技术的秘密武器(11种香草香料和23种口味)。要让高斯参数朝减少误差的方向移动,你需要知道每个参数该往哪个方向推,以及推多大力度。
这些信息是导数:如果我稍微调整这个数字,最终像素误差会变化多少。对每个高斯参数的导数都算导数,你就知道如何在协调步骤中精确调整整个模型。
这只有在渲染是参数的平滑、可微函数时才有效。“可微”意味着如果你改变高斯的位置、不透明度或某个缩放值极小,渲染后的像素会相应地以可计算的无穷小幅度变化,且不会出现突变。
硬边渲染器,即决定像素在三角形内部或外部的渲染器,是不是在这些边缘可微:一个微小的移动会让像素从一种颜色翻转到另一种颜色,中间没有平滑的中间,导数在临界点是未定义的。
你无法计算通过硬边的干净渐变。
高斯分布图正是因为它们很软才被选中。高斯分布图没有边。它的不透明度是从中心平滑地下降到零,因此像素在某个高斯分布中的贡献是该高斯分布的位置、大小、方向和不透明度的平滑函数。
轻推其中任一,像素就会平滑变化。这种柔和感,第一部分所描述的模糊斑点,不仅仅是为了美学选择,适合漂亮有机的场景。它是数学性质,使整个过程迭代化可训练.
该自带3DGS的可微分光栅器执行以下操作,每一步都构建得好,使其导数能够被计算。它将每个三维高斯投影到图像中,将三维椭球体转换为屏幕上的二维椭圆(该投影是椭圆加权平均,splatting 形式,投影涉及线性化,其雅可比矩阵是梯度路径的一部分)。
别担心,如果这些内容很多都是胡说八道,你不需要理解它也能使用或实现高斯散列。它按深度排序高斯分布。然后,对每个像素,将高斯分布从前到后游移,并对它们进行α合成:每个高斯分布都贡献其颜色乘以不透明度,再乘以近处高斯分布已阻挡的光量。
这种前后累积是一个平滑的乘法和加法链,因此它对每个输入的导数是一个已知公式。实现者手写了位置、缩放、旋转、不透明度和球谐色彩系数的解析梯度,这种手工推导的逆向传递是原始代码快速的重要原因。
它在GPU上分块运行,因此数千个像素并行计算梯度。
反向传播不是90年代的男孩乐队名字
一旦你在每个像素处有误差,并且有一条可微的参数到像素路径,你就把这条路径往回跑。从每个像素的错误程度开始。微积分的链式规则允许你将像素误差传播回alpha合成,再回2D投影,再传播到每个接触该像素的高斯参数的每个参数。
结果是一个梯度:对于数百万个参数,每个参数都有一个数字,说明哪个方向能减少误差,以及大致减少的幅度。这种向后传播的误差正是”反向传播“意味着,与训练神经网络的机制相同,这里应用于几何参数,而非网络权重。
然后你迈出一步。使用的优化器是亚当该算法保持对每个参数近期梯度的实时感知,并调整每个参数的步长,因此梯度一致的参数移动稳健,噪点较大的参数则谨慎移动。
不同参数类型的基础学习率不同,因为移动位置0.01和不透明度移动0.01的幅度不同。迈出这一步,每个高斯分布都会稍微调整,以更好地还原照片。
然后渲染下一个视图,再进行一次。
这正是高斯喷溅法有效的关键,它直接回答了人们问的一个问题:为什么这不只是一个无止境的随机搜索?随机游走,或者说蒙特卡洛方法,几乎是盲目尝试变更,保留那些恰好有帮助的。
盲搜索有数百万参数,毫无希望;空间太大,无法偶然找到一个好的配置。梯度下降不会猜测。就像一个高手,它从不早也不会迟到。每一步它都会计算误差曲面的实际下坡方向,并自信地沿方向移动。
每个参数都会同时且有目的地修正,利用可微渲染器提供的信息。这里有随机的设定,即每一步使用随机选定的相机,而不是同时使用所有参数,这也是它技术上随机梯度下降.但每一步的方向都是计算的,而不是采样。
这意味着让场景在三万步内逐渐聚焦,和靠幸运搜索永远达不到对焦之间的区别。可微分渲染器是将“这个像素太红”转换成“将这个特定的高斯向左移动并降低其不透明度”,使问题变得可解。
自适应密度控制
梯度下降是调整你已有高斯分布的参数。它本身无法单独添加需要更多细节的高斯,也无法移除一个无效的高斯,或将过度拉伸的块分成更细的部分。
高斯分布的数量及其粗略排列是另一个问题,由一套启发式规则处理,这些规则会与梯度步骤周期同步运行。在原著中,这被称为自适应密度控制,理解它就是理解几千个起始点如何变成几百万个高斯分布点。

添加高斯分布的触发条件是视空间位置梯度。如果一个高斯分布在其屏幕空间位置上持续接收到较大的梯度,说明优化器不断尝试将其移动以覆盖无法单独充分表示的区域。
这就是区域描述不足的信号。响应取决于高斯分布图的大小:
- 克隆(重建中)。该区域需要更多覆盖,但那里的高斯分布较小。复制它,创建第二个相同大小的高斯分布,让它们分散以覆盖该区域。这样模型就扩展成需要填充的空区域。
- 分裂(过度重建)。该区域需要更多细节,但那里的高斯分布较大,是一个大块,试图代表结构精细的物体。将其拆分为两个较小的高斯分布,将比例细分为(论文使用约1.6的因子),并通过在父体积内采样来定位子体。这样可以增加粗颗粒覆盖的细节。
- 修剪。任何不透明度低于一个小阈值的高斯算数基本上没有贡献,会被删除。那些在世界空间中变得异常巨大或覆盖屏幕过多的高斯算符也会被剔除,因为它们通常是伪造品。剪枝防止模型无限制地增长,并清除失败。
还有一个看起来奇怪的技巧,直到你明白为什么会这样:周期性不透明度重置。每隔几千次迭代,每个高斯的透明度都会被击退到透明状态。
真正有用的高斯分辨率会通过渐变迅速恢复不透明度;那些只是残留的几乎看不见的杂物,或者优化器用来作弊的摄像头附近的漂浮物,无法恢复并在下一次处理时被修剪。
这是一种受控的遗忘,防止模型积累无法摆脱的垃圾。
自适应密度化在训练的中间窗口内运行(在初次热身后,且在结束前很久就停止),因此最后阶段是对固定高斯分布的纯粹精炼。模型会增长、填充、锐化,然后稳定。
而且还有很多
上面的描述就是最初的INRIA配方。它有效,是大家引用的基线,而且显然还有改进空间,而自2023年以来,这个领域一直在填补这些改进空间。
什么时候拆分、克隆和修剪的规则是启发式的,而启发式正是不同研究团队根据他们更看重最终质量、训练速度还是高斯计数(影响文件大小和渲染成本)而调整的方向。
以下是一些值得注意的方向,不涉及文献综述:
- 更强的密度诱因。原版使用位置梯度的平均大小来决定哪些区域需要密度化,并且系统性地对某些区域进行低密度化。在AbsGS以及像素-GS族可以改变测量的信号,比如对绝对梯度求和,或者用高斯分布覆盖的像素数加权,这样可以恢复基线遗漏的细节,而不是让场景被更多斑点覆盖。
- 抗锯齿。基线渲染高斯图时,当你从训练视图放大或调整分辨率时,会产生锯齿和闪烁。Mip-Splatting它增加了一个3D平滑滤波器,限制了高斯细节相对于采样方式的大小,以及一个2D滤镜在屏幕空间中,使结果在缩放下保持稳定,而不会崩溃成斑点。
- 密度控制是原则性抽样,而非启发式。这是对之前蒙特卡洛问题的直接回答。3DGS-MCMC通过将高斯分布集合视为从分布中抽取的样本,并用基于该观点的重定位策略替代手工调优的启发式,重新框架了整个克隆/分裂/修剪的过程。请注意讽刺意味:将明确的马尔可夫链-蒙特卡洛框架引入密度控制,反而使其更有纪律性,而非更混乱,因为重定位是推导而非猜测的。它倾向于更高效地使用高斯算,且对原始配方要求设置的大量阈值不那么敏感。
- 速度和预算。 驯服3DGS类似的研究明确限制了高斯分布量,并引导密度化将预算用于最有利的地方,这样你可以更快地训练,发布更小的模型,用更少的计算和内存换取一点峰值质量。
主线是可微分渲染和反向推进的核心是稳定且共享的;这些方法改变的是周围的政策,比如何时添加几何体,何时移除几何体,以及如何防止锯齿。
如果你在评估工具或项目的研究方向,这才是需要考虑的轴线:大家都同意通过可微分光栅器实现梯度下降,但对围绕其的密度控制规则却意见不合。
3D、2D和4D的喷溅,不是多点D更好吗?
我们一直在描述三维高斯量,即空间中的完整椭球体。这是通用形式,也是默认使用的。但维度是设计选择,有两个重要的变体是有意为之。

三维高斯分布是体积斑点。它们是捕捉一般光辉的合适工具,尤其是我们在第一部分中称赞的有机和视角依赖场景:植被、毛发、烟雾、光泽和半透明材质,任何单一硬表面概念失效的场景。
它们的弱点正是体积化:椭球云没有明确的表面,因此从3D溅射中提取干净几何体或准确法线很笨拙,椭球体可能会稍微漂浮在真实表面之外,这些在渲染中看不出来,但会破坏任何网格化的尝试。
二维高斯分布(该技术通常写作2DGS,自2024年作品起二维高斯泼溅)将每个基元压平为一个圆盘,一个没有厚度的定向扁平片,一个面元。 这听起来像是降级,而对于模糊场景中的纯图像质量来说,有时确实如此。 但是扁平圆盘以脂肪椭球体无法做到的方式位于表面上,并且它具有明确的法线,即它所面对的方向。 当实际目标是表面时,这使得 2D splats 更好:重建精确的几何体,提取干净的网格,获得足够好的法线以进行重新照明。 如果我们想要一个也可以变成可用于测量或模拟的网格的 splat,2D splat 通常是最好的起点,这是早期面向表面的管道受益于密集几何监督的情况之一。
4D 高斯 添加时间作为第四个轴。 3D splat 会冻结 3D 中的某一瞬间,就像《黑客帝国》的《子弹时间》一样; 4D splat 表示场景在序列中如何变化,因此每个高斯都可以随着时间的推移移动、旋转、增长、褪色和改变颜色。 这就是动态场景所需要的:移动的人、风中的旗帜、捕捉为视频的任何内容,而不是一组冻结对象的静态照片。 代价是更多的参数、更多的捕捉规则(你通常需要许多同步的视点,而不是一台四处走动的相机,因为拍摄对象不会保持静止让你在它周围走动),以及更繁重的训练。 但这是以自由视角重播实际移动的事物的唯一方法。 3D splats 是一张您可以在里面走动的照片。 4D splats 是 电影 你可以在里面走走。
经验法则:3D 适合您希望从任何角度正确观看的静态场景,2D 适合您更关心表面和几何体而不是模糊的物体,4D 适合拍摄对象移动的场景。
黄鼠狼摔倒了
这就是从照片文件夹到经过训练的 splat 的完整路径。 SfM(通常是 COLMAP/GLOMAP)恢复相机和稀疏点云,并在此过程中悄悄地自校准镜头。 您可以跳过经典摄影测量将运行的密集 MVS 步骤,除非您还特别想要网格。 每个稀疏点都变成一个微弱的起始高斯分布。 然后,训练循环通过可微分光栅器渲染每个已知的视点,通过 L1 和结构损失的混合测量真实照片的误差,将该误差反向传播到每个参数的梯度中,并与 Adam 一起逐步走高斯下坡,这是有意而不是偶然的。 自适应密度控制在梯度步骤之间克隆、分割和修剪高斯,以便模型在场景需要的地方增加细节,并去掉不使用的部分。 运行数万次迭代,一堆斑点就会捕捉到一个场景中。
我们故意推迟的两件事是我们接下来要处理的两件事。 我们一直说颜色是观察方向和球谐函数波动的一个小函数;这是下一部分,关于依赖于视图的外观,这就是使溅射的反射和高光像真实表面一样跟踪您的眼睛的原因。 之后,也许我们会构建一个运行时渲染器本身,该部分获取完成的图并在浏览器或游戏引擎中实时绘制它,这与训练它是不同的问题。
我们在计算机图形学领域花费了 35 年的时间,最近在 VFX、GIS 和取证等图像到 3D 管道中投入了大量时间。 计算机视觉工作 这个系列是从. 如果你有一个不会收敛的捕获,你需要强行进入一个从未为其构建的管道,或者你想要在投入实际预算之前评估的研究方向,这就是我们解决的难题。 告诉我们您正在做什么 我们会直接告诉您 splats 是否是正确的工具。
参考文献和进一步阅读
本文中的插图是原始图表,可以免费重复使用。 上述所有内容的主要来源(按出现顺序排列):
- 科尔布尔、科帕纳斯、莱姆库勒、德雷塔基斯。 用于实时辐射场渲染的 3D 高斯喷射,SIGGRAPH 2023。 项目页面 · arXiv:2308.04079 · 代码 · 可微分光栅器
- 米尔登霍尔等人。 NeRF:将场景表示为神经辐射场以进行视图合成, ECCV 2020. arXiv:2003.08934
- 舍恩伯格,弗拉姆。 重新审视运动结构 (COLMAP),CVPR 2016。 纸 · colmap.github.io
- 潘等人。 重新审视全球运动结构 (GLOMAP),ECCV 2024。 arXiv:2407.20219·代码
- 洛韦从尺度不变关键点提取的独特图像特征(SIFT), 国际计算机视觉杂志 2004.论文(PDF)
- 王, 博维克, 谢赫, 西蒙切利.图像质量评估:从误差可见性到结构相似性(SSIM), IEEE TIP 2004.概览
- 张等人。 深层特征作为感知指标的不合理有效性 (LPIPS),CVPR 2018。 arXiv:1801.03924
- 金马,巴。 Adam:随机优化方法,ICLR 2015。 arXiv:1412.6980
- 叶等人。 AbsGS:恢复 3D 高斯泼溅的精细细节,ACM MM 2024。 arXiv:2404.10484 · 代码
- 张等人。 Pixel-GS:具有像素感知梯度的密度控制, ECCV 2024. arXiv:2403.15530
- 余等人。 Mip-Splatting:无混叠 3D 高斯 Splatting,《CVPR 2024》。arXiv:2311.16493
- Kheradmand 等人作为马尔可夫链蒙特卡洛的三维高斯点云, NeurIPS 2024。项目页面·arXiv:2404.09591
- 马利克、戈尔 等人驯服 3DGS:在有限资源下实现高质量辐射场,SIGGRAPH Asia 2024。arXiv:2406.15643
- 黄等人。几何精度辐射场的二维高斯散射,SIGGRAPH 2024。arXiv:2403.17888
- 吴等人。用于实时动态场景渲染的4D高斯喷溅CVPR 2024。项目页面·arXiv:2310.08528