Paper: Kerbl B, Kopanas G, Leimkühler T, et al. 3d gaussian splatting for real-time radiance field rendering[J]. ACM Transactions on Graphics (ToG), 2023, 42(4): 1-14. Introduction: https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/ Code: https://github.com/graphdeco-inria/gaussian-splatting

3D Gaussian Splatting 是 Siggraph 2023 的 Best Paper,法国团队在会议上展示了其实现的最先进的场景渲染。该方法在训练时间和高质量的实时渲染之间实现了很好的权衡,在重建质量之高的情况下还能接入传统光栅化,优化速度也相当快。自从 3D Gaussian Splatting 横空出世,整个 NeRF 圈波涛汹涌,有望显著加速一系列 NeRF 类的工作 1。

3D Gaussian Splatting 和 NeRF 一样,所做的任务也是新视图的合成,但没有使用 ray tracing 的渲染方式,而是更偏向于光栅化的渲染。通过构建以协方差为主导的 3D Gaussian 点云,用 Splatting 的方式进行渲染,实现了高分辨率的实时渲染。

目录

一. 预备知识1. 几何的隐式表达2. 计算机中的几何表达3. 3D Gaussian4. 光栅化5. Splatting

二. 研究思路1. 3D Gaussian Splatting2. 交叉优化3. 快速可微光栅化

三. 3D Gaussian Splatting四. 交叉优化1. 参数优化2. 自适应控制

五. 快速可微光栅化六. 实验结果1. 数据集2. 评价指标3. 对比实验4. 消融实验

七. 总结八. 复现

一. 预备知识

3D Gaussian Splatting 论文直接阅读会比较困难,本节参考 [NeRF坑浮沉记]3D Gaussian Splatting入门:如何表达几何,对需要用到的预备知识进行梳理。

更多参考资料如下:

预备知识:3d Gaussian splatting笔记;公式推导:《3D Gaussian Splatting for Real-Time Radiance Field Rendering》3D高斯的理论理解、3D Gaussian Splatting中的数学推导;源码解读:3D Gaussian Splatting源码解读、3D Gaussian Splatting cuda源码解读;全文翻译:3D Gaussian Splatting for Real-Time Radiance Field Rendering 笔记;文章总结:3D Gaussian Splatting笔记、论文简析:3D Gaussian Splatting !!!、Introduction to 3D Gaussian Splatting;视频讲解:【论文讲解】用点云结合3D高斯构建辐射场,成为快速训练、实时渲染的新SOTA!、论文分享-3D Gaussian Splatting for Real-Time Radiance Field Rendering、Gaussian Splatting: A 3D Rendering Technique;实验指导:3D Gaussian Splats tutorial;

1. 几何的隐式表达

传统的几何显式表达使用点云、体素、网格等方式,可以沿着存储空间遍历场景中的所有元素。几何隐式表达则是使用函数或神经网络来表示几何信息,而不是使用显式的几何对象。在经典的隐式几何表达 —— NeRF 中,使用一个多层感知机作为几何的隐式表示方法,输入三维空间坐标和观测视角,就可以输出对应点的几何密度和颜色。渲染场景时把光线上的一系列采样点加权积起来,就可以渲染得到一个像素颜色。

从表达方式来看,几何的隐式表达可以分为体积类表达和表面类表达两种:

体积类表达:NeRF 属于体积类表达,通过几何密度决定采样点颜色的贡献度。表面类表达:在表面类表达方式中,输入采样点,符号距离函数 SDF 输出空间中距离该点最近的表面的距离,正值表示表面外,负值表示表面内,表面类方法判定越靠近表面的采样点颜色贡献度越高。

2. 计算机中的几何表达

目前市面上大部分大型游戏在计算机中都是使用三角网格进行三维显式几何表达,能够借助 GPU 进行快速渲染。但三角网格由于三角形之间或三个顶点之间都是离散的,强行优化网格也只能是顶点粒度的,难免维度爆炸。

NeRF 系列方法大多使用光线追踪 (ray marching),速度自然没法和成熟的显式几何+光栅化比。而NeRF 在参数优化时一个参数变化对几何的优化可能是一大块也可能是一个小细节。

而 3D Gaussian 使用的椭球形表示可以作为小型可微空间进行优化,不同 Gaussian 之间则能够像三角网格一样并行光栅化渲染。可以看成是在可微和离散之间做了一个微妙平衡。其实早期的 3D 游戏也曾尝试过以椭球为基础元素进行建模 2:

3. 3D Gaussian

说到 3D Gaussian 3,第一反应是:

N

μ

x

,

σ

x

,

μ

y

,

σ

y

,

μ

z

,

σ

z

(

x

,

y

,

z

)

=

1

(

2

π

)

3

σ

x

σ

y

σ

z

exp

(

(

x

μ

x

)

2

2

σ

x

2

(

y

μ

y

)

2

2

σ

y

2

(

z

μ

z

)

2

2

σ

z

2

)

N_{\mu_x, \sigma_x, \mu_y, \sigma_y, \mu_z, \sigma_z}(x, y, z)=\frac{1}{(\sqrt{2 \pi})^3 \sigma_x \sigma_y \sigma_z} \exp \left(-\frac{\left(x-\mu_x\right)^2}{2 \sigma_x{ }^2}-\frac{\left(y-\mu_y\right)^2}{2 \sigma_y{ }^2}-\frac{\left(z-\mu_z\right)^2}{2 \sigma_z{ }^2}\right)

Nμx​,σx​,μy​,σy​,μz​,σz​​(x,y,z)=(2π

​)3σx​σy​σz​1​exp(−2σx​2(x−μx​)2​−2σy​2(y−μy​)2​−2σz​2(z−μz​)2​) 但这其实是分量

x

,

y

,

z

x, y, z

x,y,z 互相独立的特例,此时的模型坐标系和世界坐标系平行。不过这种特例可以帮助理解 3D Gaussian:试想一个实心椭球,将它沿某一条轴切开后会得到一个椭圆,这个椭圆其实是无限大的,每一层的密度都不相同,这个切面就是二维高斯分布的等线图:

3D Gaussian 也叫三维高斯分布或三维正态分布,是统计学中一种特殊的多维正态分布,通常用来建模具有连续性随机性的现象,如图像处理、统计建模、机器学习等领域。3D Gaussian 能够涵盖空间中任意形状的椭球,包括平移、旋转。3D Gaussian 在三维空间中定义了一个概率分布,标准模型数学表示如下:

G

s

(

x

)

=

1

(

2

π

)

3

det

(

Σ

)

e

x

p

(

1

2

(

x

μ

)

T

Σ

1

(

x

μ

)

)

G_s(x)=\frac{1}{(\sqrt{2 \pi})^3 \operatorname{det}(\Sigma)}exp \left( {-\frac{1}{2}(x-\mu)^T \Sigma^{-1}(x-\mu)} \right)

Gs​(x)=(2π

​)3det(Σ)1​exp(−21​(x−μ)TΣ−1(x−μ)) 其中

x

=

[

a

,

b

,

c

]

T

x=[a, b, c]^T

x=[a,b,c]T 是三维坐标向量;

μ

\mu

μ 是椭球的中心,控制椭球的位置平移;

Σ

=

[

σ

a

2

Cov

(

a

,

b

)

Cov

(

a

,

c

)

Cov

(

b

,

a

)

σ

b

2

Cov

(

b

,

c

)

Cov

(

c

,

a

)

Cov

(

c

,

b

)

σ

c

2

]

\Sigma=\left[\begin{array}{ccc} \sigma_a^2 & \operatorname{Cov}(a, b) & \operatorname{Cov}(a, c) \\ \operatorname{Cov}(b, a) & \sigma_b^2 & \operatorname{Cov}(b, c) \\ \operatorname{Cov}(c, a) & \operatorname{Cov}(c, b) & \sigma_c^2 \end{array}\right]

Σ=

​σa2​Cov(b,a)Cov(c,a)​Cov(a,b)σb2​Cov(c,b)​Cov(a,c)Cov(b,c)σc2​​

​ 是协方差矩阵,控制椭球在三维方向的伸缩和旋转。

论文中的 3D Gaussian 表示去掉了指数部分前面的尺度系数(因为系数不影响椭球的几何形状)和均值(因为每个点云有自己的位置

p

p

p ),方便旋转放缩。于是 3D Gaussian 表示如下:

G

(

x

)

=

e

x

p

(

1

2

x

T

Σ

1

x

)

G(x)=exp \left({-\frac{1}{2}x^T \Sigma^{-1}x} \right)

G(x)=exp(−21​xTΣ−1x) 因此只要确定了

Σ

\Sigma

Σ 就可以确定一个椭球的形状。但需要注意的是,三维高斯分布的协方差矩阵

Σ

\Sigma

Σ 必须是半正定的才有数学意义。论文中使用的是各向异性

Σ

\Sigma

Σ,即在不同方向上具有不同方差值。各向异性协方差更有利于优化,因为它能够适应不同方向的变化,具有更精确的建模、更好的参数优化和更紧凑的表示。

4. 光栅化

在介绍 Splatting 之前需要先介绍一下 光栅化 (Rasterization) :光栅化是将图形或图像的矢量数据转换为像素数据,从而能够在计算机屏幕上显示的过程。通过将图形转换为像素级别,计算机可以更容易地处理和显示图形,同时确保图像在屏幕上以高速率绘制。

光栅化时,先将三角网格映射到二维平面,然后使用采样函数获取三角形内的像素情况 4,再根据走样情况(如锯齿 Jaggies、摩尔纹 Moire Patterns、车轮效应 Wagon Wheel Illusion 等)进行反走样 5,最后使用顶点片元着色 6 或其他方法进行像素点着色 7。

光栅化是实现计算机屏幕上图形显示和渲染的关键步骤,能够以非常高的速度生成图像,适用于实时渲染,例如视频游戏和模拟器。

5. Splatting

Splatting 是一种用于光栅化 3D 对象(如前文讨论的椭球)的技术。这些 3D 对象被映射到投影平面后得到的 2D 图形称为 splat,类似于一个点、圆、矩形或其他形状,就像雪球打在墙上留下的印记,能量从中心向外扩散并减弱。这个过程可以在 GPU 上并行处理,因为每个 Splat 之间是独立的。

Splatting 可以将三维空间中的点投影到二维图像平面上,这些投影的数据点以某种方式在图像上产生视觉效果,从而呈现在最终的渲染图像中。Splatting 通常并不是由传统的图形硬件管线 8 自动执行,而是需要相对复杂的 GPU 编程,通常由图形开发者在需要时自行实现。

二. 研究思路

传统的三维场景表示方法需要使用网格或点云进行三维重建,近几年出现的 NeRF 可以直接进行场景的视图合成。但 NeRF 想要生成高质量的视图需要花大量的时间进行训练和渲染,因此在实际应用中需要对质量和速度进行权衡。并且目前还没有方法能够达到实时显示的效果。文章提出了一种新方法—— 3D Gaussian Splatting,同时保证了图像的质量和渲染的速度:3D Gaussian 模型能够表示先进的 (state-of-the-art, SOTA) 视觉质量和高效的训练速度,Splatting 技术能够确保高分辨率的实时渲染。

整个模型的输入是 SfM 点云表示的一组静态场景的照片和相应机位,使用点云初始化一组 3D Gaussian 模型。 3D Gaussians 能够合理紧凑地表示三维场景,颜色由球谐系数 SH 表示。 通过交叉优化 3D Gaussian 模型参数和自适应控制得到场景表示。本文方法高效的关键在于 3D Gaussian 的光栅化,通过各向异性的 Splatting 和

α

\alpha

α-blending 技术,能够快速合成渲染图像。

1. 3D Gaussian Splatting

引入 3D Gaussian 来表示场景,将其初始化为摄像机标定产生的 SfM 稀疏 点云。这样既能保持辐射场的理想特性以便优化,又能避免在空白空间中进行不必要的计算。

3D Gaussian 的 光栅化 (rasterization) 过程如下:先使用 Splatting 技术将 3D Gaussian 投影到 2D 图像,然后使用标准的

α

\alpha

α-blending 技术快速合成渲染图像。这意味着 3D Gaussian 的三维场景表示可以转换为二维图像,以供渲染和可视化。

α

\alpha

α-blending:一种用于合成两幅或多幅图像以获得混合效果的图像处理技术。在

α

\alpha

α-blending 中,每幅图像都被赋予一个权重参数

α

\alpha

α

(

0

α

1

)

(0 \leq \alpha \leq 1)

(0≤α≤1),表示每幅图像在最终合成中的贡献程度,0 表示完全使用第一幅图像,1 表示完全使用第二幅图像,而在 0 到 1 之间的中间值则表示混合两幅图像。

α

\alpha

α-blending 可以用于各种图像处理任务,包括图像叠加、过渡效果、颜色校正等,以实现图像的合成与编辑。一个典型应用就是创建图像淡入淡出效果,其中一个图像逐渐淡出,同时另一个图像逐渐淡入,通过调整 훼 参数的值来实现平滑过渡。훼-blending 也可以用于将两个图像合成成一个,以产生具有新特性的图像,如合成景深效果、融合不同光照条件下的图像等。

2. 交叉优化

交叉优化 (interleaved optimization) 3D Gaussian 的属性和 Gaussians 的自适应 密度控制 (density control),尤其是优化 各向异性协方差 (anisotropic covariance),以实现场景的精确表示。

可以优化的 3D Gaussian 点云属性包括:三维位置

p

p

p、透明度

α

\alpha

α(其实就是

α

\alpha

α-blending 中的权重参数)、各向异性协方差

Σ

\Sigma

Σ、球谐系数 SH (spherical harmonic coefficients) 等。

球谐函数 (Spherical Harmonics) :用于描述在球面上的角度相关函数的一组正交函数。球谐函数由两个角度参数(极角

θ

\theta

θ 和方位角

ϕ

\phi

ϕ)和两个整数参数(轨道量子数

l

l

l 和磁量子数

m

m

m)定义,通常表示为

Y

l

m

(

θ

,

ϕ

)

Y_{lm}(\theta, \phi)

Ylm​(θ,ϕ)。球谐函数在球坐标系中是正交的,这意味着在给定的球面上,它们的内积为零。这种正交性质使得球谐函数在处理球对称问题时非常有用。更多解释见 球谐函数介绍(Spherical Harmonics)、球面高斯介绍(Spherical Gaussian)。 球谐系数 (Spherical Harmonics Coefficients) :一组基于球谐函数的系数,用于展开和描述球对称的函数或信号。球谐系数

a

l

m

a_{lm}

alm​ 描述了一个给定函数在球谐函数基础上的分解,其表达式如下:

f

(

θ

,

ϕ

)

=

l

=

0

m

=

l

l

a

l

m

Y

l

m

(

θ

,

ϕ

)

f(\theta, \phi) = \sum_{l=0}^{\infty} \sum_{m=-l}^{l} a_{lm} Y_{lm}(\theta, \phi)

f(θ,ϕ)=l=0∑∞​m=−l∑l​alm​Ylm​(θ,ϕ) 这个公式表示,任意球对称的函数

f

(

θ

,

ϕ

)

f(\theta, \phi)

f(θ,ϕ) 可以通过球谐函数的组合进行表示。 对于给定的三维高斯分布,可以通过与球谐函数的积分来计算其球谐系数:

a

l

m

=

Y

l

m

(

θ

,

ϕ

)

f

(

θ

,

ϕ

,

r

)

r

2

sin

θ

d

r

d

θ

d

ϕ

a_{lm} = \int \int \int Y_{lm}(\theta, \phi) \cdot f(\theta, \phi, r) \, r^2 \, \sin\theta \, dr \, d\theta \, d\phi

alm​=∫∫∫Ylm​(θ,ϕ)⋅f(θ,ϕ,r)r2sinθdrdθdϕ 其中,

Y

l

m

(

θ

,

ϕ

)

Y_{lm}(\theta, \phi)

Ylm​(θ,ϕ) 是球谐函数,

f

(

θ

,

ϕ

,

r

)

f(\theta, \phi, r)

f(θ,ϕ,r) 是高斯分布的三维表示,

r

r

r 是径向距离,

θ

\theta

θ 是极角,

ϕ

\phi

ϕ 是方位角。

3. 快速可微光栅化

使用 GPU 进行快速、可微的渲染,支持各向异性 Splatting 和快速反向传播。因此能够加速训练和实时渲染。

三. 3D Gaussian Splatting

鉴于 3D Gaussian 可微、便于投影到二维 splats、显示地支持快速渲染等优点,用其作为场景表示。使用一个三维的满协方差矩阵初始化 3D Gaussian:

G

(

x

)

=

e

x

p

(

1

2

x

T

Σ

1

x

)

G(x)=exp \left({-\frac{1}{2}x^T \Sigma^{-1}x} \right)

G(x)=exp(−21​xTΣ−1x)

光栅化时需要将三维场景变换到二维空间,作者希望 3D Gaussian 在变换中保持分布(不然光栅完和高斯没关系的话一直以来的努力都白费了),这难免需要更多限制。View 变换

W

W

W 主要是旋转和平移,都是 仿射 (affine) 的 9,不会有问题;但 Project 变换不是仿射的,于是文中用

J

J

J 矩阵变换替代 Project 变换,

J

J

J 是 Project 变换的仿射近似。于是得到摄像机坐标下的协方差矩阵

Σ

\Sigma^{\prime}

Σ′:

Σ

=

J

W

Σ

W

T

J

T

\Sigma^{\prime}=J W \Sigma W^T J^T

Σ′=JWΣWTJT

Σ

\Sigma

Σ 不能直接优化,因为

Σ

\Sigma

Σ 必须是 半正定 (semi-definite) 的 3D Gaussian 才有意义。于是文中将

Σ

\Sigma

Σ 表示为球变换到椭球的过程:将球按轴向先放缩

S

S

S 再旋转

R

R

R(注意顺序,是先放缩再旋转,椭球的对称轴一直是模型空间的 xyz 轴,互相垂直,详见视频讲解 17:15)。因此

Σ

\Sigma

Σ 初始化如下:

Σ

=

R

S

S

T

R

T

\Sigma=R S S^T R^T

Σ=RSSTRT 于是在训练过程中使用梯度下降对参数

Σ

\Sigma

Σ 进行优化时需要继续将梯度传递到

S

S

S 和

R

R

R 进行优化。

如前文所述,各向异性协方差更适合优化:能够优化 3D Gaussian 以适应场景中不同形状的几何形状,从而产生一个紧凑的表示。如下图所示,将 3D Gaussian 渲染的图像缩小 60% 后细节仍然清晰可见,说明其对复杂细节较强的拟合能力:

四. 交叉优化

本文的核心是对 3D Gaussian 的优化,优化的目的是创建一组密集的 3D Gaussian 以精确地表示场景。优化的参数包括:三维位置

p

p

p、透明度

α

\alpha

α、各向异性协方差

Σ

\Sigma

Σ 和球谐系数 SH (spherical harmonic coefficients) 。这些

\lceil

⌈参数的优化

\rfloor

⌋ 和

\lceil

⌈自适应控制高斯模型

\rfloor

⌋ 交替进行(也可以理解为在参数优化的过程中周期性地进行致密化)。

1. 参数优化

由于 3D 投影到 2D 的模糊性,渲染图像中的几何体可能会被放错位置。因此,优化过程中需要能够创建几何体,并且在错误位置处销毁或移动几何体。

参数优化使用 SGD 连续迭代完成,每一轮迭代时都会渲染图像并将其与真实的训练视图做比较。

α

\alpha

α 使用 Sigmoid 激活函数来限制 (0, 1) 的范围;

Σ

\Sigma

Σ 使用指数激活函数激活;

p

p

p 使用指数衰减调度技术 (exponential decay scheduling technique) 进行优化。模型的损失函数是 L1 与 D-SSIM 项的组合:

L

=

(

1

λ

)

L

1

+

λ

L

D

S

S

I

M

\mathcal{L}=(1-\lambda) \mathcal{L}_1+\lambda \mathcal{L}_{\mathrm{D}-\mathrm{SSIM}}

L=(1−λ)L1​+λLD−SSIM​

SSIM (Structural Similarity Index):结构相似性指标,一种用于衡量两幅图像之间结构相似性的指标。它不仅考虑了两幅图像的亮度和对比度差异,还考虑了它们的结构信息。SSIM 指标取值范围通常在 [-1,1] 之间,越接近 1 表示两幅图像越相似,越接近 -1 表示两幅图像越不相似。 计算 SSIM 时,先将图像分成许多小块,然后对每个块应用一个一维的高斯窗口(这个窗口的目的是加权不同位置的像素,使得中心像素附近的像素对 SSIM 的贡献更大)再对每个块计算亮度、对比度和结构相似性,最后将所有块的亮度、对比度和结构相似性的平均值组合起来,得到整体的 SSIM 值。 D-SSIM (Dissimilarity Structural Similarity Index):结构相异性指标,用于衡量两幅图像之间结构差异性。

D

-

S

S

I

M

=

1

S

S

I

M

2

D\text{-}SSIM=\frac{1-SSIM}{2}

D-SSIM=21−SSIM​

2. 自适应控制

在 3D Gaussian Splatting 中,场景表示是通过多个高斯模型叠加而成的。在早期迭代次数较少时,会出现 重建不足 (under-reconstruction) 的问题,即高斯模型没有完全覆盖小规模的几何体,此时需要复制高斯模型进行覆盖;在后期迭代次数较多时,会出现 重建过度 (over-reconstruction) 的问题,即高斯模型超出小规模几何体的范围,此时需要将该高斯模型一分为二。这就是自适应控制 Gaussians:

从初始化 Gaussians 为稀疏的 SfM 点云开始,通过 自适应地控制高斯模型的数量和它们在单位体积上的密度,逐渐从稀疏的高斯模型集合过渡到更密集且能够更好地表示场景的集合。该过程主要关注 under-reconstruction 和 over-reconstruction 的区域,即具有较大的视图空间位置梯度的区域。直观理解来看,是因为这些区域尚未完全重建好,因此优化算法试图移动高斯函数以进行修正。under-reconstruction 和 over-reconstruction 的区别是 over-reconstruction 区域的 Gaussian 方差大,因为数据的变化幅度较大。对于视图空间的位置梯度大于阈值 휏pos 的区域,需要对该高斯模型进行 致密化 (densify) 操作:

under-reconstruction 区域:高斯模型没有完全覆盖小规模的几何体,此时需要复制高斯模型并将其沿位置梯度方向移动,以覆盖几何体。over-reconstruction 区域:高斯模型超出小规模几何体的范围,此时需要将该拆分高斯模型只覆盖几何体。

然而,这种体积表示法在优化过程中可能会因为相机附近的漂浮物而陷入困境,从而导致高斯密度不合理的增加。一个有效的调节方法是每 3000 次迭代就将

α

\alpha

α 值设为接近零,然后再根据上述优化过程逐渐提高

α

\alpha

α 值。此外,每 100 次迭代就剔除透明的高斯分布(即

α

\alpha

α 小于阈值

ϵ

α

\epsilon_{\alpha}

ϵα​)以限制高斯模型的总数量。

五. 快速可微光栅化

直接 Splatting 显然没法实现高帧率的渲染效果,下面介绍文中是如何进行光栅化的。Gaussians 快速可微光栅化是为了快速实现整体渲染和排序,从而实现近似

α

\alpha

α-blending 并且不再限制能够接收梯度的 splats 的数量。为了达到目的,对 Gaussian splats 进行分块 (tile) 处理,将该光栅化过程命名为 基于分块的光栅化 (tile-based rasterization)。

首先将 2D 屏幕分割成 16×16 个 tile,然后为每个 tile 筛选视锥体 (view frustum) 内的 3D Gaussian:

每个视锥体内只保留置信度大于 99% 的高斯模型;设置一个保护带 (guard band) 剔除位于极端位置的高斯模型,如均值接近近平面或在视锥体之外; 根据每个 Gaussian 重叠的 tile 数量来实例化,为其分配 key 值(key 值结合了该 Gaussian 所在 tile 的 ID 和对应视域的深度); 使用 GPU Radix sort 根据 key 值对 Gaussians 进行排序(其实就是按高斯模型到图像平面的深度值);

传统光栅化渲染管线只能逐像素进行,将三角网格分解为像素,并经过颜色插值、深度测试等一系列的像素处理步骤,最终将渲染结果呈现在屏幕上。

将排好序的 Gaussians 从近到远向对应 tile 上做 Splatting。然后在每个 tile 上对高斯模型留下的 splat 做堆叠(类似

α

\alpha

α-blending,累积

α

\alpha

α 和

c

\bold c

c),直到所有像素的不透明度都饱和(

α

\alpha

α=1)。该过程可以表示为:

C

=

i

N

c

i

α

i

j

=

1

i

1

(

1

α

j

)

\mathbf{C}=\sum_{i \in \mathcal{N}} \mathbf{c}_i \alpha_i \prod_{j=1}^{i-1}\left(1-\alpha_j\right)

C=i∈N∑​ci​αi​j=1∏i−1​(1−αj​)

为每个 tile 都单独开了一个线程快,因此每个 tile 上的光栅化过程可以并行执行。图像中某一个像素不透明度达到饱和后,线程块就停止对该像素的处理。

优化参数时,按每个 tile 堆叠的 splat 对应的 Gaussians 的顺序反向传播;

本节就是 3D Gaussian Splatting 的渲染过程。在合成新视图时,只需要指定一个视角,就可以使用视锥体筛选 3D Gaussian 点云,然后光栅化得到 2D 图像。

六. 实验结果

1. 数据集

实验中使用了 13 个真实场景,来自以下数据集:

Synthetic Blender dataset:Mildenhall 等人在论文《Nerf: Representing scenes as neural radiance fields for view synthesis》中合成的数据集;Mip-Nerf360 dataset:Barron 等人在论文《Mip-NeRF 360: Unbounded Anti-Aliased Neural Radiance Fields》中采样得到的数据集;Tanks&Temples dataset: Knapitsch 等人在论文《Tanks and temples: Benchmarking large-scale scene reconstruction》中采样得到的数据集;Deep Blending dataset:Hedman 等人在论文《Deep blending for free-viewpoint image-based rendering》中采样得到的数据集;

2. 评价指标

实验中使用了 3 个常见的图像质量评估指标:

SSIM:结构相似性指标 (Structural Similarity Index),用于衡量两幅图像之间的相似度。SSIM 主要考虑了亮度、对比度和结构三个方面,计算时将两幅图像分别分解为亮度、对比度和结构三个分量,比较各分量的差异再将结果结合。SSIM 的取值范围在 [-1, 1] 之间,取值越接近 1 表示两幅图像越相似,取值越接近 -1 表示两幅图像越不相似;PSNR:峰值信噪比 (Peak Signal-to-Noise Ratio),用于衡量原始图像与重建图像之间的像素值差异。PSNR 的计算公式是对数均方根误差与一个参考信号的最大可能值之间的比值。PSNR 越高,表示重建图像与原始图像之间的差异越小,图像质量越好;L-PIPS:学习感知图像块相似度 (Learned Perceptual Image Patch Similarity),用于衡量两个图像之间感知相似度的指标。与传统的像素级别的指标不同,L-PIPS 考虑了图像在感知层面上的相似度,这意味着它更加符合人类对图像相似性的认知。计算 L-PIPS 时通常先使用预训练的深度学习模型提取图像的特征,来捕捉图像的语义信息而不是像素级别的信息,然后计算特征之间的距离并转换为感知相似度的度量;

3. 对比实验

文中使用 PSNR、L-PIPS、SSIM 作为模型的评价指标,将 3D Gaussian Splatting 和 Mip-Nerf360、InstantNGP、Plenoxels 做了对比。定量结果见下表:

定性结果如图:

4. 消融实验

图像质量随迭代轮次逐渐提高,背景中伪影逐渐减少:

不同细节处理对应 PSNR 指标:

初始化 SfM 点云和随机初始化的效果对比:

自适应控制 Gaussians 的致密化操作效果对比:

各向同性和各向异性 Gaussian 效果对比:

七. 总结

3D Gaussian Splatting 是一种用于实时渲染的光栅化技术,同 NeRF 一样,可以对从小图像样本集中学习到的逼真场景进行极其快速的渲染。但 3D Gaussian Splatting 本质与 NeRF 还是有比较大的区别,前者更偏向于光栅化的渲染,后者则有点类似于 ray tracing 的渲染方式。并且由于 3D Gaussian Splatting 的生成结果是 point cloud 的显式表达,因此在有遮挡物体建模、生成静态场景的动画等情境下更占优势。

3D Gaussian Splatting 无疑是继 InstantNGP 后,一种更高效的显 - 隐式相结合的 3D 空间表达方式。它的优势在于可以提供类似于点云的可存储的显式表达,对于各种设备更加友好。并且光栅化的渲染方式不需要光线追踪、路径追踪、Diffusion 等技术,就可以直接将模型信息转换为图像,相较于 ray tracing 的渲染方式也更加快。目前已被用于各种静态场景渲染:Kind Humanoid、White tree。

但 3D Gaussian Splatting 也存在一些缺点:视角不足区域和反光区域容易出现伪影、未使用正则化、数百万个高斯需要几十个 G 的显存。

八. 复现

3D Gaussian Splatting 使用 Pytorch 框架,并自定义 CUDA 核用于光栅化,以及使用 NVIDIA CUB 排序例程进行快速基数排序。

平台:AutoDL显卡:RTX 4090 24G镜像:PyTorch 2.0.0、Python 3.8(ubuntu20.04)、Cuda 11.8源码:https://github.com/graphdeco-inria/gaussian-splatting

实验记录:

克隆仓库时,因为使用了 --recursive 选项递归处理目录,因此费时较长,耐心等待即可。如果不使用 --recursive 选项,diff-gaussian-rasterization、simple-knn、SIBR_viewers 都需要手动克隆;执行 environment.yml 脚本创建完虚拟环境后,使用 conda activate gaussian_splatting 指令无法激活环境。改为 source activate gaussian_splatting 即可;安装虚拟环境过程中,如果 diff-gaussian-rasterization 安装失败,遇到 fatal error: glm/glm.hpp: No such file or directory 报错,可能是克隆子模块时没有递归。检查 submodules/diff-gaussian-rasterization/third_party 下的 glm 文件夹是否是空的,如果是空的运行 git submodule update --init --recursive 指令 10,然后就可以成功安装;下载可用的数据集,并将其上传至 data 文件夹下以供调用。本次复现使用的是 Tanks & Temples 下的火车场景。如果想要使用自己的数据集,需要使用 Colmap 处理;如果想要训练时呈现实时渲染效果,需要执行 Interactive Viewers 下 SIBR 相关配置,详见 3D Gaussian Splatting for Real-Time Radiance Field Rendering论文中代码复现及排错过程;训练时,运行 python train.py -s data/tandt/train 命令即可。如果后面想要评估模型质量(即 Evaluation 部分),需要划分训练集和测试集,执行时加上 --eval 选项: 训练完成后,output/XXX 文件夹下会保存 7k 和 3w 次迭代时对应的结果;执行 python render.py -m output/bb9afdf5-4 指令渲染场景: output/XXX/train 和 output/XXX/test 文件夹下会生成 3w 轮训练场景的 train 和 test 渲染图像;执行 python metrics.py -m output/bb9afdf5-4 指令定量分析重建效果: 每一视角和整个场景的 SSIM、PSNR、LPIPS 指标会被保存在 output/XXX 文件夹下;如果想要将渲染图像生成 mp4,需要运行 ffmpeg 指令 11:ffmpeg -framerate 3 -i output/bb9afdf5-4/train/ours_30000/renders/%05d.png -vf "pad=ceil(iw/2)*2:ceil(ih/2)*2" -c:v libx264 -r 3 -pix_fmt yuv420p output/bb9afdf5-4/train/ours_30000/renders.mp4

ffmpeg -framerate 3 -i output/bb9afdf5-4/train/ours_30000/gt/%05d.png -vf "pad=ceil(iw/2)*2:ceil(ih/2)*2" -c:v libx264 -r 3 -pix_fmt yuv420p output/bb9afdf5-4/train/ours_30000/gt.mp4

为了生成的视频更加连续,这里选用训练数据(测试集视角太跳跃);执行 ffmpeg 指令期间出现 ffmpeg: error while loading shared libraries: libopenh264.so.5: cannot open shared object file: No such file or directory 问题,更新 ffmpeg 即可 12:conda update ffmpeg;

实验结果:

实验证明,3D Gaussian Splatting 确实又快又准。仅仅需要几分钟就可以完成 3w 轮迭代,得到高质量的三维重建。火车场景测试集的真实场景和重建场景对比如下:

真实视图

渲染视图

Siggraph 2023 有什么值得关注的论文 ? ↩︎ 怪异魔幻!人类早期3D恐怖开放世界游戏是啥样子? ↩︎ 多元高斯分布完全解析 ↩︎ 计算机图形学基础2——光栅化 ↩︎ Games101计算机图形学入门基础之二:光栅化 ↩︎ 光栅化过程 (顶点片元着色) ↩︎ GAMES101现代计算机图形学入门——光栅化成像之着色 ↩︎ RTR4 第二章图形渲染管线 ↩︎ 【射影几何08】仿射映射 ↩︎ RuntimeError CUDA version (12.0) mismatches the version that was used to compile #385 ↩︎ gaussian_splatting_colab.ipynb ↩︎ ffmpeg: error while loading shared libraries: libopenh264.so.5 ↩︎

文章来源

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: