论文笔记(一百一十三)3D Gaussian Splatting for Real-Time Radiance Field Rendering

3D Gaussian Splatting for Real-Time Radiance Field Rendering

  • 文章概括
  • ABSTRACT
  • [1 INTRODUCTION](#1 INTRODUCTION)
  • [2 RELATED WORK](#2 RELATED WORK)
    • [2.1 传统场景重建与渲染](#2.1 传统场景重建与渲染)
    • [2.2 Neural Rendering and Radiance Fields 神经渲染与辐射场](#2.2 Neural Rendering and Radiance Fields 神经渲染与辐射场)
    • [2.3 Point-Based Rendering and Radiance Fields 基于点的渲染与辐射场](#2.3 Point-Based Rendering and Radiance Fields 基于点的渲染与辐射场)
  • [3 OVERVIEW](#3 OVERVIEW)
  • [4 DIFFERENTIABLE 3D GAUSSIAN SPLATTING 可微的 3D 高斯泼溅(Gaussian Splatting)](#4 DIFFERENTIABLE 3D GAUSSIAN SPLATTING 可微的 3D 高斯泼溅(Gaussian Splatting))
  • [5 OPTIMIZATION WITH ADAPTIVE DENSITY CONTROL OF 3D GAUSSIANS 具有自适应密度控制的 3D 高斯优化](#5 OPTIMIZATION WITH ADAPTIVE DENSITY CONTROL OF 3D GAUSSIANS 具有自适应密度控制的 3D 高斯优化)
    • [5.1 Optimization](#5.1 Optimization)
    • [5.2 Adaptive Control of Gaussians 高斯的自适应控制](#5.2 Adaptive Control of Gaussians 高斯的自适应控制)
  • [6 FAST DIFFERENTIABLE RASTERIZER FOR GAUSSIANS 面向高斯的快速可微光栅化器](#6 FAST DIFFERENTIABLE RASTERIZER FOR GAUSSIANS 面向高斯的快速可微光栅化器)
  • [7 IMPLEMENTATION, RESULTS AND EVALUATION 实现、结果与评估](#7 IMPLEMENTATION, RESULTS AND EVALUATION 实现、结果与评估)
    • [7.1 Implementation 实现细节](#7.1 Implementation 实现细节)
    • [7.2 Results and Evaluation 实验结果与评估](#7.2 Results and Evaluation 实验结果与评估)
    • [7.3 Ablations](#7.3 Ablations)
    • [7.4 Limitations 局限性](#7.4 Limitations 局限性)
  • [8 DISCUSSION AND CONCLUSIONS 讨论与结论](#8 DISCUSSION AND CONCLUSIONS 讨论与结论)
  • [ACKNOWLEDGMENTS 致谢](#ACKNOWLEDGMENTS 致谢)
  • [A DETAILS OF GRADIENT COMPUTATION](#A DETAILS OF GRADIENT COMPUTATION)
  • [B 优化与增密算法](#B 优化与增密算法)
  • [C DETAILS OF THE RASTERIZER 光栅化器的细节](#C DETAILS OF THE RASTERIZER 光栅化器的细节)

文章概括

引用:

bash 复制代码
@article{kerbl20233d,
  title={3D Gaussian splatting for real-time radiance field rendering.},
  author={Kerbl, Bernhard and Kopanas, Georgios and Leimk{\"u}hler, Thomas and Drettakis, George},
  journal={ACM Trans. Graph.},
  volume={42},
  number={4},
  pages={139--1},
  year={2023}
}
markup 复制代码
Kerbl, B., Kopanas, G., Leimkühler, T. and Drettakis, G., 2023. 3D Gaussian splatting for real-time radiance field rendering. ACM Trans. Graph., 42(4), pp.139-1.

主页:
原文:
代码、数据和视频:

系列文章:

请在 《 《 《文章 》 》 》 专栏中查找


宇宙声明!

引用解析部分属于自我理解补充,如有错误可以评论讨论然后改正!


ABSTRACT

辐射场(Radiance Field)方法近年来彻底革新了基于多张照片或视频捕获的场景的新视角合成(novel-view synthesis)。 然而,要获得高视觉质量仍然需要训练与渲染成本很高的神经网络;而近期更快的方法又不可避免地在速度与质量之间做出权衡。 对于无边界且完整的场景(而非孤立物体)并在 1080p 分辨率下渲染,目前没有任何方法能够达到实时显示帧率。 我们提出三个关键要素,使得在保持具有竞争力的训练时间的同时实现最先进的视觉质量,并且更重要的是,在 1080p 分辨率下实现高质量的实时(≥30 fps)新视角合成。 第一,我们从相机标定过程中产生的稀疏点出发,用 3D 高斯(3D Gaussians)来表示场景:这种表示在用于场景优化时保留了连续体渲染式辐射场(continuous volumetric radiance fields)的理想性质,同时避免在空旷区域进行不必要的计算。 第二,我们对 3D 高斯进行交错式的优化与密度控制(interleaved optimization/density control),尤其是通过优化各向异性协方差(anisotropic covariance),以获得对场景更准确的表示。 第三,我们开发了一种快速的、具备可见性感知(visibility-aware)的渲染算法,支持各向异性泼溅(anisotropic splatting),既能加速训练,也能实现实时渲染。 我们在若干经典数据集上展示了最先进的视觉质量与实时渲染能力。

CCS 概念分类:• 计算方法论 → 渲染;基于点的模型;光栅化;机器学习方法。

补充关键词与短语:新视角合成、辐射场、3D 高斯、实时渲染。

ACM 参考文献格式: Bernhard Kerbl、Georgios Kopanas、Thomas Leimkühler、George Drettakis. 2018. 《用于实时辐射场渲染的 3D 高斯泼溅》。 ACM Trans. Graph. 0, 0, Article 0(2018),14 页。https://doi.org/XXXXXXX

. XXXXXXX

1 INTRODUCTION

网格(mesh)和点(point)是最常见的三维场景表示方式,因为它们是显式表示,并且非常适合基于 GPU/CUDA 的高速光栅化渲染。 相比之下,近年来的神经辐射场(NeRF)方法基于连续场景表示,通常通过体渲染射线行进(volumetric ray-marching)来优化一个多层感知机(MLP),以实现对真实采集场景的新视角合成。 类似地,迄今为止最高效的辐射场方法也基于连续表示,例如通过在体素网格 [Fridovich-Keil and Yu et al. 2022]、哈希网格 [Müller et al. 2022] 或点 [Xu et al. 2022] 中存储并插值这些值。 尽管连续表示有助于优化过程,但渲染时所需的随机采样计算代价高昂,并且可能引入噪声。 我们提出了一种融合两类方法优势的新方法:我们的 3D 高斯表示在保持具有竞争力训练时间的同时,实现了最先进(SOTA)的视觉质量;而基于瓦片的泼溅(tile-based splatting)方案则保证了在多个已发布数据集 [Barron et al. 2022; Hedman et al. 2018; Knapitsch et al. 2017] 上,以 1080p 分辨率实现 SOTA 质量的实时渲染(见图 1)。

图 1. 我们的方法实现了辐射场的实时渲染,其质量与此前质量最好的方法相当 [Barron et al. 2022],同时所需的优化时间又能与此前最快的方法相竞争 [Fridovich-Keil and Yu et al. 2022; Müller et al. 2022]。 这一性能的关键在于一种新的 3D 高斯场景表示,并与一个实时可微渲染器(real-time differentiable renderer)相结合,从而在场景优化和新视角合成两方面都带来了显著的加速。 需要注意的是:在与 InstantNGP [Müller et al. 2022] 相当的训练时间下,我们能够达到与其类似的质量;而这已经是他们所能达到的最高质量。相比之下,我们训练 51 分钟即可达到最先进(state-of-the-art)的质量,甚至略优于 Mip-NeRF360 [Barron et al. 2022]。

我们的目标是对由多张照片采集的场景实现实时渲染,并且在典型真实场景下,以与此前最高效方法相当的优化时间生成场景表示。 近期方法虽然实现了快速训练 [Fridovich-Keil and Yu et al. 2022; Müller et al. 2022],但在视觉质量上仍难以达到当前最先进的 NeRF 方法------即 Mip-NeRF360 [Barron et al. 2022],而后者通常需要长达 48 小时的训练时间。 这些速度快但质量较低的辐射场方法,在某些场景下可以实现交互式渲染(每秒 10--15 帧),但在高分辨率下仍无法达到真正的实时渲染。

我们的方法基于三个主要组成部分。 首先,我们引入 3D 高斯作为一种灵活且表达能力强的场景表示。 我们采用与以往 NeRF 类方法相同的输入,即通过结构自运动(SfM)[Snavely et al. 2006] 标定的相机,并利用 SfM 过程中免费生成的稀疏点云来初始化 3D 高斯集合。 与大多数依赖多视角立体(MVS)数据的方法不同 [Aliev et al. 2020; Kopanas et al. 2021; Rückert et al. 2022],我们仅使用 SfM 点作为输入便可获得高质量结果。 需要注意的是,在 NeRF-synthetic 数据集上,即使采用随机初始化,我们的方法也能获得较高质量。 我们证明了 3D 高斯是一种极佳的选择:它们既是可微的体表示,又可以通过投影到二维并使用标准 α \alpha α-混合进行高效光栅化,其成像模型与 NeRF 等价。 我们方法的第二个组成部分是对 3D 高斯属性的优化------包括三维位置、不透明度 α \alpha α、各向异性协方差以及球谐(SH)系数------并与自适应密度控制步骤交替进行,在优化过程中动态地添加或移除 3D 高斯。 该优化过程最终生成了一种相对紧凑、非结构化但精确的场景表示(在所有测试场景中约为 100 万至 500 万个高斯)。 方法的第三个也是最后一个组成部分是实时渲染方案,它使用高速 GPU 排序算法,并受到基于瓦片光栅化工作的启发 [Lassner and Zollhofer 2021]。 然而,得益于 3D 高斯表示,我们能够执行考虑可见性顺序的各向异性泼溅------通过排序与 α \alpha α-混合实现------并通过跟踪所需数量的排序泼溅,实现快速且精确的反向传播。

总结而言,我们的主要贡献包括:

  • 引入各向异性 3D 高斯,作为一种高质量、非结构化的辐射场表示。
  • 提出一种 3D 高斯属性的优化方法,并与自适应密度控制交替进行,以构建高质量的真实场景表示。
  • 提出一种快速、可微、具备可见性感知的 GPU 渲染方法,支持各向异性泼溅与快速反向传播,实现高质量新视角合成。

在多个已发布数据集上的实验结果表明,我们可以从多视角采集中优化 3D 高斯,并达到与此前最佳隐式辐射场方法相当甚至更高的质量。 同时,我们在训练速度与质量上可与最快的方法相媲美,并且重要的是,首次实现了高质量新视角合成的实时渲染。

2.1 传统重建 → 2.2 神经渲染/NeRF → 2.3 点渲染与辐射场的关系(公式最关键)→ 为什么 3D 高斯是折中最优

我们首先简要回顾传统三维重建方法,然后讨论基于点的渲染与辐射场相关工作,并分析它们之间的相似性;由于辐射场是一个非常庞大的研究领域,这里仅关注与本文直接相关的工作。 若需全面了解该领域,请参考近期两篇优秀的综述论文 [Tewari et al. 2022; Xie et al. 2022]。

新视角合成想要"又快又好",传统方法快但会缺洞/过度重建;NeRF 质量好但训练和渲染太慢;点渲染快但以前要么依赖 MVS、要么用 CNN 渲染导致时间闪烁、要么无法扩展到大场景。 于是这篇工作把"辐射场的成像模型"用"点(3D高斯)+ α α α 混合"的方式显式实现,并设计 GPU 友好的渲染器,达到实时渲染和高质量。

2.1 传统场景重建与渲染

最早的新视角合成方法基于光场表示,最初依赖于密集采样 [Gortler et al. 1996; Levoy and Hanrahan 1996],随后扩展到支持非结构化采集 [Buehler et al. 2001]。 结构自运动(Structure-from-Motion, SfM)[Snavely et al. 2006] 的出现开启了一个全新的研究方向,使得可以利用一组照片来合成新的视角。 SfM 在相机标定过程中会估计出一个稀疏点云,最初主要用于对三维空间进行简单的可视化。 随后的多视角立体(Multi-View Stereo, MVS)方法在多年发展中产生了令人印象深刻的完整三维重建算法 [Goesele et al. 2007],并推动了多种新视角合成算法的发展 [Chaurasia et al. 2013; Eisemann et al. 2008; Hedman et al. 2018; Kopanas et al. 2021]。 这些方法都将输入图像重新投影并融合到新视角相机中,并利用几何信息来指导这一重投影过程。 这些方法在许多情况下能产生出色的结果,但通常无法完全从未被重建的区域中恢复,或在 MVS 生成不存在几何(即"过度重建")时产生明显问题。 近期的神经渲染算法 [Tewari et al. 2022] 在很大程度上减少了这些伪影,并避免了将所有输入图像存储在 GPU 上的巨大开销,在大多数方面都优于上述传统方法。

1)2.1 传统场景重建与渲染:从"光场 → SfM → MVS → 传统新视角"

这一节在讲"神经方法出现前,大家怎么做"。

1.1 光场(Light Field):早期"靠拍很多张"

  • 最早的办法:把一个场景从非常密的视角拍下来(像围着物体拍一圈还很密)。
  • 新视角合成时:直接在这些照片之间插值/重采样。
  • 缺点很直观:需要超级密集的采集,不现实;后来才支持"不规则采集"。

你可以把光场理解成:

"你拍得足够密,就不用理解三维结构,直接在照片里搬运像素。"

1.2 SfM(Structure-from-Motion):从照片估相机+稀疏点云

SfM 是一个巨大转折点:

  • 输入:一堆照片

  • 输出:

    1. 每张照片的相机位姿(相机在哪、朝哪)
    2. 一个稀疏点云(只是一堆关键点)

早期主要用于"看个大概"式的 3D 可视化。 你可以把 SfM 理解成:

"先把相机摆放搞清楚,再把一些可靠的3D点 triangulate 出来。"

1.3 MVS(Multi-View Stereo):从稀疏到稠密的几何

MVS 接着做更狠的事:

  • 在多视角之间做像素/patch 匹配
  • 估计稠密深度
  • 得到更完整的几何表面

这推动了很多传统的新视角合成: 把输入图像重投影到新相机视角,再融合。

传统方法的两大硬伤(文中点名)

  1. 没重建到的地方恢复不了:比如遮挡后面、反光区域、无纹理区域。你没几何,就没法把图像投过去。
  2. 过度重建(hallucinated geometry):MVS 可能"凭空造出不存在的几何",投影时就出明显伪影。

1.4 神经渲染出现后:减少伪影 + 不需要把所有图像塞GPU

这里的意思是:

  • 传统方法依赖几何重投影,几何一错就崩
  • 神经渲染用可学习的表示更"柔",可以补洞、减伪影
  • 同时避免把所有源图都存在 GPU 上做融合(传统有时要存很多图)

2.2 Neural Rendering and Radiance Fields 神经渲染与辐射场

深度学习技术很早就被引入新视角合成任务中 [Flynn et al. 2016; Zhou et al. 2016];其中,卷积神经网络(CNN)被用于估计图像融合权重 [Hedman et al. 2018],或用于纹理空间中的解决方案 [Riegler and Koltun 2020; Thies et al. 2019]。 这些方法大多依赖基于 MVS 的几何,这是它们的一个主要缺陷;此外,在最终渲染阶段使用 CNN 往往会导致时间上的闪烁问题。

2)2.2 神经渲染与辐射场:从 CNN 融合到 NeRF

2.1 早期 CNN 新视角:学习融合权重/纹理空间

这类方法大致是:

  • 先用 MVS 得到几何
  • CNN 学会怎么融合不同视角的颜色

缺点(文中强调):

  • 依赖 MVS 几何:MVS 错了就继承伪影
  • CNN 最终渲染会闪烁:时间上不稳定(video 里 frame-to-frame 抖动)

基于体表示的新视角合成最早由 Soft3D 提出 [Penner and Zhang 2017];随后,研究者提出将深度学习与体渲染射线行进相结合的方法 [Henzler et al. 2019; Sitzmann et al. 2019],通过连续且可微的密度场来表示几何结构。 由于体渲染射线行进需要对体数据进行大量采样,其渲染成本非常高。 神经辐射场(NeRF)[Mildenhall et al. 2020] 引入了重要性采样和位置编码来提升质量,但使用了规模较大的多层感知机(MLP),从而对速度产生了不利影响。 NeRF 的成功引发了大量后续工作,致力于在质量和速度之间取得平衡,通常通过引入正则化策略;目前在新视角合成图像质量方面的最先进方法是 Mip-NeRF360 [Barron et al. 2022]。 尽管其渲染质量非常出色,但训练和渲染时间仍然极其高昂;而我们的方法在实现快速训练和实时渲染的同时,能够达到甚至在某些情况下超过该质量。

2.2 体表示 + 射线行进:Soft3D → 可微体渲染

核心思想变了:

不再明确重建网格表面,而是学习一个"空间里每个位置的密度/颜色",渲染时沿射线积分。

这就引出 NeRF。

2.3 NeRF:质量强,但"训练和渲染都很慢"

NeRF 做了两个关键技巧(文中提):

  • 位置编码(让 MLP 更好表示高频细节)
  • 重要性采样(更聪明地采样射线上的点)

但它仍然慢的原因也很核心:

  1. 每条像素射线要采很多点(ray marching)
  2. 每个采样点还要跑一个 MLP(算密度和颜色)

因此训练慢、渲染慢。 Mip-NeRF360 质量顶尖,但代价更贵。

最新的方法主要通过三种设计选择来加速训练和/或渲染:使用空间数据结构来存储(神经)特征并在体渲染射线行进中进行插值、采用不同的编码方式,以及调整 MLP 的容量。 这些方法包括多种空间离散化方案 [Chen et al. 2022b,a; Fridovich-Keil and Yu et al. 2022; Garbin et al. 2021; Hedman et al. 2021; Reiser et al. 2021; Takikawa et al. 2021; Wu et al. 2022; Yu et al. 2021]、代码本 [Takikawa et al. 2022],以及诸如哈希表等编码方式 [Müller et al. 2022],从而可以使用更小的 MLP,甚至完全不使用神经网络 [Fridovich-Keil and Yu et al. 2022; Sun et al. 2022]。

2.4 后续加速 NeRF 的三条路线(文中总结得很清楚)

你记住这三条就行:

  1. 用空间数据结构存特征:比如体素网格、稀疏网格、树结构、占据网格 → 查询插值比 MLP 便宜
  2. 换编码方式:比如哈希编码(Instant-NGP 的核心)
  3. 减小或取消 MLP:甚至完全不用神经网络(Plenoxels)

代表:

  • Instant-NGP:哈希网格 + 占据网格 + 小 MLP
  • Plenoxels:稀疏体素网格,直接存密度/颜色,不用神经网

它们很强,但仍有局限:

  • 空旷区域表示困难(依赖场景/采集)
  • 质量受网格结构限制(分辨率/aliasing)
  • 渲染仍然要沿射线走很多步、每步查很多采样点

于是作者抛出自己的点:

我们用"非结构化、显式、GPU友好"的 3D 高斯表示,不用神经组件也能更快渲染、质量更高。

其中最具代表性的方法包括 InstantNGP [Müller et al. 2022],其使用哈希网格和占据网格来加速计算,并通过较小的 MLP 表示密度和外观;以及 Plenoxels [Fridovich-Keil and Yu et al. 2022],其使用稀疏体素网格插值连续密度场,并完全摒弃了神经网络。 这两种方法都依赖球谐函数:前者直接用于表示方向相关效应,后者则用于对颜色网络的输入进行编码。 尽管它们都取得了出色的结果,但在表示空旷区域时仍可能存在困难,这在一定程度上取决于场景或采集方式。 此外,图像质量在很大程度上受限于所采用的加速结构化网格,而渲染速度也因每一步射线行进需要查询大量采样点而受到制约。 我们采用的非结构化、显式、对 GPU 友好的 3D 高斯表示,在不依赖神经组件的情况下,实现了更快的渲染速度和更高的图像质量。

2.3 Point-Based Rendering and Radiance Fields 基于点的渲染与辐射场

3)2.3 点渲染与辐射场:为什么作者说两者"本质同一个成像模型"?

这节最关键就是公式 (1)(2)(3)。懂了之后就能懂为啥能"把 NeRF 的体渲染思想搬到点渲染里"。

基于点的方法能够高效渲染离散且非结构化的几何采样(即点云)[Gross and Pfister 2011]。 在最简单的形式中,点采样渲染(point sample rendering)[Grossman and Dally 1998] 将一个非结构化点集以固定大小进行光栅化,这可以利用图形 API 原生支持的点类型 [Sainz and Pajarola 2004],或在 GPU 上进行并行软件光栅化 [Laine and Karras 2011; Schütz et al. 2022]。 尽管点采样渲染忠实于底层数据,但它会出现孔洞、产生混叠,并且在严格意义上是非连续的。 经典的高质量点渲染工作通过对覆盖范围大于一个像素的点元(point primitives)进行"泼溅(splatting)"来解决这些问题,例如使用圆盘或椭圆盘、椭球体或 surfel 等 [Botsch et al. 2005; Pfister et al. 2000; Ren et al. 2002; Zwicker et al. 2001b]。

近期人们对可微的点渲染技术产生了浓厚兴趣 [Wiles et al. 2020; Yifan et al. 2019]。 一些方法为点引入神经特征并用 CNN 进行渲染 [Aliev et al. 2020; Rückert et al. 2022],从而实现快速甚至实时的新视角合成;但它们仍依赖 MVS 来获得初始几何,因此会继承其伪影,尤其是在无纹理/高反光区域或细薄结构等困难场景中出现过度重建或欠重建。

3.1 先讲 NeRF/体渲染的颜色公式(式(1)(2))

体渲染沿着一条射线采样 N N N 个点,每个点有:

  • 密度 σ i \sigma_i σi
  • 颜色 c i \mathbf{c}_i ci
  • 采样间隔 δ i \delta_i δi

颜色是累积出来的:

C = ∑ i = 1 N T i ( 1 − exp ⁡ ( − σ i δ i ) ) c i C=\sum_{i=1}^{N}T_i(1-\exp(-\sigma_i\delta_i))\mathbf{c}_i C=i=1∑NTi(1−exp(−σiδi))ci

其中 T i T_i Ti 是"走到第 i 个点时,还剩多少光没被前面挡掉"(透射率):

T i = exp ⁡ ( − ∑ j = 1 i − 1 σ j δ j ) T_i=\exp\left(-\sum_{j=1}^{i-1}\sigma_j\delta_j\right) Ti=exp(−j=1∑i−1σjδj)

然后作者把 ( 1 − exp ⁡ ( − σ i δ i ) ) (1-\exp(-\sigma_i\delta_i)) (1−exp(−σiδi)) 记成 α i \alpha_i αi,就得到更像"α混合"的形式:

C = ∑ i = 1 N T i α i c i C=\sum_{i=1}^{N}T_i\alpha_i\mathbf{c}_i C=i=1∑NTiαici

直觉解释(非常重要):

  • α i \alpha_i αi:第 i 个采样点"挡光/贡献颜色"的强度(不透明度)
  • T i T_i Ti:前面没挡掉的比例(剩余透明度)
  • 所以每一点贡献 = "还剩多少光" × "这一点挡多少并给什么颜色"

这就是经典体渲染积分的离散形式。

基于点的 α \alpha α-混合与 NeRF 风格的体渲染在本质上共享同一种成像模型。 具体而言,颜色 C C C 由沿射线的体渲染给出:

C = ∑ i = 1 N T i ( 1 − exp ⁡ ( − σ i δ i ) ) c i C=\sum_{i=1}^{N}T_i(1-\exp(-\sigma_i\delta_i))\text{c}i C=i=1∑NTi(1−exp(−σiδi))ci,其中 T i = exp ⁡ ( − ∑ j = 1 i − 1 σ j δ j ) (1) T_i=\exp\left(-\sum{j=1}^{i-1}\sigma_j\delta_j\right)\tag{1} Ti=exp(−j=1∑i−1σjδj)(1)

其中沿射线以间隔 δ i \delta_i δi 采样密度 σ \sigma σ、透射率 T T T 与颜色 c \text{c} c。 该式可改写为

C = ∑ i = 1 N T i α i c i (2) C=\sum_{i=1}^{N}T_i\alpha_i\text{c}_i\tag{2} C=i=1∑NTiαici(2)

其中

α i = ( 1 − exp ⁡ ( − σ i δ i ) ) \alpha_i=(1-\exp(-\sigma_i\delta_i)) αi=(1−exp(−σiδi)) 且 T i = ∏ j = 1 i − 1 ( 1 − α i ) T_i=\prod_{j=1}^{i-1}(1-\alpha_i) Ti=j=1∏i−1(1−αi)。

注:原文这里的乘积项索引在排版上似乎有一个小笔误(一般应为 ( 1 − α j ) (1-\alpha_j) (1−αj)), 我按原文符号保留。

典型的神经点方法(如 [Kopanas et al. 2022, 2021])通过混合与该像素重叠的、按顺序排列的 N \mathcal{N} N 个点来计算像素颜色 C C C:

C = ∑ i ∈ N c i α i ∏ j = 1 i − 1 ( 1 − α j ) (3) C=\sum_{i\in \mathcal{N}}c_i\alpha_i\prod_{j=1}^{i-1}(1-\alpha_j)\tag{3} C=i∈N∑ciαij=1∏i−1(1−αj)(3)

其中 c i \text{c}_i ci 是每个点的颜色,而 α i \alpha_i αi 由一个协方差为 Σ \Sigma Σ 的二维高斯 [Yifan et al. 2019] 的取值与学习得到的逐点不透明度相乘得到。

3.2 点渲染的 α 混合公式(式(3))是什么?

点方法里,一个像素会被多个点/泼溅(splat)覆盖。 这些点有顺序(按深度从近到远),于是颜色也用 α 混合累积:

C = ∑ i ∈ N c i α i ∏ j = 1 i − 1 ( 1 − α j ) (3) C=\sum_{i\in \mathcal{N}}c_i\alpha_i\prod_{j=1}^{i-1}(1-\alpha_j)\tag{3} C=i∈N∑ciαij=1∏i−1(1−αj)(3)

直觉解释:

  • 第 i 个点的颜色贡献 = 自己颜色 c i \mathbf{c}_i ci × 自己不透明度 α i \alpha_i αi × 前面所有点"没挡住的剩余透明度"
  • ∏ j < i ( 1 − α j ) \prod_{j< i}(1-\alpha_j) ∏j<i(1−αj) 就是点渲染里的 T i T_i Ti

所以作者说:式(2) 和式(3) 本质上是同一个成像模型------都在做"前向遮挡的 α 累积"。

这句话非常关键:

  • NeRF 的体渲染 = 连续空间里很多采样点的 α 混合
  • 点渲染 = 离散点集上的 α 混合
  • 成像机制是一致的,只是"点从哪里来"和"怎么取样"不同。

由式(2)与式(3)可清楚看出,两者的成像模型是相同的。 然而,渲染算法却截然不同。 NeRF 是一种连续表示,隐式表达空空间/占据空间;为了获得式(2)中的采样点需要代价高昂的随机采样,因此会带来噪声与计算开销。 相比之下,点是一种非结构化、离散的表示,足够灵活,能够像 NeRF 一样支持几何的生成、删除与位移。 如先前工作所示 [Kopanas et al. 2021],这可通过优化不透明度与位置来实现,同时避免完整体表示的缺陷。

3.3 为什么说"渲染算法却截然不同"?

虽然公式像,但计算方式不同:

NeRF 的渲染:沿射线采样(ray marching)

  • 为了得到采样点,你要在空间里"走很多步"
  • 采样是"随机/重要性采样" → 有噪声
  • 每一步要查密度/颜色(MLP 或特征插值) →

点渲染:直接渲染已有点(splat)

  • 点已经在那里(离散表示)
  • 只要把点投影到屏幕、做覆盖、按深度排序混合 → 更像传统 GPU 管线,天然快

并且点表示很灵活:

  • 点可以移动/删/加(通过优化位置、不透明度等)
  • 不需要显式"空空间"的连续函数

Pulsar [Lassner and Zollhofer 2021] 实现了快速的球体光栅化,这启发了我们基于瓦片与排序的渲染器。 然而基于上述分析,我们希望在排序后的 splat 上保持(近似的)传统 α \alpha α-混合,以获得体表示的优势: 与其顺序无关的方法不同,我们的光栅化过程遵循可见性顺序。 此外,我们对像素内所有 splat 进行梯度反向传播,并光栅化各向异性 splat。 这些因素共同促成了我们结果的高视觉质量(见第 7.3 节)。 另外,上述提到的以往方法还使用 CNN 进行渲染,这会导致时间不稳定性。 尽管如此,Pulsar [Lassner and Zollhofer 2021] 与 ADOP [Rückert et al. 2022] 的渲染速度仍然促使我们开发自己的快速渲染方案。

4)作者为什么强调 Pulsar、ADOP、CNN 渲染闪烁、以及"瓦片+排序渲染器"?

这部分是在解释他们的渲染器设计动机。

4.1 Pulsar:快的球体光栅化 → 启发了瓦片与排序

Pulsar 做了快速光栅化,给了作者启发:

我也要写一个极快的渲染器,所以用"瓦片分块(tiling)+ 排序(sorting)"来高效处理大量点的投影和混合。

瓦片化的直觉:

  • 把屏幕分成很多小块(tiles)
  • 每个点只影响少数几个 tile
  • 在 tile 内做排序和混合,GPU 更好并行

4.2 为什么强调"保持传统 α 混合"和"按可见性顺序"?

有些方法做"顺序无关(order-independent)"的混合,会牺牲可见性正确性。作者说他们希望保留体表示的优势,所以:

  • 仍按深度(可见性)顺序混合
  • 并且对像素内所有 splat 反传梯度
  • 还支持各向异性 splat(不是圆点,是椭圆/高斯投影)

这些都是为了 更高视觉质量

4.3 为什么说"用 CNN 渲染会时间不稳定"?

CNN 渲染通常是:

  • 把点/特征投到屏幕
  • 生成一个中间缓冲
  • CNN 再"补细节/去洞"

但 CNN 对小扰动敏感:相机移动一点点、点覆盖变化一点点,CNN 输出可能跳变 → 视频闪烁。 作者强调他们不这么做,是为了稳定。

在侧重镜面效应的研究背景下,Neural Point Catacaustics [Kopanas et al. 2022] 的漫反射点渲染路线通过使用 MLP 克服了这种时间不稳定性,但仍然需要 MVS 几何作为输入。 该类别中最新的方法 [Zhang et al. 2022] 不再需要 MVS,并同样使用球谐(SH)来表示方向;但它只能处理单个物体的场景,并且需要掩码进行初始化。 尽管在低分辨率与低点数时它很快,但尚不清楚其如何扩展到典型数据集中的场景规模 [Barron et al. 2022; Hedman et al. 2018; Knapitsch et al. 2017]。 我们使用 3D 高斯作为更灵活的场景表示,避免对 MVS 几何的需求,并借助针对投影高斯的基于瓦片渲染算法实现实时渲染。

5)后面那段:为什么之前的点/高斯相关工作还不够?

作者列了一串"看起来相关但不满足我目标"的工作,逻辑是:

5.1 仍依赖 MVS 的点方法:会继承 MVS 伪影

很多神经点渲染需要 MVS 几何初始化:

  • 无纹理/反光/细薄结构 → MVS 易过重建/欠重建 → 点方法继承伪影

作者想摆脱 MVS 依赖。

5.2 有的能不用 MVS,但限制很大

比如只能单物体、需要 mask 初始化、难扩展到大场景/大深度复杂度。

5.3 有的用点表示辐射场,但仍用 ray marching

比如用 RBF 表示,但渲染还是体渲染射线行进,所以依然达不到实时帧率。

5.4 早期 3D 高斯用于人体/单物体,场景简单

过去高斯用于人体/脸这类:

  • 深度复杂度低(背景简单)
  • 不需要处理室内室外大场景

作者强调自己方法能处理"包含背景的复杂场景",靠的是:

  • 各向异性协方差优化
  • 交错式优化/密度控制(点的剪枝/增密一类)
  • 渲染时高效深度排序 → 才能扩展到复杂场景

近期一项工作 [Xu et al. 2022] 使用径向基函数(radial basis function)方法用点来表示辐射场。 他们在优化过程中采用点的剪枝与增密技术,但仍使用体渲染射线行进,因此无法达到实时显示帧率。

在人体动作/表演捕捉领域,3D 高斯曾被用于表示采集到的人体 [Rhodin et al. 2015; Stoll et al. 2011];更近期它们还与体渲染射线行进结合用于视觉任务 [Wang et al. 2023]。 在类似背景下也有人提出神经体积基元(neural volumetric primitives)[Lombardi et al. 2021]。 尽管这些方法启发了我们选择 3D 高斯作为场景表示,但它们主要聚焦于重建与渲染单个孤立物体(如人体或人脸)的特定情形,因此场景的深度复杂度较小。 相比之下,我们对各向异性协方差的优化、交错式的优化/密度控制以及渲染时高效的深度排序,使我们能够处理包含背景在内的完整复杂场景,覆盖室内与室外,并具有很高的深度复杂度。

6)把整段 Related Work 用一句"你能复述的核心结论"收束

  1. 传统 SfM/MVS 重投影:会缺洞、过度重建
  2. NeRF/Mip-NeRF360 质量极强,但训练/渲染很慢(射线行进+采样)
  3. 加速 NeRF 的网格/哈希/体素方法仍受结构限制且射线行进开销还在
  4. 点渲染很快,而且其 α 混合与 NeRF 体渲染在成像模型上等价
  5. 但以前点法常依赖 MVS 或 CNN 渲染导致闪烁/难扩展
  6. 因此作者用 显式的 3D 高斯点表示 + 可见性排序的 α 混合 + GPU 友好的瓦片渲染器,实现实时渲染并保持高质量,且不依赖神经组件/不依赖 MVS。

3 OVERVIEW

1)这篇方法到底要解决什么事?一句话

给你一堆同一个静态场景的照片(从不同角度拍的),我要学出一个三维表示,让你以后把相机放到任何新角度,都能实时渲染出对应的新视角图像。

它不是在做"物体识别",也不是在做"深度估计",而是在做:新视角合成 / 可实时导航的场景表示

我们方法的输入是一组静态场景的图像,以及由 SfM 标定得到的对应相机参数 [Schönberger and Frahm 2016];SfM 过程还会作为副产物生成一个稀疏点云。 基于这些点,我们构建一组 3D 高斯(第 4 节),每个高斯由位置(均值)、协方差矩阵以及不透明度 α \alpha α所定义,从而支持非常灵活的优化机制。 这将得到一种相对紧凑的三维场景表示,部分原因在于可以用高度各向异性的体积 splat 来紧凑地表示细小结构。 辐射场的方向性外观分量(颜色)采用球谐函数(SH)表示,遵循标准做法 [Fridovich-Keil and Yu et al. 2022; Müller et al. 2022]。 我们的算法通过一系列对 3D 高斯参数的优化步骤来构建辐射场表示(第 5 节),即对位置、协方差、 α \alpha α以及 SH 系数进行优化,并与用于自适应控制高斯密度的操作交替进行。 我们方法高效性的关键在于基于瓦片(tile-based)的光栅化器(第 6 节):它支持对各向异性 splat 进行 α \alpha α-混合,并借助快速排序来遵循可见性顺序。 我们的快速光栅化器还通过跟踪累积的 α \alpha α值实现快速反向传播,并且对可接收梯度的高斯数量不设上限。 我们方法的整体流程如图 2 所示。

图 2. 优化过程从稀疏的 SfM 点云开始,并生成一组 3D 高斯。 随后,我们对这组高斯进行优化,并对其密度进行自适应控制。 在优化过程中,我们使用快速的基于瓦片(tile-based)的渲染器,使得训练时间能够与最先进(SOTA)的快速辐射场方法相竞争。 训练完成后,我们的渲染器支持在多种不同场景中进行实时导航。

2)输入是什么?为什么一定要 SfM?

2.1 输入

  • 一组静态场景图片(多视角)
  • 每张图片对应的相机参数(相机在哪、朝哪、内参是什么)

这些相机参数来自 SfM(Structure-from-Motion,结构自运动)。

2.2 SfM 额外送你一个"稀疏点云"

SfM 在估计相机位姿的同时,还会 triangulate 出一些可靠的三维点(但很稀疏)。这就是图2最左边的 SfM Points(黑点)。

为什么要它? 因为这篇方法不是从零开始在整个三维空间乱猜,它需要一个合理的起点:

"场景里大概哪些地方有东西?"

稀疏点云就给了这个"骨架"。


3)核心表示:什么是"3D 高斯"?为什么用它来表示场景?

从 SfM 点云出发,作者构建一组 3D Gaussians。你可以把一个 3D 高斯想象成一个"带形状、带透明度、带颜色的三维小云团(splat)"。 每个高斯主要有四类参数:

3.1 位置(均值)

  • 高斯中心在哪: μ ∈ R 3 \mu \in \mathbb{R}^3 μ∈R3
  • 就像点的位置,但比点更"有体积"

3.2 协方差矩阵(形状/大小/方向)

  • Σ \Sigma Σ 决定这个"云团"是圆的还是扁的,是朝哪个方向拉长的
  • 各向异性(anisotropic)就是允许它变成"细长椭球/薄片",很适合表示细杆、边缘、细枝等细结构 所以作者说这让表示更紧凑:少量高斯就能覆盖复杂细节。

3.3 不透明度 α \alpha α

  • 决定这个云团"挡光有多强 / 有多实"
  • 渲染时做 α \alpha α-混合(后面会讲)

3.4 颜色怎么表示?用球谐函数(SH)

真实世界很多表面颜色不是固定的,会随视角变(高光、反射等)。 作者用 球谐函数(Spherical Harmonics, SH) 来表示"方向相关的颜色":

  • 不是一个固定RGB
  • 而是"给定观察方向",通过SH系数算出当前看到的颜色

你可以把它理解为:

每个高斯不是只有一个颜色,而是一个"随你看它的方向会变的颜色模型"。


4)图2中间:Projection(投影)在做什么?

你现在有一堆三维高斯(在3D里),还知道当前相机参数(从 SfM 来)。

投影就是把每个 3D 高斯"映射到图像平面":

  • 高斯在3D里是一个椭球(由 Σ \Sigma Σ 决定)
  • 投影到2D图像上会变成一个 2D 椭圆高斯(可以理解为一个椭圆形的"模糊斑点")

所以投影后,每个高斯都会在屏幕上覆盖一片像素区域(splat 的 footprint)。

这一步的结果是:

我知道每个高斯会影响哪些像素、影响多大、深度大概是多少(用于排序)。


5)图2右侧核心:Differentiable Tile Rasterizer(可微瓦片光栅化器)

这是作者效率的关键模块(第6节会细讲)。你现在先抓住它做三件事:

5.1 它是"光栅化器",不是"射线行进"

NeRF 慢,主要慢在:每个像素要沿射线采很多点(ray marching)。 这里不这么干。

这里是:

直接把高斯投影到屏幕上,用类似GPU图形管线的方式,把它们"画"到像素上。

这就是光栅化思路,天然快。

5.2 为什么叫 tile-based(瓦片式)?

把屏幕分成很多小块(tiles),比如 16×16 像素一块:

  • 每个高斯只会影响少数几个 tile
  • 在 tile 内做并行处理(GPU 很擅长)
  • 大幅减少无意义的计算和访存

所以速度上去。

5.3 为什么强调"快速排序 + 可见性顺序"?

一个像素可能被很多高斯覆盖(前面的、后面的)。正确合成必须考虑遮挡:

  • 更近的高斯先影响
  • 后面的被前面的透明度"剩余透过率"衰减

所以要按深度排序(至少近似排序)。作者强调他们遵循可见性顺序,从而质量更好。


6) α \alpha α-混合到底是什么?(这篇方法的"成像模型"核心)

在一个像素里,假设有很多按深度排序的 splat(高斯投影),第 i i i 个有颜色 c i \mathbf{c}_i ci、不透明度
α i \alpha_i αi。

经典前向合成是:

  • 前面已经挡掉了一部分光,剩余透过率记为 T i T_i Ti
  • 当前 splat 的贡献是 T i α i c i T_i\alpha_i\mathbf{c}_i Tiαici
  • 然后更新透过率: T i + 1 = T i ( 1 − α i ) T_{i+1}=T_i(1-\alpha_i) Ti+1=Ti(1−αi)

所以颜色是"逐层叠加"的。 你只要记住一句话就不会卡:

α \alpha α-混合就是"前面的半透明东西会先盖上去,后面的颜色要乘一个'还能透过多少'的系数"。

这就是为什么深度顺序重要。


7)为什么它是"可微的"?蓝色箭头(Gradient Flow)在说什么?

图2里黑色箭头是"正向计算流程",蓝色箭头是"梯度反向传播"。 你训练时是这样:

  1. 用当前的高斯参数渲染出一张图(Image)
  2. 跟真实照片对比,算损失(比如像素误差)
  3. 反向传播梯度,把误差变成"应该怎么改高斯参数"

可微 rasterizer 的意思就是:

渲染这一步是可以求导的,所以你能把"像素误差"反推到每个高斯的:位置、协方差、 α \alpha α、SH系数。

作者还强调两个点:

7.1 "跟踪累积的 α \alpha α"让反向传播更快

因为在一个像素里,如果前面的高斯已经把 α \alpha α 累积到接近 1(基本不透明):

  • 后面的高斯几乎看不见
  • 它们对像素颜色的贡献接近 0
  • 那它们的梯度也几乎 0

所以渲染器可以"早停/裁剪"一部分反传计算,速度更快。

7.2 "对可接收梯度的高斯数量不设上限"

很多方法为了省显存/省算力,会限制每像素最多处理多少 primitive。 作者说他们不设上限(实现上仍会有工程剪枝,但理念是"能处理非常复杂的深度重叠"),这有利于复杂场景质量。


8)Adaptive Density Control(自适应密度控制)到底是什么?为什么要它?

这也是图2中间下方的模块:它在训练过程中"动态改变高斯数量"。 你可以把它理解为:边学边改网格密度,但这里不是网格,是高斯点集。

为什么必须这样?

  • 一开始只有 SfM 的稀疏点云,太少了,细节不够
  • 但你也不能一上来就放几百万个高斯,太慢、也不好优化

所以策略是:

先用少量高斯起步 → 哪些地方误差大/需要细节,就在那儿"增密"(splitting/复制/加点);哪些地方贡献很小/冗余,就"剪枝"(删掉)

这就叫 自适应密度控制:让表示在"需要细节的地方变密",在"空旷或不重要的地方变稀"。


9)把图2完整跑一遍:你现在应该能在脑子里"放电影"

按图2从左到右:

  1. SfM:从多视角照片估计相机参数 + 得到稀疏点云
  2. Initialization:用这些点初始化一堆 3D 高斯(位置/协方差/α/SH)
  3. Projection:给定某个相机,把3D高斯投影成2D椭圆高斯
  4. Differentiable Tile Rasterizer:tile-based 光栅化 + 深度排序 + α混合 → 渲染出图像
  5. Image 对比 GT:算误差
  6. 反向传播(蓝箭头):把误差梯度传回去,更新高斯参数
  7. Adaptive Density Control:训练中间穿插增密/剪枝,让高斯数量和分布更合理
  8. 循环多次,直到渲染图像逼近真实照片
  9. 训练完:因为渲染器很快 → 可以实时导航(实时新视角渲染)

4 DIFFERENTIABLE 3D GAUSSIAN SPLATTING 可微的 3D 高斯泼溅(Gaussian Splatting)

  1. 用什么"基本元(primitive)"表示场景?(为什么选 3D 高斯)
  2. 这个基本元怎么从3D变成2D在图像上渲染?(投影公式(5))
  3. 训练时怎么优化它还不出数学事故? (为什么不用直接优化 Σ \Sigma Σ,改成优化 s s s 和 q q q,公式(6))

我们的目标是从一组不含法向量的稀疏(SfM)点出发,优化一种能够实现高质量新视角合成的场景表示。 为此,我们需要一种既继承可微体表示特性的基本元(primitive),同时又是非结构化且显式的表示,以支持极其快速的渲染。 我们选择 3D 高斯作为表示,因为它们是可微的,并且可以很容易地投影为 2D splat,从而支持快速的 α \alpha α-混合渲染。

1)这一节要解决的任务:从稀疏 SfM 点出发,学出能渲染的新视角表示

你现在只有:

  • 多张照片 + 相机位姿(SfM给的)
  • 一个很稀疏的点云(SfM副产物)
  • 而且没有法向量(normal)

目标是学一个场景表示,能做到:

  • 渲染质量高(像 NeRF 那种细节)
  • 但渲染要极快(接近传统GPU渲染的速度)
  • 并且训练还能用梯度下降(可微)

所以作者需要一种 primitive 同时满足:

  • 可微:能反向传播更新参数
  • 显式、非结构化:像一堆"元素"直接存着,不是隐式MLP
  • 能很快投影到2D并做α混合:渲染快

于是选:3D 高斯


2)为什么不用"带法向量的小圆盘点"(surfel/point disk)?为什么改用 3D 高斯?

你文里提到以前二维点方法通常把点当作"带法向量的小平面圆盘"。这类方法需要每个点有 normal,因为圆盘要知道"朝哪边"。 问题在于:SfM 点云太稀疏,normal 很难估计:

  • 点太少、分布不均
  • 有噪声
  • 估出来的法向量会乱

更糟糕的是:你还要在训练中优化这些 normal。噪声 normal 的优化会非常不稳定,容易让系统崩掉或学不出细节。

3D 高斯的好处:它是"体积云团",天然是 3D 的,不需要法向量就能有形状(椭球)。 你可以把它理解成:

surfel 是"薄片",必须知道朝向; 3D 高斯是"云团/椭球",不用法向量也能表达方向和形状(通过协方差)。

我们的表示方式与以往使用二维点的方法 [Kopanas et al. 2021; Yifan et al. 2019] 在形式上有相似之处,这些方法通常假设每个点是带有法向量的小型平面圆盘。 鉴于 SfM 点云极其稀疏,准确估计法向量是非常困难的。 同样地,对这种估计得到的、噪声极大的法向量进行优化也将非常具有挑战性。 因此,我们将几何结构建模为一组不需要法向量的 3D 高斯。 我们的高斯由定义在世界坐标系中的完整三维协方差矩阵 Σ \Sigma Σ [Zwicker et al. 2001a] 所描述,并以点(均值) μ \mu μ为中心:

G ( x ) = e − 1 2 ( x ) T Σ − 1 ( x ) ( 4 ) G(x)=e^{-\frac{1}{2}(x)^T\Sigma^{-1}(x)}\quad (4) G(x)=e−21(x)TΣ−1(x)(4)

在我们的混合过程中,该高斯函数还会乘以不透明度 α \alpha α。

3)公式(4):3D 高斯到底是什么?参数是什么?

作者写:

G ( x ) = e − 1 2 x T Σ − 1 x ( 4 ) G(x)=e^{-\frac{1}{2}x^T\Sigma^{-1}x}\quad (4) G(x)=e−21xTΣ−1x(4)

这就是一个标准的高斯函数(这里写的是以中心为原点的形式;实际高斯是以均值 μ \mu μ 为中心,你可以理解为 x x x 代表
( x − μ ) (\mathbf{x}-\mu) (x−μ))。

你只要记住两件事:

3.1 均值 μ \mu μ:云团中心在哪里

  • 表示一个"点"在 3D 里位置

3.2 协方差 Σ \Sigma Σ:云团怎么"胖/瘦/朝哪拉长"

  • 如果 Σ \Sigma Σ 像一个球:云团各方向一样大
  • 如果 Σ \Sigma Σ 很扁:云团像薄片
  • 如果 Σ \Sigma Σ 很细长:云团像针/细杆
  • 并且它还能旋转到任意方向

所以一个 3D 高斯就是:

一个以 μ \mu μ 为中心、形状由 Σ \Sigma Σ 决定的椭球云团。

另外作者说:在混合时会乘以不透明度 α \alpha α。 这意味着每个高斯除了形状,还带"遮挡能力":

  • α \alpha α 越大:越"实"、越挡光
  • α \alpha α 越小:越透明

渲染时就是按深度做 α 混合(前面讲过那套成像模型)。

然而,在渲染时我们需要将 3D 高斯投影到二维空间。 Zwicker 等人 [2001a] 给出了将其投影到图像空间的方法。 给定一个视图变换 W W W,在相机坐标系中的协方差矩阵 Σ ′ \Sigma' Σ′可表示为:

Σ ′ = J W Σ W T J T ( 5 ) \Sigma'=JW\Sigma W^T J^T\quad (5) Σ′=JWΣWTJT(5)

其中 J J J是投影变换仿射近似的雅可比矩阵。 Zwicker 等人 [2001a] 还指出,如果去掉 Σ ′ \Sigma' Σ′的第三行和第三列,就可以得到一个 2 × 2 2\times2 2×2的方差矩阵,其结构和性质与从带法向量的平面点开始(如以往工作 [Kopanas et al. 2021])得到的结果一致。

4)关键:渲染时必须把 3D 高斯投影成 2D splat(椭圆斑点)

训练/渲染是在图像平面进行的。你有一个 3D 椭球云团,想在屏幕上画出来,就要做投影。 作者引用 Zwicker 2001 的结果: 给定视图变换 W W W(把世界坐标变到相机坐标),在相机坐标下的协方差变成:

Σ ′ = J W Σ W T J T ( 5 ) \Sigma'=JW\Sigma W^T J^T\quad (5) Σ′=JWΣWTJT(5)

这里最容易卡,我把每个符号讲透:

4.1 W W W 是什么?

  • 视图变换(view transform)
  • 把世界坐标系的点变到相机坐标系: 世界里点 → 相机眼里点

你可以把它理解成相机外参(旋转+平移)的矩阵形式。

4.2 J J J 是什么?为什么要它?

投影(透视投影)严格来说是非线性的(因为有除以深度 Z Z Z)。 J J J 是"投影函数在某个位置的线性近似"的雅可比矩阵:

  • 你把 3D 点附近的小扰动(小范围形状)经过投影会怎么变形
  • 用 J J J 把这种局部变形线性化

所以 J W JW JW 的意义是:

先把高斯从世界坐标转到相机坐标( W W W), 再用投影的局部线性映射( J J J)把3D形状映射到图像平面附近的2D形状。

4.3 为什么是 Σ ′ = A Σ A T \Sigma' = A\Sigma A^T Σ′=AΣAT 这种形式?

这其实是概率/几何里一个经典变换规律:

一个椭球(或高斯)的协方差在经过线性变换 A A A 后,协方差会变成 A Σ A T A\Sigma A^T AΣAT。

这里 A A A 就是 J W JW JW。

4.4 从 3D 协方差得到 2D:删掉第三行第三列

作者说:把 Σ ′ \Sigma' Σ′ 的第三行第三列去掉,就得到一个 2 × 2 2\times2 2×2 的方差矩阵(就是图像平面上的二维协方差)。

直觉解释:

  • 相机坐标是 (X,Y,Z)
  • 图像平面只关心 (x,y) 两个维度(屏幕坐标)
  • 所以我们取出与 X,Y 对应的那部分协方差 → 2D 椭圆高斯

最终你得到一个 2D 椭圆斑点(splat),可以在屏幕上用 α α α 混合画出来。

一种直观的做法是直接优化协方差矩阵 Σ \Sigma Σ,以获得用于表示辐射场的 3D 高斯。 然而,协方差矩阵只有在是半正定的情况下才具有物理意义。 在我们对所有参数进行的梯度下降优化中,很难对其施加约束以保证生成的矩阵始终有效,更新步骤和梯度很容易产生无效的协方差矩阵。

5)为什么不能直接优化 Σ \Sigma Σ?因为它必须"半正定",训练很容易把它更新坏掉

这是本节第二个大难点。

5.1 协方差矩阵必须满足什么性质?

协方差 Σ \Sigma Σ 必须是:

  • 对称
  • 半正定(至少不能有负特征值)

否则它就不代表一个合法的"椭球云团":

  • 负特征值会让高斯形状变成"物理上不存在"的怪东西
  • 数值上还可能导致 Σ − 1 \Sigma^{-1} Σ−1 出问题(不可逆/不稳定)

5.2 为什么梯度下降会把它弄坏?

因为普通梯度下降就是:

  • Σ ← Σ − η ∇ Σ L \Sigma \leftarrow \Sigma - \eta \nabla_\Sigma L Σ←Σ−η∇ΣL

这种更新不管你是不是半正定。稍微更新一下,矩阵就可能:

  • 不对称了
  • 出现负特征值了

要强行约束半正定,你需要复杂的投影/参数化/约束优化,会很麻烦、还慢。 所以作者选择:不直接优化 Σ \Sigma Σ,改用等价但更稳的参数化。

因此,我们选择了一种更直观、但在表达能力上等价的优化表示方式。 3D 高斯的协方差矩阵 Σ \Sigma Σ可以类比为对一个椭球体形状配置的描述。 给定一个缩放矩阵 S S S和旋转矩阵 R R R,可以得到对应的 Σ \Sigma Σ:

Σ = R S S T R T ( 6 ) \Sigma=RSS^TR^T\quad (6) Σ=RSSTRT(6)

为了允许对这两个因素进行独立优化,我们将它们分别存储:用三维向量 s s s表示缩放,用四元数 q q q表示旋转。 这些参数可以很容易地转换为对应的矩阵并组合起来,同时通过对 q q q进行归一化来确保其为合法的单位四元数。

6)公式(6):把 Σ \Sigma Σ 写成"旋转 + 缩放"的组合,保证永远合法

作者说:协方差可以类比椭球形状配置。给定缩放矩阵 S S S 和旋转矩阵 R R R:

Σ = R S S T R T ( 6 ) \Sigma=RSS^TR^T\quad (6) Σ=RSSTRT(6)

这一步极其关键,因为它自动保证 Σ \Sigma Σ 合法。原因是:

  • S S T SS^T SST 永远是半正定(因为任何矩阵乘自己转置都≥0)
  • 再用 R ( ⋅ ) R T R(\cdot)R^T R(⋅)RT 旋转一下,不会改变正定性
  • 所以 Σ \Sigma Σ 永远不会"更新坏掉"

你可以把它理解成:

我不直接学一个"随便的矩阵", 我只学"椭球的三条轴有多长"(缩放)和"椭球朝向哪里"(旋转)。 这样拼出来的协方差天然合法。

6.1 他们怎么存这两个东西?

  • 缩放用三维向量 s s s 表示(对应 x/y/z 三个方向的尺度)
  • 旋转用四元数 q q q 表示

为什么用四元数?

  • 不会像欧拉角那样万向节锁
  • 表达旋转稳定
  • 梯度优化更顺

但四元数必须是单位四元数才表示合法旋转,所以作者说:

通过对 q q q 归一化保证其合法。

这就是"优化过程中不会崩"的关键工程点。


7)为什么说这种表示"表达能力等价"?

你可能会担心:我限制成 R R R 和 S S S 会不会少表达力?

不会。因为任何对称半正定矩阵都可以看成:

  • 某个正交基(旋转)下的对角缩放(特征值)
  • 再旋转回来

这就是本质上的"特征分解/椭球主轴表示"。 所以他们说"直观但表达能力等价"。

为避免训练过程中自动微分带来的显著开销,我们对所有参数的梯度进行了显式推导。 具体的导数计算细节见附录 A。 这种适用于优化的各向异性协方差表示,使我们能够优化 3D 高斯以适应采集场景中不同形状的几何结构,从而得到一种相当紧凑的表示。 图 3 展示了这些示例。

图 3. 为了可视化优化后的 3D 高斯,我们将它们整体缩小 60%(最右侧)。 这清晰地展示了 3D 高斯的各向异性形状:优化后它们能够以紧凑的方式表示复杂几何结构。 左侧为实际渲染得到的图像。

8)为什么要显式推导梯度?(不是让自动微分算)

作者说:为避免自动微分开销,他们对所有参数的梯度做了显式推导。

原因很现实:

  • 这里渲染器要处理海量高斯、海量像素覆盖
  • autograd 会带来巨大的计算图和显存开销
  • 显式梯度 + 手写 CUDA/高效实现 → 训练速度才能到论文宣称的级别

你只要理解:

他们不是"不会用自动微分",是"为了极致速度必须手推导"。


9)图3在告诉你什么?"缩小60%"为什么能看出各向异性?

图3右边把高斯整体缩小 60% 来可视化: 因为正常渲染时,高斯会覆盖像素并叠加,看起来像连续表面;你不容易直观看到每个高斯的形状。 缩小后你会发现:

  • 高斯不是球,而是各种"细长/扁平"的椭球
  • 它们沿着物体的结构分布(比如百叶窗的条纹、边缘等)
  • 说明优化确实学到了"用各向异性椭球紧凑表示复杂几何"

这正对应第3节说的:各向异性 splat 能紧凑表示细结构。


10)把第4节用"可复现的最小实现视角"总结成算法结构

这一节本质上定义了你要优化的参数化与投影方式:

表示(每个高斯存什么)

  • μ \mu μ:3D位置
  • s s s:3D缩放(决定椭球轴长)
  • q q q:四元数旋转(决定椭球朝向)
  • α \alpha α:不透明度
  • SH系数:方向相关颜色

由 s , q s,q s,q 组合出 R , S R,S R,S,再得到: Σ = R S S T R T \Sigma=RSS^TR^T Σ=RSSTRT

渲染时怎么从3D变2D

  • 用视图变换 W W W + 投影雅可比 J J J 得到相机坐标协方差: Σ ′ = J W Σ W T J T \Sigma'=JW\Sigma W^T J^T Σ′=JWΣWTJT
  • 取 Σ ′ \Sigma' Σ′ 的 2×2 部分得到图像平面椭圆
  • 在屏幕上对这些椭圆做深度排序 + α混合得到像素颜色

优化为什么稳

  • 不直接更新 Σ \Sigma Σ(会变成非法矩阵)
  • 更新 s , q s,q s,q(并归一化 q q q)→ 组合出来的 Σ \Sigma Σ 永远合法

5 OPTIMIZATION WITH ADAPTIVE DENSITY CONTROL OF 3D GAUSSIANS 具有自适应密度控制的 3D 高斯优化

训练=反复渲染→和真图对比→用梯度改高斯参数;同时每隔一段时间做一次"增密/删点/拆点",让高斯数量和分布越来越适合表达场景。

我们方法的核心是优化步骤,该步骤生成一组致密的 3D 高斯,用于精确表示场景并支持自由视角合成。 除了位置 𝑝 𝑝 p、不透明度 α \alpha α 以及协方差矩阵 Σ Σ Σ之外,我们还优化表示每个高斯颜色 𝑐 𝑐 c 的球谐(SH)系数,以正确捕捉场景的视角相关外观。 这些参数的优化与用于控制高斯密度的步骤交替进行,以更好地表示场景。

0)先把"你在训练什么"讲清楚:一个高斯有哪些可学习参数?

每个 3D 高斯(primitive)不是只有位置,它至少有这些参数(文中点名):

  1. 位置 p p p (或 μ \mu μ):高斯中心在哪里
  2. 形状 Σ \Sigma Σ :椭球云团的高矮胖瘦+朝向(上一节讲过用 s , q s,q s,q 参数化)
  3. 不透明度 α \alpha α:这个高斯"挡光多少"(用于 α 混合)
  4. 颜色 c c c 的球谐系数(SH):让颜色随观察方向变化(能表示反射/高光那种视角相关外观)

所以你训练的就是一堆高斯的这四类参数: 位置、形状、不透明度、SH颜色

5.1 Optimization

1)5.1 Optimization:训练主循环到底怎么跑?

训练的主循环非常朴素,跟 NeRF 很像,但渲染方式不一样:

优化过程基于反复迭代:先进行渲染,再将生成的图像与采集数据集中的训练视图进行比较。 由于三维到二维投影存在歧义,几何体不可避免地可能被错误放置。 因此,我们的优化过程必须能够创建几何结构,并在几何被错误放置时将其删除或移动。 3D 高斯协方差参数的质量对于表示的紧凑性至关重要,因为大面积的均匀区域可以用少量大的各向异性高斯来表示。

1.1 每次迭代做三步

  1. 随机选一个训练视角(就是输入照片里的一张 + 相机参数)
  2. 用当前的高斯集合渲染出一张图(靠第6节的 tile rasterizer + α 混合)
  3. 把渲染图和真实照片对比,算损失,然后反向传播更新参数(SGD)

这就是"反复迭代:渲染→比较→更新"。

1.2 为什么作者强调"3D到2D投影有歧义,所以几何会被放错"?

你只用照片监督(像素误差),很多不同的 3D 结构都可能解释同样的图像(尤其在遮挡、纹理重复、反光处)。 所以训练早期很容易出现:

  • 有些高斯被"拉"到错误位置
  • 甚至在相机附近出现漂浮物(floaters)
  • 某些区域本该有几何但没覆盖到(欠重建)
  • 某些区域用一个大高斯糊住了细节(过重建)

所以作者说:优化必须能 创建几何 (加高斯)也要能 删除/移动几何(删掉透明的、拆分、清理)。

我们采用随机梯度下降(SGD)进行优化,充分利用标准 GPU 加速框架,并在部分操作中使用自定义 CUDA 内核,遵循近期的最佳实践 [Fridovich-Keil and Yu et al. 2022; Sun et al. 2022]。 尤其是我们的快速光栅化(见第 6 节)对优化效率至关重要,因为渲染是优化过程中的主要计算瓶颈。

1.3 用 SGD + GPU + 自定义 CUDA 的原因

不是理论上的新东西,就是工程现实:

  • 渲染是最大的瓶颈
  • 他们用非常快的 rasterizer(第6节)才让训练时间能跟"快速辐射场方法"竞争

你记住:这里训练速度的关键不是优化器多高级,而是渲染器快。

我们对 α \alpha α 使用 sigmoid 激活函数,将其约束在 [ 0 , 1 ) [0,1) [0,1) 范围内并获得平滑梯度;对协方差的尺度参数则使用指数激活函数,原因类似。

2)为什么要对 α \alpha α 用 sigmoid、对尺度用 exp?(这是训练稳定性的硬关键)

2.1 α \alpha α 必须在 [ 0 , 1 ) [0,1) [0,1)

  • α < 0 \alpha<0 α<0 或 α > 1 \alpha>1 α>1 都没物理意义(透明度/不透明度)

  • 所以用 sigmoid 把任何实数压到 ( 0 , 1 ) (0,1) (0,1):

    • 永远合法
    • 梯度也比较平滑(比硬裁剪好)

2.2 尺度必须为正

你上一问也提到:协方差尺度不能是负数。 很多实现会对 s s s 用 exp(或 softplus)确保 s > 0 s>0 s>0:

  • 你优化的是一个 unconstrained 的参数 s ~ \tilde{s} s~
  • 真正用的尺度是 s = exp ⁡ ( s ~ ) s=\exp(\tilde{s}) s=exp(s~)
  • 这样训练更新永远不会产生负尺度导致崩

这就是作者说"原因类似"的意思:都在把参数限制到物理合理范围


3)初始协方差怎么设?为什么这么设?

作者说:初始用各向同性高斯(球形),轴长度取"到最近三个点距离的平均值"。 直觉非常简单:

  • SfM 点云稀疏,你先给每个点一个"合适大小的球"
  • 这个球的半径如果太小,覆盖不到任何像素;太大,会糊成一片
  • "最近邻距离"是一个很自然的尺度:点云密的地方半径小,点云稀的地方半径大

所以这就是一个自适应的初始半径

我们将初始协方差矩阵设为各向同性高斯,其轴长度等于到最近三个点距离的平均值。 我们采用与 Plenoxels [Fridovich-Keil and Yu et al. 2022] 类似的标准指数衰减调度策略,但仅用于位置参数。 损失函数由 L 1 \mathcal{L}_1 L1 损失与 D-SSIM 项组合而成:

L = ( 1 − λ ) L 1 + λ L D-SSIM ( 7 ) \mathcal{L}=(1-\lambda)\mathcal{L}1+\lambda \mathcal{L}\text{D-SSIM}\quad (7) L=(1−λ)L1+λLD-SSIM(7)

在所有实验中我们使用 λ = 0.2 \lambda=0.2 λ=0.2。 学习率调度及其他细节见第 7.1 节。

4)损失函数 (7):为什么是 L1 + D-SSIM?

L = ( 1 − λ ) L 1 + λ L D-SSIM ( 7 ) \mathcal{L}=(1-\lambda)\mathcal{L}1+\lambda \mathcal{L}\text{D-SSIM}\quad (7) L=(1−λ)L1+λLD-SSIM(7)

你不用把 SSIM 公式背下来,只要知道它在干什么:

  • L 1 \mathcal{L}_1 L1:逐像素差,训练很稳定,但容易让图"偏糊"
  • D-SSIM:更关注局部结构/对比度/纹理一致性,能让细节更像

λ = 0.2 \lambda=0.2 λ=0.2 说明:

主要靠 L1 稳住训练,再加一点结构感知的项提升视觉质量。

5.2 Adaptive Control of Gaussians 高斯的自适应控制

我们从 SfM 得到的初始稀疏点集开始,然后通过方法自适应地控制高斯的数量及其单位体积内的密度(这里的高斯密度当然不应与 NeRF 文献中的密度𝜎混淆),从而将初始稀疏的高斯集合转化为更致密、参数更准确、能更好表示场景的集合。在优化预热阶段之后(见第 7.1 节),我们每 100 次迭代进行一次增密,并移除几乎完全透明的高斯,即 α \alpha α 小于阈值 ϵ α \epsilon_\alpha ϵα 的高斯。

5)5.2 自适应密度控制:为什么必须"边训练边增密/删/拆"?

一句话原因:

你一开始只有稀疏点云,不可能靠"只移动这些点"就复原出完整几何。

必须在需要细节的地方增加表示容量(加更多高斯),在不需要的地方删掉。

作者强调他们控制的是高斯数量/单位体积密度 (别和 NeRF 的密度 σ \sigma σ 搞混)。

我们的高斯自适应控制需要填充场景中的空白区域。 该策略既关注几何特征缺失的区域("欠重建"),也关注高斯覆盖面积过大的区域(通常对应"过重建")。 我们观察到,这两类区域在视空间中的位置梯度都较大。 直观上,这是因为这些区域尚未被良好重建,优化过程试图通过移动高斯来纠正这一问题。

6)增密触发信号是什么?------看"视空间位置梯度"大不大

这是本节最"聪明"的地方:他们不用额外网络判断哪里该加点,而是直接看优化给你的信号:

欠重建 / 过重建区域会导致 视空间中的位置梯度很大

你可以这样理解:

  • 如果某块地方没重建好,渲染误差大
  • 反向传播会告诉你:"把某些高斯往那边挪才能减小误差"
  • 于是这些高斯的 位置梯度幅值 会变大

所以他们用一个阈值 τ pos = 0.0002 \tau_\text{pos}=0.0002 τpos=0.0002:

  • 平均位置梯度幅值 > τ pos \tau_\text{pos} τpos 的高斯:认为它处在"问题区域",适合增密

同时他们还有一个节奏:

  • 预热阶段后,每 100 次迭代增密一次
  • 并且移除 α < ϵ α \alpha<\epsilon_\alpha α<ϵα 的高斯(几乎完全透明就等于没用)

由于这两种情况都适合进行增密,我们对视空间位置梯度平均幅值高于阈值 τ pos \tau_\text{pos} τpos 的高斯进行增密,在实验中该阈值设为 0.0002。

下文将结合图 4 详细说明该过程。

对于位于欠重建区域的小高斯,我们需要覆盖新生成的几何结构。 为此,更合适的做法是克隆高斯:创建一个同尺寸的副本,并沿位置梯度方向移动。

另一方面,在高方差区域的大高斯需要被拆分为更小的高斯。 我们用两个新的高斯替换原有高斯,并将其尺度缩小为原来的 1 / ϕ 1/\phi 1/ϕ,其中 ϕ = 1.6 \phi=1.6 ϕ=1.6 是通过实验确定的。 同时,我们以原始 3D 高斯作为概率密度函数(PDF)进行采样,以初始化新高斯的位置。

7)图4:两种"增密"其实是两套操作:Clone vs Split

图4上排叫 欠重建(under-reconstruction) ,下排叫 过重建(over-reconstruction) 。 关键是:它们都"梯度大",但你应该用不同方式处理。

7.1 欠重建:小高斯不够覆盖细小几何 → Clone(克隆)

情形:黑色轮廓的小结构没被覆盖够(比如边缘、细条纹)。 你现在的高斯太少,导致那块区域像素一直误差大。

做法:克隆高斯

  • 复制一个"同尺寸"的高斯(形状/尺度先一样)
  • 然后沿着位置梯度方向把新高斯挪一点

直觉是:

你缺的是"更多同样大小的笔触"来填空。

复制一支笔,再往误差方向补一笔。

所以 clone 是在解决:需要更多覆盖面积/更多样本点

7.2 过重建:一个大高斯糊住了细小结构 → Split(拆分)

情形:细小几何被一个"大 splat"表示。结果是:

  • 它能覆盖,但细节被糊
  • 你想表达边缘/拐角/窄结构时,一个大椭圆不够精细

做法:把一个大高斯拆成两个小高斯

  • 用两个新高斯替换旧高斯
  • 新高斯的尺度变小:缩小到原来的 1 / ϕ 1/\phi 1/ϕ, ϕ = 1.6 \phi=1.6 ϕ=1.6
  • 新高斯的位置怎么定? 作者说:以原始 3D 高斯作为 PDF 采样,初始化新位置(等于在原椭球范围内"随机抽"两个中心)

直觉是:

你不是缺覆盖,而是"一个笔头太粗"。

把粗笔换成两支细笔,才能画出细节。

所以 split 是在解决:需要更高分辨率的局部表示

7.3 他们还强调一个区别:总体积变化不同

  • 欠重建(clone):总体积 + 高斯数量都会增(你真的缺东西)
  • 过重建(split):总体积尽量不变,只增加数量(把同样的体积切细)

这句话看起来抽象,但意思就是:

clone 是"加料",split 是"切细"。

在第一种情况下,我们检测并处理系统总体积和高斯数量都需要增加的问题;而在第二种情况下,我们保持总体积不变,仅增加高斯数量。 与其他体表示方法类似,我们的优化过程可能在靠近输入相机的位置出现"漂浮物(floaters)",这在我们的情形下可能导致高斯密度不合理地增加。 一种有效抑制高斯数量增长的方法是每隔 N = 3000 N=3000 N=3000 次迭代将𝛼值重置为接近零。 随后,优化过程会在需要的位置重新增大𝛼,同时允许我们的剔除策略移除 α \alpha α 小于 ϵ α \epsilon_\alpha ϵα 的高斯。 高斯可能会收缩或膨胀,并与其他高斯产生显著重叠,但我们会周期性地移除在世界空间中过大的高斯,以及在视空间中投影面积过大的高斯。 该策略在整体上实现了对高斯总数量的良好控制。 我们模型中的高斯始终作为欧几里得空间中的基本元存在;与其他方法不同 [Barron et al. 2022; Fridovich-Keil and Yu et al. 2022],我们不需要对远处或尺度很大的高斯进行空间压缩、扭曲或投影等策略。

图 4. 我们的自适应高斯增密方案。上排(欠重建):当小尺度几何(黑色轮廓)覆盖不足时,我们克隆对应的高斯。下排(过重建):当小尺度几何被一个大的 splat 表示时,我们将其拆分为两个。

8)为什么会出现 floaters?他们怎么防止高斯数量失控?

floaters = 相机附近出现漂浮的错误几何。原因是:

  • 近处对像素影响大,梯度强
  • 容易在相机附近长出一堆"讨好损失"的垃圾高斯

如果不管,高斯会越来越多,训练会炸、渲染会慢。 作者给了三套"控量手段":

8.1 周期性把 α 重置接近 0(每 N=3000 次)

这招很像"清场":

  • 把很多高斯的 α \alpha α 打到很小
  • 真正需要的高斯会在后续优化中再次把 α 学大
  • 不需要的会一直很透明 → 被剔除策略删掉( α < ϵ α \alpha<\epsilon_\alpha α<ϵα)

直觉:

你让所有人先"变隐身",再看谁真的必须站出来。

这能有效抑制无意义高斯的堆积。

8.2 周期性删除"过大"的高斯

他们还会删两类异常:

  • 世界空间中过大的高斯(形状膨胀离谱)
  • 视空间投影面积过大的高斯(在屏幕上铺太大,一看就是糊)

这防止一两个高斯变成"巨型刷子"破坏细节。

8.3 不做远处空间压缩/扭曲

作者强调他们不需要像一些体表示那样对远处或大尺度做"空间扭曲/压缩"。 你现在只要理解:他们的高斯一直是欧氏空间里的普通 primitive,不靠坐标变换投机取巧。

6 FAST DIFFERENTIABLE RASTERIZER FOR GAUSSIANS 面向高斯的快速可微光栅化器

0)先搞清楚:他们到底在渲染什么?为什么会慢?

你要渲染的是:
一堆 3D 高斯 (每个有位置、形状、α、颜色) → 投影成屏幕上的 2D 椭圆 splat → 对每个像素,把所有覆盖这个像素的 splat 按深度从近到远做 α混合 得到像素颜色。

慢点在两件事:

  1. 排序:α混合要按深度顺序(近的先盖住远的)。 如果你"每个像素"都把覆盖它的 splat 拿出来排序,那会贵到爆(每像素动辄几十上百个 splat,还要排序)。

  2. 反向传播:训练要算梯度。你不能只前向画完就算了,还得把误差反传到每个 splat 的参数上。 以前很多方法为了省事,会限制"每个像素最多混合多少个 splat"(硬上限),超过的就不算梯度了------这样快,但会学不准,深度复杂度一高就崩。

这篇的目标就是:

排序要快、渲染要快、反传也要快,而且不对可接收梯度的 splat 数量设硬上限。

我们的目标是实现整体渲染与排序的高速化,以支持近似的 α \alpha α-混合------包括对各向异性 splat 的支持------并避免以往工作中对可接收梯度的 splat 数量设置的硬性上限 [Lassner and Zollhofer 2021]。

为实现这些目标,我们设计了一种基于瓦片(tile-based)的高斯 splat 光栅化器,灵感来自近期的软件光栅化方法 [Lassner and Zollhofer 2021],通过对整幅图像的基本元进行一次性预排序,避免了以往 α \alpha α-混合方案中每像素排序所带来的高昂开销 [Kopanas et al. 2022, 2021]。 我们的快速光栅化器能够在低额外内存开销下,对任意数量参与混合的高斯高效地进行反向传播,每个像素只需常数级的额外开销。 我们的光栅化流水线是完全可微的,并且在完成二维投影(第 4 节)后,能够像以往的二维 splatting 方法那样光栅化各向异性 splat [Kopanas et al. 2021]。

1)核心思想:用"瓦片(tile)+ 一次全局排序"替代"每像素排序"

1.1 什么是 tile?

把屏幕切成很多小块,比如每块 16×16 像素。 你可以把 tile 当成"渲染的最小工作单元"。

为什么要这么做?因为 GPU 最擅长的是:

  • 大量线程做类似工作
  • 一块区域的数据可以放共享内存反复用
  • 线程块(thread block)天然就适合管一个 tile

1.2 以前为什么要"每像素排序"?

因为一个像素里可能有多个 splat 重叠,而且深度不同。 正确 α混合需要按深度顺序。

但每像素排序太贵:

你要对每个像素单独收集它的 splat 列表、再排序。

1.3 他们怎么绕开?------"一次性预排序"

他们做法是:
不再为每个像素排序,而是先把 splat 组织成"tile 列表",然后对这些列表做一次全局排序。

核心关键字:

  • 为每个 "高斯-瓦片" 组合创建一个"实例(instance)"
  • 给每个实例一个 key:(深度, tileID)
  • 对所有实例做一次 GPU Radix Sort(基数排序)
  • 排完以后,同一个 tile 的实例自然挤在一起,并且按深度顺序排好了

这一步的意义是:

你把"排序"从"每像素"变成了"每个高斯影响哪些 tile → 对这些 tile 的高斯统一排序一次"。

排序次数瞬间少很多,而且排序对象更结构化,GPU 很擅长。

我们的方法首先将屏幕划分为 16 × 16 16\times16 16×16 的瓦片,然后对 3D 高斯进行视锥体和瓦片级别的剔除。 具体而言,我们仅保留其 99% 置信区间与视锥体相交的高斯。 此外,我们使用一个保护带(guard band)来直接剔除处于极端位置的高斯(即均值接近近裁剪面且远离视锥体的高斯),因为对它们计算投影后的二维协方差会不稳定。 接着,我们根据每个高斯与多少个瓦片重叠来实例化该高斯,并为每个实例分配一个结合了视空间深度与瓦片 ID 的键值。 随后,我们使用一次快速的 GPU 基数排序(Radix sort)[Merrill and Grimshaw 2010],根据这些键值对高斯进行排序。 需要注意的是,这里不再进行任何逐像素的点排序, α \alpha α-混合完全基于这一初始排序结果。 因此,在某些配置下,我们的 α \alpha α-混合是近似的。 然而,当 splat 的尺寸接近单个像素大小时,这种近似误差将变得可以忽略。 我们发现,这一选择在不产生可见伪影的前提下,显著提升了训练与渲染性能。

2)渲染前的剔除:为什么要做视锥体/瓦片级剔除 + guard band?

这部分是"别让 GPU 算没用的东西"。

2.1 视锥体剔除(frustum culling)

只保留"高斯的 99% 置信椭球"与相机视锥体相交的高斯。 你可以理解为:

一个高斯大概率都在视野外,那它不可能影响屏幕,就别算。

为什么是 99%? 因为高斯理论上无限延伸,但大部分能量集中在一个范围里(比如几倍标准差内)。用 99% 相当于取一个"足够安全但有限"的包围范围。

2.2 瓦片级剔除

高斯投影到屏幕上只会覆盖少量 tile。 所以只在那些 tile 上"实例化它",别让它去影响全屏。

2.3 guard band(保护带)是干嘛的?

有些高斯位置很极端:

  • 均值靠近近裁剪面(near plane)
  • 又远离视锥体 这种情况投影会数值不稳定(因为透视投影里有除以深度,深度很小就爆)。

所以 guard band 是一种"安全过滤":

这些极端点直接扔掉,避免算出爆炸的 2D 协方差,导致 NaN、训练崩。


3)"实例化 + key=(depth, tileID) + Radix sort" 这步你最容易卡,我给你讲成白话

想象你有一个高斯 A,它投影后覆盖了 7 个 tile。 那你就创建 7 条记录:

  • (tile=3, depth=0.4, gaussian=A)
  • (tile=4, depth=0.4, gaussian=A)
  • ... 每条记录叫一个 instance。

然后你给每条记录一个排序 key:
先按 tileID 分桶,再在桶内按深度排(等价于 key=(tileID, depth) 或 (depth, tileID),论文写法是组合两者;目的就是让同一tile聚在一起并深度有序)。

用 GPU 的 Radix sort 很快,因为:

  • key 是整数/可编码的
  • 基数排序适合大规模并行排序

排序完你会得到一个大数组: 里面按 tile 分成连续段,每段内部基本按深度排序。


4)"近似 α混合"到底近似在哪?为什么误差很小?

他们说:因为不做每像素排序,α混合完全基于初始排序结果,所以某些配置下是近似的。 近似的根源是:

  • 他们是按 tile 的深度顺序组织,而不是精确地对"每个像素的覆盖 splat 深度"做排序
  • 一个 tile 内不同像素看到的"哪个 splat 更近"可能会有细微差异(尤其当 splat 很大、深度变化大时)

但他们说:当 splat 尺寸接近 1 像素时,这个误差可忽略。 直觉非常简单:

splat 越小,它覆盖的像素越少,tile 内的深度相对关系越一致; 你用 tile 级排序近似像素级排序就几乎等价。

而训练过程中,他们会增密、拆分,使 splat 变小、变细,所以这种近似通常不会产生可见伪影,但性能提升巨大。

在完成高斯排序后,我们通过确定对某一瓦片产生 splat 的、按深度排序后的首个和最后一个条目,为每个瓦片生成一个列表。 在光栅化阶段,我们为每个瓦片启动一个线程块(thread block)。 每个线程块首先协作地将一批高斯加载到共享内存中,然后针对某个像素以前向到后向的顺序遍历列表,累积颜色和 α \alpha α值,从而在数据加载/共享和计算处理两方面都最大化并行性。 当某个像素的 α \alpha α达到目标饱和值时,对应的线程便停止计算。 在线程块内部以固定间隔进行检查,当瓦片中的所有像素都达到饱和(即 α \alpha α趋近于 1)时,整个瓦片的处理终止。 关于排序细节以及整体光栅化方法的高层概述见附录 C。

5)前向渲染阶段:一个 tile 一个 thread block,怎么把共享内存用满?

排序完后,他们为每个 tile 建一个列表(其实就是这个 tile 在排序数组里对应的起止范围:first/last)。

然后渲染:

  • 每个 tile 启动一个 thread block(线程块)

  • 线程块协作把一批高斯加载到 shared memory(共享内存)

    • 共享内存比全局显存快很多 * tile 内 16×16 个像素都要用这批高斯,复用率高
  • 每个线程负责 tile 里的一个或几个像素

  • 对每个像素,按"从前到后"(近到远)遍历该 tile 的高斯列表:

    • 计算这个 splat 对该像素的权重/α贡献 * 累积颜色、累积α(α混合)

5.1 早停:α饱和就停

当某个像素的累计 α 已经接近 1(不透明了),再往后算也几乎没影响,所以该线程直接停止。

更狠的是:

  • 线程块内部隔一段检查一次
  • 如果 tile 里所有像素都饱和了 → 整个 tile 停止处理

这就是巨大的加速来源:

很多场景前面几层就挡满了,后面几百个 splat 根本不用算。

在光栅化过程中, α \alpha α的饱和是唯一的停止条件。 与以往工作不同,我们不对接收梯度更新的混合基本元数量施加限制。 我们坚持这一设计,使方法能够处理任意、变化的深度复杂度场景,并对其进行准确学习,而无需针对不同场景进行超参数调节。 因此,在反向传播过程中,我们必须恢复前向过程中每个像素的完整混合点序列。 一种解决方案是在全局内存中为每个像素存储任意长度的混合点列表 [Kopanas et al. 2021]。 为避免由此带来的动态内存管理开销,我们选择再次遍历每个瓦片的列表;并复用前向过程中得到的高斯排序数组和瓦片范围。 为了便于梯度计算,这一次我们按从后向前的顺序进行遍历。

6)关键难点:不设"可接收梯度的 splat 上限"后,反向传播怎么办?

以前很多工作为了省事会规定: "每像素最多算 K 个 splat 的梯度"。 K 可能是 8、16、32...... 超过的就不管了。这样内存和时间可控,但会学不对(深度复杂场景直接炸)。 他们坚持:不设这个硬上限。 那问题来了:

反向传播要用到前向混合的完整序列信息。 你怎么记住"每个像素到底混了哪些 splat、混到哪一步"?

最直接的方法是: 给每个像素存一个"任意长度的列表"(动态数组)。 但这会带来灾难:全局内存巨大 + 动态内存管理很慢。


7)他们的解法:反向不存列表,而是"再遍历一次 tile 列表",并且倒着遍历

这一步非常聪明也非常工程化:

7.1 前向时已经有两样东西

  1. 全局排序后的高斯数组(按 tile 分段)
  2. 每个 tile 的范围(start/end)

这两样足够让你"重新走一遍当时的混合顺序"。

所以反向传播时:

  • 不存每像素的混合列表
  • 直接对每个 tile 再跑一次遍历
  • 但这次按 从后向前(远到近)遍历

为什么要倒着? 因为 α混合的梯度计算天然需要"后面层的影响"往前传,倒序遍历更顺(跟体渲染反传类似)。

7.2 反向阶段怎么避免"白算"?

他们加了两个剪枝:

剪枝A:只处理对像素真正有贡献的最后一个点之前的点

前向时对每个像素,最终会有一个"最后贡献点"的深度(后面的要么没覆盖,要么像素已经饱和了)。

反向时:

  • 只有当某个点的深度 ≤ 前向最后贡献点深度,才对该像素做昂贵的"重叠测试 + 处理"
  • 深度更远的点直接跳过

剪枝B:共享内存批量加载

和前向一样,tile 内协作加载到 shared memory,提高吞吐。

遍历从对瓦片中任意像素产生影响的最后一个点开始,并再次以协作方式将点加载到共享内存中。 此外,只有当点的深度小于或等于前向过程中最后一个对该像素颜色有贡献的点的深度时,该像素才会启动(代价较高的)重叠测试和点处理。 第 4 节中描述的梯度计算需要在原始混合过程中每一步的累积不透明度值。 相比在反向传播中遍历一份逐步衰减的不透明度显式列表,我们只需存储前向结束时的总累积不透明度即可恢复这些中间不透明度。 具体而言,每个点在前向过程中存储最终的累积不透明度 α \alpha α;在反向的后向遍历中,我们用该值除以每个点自身的 α \alpha α,即可得到梯度计算所需的系数。

8)最容易卡的公式直觉:反向需要每一步的"累积不透明度",他们怎么只存一个值就恢复?

你贴的最后一句是关键:

梯度计算需要在原始混合过程中每一步的累积不透明度值。

他们不存一整个列表,只存前向结束时的总累积不透明度,就能恢复中间量。

直觉如下(你不用背推导):

  • 前向 α混合里有一个"透过率/剩余透明度"的连乘结构: 后面层的贡献总是被前面层的 ( 1 − α ) (1-\alpha) (1−α) 连乘衰减
  • 所以某个点在前向时的"累积透明度/透过系数"可以通过"最终值"反推出来: 倒着走的时候,你相当于一步步"把后面的影响除掉"

他们说的"每个点在前向存最终累积 α;反向时用该值除以点自身 α 得到系数",本质就是:

倒序遍历时,你可以用简单的除法/更新,把需要的中间透过系数恢复出来,而不必存一个长列表。

这就是他们能做到"每像素常数级额外开销"的原因。
9)把整段变成你脑子里能运行的"流水线"总结

前向:

  1. 屏幕切 16×16 tiles

  2. 剔除:视锥体相交(99%) + guard band

  3. 每个高斯看它覆盖哪些 tiles → 生成实例(gaussian,tile)

  4. 给实例 key=(tileID, depth) → Radix sort 一次

  5. 得到每 tile 的连续列表范围

  6. 每 tile 一个 thread block:

    • shared memory 批量加载高斯 * 每像素按近到远 α混合 * 像素 α 饱和就早停;全 tile 饱和就停

反向:

  1. 不存每像素列表
  2. 复用排序数组 + tile范围,再遍历一次
  3. 倒序(远到近)
  4. 只处理深度 ≤ "前向最后贡献点深度"的那些点
  5. 用前向存的最终累积 α + 除以当前点 α 恢复梯度所需系数
  6. 得到对 μ/s/q/α/SH 的梯度更新

7 IMPLEMENTATION, RESULTS AND EVALUATION 实现、结果与评估

接下来我们将讨论实现细节,展示实验结果,并将我们的方法与以往工作进行对比评估,同时给出消融实验分析。

7.1 Implementation 实现细节

我们使用 Python 和 PyTorch 框架实现了该方法,并编写了用于光栅化的自定义 CUDA 内核,这些内核是在以往方法 [Kopanas et al. 2021] 的基础上扩展而来,同时采用 NVIDIA CUB 提供的排序例程来实现快速的基数排序(Radix sort)[Merrill and Grimshaw 2010]。 我们还基于开源的 SIBR 系统 [Bonopera et al. 2020] 构建了一个交互式查看器,用于交互式浏览结果。 我们使用该实现来测量所达到的帧率。 我们的源代码和所有数据可在以下地址获取:https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/

Optimization Details 为了提高稳定性,我们在较低分辨率下对计算过程进行"预热(warm-up)"。 具体而言,我们在初始阶段使用分辨率降低 4 倍的图像进行优化,并在第 250 次和第 500 次迭代后分别进行两次上采样。

球谐(SH)系数的优化对角度信息的缺失非常敏感。 对于典型的"类 NeRF"采集场景,即围绕中心物体在整个半球范围内拍摄照片的情况,优化过程表现良好。 然而,如果采集中缺失某些角度区域(例如只拍摄场景的一个角落,或进行"由内向外(inside-out)"的采集 [Hedman et al. 2016]),优化过程可能会为 SH 的零阶分量(即基底或漫反射颜色)生成完全错误的数值。 为了解决这一问题,我们首先只优化零阶分量,然后每经过 1000 次迭代引入一阶 SH,逐步增加,直到所有 4 个 SH 频带都被引入。

7.2 Results and Evaluation 实验结果与评估

实验结果 我们在总共 13 个真实场景以及合成的 Blender 数据集 [Mildenhall et al. 2020] 上测试了我们的算法。 具体而言,我们在当前 NeRF 渲染质量的最先进方法 Mip-NeRF360 [Barron et al. 2022] 所使用的完整场景集上进行了测试,同时还测试了 Tanks&Temples 数据集 [2017] 中的两个场景,以及 Hedman 等人提供的两个场景 [Hedman et al. 2018]。 我们选择的场景具有非常不同的采集方式,既包含有界的室内场景,也涵盖了大规模的无界室外环境。 在所有评估实验中,我们使用相同的超参数配置。 除 Mip-NeRF360 方法外,所有结果均在 A6000 GPU 上运行得到(Mip-NeRF360 另有说明,见下文)。

在补充材料中,我们展示了若干场景的渲染视频路径,其中包含远离输入照片视角的位置。

真实世界场景 在渲染质量方面,目前的最先进方法是 Mip-NeRF360 [Barron et al. 2021]。 我们将该方法作为质量基准进行对比。 此外,我们还与两种最新的快速 NeRF 方法进行了比较:InstantNGP [Müller et al. 2022] 和 Plenoxels [Fridovich-Keil and Yu et al. 2022]。

我们按照 Mip-NeRF360 推荐的方法对数据集进行训练/测试划分,即每隔 8 张照片选取一张作为测试集,以保证生成误差指标时具有一致性和可比性,并采用文献中最常用的 PSNR、LPIPS 和 SSIM 指标;详见表 1。 表中所有数值均来自我们使用原作者代码的自行复现实验,唯一的例外是 Mip-NeRF360 在其原始数据集上的结果,为避免对当前 SOTA 的混淆,我们直接引用了其原论文中的数值。 对于论文中展示的图像结果,我们使用的是我们自己运行的 Mip-NeRF360,其对应的数值结果列于附录 D。 我们还展示了平均训练时间、渲染速度以及用于存储优化参数的内存占用。 我们报告了 InstantNGP 的基础配置(Base,训练 35K 次迭代)以及作者建议的稍大网络(Big)的结果,同时给出了我们方法在 7K 和 30K 次迭代下的两种配置结果。 我们在图 6 中展示了这两种配置下的视觉质量差异。 在许多情况下,仅进行 7K 次迭代时的质量已经相当不错。

训练时间会因数据集不同而有所变化,我们分别进行了报告。 需要注意的是,不同数据集的图像分辨率也不相同。 在项目网站上,我们提供了所有场景下、所有方法(包括我们的方法和以往工作)用于统计评估的测试视图渲染结果。 需要指出的是,所有渲染结果均保持输入图像的原始分辨率。

表中结果表明,我们完全收敛后的模型在质量上与 SOTA 方法 Mip-NeRF360 持平,且在某些情况下略优;需要注意的是,在相同硬件条件下,Mip-NeRF360 的平均训练时间为 48 小时,而我们仅需 35--45 分钟,其渲染时间为 10 秒/帧。 在训练 5--10 分钟后,我们即可达到与 InstantNGP 和 Plenoxels 相当的质量;而进一步增加训练时间后,我们能够达到 SOTA 级别的质量,这是其他快速方法所无法实现的。 在 Tanks & Temples 数据集上,我们在相近的训练时间(约 7 分钟)内达到了与 InstantNGP 基础配置相似的质量。

我们还在图 5 中展示了我们的方法与所选对比方法在一个留出的测试视角上的视觉结果;其中我们的方法对应 30K 次迭代训练。 可以看到,在某些情况下,即使是 Mip-NeRF360 仍然存在残留伪影,而我们的方式能够避免这些问题(例如 Bicycle、Stump 场景中植被的模糊,或 Room 场景中墙面的模糊)。 在补充视频和网页中,我们还提供了远距离视角路径的对比结果。 我们的方法即使在远距离视角下,也能较好地保留被充分覆盖区域的视觉细节,而以往方法并非总能做到这一点。

合成有界场景 除真实场景外,我们还在合成的 Blender 数据集上评估了我们的方法 [Mildenhall et al. 2020]。 这些场景提供了完备的视角集合、有限的空间范围以及精确的相机参数。 在这种情况下,即便采用随机初始化,我们也能够达到 SOTA 结果:训练开始时在包围场景边界的体积内均匀随机生成 10 万个高斯。 我们的方法会快速、自动地将其裁剪到约 6K--10K 个有意义的高斯。 在 30K 次迭代后,最终训练得到的模型规模约为每个场景 20 万至 50 万个高斯。 为保证可比性,我们在白色背景下统计并在表 2 中报告了与以往方法的 PSNR 对比结果。 示例结果见图 10(从左数第二张)以及补充材料。 训练完成的合成场景渲染速度可达 180--300 FPS。

表示紧凑性 与以往显式场景表示相比,我们在优化中使用的各向异性高斯能够用更少的参数建模复杂形状。 我们通过与 [Zhang et al. 2022] 提出的高度紧凑的点基模型进行对比来展示这一优势。 我们从其通过前景掩码进行空间雕刻得到的初始点云开始优化,直到达到与其报告的 PSNR 相当的水平。 这一过程通常在 2--4 分钟内完成。 在仅使用其约四分之一点数的情况下,我们便超过了其报告的指标,平均模型大小为 3.8 MB,而其模型为 9 MB。 需要指出的是,在该实验中,我们仅使用了两阶球谐,与其设置相同。

7.3 Ablations

我们将所做的不同贡献点与算法选择逐一剥离,并构建了一系列实验来衡量它们的影响。 具体而言,我们测试算法的以下方面:基于 SfM 的初始化、我们的增密策略、各向异性协方差、允许无限数量的 splat 接收梯度这一设计,以及球谐函数(SH)的使用。 每项选择的定量影响汇总于表 3。

Initialization from SfM SfM 初始化 我们还评估了从 SfM 点云初始化 3D 高斯的重要性。 在该消融实验中,我们在一个立方体内进行均匀采样,该立方体的尺寸为输入相机包围盒范围的 3 倍。 我们观察到,即使不使用 SfM 点,我们的方法仍然表现得相对良好,避免了完全失败。 不过,它主要在背景区域出现退化,见图 7。 此外,在训练视角覆盖不充分的区域,随机初始化的方法似乎会产生更多无法通过优化去除的"漂浮物(floaters)"。 另一方面,合成 NeRF 数据集不会出现这种现象,因为它没有背景,并且输入相机对场景约束充分(见上文讨论)。

Densification 增密 接下来我们评估两种增密方法,更具体地说是第 5 节描述的克隆(clone)与拆分(split)策略。 我们分别禁用其中一种方法,并在其余部分保持不变的情况下进行优化。 结果表明,拆分大高斯对于背景的良好重建非常重要(见图 8);而在小高斯上采用克隆而非拆分,则能获得更好、更快的收敛,尤其当场景中存在细薄结构时更为明显。

Unlimited depth complexity of splats with gradients 允许带梯度的 splat 具有无限深度复杂度 我们评估一种做法:如 Pulsar [Lassner and Zollhofer 2021] 所建议的那样,在最前面的 N N N个点之后跳过梯度计算,是否能够在不牺牲质量的前提下提升速度。 在该测试中,我们选择 N = 10 N=10 N=10,这是 Pulsar 默认值的两倍,但由于梯度计算近似过于严重,导致优化过程不稳定。 对于 Truck 场景,PSNR 质量下降了 11 dB(见表 3,Limited-BW),而 Garden 场景的可视化结果见图 9。

Anisotropic Covariance 各向异性协方差 我们方法中的一个重要算法选择是对 3D 高斯的完整协方差矩阵进行优化。 为展示这一选择的影响,我们进行一项消融:通过仅优化一个标量来控制 3D 高斯在三个轴上的半径,从而移除各向异性。 该优化的结果在图 10 中以可视化形式呈现。 我们观察到,各向异性显著提升了 3D 高斯与表面对齐的能力质量,从而在保持点数不变的情况下实现更高的渲染质量。

Spherical Harmonics 球谐函数 最后,使用球谐函数能够提升整体 PSNR 分数,因为它们可以补偿视角相关效应(表 3)。





7.4 Limitations 局限性

我们的方法并非没有局限。 在场景观测不足的区域,我们会产生伪影;而在这些区域中,其他方法同样表现不佳(例如图 11 中的 Mip-NeRF360)。 尽管如前所述各向异性高斯具有诸多优势,我们的方法仍可能生成拉长的伪影或"斑点状"的高斯(见图 12);同样地,以往方法在这些情况下也存在困难。

当优化过程中生成较大的高斯时,我们有时还会出现"跳变(popping)"伪影,这种情况往往发生在具有强视角相关外观的区域。 造成这些跳变伪影的一个原因是光栅化器中通过保护带(guard band)对高斯进行的简单剔除策略。 采用更加合理、系统化的剔除方法有望缓解这些伪影。 另一个因素是我们较为简单的可见性算法,这可能导致高斯在深度或混合顺序上突然发生切换。 这一问题可以通过抗锯齿技术加以缓解,但我们将其留作未来工作。 此外,我们目前在优化过程中未引入任何正则化;加入正则化将有助于缓解未观测区域和跳变伪影的问题。

尽管在完整评估中我们对所有实验使用了相同的超参数,但早期实验表明,在非常大的场景(例如城市数据集)中,可能需要降低位置参数的学习率才能实现收敛。

尽管与以往点基方法相比我们的表示已经相当紧凑,但其内存消耗仍明显高于基于 NeRF 的方案。 在大规模场景的训练过程中,我们未经优化的原型系统中 GPU 内存峰值可能超过 20 GB。 然而,通过对优化逻辑进行精细的底层实现(类似 InstantNGP 的做法),这一数值有望显著降低。 对训练完成的场景进行渲染需要足够的 GPU 内存来存储完整模型(对于大规模场景通常为数百 MB),并且还需要额外 30--500 MB 的内存用于光栅化器,具体取决于场景规模和图像分辨率。 我们注意到,仍然存在多种进一步降低方法内存消耗的潜在途径。 点云压缩技术是一个研究充分的领域 [De Queiroz and Chou 2016];探索如何将这些方法适配到我们的表示方式中将是一个有趣的方向。

8 DISCUSSION AND CONCLUSIONS 讨论与结论

我们提出了首个真正实现实时、高质量辐射场渲染的方法,适用于多种场景与采集方式,同时其训练时间与以往最快的方法具有竞争力。

我们选择 3D 高斯作为基本元,在优化阶段保留体渲染的特性,同时又能直接支持基于 splat 的快速光栅化。 我们的工作表明------与广泛接受的观点相反------连续表示并非实现快速且高质量辐射场训练的必要条件。

由于我们基于 PyTorch 实现以便他人使用,训练时间的大部分(约 80%)消耗在 Python 代码中。 目前仅光栅化流程以优化的 CUDA 内核实现。 我们预计,若将其余优化过程完全迁移至 CUDA(如 InstantNGP [Müller et al. 2022] 所做),在对性能要求严格的应用中可实现显著的进一步加速。

我们还展示了遵循实时渲染原则、充分利用 GPU 的算力以及软件光栅化流水线架构速度的重要性。 这些设计选择是训练与实时渲染性能的关键,使得本方法在性能上优于以往的体素射线步进(ray-marching)方案。

探索是否能够利用我们的高斯表示来进行场景的网格重建将非常有意义。 除了网格在实践中的广泛应用价值外,这也有助于我们更清晰地理解该方法在体表示与表面表示连续谱中的具体位置。

总之,我们提出了首个用于辐射场的实时渲染方案,其渲染质量可与以往成本高昂的最佳方法相媲美,而训练时间又与现有最快方案具有竞争力。

ACKNOWLEDGMENTS 致谢

本研究由 ERC 高级项目 FUNGRAPH(编号 788065,http://fungraph.inria.fr)资助。 作者感谢 Adobe 的慷慨捐助,感谢蔚蓝海岸大学的 OPAL 基础设施,以及来自 GENCI--IDRIS 的高性能计算资源(项目编号 2022-AD011013409)。 作者感谢匿名审稿人的宝贵意见,感谢 P. Hedman 与 A. Tewari 对早期稿件的校阅,也感谢 T. Müller、A. Yu 和 S. Fridovich-Keil 在对比实验方面提供的帮助。

A DETAILS OF GRADIENT COMPUTATION

回顾一下, Σ / Σ ′ \Sigma/\Sigma' Σ/Σ′ 分别是高斯在世界空间/视图空间中的协方差矩阵, q q q 表示旋转, s s s 表示缩放, W W W 是视图变换矩阵, J J J 是投影变换的仿射近似的雅可比矩阵。 我们可以应用链式法则来求相对于缩放和旋转的导数:

d Σ ′ d s = d Σ ′ d Σ d Σ d s (8) \frac{d\Sigma'}{ds}=\frac{d\Sigma'}{d\Sigma}\frac{d\Sigma}{ds}\tag{8} dsdΣ′=dΣdΣ′dsdΣ(8)

以及

d Σ ′ d q = d Σ ′ d Σ d Σ d q (9) \frac{d\Sigma'}{dq}=\frac{d\Sigma'}{d\Sigma}\frac{d\Sigma}{dq}\tag{9} dqdΣ′=dΣdΣ′dqdΣ(9)

利用 U = J W U=JW U=JW 对公式 (5) 进行简化,并注意 Σ ′ \Sigma' Σ′ 是 U Σ U T U\Sigma U^T UΣUT 的(对称)左上 2 × 2 2\times2 2×2 子矩阵,用下标表示矩阵元素,则可得到如下偏导数:

∂ Σ ′ ∂ Σ i j = ( U 1 , i U 1 , j U 1 , i U 2 , j U 1 , j U 2 , i U 2 , i U 2 , j ) . \frac{\partial\Sigma'}{\partial\Sigma_{ij}}= \begin{pmatrix} U_{1,i}U_{1,j} & U_{1,i}U_{2,j}\\ U_{1,j}U_{2,i} & U_{2,i}U_{2,j} \end{pmatrix}. ∂Σij∂Σ′=(U1,iU1,jU1,jU2,iU1,iU2,jU2,iU2,j).

接下来,我们需要求 d d s Σ \frac{d}{ds}\Sigma dsdΣ 和 d d q Σ \frac{d}{dq}\Sigma dqdΣ。 由于 Σ = R S S T R T \Sigma=RSS^TR^T Σ=RSSTRT,我们可以计算 M = R S M=RS M=RS,并将 Σ \Sigma Σ 重写为 Σ = M M T \Sigma=MM^T Σ=MMT。 因此,可以写为 d Σ d s = d Σ d M d M d s \frac{d\Sigma}{ds}=\frac{d\Sigma}{dM}\frac{dM}{ds} dsdΣ=dMdΣdsdM,以及 d d q Σ = d Σ d M d M d q \frac{d}{dq}\Sigma=\frac{d\Sigma}{dM}\frac{dM}{dq} dqdΣ=dMdΣdqdM。 由于协方差矩阵 Σ \Sigma Σ(及其梯度)是对称的,其公共部分可以简洁地写为 d Σ d M = 2 M T \frac{d\Sigma}{dM}=2M^T dMdΣ=2MT。 对于缩放,还有

∂ M i , j ∂ s k = { R i , k , if j = k , 0 , otherwise . \frac{\partial M_{i,j}}{\partial s_k}= \begin{cases} R_{i,k}, & \text{if } j=k,\\ 0, & \text{otherwise}. \end{cases} ∂sk∂Mi,j={Ri,k,0,if j=k,otherwise.

为了推导旋转的梯度,我们回顾单位四元数 q q q(实部为 q r q_r qr,虚部为 q i , q j , q k q_i,q_j,q_k qi,qj,qk)到旋转矩阵 R R R 的转换关系:

R ( q ) = 2 ( 1 2 − ( q j 2 + q k 2 ) q i q j − q r q k q i q k + q r q j q i q j + q r q k 1 2 − ( q i 2 + q k 2 ) q j q k − q r q i q i q k − q r q j q j q k + q r q i 1 2 − ( q i 2 + q j 2 ) ) (10) R(q)=2 \begin{pmatrix} \frac12-(q_j^2+q_k^2) & q_iq_j-q_rq_k & q_iq_k+q_rq_j\\ q_iq_j+q_rq_k & \frac12-(q_i^2+q_k^2) & q_jq_k-q_rq_i\\ q_iq_k-q_rq_j & q_jq_k+q_rq_i & \frac12-(q_i^2+q_j^2) \end{pmatrix} \tag{10} R(q)=2 21−(qj2+qk2)qiqj+qrqkqiqk−qrqjqiqj−qrqk21−(qi2+qk2)qjqk+qrqiqiqk+qrqjqjqk−qrqi21−(qi2+qj2) (10)

因此,可以得到关于 q q q 各分量的梯度如下:

∂ M ∂ q r = 2 ( 0 − s y q k s z q j s x q k 0 − s z q i − s x q j s y q i 0 ) , ∂ M ∂ q i = 2 ( 0 s y q j s z q k s x q j − 2 s y q i − s z q r s x q k s y q r − 2 s z q i ) , ∂ M ∂ q j = 2 ( − 2 s x q j s y q i s z q r s x q i 0 s z q k − s x q r s y q k − 2 s z q j ) , ∂ M ∂ q k = 2 ( − 2 s x q k − s y q r s z q i s x q r − 2 s y q k s z q j s x q i s y q j 0 ) (11) \frac{\partial M}{\partial q_r}=2 \begin{pmatrix} 0 & -s_y q_k & s_z q_j\\ s_x q_k & 0 & -s_z q_i\\ -s_x q_j & s_y q_i & 0 \end{pmatrix}, \\ \quad\\ \frac{\partial M}{\partial q_i}=2 \begin{pmatrix} 0 & s_y q_j & s_z q_k\\ s_x q_j & -2s_y q_i & -s_z q_r\\ s_x q_k & s_y q_r & -2s_z q_i \end{pmatrix},\\ \quad\\ \frac{\partial M}{\partial q_j}=2 \begin{pmatrix} -2s_x q_j & s_y q_i & s_z q_r\\ s_x q_i & 0 & s_z q_k\\ -s_x q_r & s_y q_k & -2s_z q_j \end{pmatrix},\\ \quad\\ \frac{\partial M}{\partial q_k}=2 \begin{pmatrix} -2s_x q_k & -s_y q_r & s_z q_i\\ s_x q_r & -2s_y q_k & s_z q_j\\ s_x q_i & s_y q_j & 0 \end{pmatrix} \tag{11} ∂qr∂M=2 0sxqk−sxqj−syqk0syqiszqj−szqi0 ,∂qi∂M=2 0sxqjsxqksyqj−2syqisyqrszqk−szqr−2szqi ,∂qj∂M=2 −2sxqjsxqi−sxqrsyqi0syqkszqrszqk−2szqj ,∂qk∂M=2 −2sxqksxqrsxqi−syqr−2syqksyqjszqiszqj0 (11)

四元数归一化的梯度推导是直接而简单的。

B 优化与增密算法

我们的优化与增密算法总结于算法 1 中。

C DETAILS OF THE RASTERIZER 光栅化器的细节

Sorting 排序 我们的设计基于这样一个假设:场景中存在大量小型 splat,因此我们在每一帧开始时使用基数排序(radix sort)对所有 splat 进行一次排序,以此进行优化。 我们将屏幕划分为 16×16 像素的瓦片(或称 bin)。 对于每一个 splat,我们在其所覆盖的每一个 16×16 瓦片中实例化一次,从而为每个瓦片创建一个 splat 列表。 这会带来需要处理的高斯数量的适度增加,但这一开销通过更简单的控制流以及高度并行、经过优化的 GPU 基数排序 [Merrill and Grimshaw 2010] 得到了摊销。 我们为每一个 splat 实例分配一个最多 64 位的键值,其中低 32 位编码其投影深度,高位编码其所覆盖瓦片的索引。 索引所需的具体位数取决于当前分辨率下瓦片的数量。 因此,通过一次基数排序即可并行地完成所有 splat 的深度排序。 排序完成后,我们可以通过识别排序数组中具有相同瓦片 ID 的区间起止位置,高效地生成每个瓦片对应的高斯列表。 该过程以并行方式完成,为排序数组中的每一个 64 位元素启动一个线程,将其高 32 位与相邻元素进行比较。 与 [Lassner and Zollhofer 2021] 相比,我们的光栅化方法完全消除了顺序的图元处理步骤,并生成了更紧凑的按瓦片组织的列表,供前向遍历使用。 我们在算法 2 中给出了该光栅化方法的高层概览。



相关推荐
森诺Alyson18 小时前
前沿技术借鉴研讨-2025.12.23(荟萃分析/信号提取/轻量级模型)
论文阅读·人工智能·经验分享·论文笔记·论文讨论
有Li20 小时前
MIRAGE:针对嘈杂环境鲁棒性的医学图像-文本预训练|文献速递-医疗影像分割与目标检测最新技术
论文阅读·人工智能·深度学习·计算机视觉·文献·医学生
EchoL、1 天前
【论文阅读】HiDDeN:Hiding Data With Deep Networks
论文阅读·笔记·机器学习
张较瘦_1 天前
[论文阅读] 远程工作中的“隐形障碍”:残障开发者在软件开发团队的挑战与破局之道
论文阅读·远程工作
CoookeCola1 天前
M.I.O: Interactive Intelligence for Digital Humans(交互式智能数字人)
论文阅读·人工智能·aigc·音视频
张较瘦_1 天前
[论文阅读] AI + 硬件开发 | 硬件设计新范式:LLM赋能行为驱动开发,解决验证痛点的实战方案
论文阅读·人工智能·驱动开发
m0_650108242 天前
MindDrive:融合世界模型与视觉语言模型的端到端自动驾驶框架
论文阅读·自动驾驶·轨迹生成与规划·世界动作模型·e2e-ad·vlm导向评估器·minddrive
CoookeCola2 天前
无需抠图!Qwen-Image-Layered 一键分解图像图层,支持图层级精准编辑
论文阅读·深度学习·计算机视觉·ai作画·开源·视觉检测·aigc
bylander2 天前
【论文阅读】VTP:Towards Scalable Pre-training of Visual Tokenizers for Generation
论文阅读·图像处理·大模型