3D Gaussian Splatting:用于实时的辐射场渲染

这篇具有很好参考价值的文章主要介绍了3D Gaussian Splatting:用于实时的辐射场渲染。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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 的方式进行渲染,实现了高分辨率的实时渲染。

3D Gaussian Splatting:用于实时的辐射场渲染,3D视觉,3D视觉,Gaussian,Splatting,视图渲染

一. 预备知识

3D Gaussian Splatting 论文直接阅读会比较困难,本节参考 [NeRF坑浮沉记]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!、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

3D Gaussian Splatting:用于实时的辐射场渲染,3D视觉,3D视觉,Gaussian,Splatting,视图渲染

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σz1exp(2σx2(xμx)22σy2(yμy)22σz2(zμz)2)
但这其实是分量 x , y , z x, y, z x,y,z 互相独立的特例,此时的模型坐标系和世界坐标系平行。不过这种特例可以帮助理解 3D Gaussian:试想一个实心椭球,将它沿某一条轴切开后会得到一个椭圆,这个椭圆其实是无限大的,每一层的密度都不相同,这个切面就是二维高斯分布的等线图:
3D Gaussian Splatting:用于实时的辐射场渲染,3D视觉,3D视觉,Gaussian,Splatting,视图渲染
3D Gaussian Splatting:用于实时的辐射场渲染,3D视觉,3D视觉,Gaussian,Splatting,视图渲染

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(Σ)1exp(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] Σ= σa2Cov(b,a)Cov(c,a)Cov(a,b)σb2Cov(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(21xTΣ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 之间是独立的。
3D Gaussian Splatting:用于实时的辐射场渲染,3D视觉,3D视觉,Gaussian,Splatting,视图渲染

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 技术,能够快速合成渲染图像。

3D Gaussian Splatting:用于实时的辐射场渲染,3D视觉,3D视觉,Gaussian,Splatting,视图渲染

1. 3D Gaussian Splatting

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

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 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=0m=llalmYlm(θ,ϕ)
这个公式表示,任意球对称的函数 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(21xTΣ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 Splatting:用于实时的辐射场渲染,3D视觉,3D视觉,Gaussian,Splatting,视图渲染

四. 交叉优化

本文的核心是对 3D Gaussian 的优化,优化的目的是创建一组密集的 3D Gaussian 以精确地表示场景。优化的参数包括:三维位置 p p p、透明度 α \alpha α、各向异性协方差 Σ \Sigma Σ 和球谐系数 SH (spherical harmonic coefficients) 。这些 ⌈ \lceil 参数的优化 ⌋ \rfloor ⌈ \lceil 自适应控制高斯模型 ⌋ \rfloor 交替进行(也可以理解为在参数优化的过程中周期性地进行致密化)。

3D Gaussian Splatting:用于实时的辐射场渲染,3D视觉,3D视觉,Gaussian,Splatting,视图渲染

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+λLDSSIM

2. 自适应控制

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

从初始化 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)

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

    • 每个视锥体内只保留置信度大于 99% 的高斯模型;
    • 设置一个保护带 (guard band) 剔除位于极端位置的高斯模型,如均值接近近平面或在视锥体之外;
  2. 根据每个 Gaussian 重叠的 tile 数量来实例化,为其分配 key 值(key 值结合了该 Gaussian 所在 tile 的 ID 和对应视域的深度);

  3. 使用 GPU Radix sort 根据 key 值对 Gaussians 进行排序(其实就是按高斯模型到图像平面的深度值);

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

  4. 将排好序的 Gaussians 从近到远向对应 tile 上做 Splatting。然后在每个 tile 上对高斯模型留下的 splat 做堆叠(类似 α \alpha α-blending,累积 α \alpha α c \bold c c),直到所有像素的不透明度都饱和( α \alpha α=1);

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

  5. 优化参数时,按每个 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. 对比实验

文中使用 PSNR、L-PIPS、SSIM 作为模型的评价指标,将 3D Gaussian Splatting 和 Mip-Nerf360、InstantNGP、Plenoxels 做了对比。定量结果见下表:
3D Gaussian Splatting:用于实时的辐射场渲染,3D视觉,3D视觉,Gaussian,Splatting,视图渲染

定性结果如图:
3D Gaussian Splatting:用于实时的辐射场渲染,3D视觉,3D视觉,Gaussian,Splatting,视图渲染

3. 消融实验

图像质量随迭代轮次逐渐提高,背景中伪影逐渐减少:
3D Gaussian Splatting:用于实时的辐射场渲染,3D视觉,3D视觉,Gaussian,Splatting,视图渲染

不同细节处理对应 PSNR 指标:
3D Gaussian Splatting:用于实时的辐射场渲染,3D视觉,3D视觉,Gaussian,Splatting,视图渲染

初始化 SfM 点云和随机初始化的效果对比:
3D Gaussian Splatting:用于实时的辐射场渲染,3D视觉,3D视觉,Gaussian,Splatting,视图渲染

自适应控制 Gaussians 的致密化操作效果对比:
3D Gaussian Splatting:用于实时的辐射场渲染,3D视觉,3D视觉,Gaussian,Splatting,视图渲染

各向同性和各向异性 Gaussian 效果对比:
3D Gaussian Splatting:用于实时的辐射场渲染,3D视觉,3D视觉,Gaussian,Splatting,视图渲染

七. 总结

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 A5000 24G
  • 镜像:PyTorch 2.0.0、Python 3.8(ubuntu20.04)、Cuda 11.8
  • 源码:https://github.com/graphdeco-inria/gaussian-splatting

(这里选用 A5000 显卡,因为 Cuda 版本要求 11.8,之前一直使用的 3090 显卡最高支持 11.5 版本。)

实验记录

  1. 克隆仓库时,因为使用了 --recursive 选项递归处理目录,因此费时较长,耐心等待即可;

  2. 执行 environment.yml 脚本创建完虚拟环境后,使用 conda activate 指令无法激活环境。改为 source activate 即可;

  3. 下载可用的数据集,并将其上传至正确的位置以供调用。复现时使用的是 Tanks&Temples dataset 下的火车 (train) 场景;

  4. 如果想要训练时呈现实时渲染效果,需要执行 Interactive Viewers 下 SIBR 相关配置,详见 3D Gaussian Splatting for Real-Time Radiance Field Rendering论文中代码复现及排错过程;

  5. 训练时如果直接执行 Running 下的指令默认将所用可用图片都用来训练,如果想要评价模型(Evaluation 部分)需要划分测试集,即执行 train.py 时加上 --eval 选项;
    3D Gaussian Splatting:用于实时的辐射场渲染,3D视觉,3D视觉,Gaussian,Splatting,视图渲染

  6. 训练完成后,output 文件夹下会保存 7k 和 3w 次迭代时对应的结果。再执行 render.py 后就会生成 3w 次迭代时 train 和 test 的渲染图像;

  7. 如果想要将渲染图像生成 mp4,需要执行 Colab 中最后两条 ffmpeg 指令:

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

    3D Gaussian Splatting:用于实时的辐射场渲染,3D视觉,3D视觉,Gaussian,Splatting,视图渲染
    3D Gaussian Splatting:用于实时的辐射场渲染,3D视觉,3D视觉,Gaussian,Splatting,视图渲染

  8. 执行 ffmpeg 指令期间出现 ffmpeg: error while loading shared libraries: libopenh264.so.5: cannot open shared object file: No such file or directory 问题,更新 ffmpeg 即可 10conda update ffmpeg

实验结果

实验证明,3D Gaussian Splatting 确实又快又准。仅仅经过十几分钟 3w 轮迭代,就可以完成高质量的三维重建。火车场景的真实视图和渲染新视图对比如下:

真实视图

渲染视图


  1. Siggraph 2023 有什么值得关注的论文 ? ↩︎

  2. 怪异魔幻!人类早期3D恐怖开放世界游戏是啥样子? ↩︎

  3. 多元高斯分布完全解析 ↩︎

  4. 计算机图形学基础2——光栅化 ↩︎

  5. Games101计算机图形学入门基础之二:光栅化 ↩︎

  6. 光栅化过程 (顶点片元着色) ↩︎

  7. GAMES101现代计算机图形学入门——光栅化成像之着色 ↩︎

  8. RTR4 第二章图形渲染管线 ↩︎

  9. 【射影几何08】仿射映射 ↩︎

  10. ffmpeg: error while loading shared libraries: libopenh264.so.5 ↩︎文章来源地址https://www.toymoban.com/news/detail-751953.html

到了这里,关于3D Gaussian Splatting:用于实时的辐射场渲染的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【3D-GS】Gaussian Splatting SLAM——基于3D Gaussian Splatting的全网最详细的解析

    【3D-GS】Gaussian Splatting SLAM——基于3D Gaussian Splatting的全网最详细的解析

    3D Gaussian Splatting for Real-Time Radiance Field Rendering 论文:link code:link video:link 1. 开山之作 Nerf 一切的开始都是起源于 NERF 开山之作 这里由详细的学习与拆解 【NERF】入门学习整理(一) 【NERF】入门学习整理(二) 【NERF】入门学习整理(三) 【NeRF数据集】LLFF格式数据集处理co

    2024年04月15日
    浏览(59)
  • 3D Gaussian Splatting

    3D Gaussian Splatting

    本文转载于大佬~~ 这是3D Gaussian Splatting综述, 先回顾3D Gaussian的原理和应用,借着全面比较了3D GS在静态场景、动态场景和驾驶场景中的性能,最后为未来指明了研究方向! 三维 Gaussian splatting(3DGS)是近年来在显式辐射场和计算机图形学领域出现的一种变革性技术。这种创新

    2024年04月08日
    浏览(14)
  • 3D Gaussian Splatting的使用

    3D Gaussian Splatting的使用

    今年SIGGRAPH最佳论文,学习了一下,果然厉害,具体论文原理就不说了,一搜都有,主要是看看怎么用,自己能不能把身边的场景快速建个模。 赶紧记录下,好像这几天在这个基础上又有很多花样出来了… 我的系统是Ubuntu22.04。 开源作者已经都弄的很详细了,也有教程。 首

    2024年02月04日
    浏览(8)
  • 【计算机视觉】Gaussian Splatting源码解读补充(二)

    【计算机视觉】Gaussian Splatting源码解读补充(二)

    第一部分 本文是对学习笔记之——3D Gaussian Splatting源码解读的补充,并订正了一些错误。 其中出现的辅助函数: 这部分的参考资料: [1] CUDA Tutorial [2] An Even Easier Introduction to CUDA [3] Introduction to CUDA Programming CUDA是一个为支持CUDA的GPU提供的平台和编程模型。该平台使GPU能够进

    2024年04月10日
    浏览(32)
  • 【计算机视觉】Gaussian Splatting源码解读补充(一)

    【计算机视觉】Gaussian Splatting源码解读补充(一)

    本文旨在补充@gwpscut创作的博文学习笔记之——3D Gaussian Splatting源码解读。 Gaussian Splatting Github地址:https://github.com/graphdeco-inria/gaussian-splatting 论文地址:https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/3d_gaussian_splatting_high.pdf 这部分可以参考PlenOctrees论文的附录B。 有时候从不同的

    2024年04月09日
    浏览(46)
  • 3D Gaussian Splatting:论文原理分析

    3D Gaussian Splatting:论文原理分析

    标题:3D Gaussian Splatting for Real-Time Radiance Field Rendering 作者:Bernhard Kerbl、Georgios Kopanas、Thomas Leimkühler和George Drettakis,来自法国Inria、Université Côte d\\\'Azur和德国Max-Planck-Institut für Informatik。 发表时间:2023年8月,ACM Transactions on Graphics上,卷号42,编号4 提出了一种名为3D Gaussia

    2024年01月23日
    浏览(11)
  • Awesome 3D Gaussian Splatting Resources

    GitHub - MrNeRF/awesome-3D-gaussian-splatting: Curated list of papers and resources focused on 3D Gaussian Splatting, intended to keep pace with the anticipated surge of research in the coming months. 3D Gaussian Splatting简明教程 - 知乎 

    2024年01月20日
    浏览(11)
  • 3D Gaussian Splatting学习记录11.2

    cmd输入以下命令,开始训练 整个训练(30,000步)大约需要20分钟,但7000步后会保存一个中间模型,效果已经很不错了。训练结束后得到output文件 在Ubuntu 22.04上,运行以下命令来构建可视化工具: 安装后,找到SIBR_gaussianViewer_app二进制文件,并以模型的路径作为参数运行它: 参

    2024年02月04日
    浏览(9)
  • 3D Gaussian Splatting文件的压缩【3D高斯泼溅】

    3D Gaussian Splatting文件的压缩【3D高斯泼溅】

    在上一篇文章中,我开始研究高斯泼溅(3DGS:3D Gaussian Splatting)。 它的问题之一是数据集并不小。 渲染图看起来不错。 但“自行车”、“卡车”、“花园”数据集分别是一个 1.42GB、0.59GB、1.35GB 的 PLY 文件。 它们几乎按原样加载到 GPU 内存中作为巨大的结构化缓冲区,因此

    2024年02月03日
    浏览(9)
  • 3d gaussian splatting笔记(paper部分翻译)

    3d gaussian splatting笔记(paper部分翻译)

    本文为3DGS paper的部分翻译。 基于点的𝛼混合和 NeRF 风格的体积渲染本质上共享相同的图像形成模型。 具体来说,颜色 𝐶 由沿射线的体积渲染给出: 其中密度 𝜎、透射率 𝑇 和颜色 c 的样本是沿着射线以间隔 𝛿 𝑖 采集的。 这可以重写为 典型的基于神经点的方法通过

    2024年01月24日
    浏览(14)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包