一场对3D Gaussian Splatting的祛魅:深入分析NeRF及3DGS的原理

作者 | 德尔图良  编辑 | 自动驾驶Daily

原文链接:https://zhuanlan.zhihu.com/p/717369859

点击下方卡片,关注“自动驾驶之心”公众号

戳我-> 领取自动驾驶近15个方向学习路线

>>点击进入→自动驾驶之心3DGS技术交流群

本文只做学术分享,如有侵权,联系删文

(本文是作者在公司内部分享的整理,力求简明扼要的向大家介绍清楚 Nerf 技术的发展脉络,以及个人对于 3D Gaussian Splatting 技术的看法,其中原理推导的部分设计较多的数学原理,如果感到枯燥可以直接跳过看结论,对于 Nerf 感兴趣的同学,欢迎积极留言,大家一起学习讨论~)

NeRF 介绍

NeRF 是什么

传统计算机图形学

在传统的计算机图形学技术中,我们通过将场景数据,通过渲染算法,生成在特定视角下的渲染画面。

outside_default.png

场景数据包括:

  1. 几何数据(点云、三角网格、体素等)

  2. 纹理数据(PBR、Normal、AO等)

  3. 光照数据(光源类型、阴影、全局光照等)

渲染算法包括:

  1. 光栅化方法

  2. 光线投射方法

为了达成更加逼真的画面,需要人工参与创建、估算各种场景参数,带来大量的人工成本(美术、引擎、图程)。

NeRF Rendering

outside_default.png

NeRF,全称是 Neural Radiance Fields (神经辐射场)技术,滥觞于 2019 年发表的《NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis》这篇论文,文中通过结合机器学习的方法,使用可微分的渲染损失,来从观测中重建这样的场景数据。

outside_default.png

相比于传统的计算机图形学技术,从人工建模与调参,得到场景数据,最后渲染出逼真的画面, Nerf 技术可以直接从参考图像中,运用机器学习的方法,自动得到场景数据,而无需人工手动参与,从而大大降低了场景建模的成本。

NeRF 的原理

NeRF 中三大关键的技术点:

  1. 5D 的隐式场景表示函数;

  2. 位置编码;

  3. 分层体渲染;

三维场景的显示表达与隐式表达

在传统的计算机图形学技术中,用来表示场景的数据通常可以分为以下几类:

  1. 点云:由一维的点组成,本身没有封闭的面,所以没有办法表达拓扑结构;

outside_default.png
  1. 三角网格:由二维的平面组成,可以描述绝大部分的拓扑结构,游戏中最常用的方式;

outside_default.png
  1. 体素:体素描述的是三维体积中的数据,可以描述各种拓扑结构

outside_default.png

这些场景数据都是显示表达的数据,可以直接读取出场景中某个位置的属性,也因此,这些数据是对连续的真实场景的离散化的采样。

另一种表达场景的方式,是通过高维函数直接对场景建模,需要获取场景中某个位置的属性的时候,传入位置信息作为参数,计算出该点的属性,这种方式并不直接保存数据,我们一般把这种方式成为场景数据的隐式表达。

outside_default.png

比如,我们可以通过下面的方程求得场景中任意一点,到原点的距离:

outside_default.png

这就是一种隐式的场景表达方式,在 NeRF 技术中,我们也采用类似的方式,用来表达场景

outside_default.png outside_default.png

这里需要说明一下,为什么要使用 5D 的参数:

  1. 对于颜色数据来说,尤其是高光反射的部分,虽然在场景中的位置相同,但是从不同的角度观察时,会得到不同的结果,所以本身除了和位置相关,也和观察角度相关;

  2. 对于密度数据来说,其表示的是观察的视线能够通过该点的概率,所以只和位置相关。

神经网络结构

当我们把整个场景表示成一个连续的 5D 函数之后,就可以通过 MLP 全连接层来对这个函数建模,首先对位置进行位置编码,再通过 8 层 256 维的全链接 ReLU 层,输出体素密度

和 256 维的特征向量,然后把特征向量和经过位置编码后的方向参数串联,最后经过一个 128 维的全连接层,得到与位置和方向都相关的一个颜色预测。

outside_default.png

当我们把场景函数通过神经网络表示之后,就可以用梯度下降的方式来进行优化,通过不断的最小化每个观察图像和对应视图之间的误差,最终得到我们需要的场景函数,具体步骤如下:

outside_default.png
  1. 从相机的位置出发,沿着相机的视线,一步步采样 5D 坐标(位置和角度)下场景的属性;

  2. 将 5D 坐标输入 MLP 全连接神经网络,得到该位置的颜色和密度;

  3. 利用体渲染技术,将得到的颜色和密度,合成为 2D 的图像;

  4. 通过最小化合成的图像与参考图像之间的差值,来优化我们的 MLP 全连接神经网络;

  5. 不断重复上面的过程,最终得到一个足够优化的场景表示函数;

体渲染技术

体渲染技术在计算机图形学中由来已久,对大气散射、体积雾等没有清晰边界的物体,体渲染技术能够很好的表现其体积感与层次感,由于 NeRF 中采用的表示场景的方法,是一个连续的隐函数,故而可以认为其本身充满了整个空间,所以可以采用体渲染的方式,来得到图像。

计算机算机图形学中的体渲染,模拟了光在空间中的散射、吸收等现象,NeRF 中对此进行了简化,使用了(t)表示碰撞概率,即视线通过此处的概率。下面会详细说明下(t):

outside_default.png outside_default.png outside_default.png outside_default.png

改写上述公式可以得到:

outside_default.png

求解该微分方程

outside_default.png

我们得到了两点之间碰撞概率之比。

outside_default.png outside_default.png outside_default.png

得到了上述连续形式的积分方程之后,我们还需要进一步对其进行离散化。

outside_default.png outside_default.png outside_default.png outside_default.png outside_default.png

把整个射线上的N段进行累加:

outside_default.png outside_default.png

outside_default.png结合上面的公式,可以得到最终的离散化的形式:

outside_default.png

得到了如何计算一条视线所得到的颜色,就可以从相机位置发出多条视线,组成画面,NeRF 的算法里面是通过 1024 条射线,来得到一幅完整的画面

outside_default.png

重建三维场景

outside_default.png

有了表示场景的神经网络,和能够得到图像的体渲染技术后,我们就可以开始训练神经网络,具体步骤如下:

  1. 数据准备:准备一组包含二维图片和相应相机参数的训练数据。每张图片是从不同角度捕获的场景快照。每个训练样本由一张图片和对应的相机参数组成;

  2. 视线的生成:对于每张图片,根据相机参数生成视线,这些视线起始于相机位置,穿过图像平面上的每个像素,并延伸到场景中;

  3. 输出颜色:对于每条视线,将视线的起始点传入体积函数(通常是一个多层感知器)。体积函数沿着视线逐点采样神经网络,得到该点的颜色和密度值,带入体渲染公式,得到最终的颜色;

  4. 损失计算:将体积函数输出的颜色与实际图像中对应像素的颜色进行比较,计算损失,损失衡量了预测图像与真实图像之间的差异;

  5. 反向传播和优化:使用反向传播算法,将损失反向传播到神经网络中,计算梯度并进行权重更新,这个过程采用优化算法(如随机梯度下降)来逐步调整神经网络的权重,以最小化损失函数;

  6. 迭代训练:重复以上步骤,逐渐迭代训练神经网络。每次迭代都会使用不同的训练样本,以便网络能够从各个角度和视角学习场景的三维表示;

  7. 收敛与模型保存:训练过程会持续一段时间,直到模型达到一定的收敛程度,即损失足够小,在训练完成后,可以保存训练好的体积函数模型,之后就可以直接利用该体积函数新的视角下的输出。

总的来说,场景重建就是通过在多个视角下的输入图像和相机参数,让神经网络学习到一个能够将三维空间点映射到颜色和密度值的隐式函数。这个过程实际上是在从输入图像中学习场景的三维结构和属性,并将其表示为神经网络的权重,这使得网络在渲染阶段能够根据相机参数和光线来生成场景的虚拟图像。

位置编码

outside_default.png outside_default.png

解决这个问题的办法,是通过编码将输入的维度进行提升,这样低频的连续输入经过升维后,就有足够的维度去描述更高频的信息了,具体采用的方式如下:

outside_default.png

经过编码后,三维的位置信息,会变为 63 维的输入信息(3 维原来的信息,加上3210维升维后的信息),同时,我们用三维的向量来描述视角信息,经过编码后,得到 27维的视角信息(3 维原来的信息,加上324维升维后的信息)

如图所示,可以看到完全没有位置编码的情况下,整个场景会偏向模糊,阴影细节无法很好表示;而只对位置进行编码,而对视角没有编码的情况下,则对于像高光反射这种现象,无法很好表示;在对位置和视角都进行了编码后,场景对于高频信息的表现能力大大增强。

分层采样

outside_default.png outside_default.png

故 NeRF 中采用了多层级体素采样(Hierarchical volume sampling)的技术,该方案可以根据场景密度,自适应分布场景中的采样点,具体步骤如下:

  1. 准备神经网络:我们需要准备两个神经网络,分别称为粗网络(coarse net)和精网络(fine net);

  2. 训练粗网络:在训练粗网络时,我们采用均匀采样,加随机偏移的方式,如下图所示:

outside_default.png outside_default.png outside_default.png outside_default.png

通过处的pdf,我们可以积分得到cdf,对cdf进行均匀采样,就可以反向得到应该采样的位置。

  1. 训练精网络:通过采样上一步得到的位置,来对精网络进行训练,最后我们保存下来,用来进行预测输出的就是精网络。

NeRF 的发展历程

在 2019 年《NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis》这篇论文横空出世之后,凭借其震撼的合成效果获得了 2020 年 ECCV 的最佳论文,之后沿着 NeRF 打开的大门,人们开始不懈的探索,到 2023 年为止这篇论文已经被引用了 3000+ 次。

但是 NeRF 本身也存在很多问题,其中最大的两个问题就是:训练慢 和 渲染慢,NeRF 对于单一物体的训练时间平均达到了一到两天,渲染更是连 1 FPS 都达不到,完全无法实时交互,这两个问题极大的限制了 NeRF 的应用场景。

我们可以看下 NeRF 为什么会存在训练慢和渲染慢的问题:训练慢:NeRF 中采用的 MLP 网络是从零开始进行训练,需要在训练中一点点学习到场景的空间结构;渲染慢:体渲染技术中,会对空白区域进行采样,浪费了大量的算力;

有问题,就会有解决问题的探索,下面就介绍几种尝试解决以上两个问题的方案:

Mip-NeRF(视锥追踪)

outside_default.png

《Mip-NeRF: A Multiscale Representation for Anti-Aliasing Neural Radiance Fields》中提出了一种方法,在体渲染的采样中,不再发射一条射线,而是换成了发射一条圆锥,然后把圆锥进行分段,每段通过 3D Gaussian 函数进行建模,采样的时候输入的不再是位置和视角,而是高斯的均值、方差和视角。

采用这种方法,可以减少采样光线的数量,从而提高了渲染速度,同时能降低训练图片与渲染画面分辨率不一致时的锯齿和模糊感。

PlenOctrees(MLP 转 八叉树)

outside_default.png

《PlenOctrees for Real-time Rendering of Neural Radiance Fields》中提出了一种方法,先根据场景,预训练一个 NeRF 的神经网路,然后稠密采样这个 NeRF 网络,用八叉树来存储采样的结果,再对八叉树存储的结果进行优化,最终保存八叉树用来渲染。

DVGO(显式表达+隐式表达)

outside_default.png

《Direct Voxel Grid Optimization: Super-fast Convergence for Radiance Fields Reconstruction》中提出了一种新的思路,既然我们可以用八叉树来加速渲染,那我们可不可以用类似的方式来加速训练呢?这篇文章就是从这个角度,进行的探索。

在这篇文章提出的方法中,不仅用到了 MLP 神经网络来存储颜色,还用到了体素网格来表达整个场景,每个体素里会存储密度和颜色特征值,然后用三线性插值的方式,保证了这些值是连续平滑变化的,从而可以进行可微渲染,反向传播优化。为了用低密度网格表示高频信息,在密度值插值之后,会加上一个非线性的激活函数。而颜色特征值会和位置与视角一起作为输入,传入到 MLP 神经网络中,获取到颜色值。在训练中会不断对体素网格进行优化,这样就可以利用体素网格,来快速跳过大部分空白的区域,从而提高训练和渲染的速度。

Point-NeRF(显式表达+隐式表达)

outside_default.png

《Point-NeRF: Point-based Neural Radiance Fields》中提出了另一个思路,上文中的体素毕竟是均匀分布,还是会有空洞,那是不是可以有更加适应场景密度的形式?

答案是肯定的,我们可以使用 deep MVS 或者 COLMAP 等方法,对参考图片进行处理,从而得到用来表示整个场景的点云分布,然后在体渲染采样时,通过采样周围点,插值融合点上的特征,再传入 MLP 神经网络中,得到颜色与密度。

这种方法可以在一开始就通过预训练的方法,得到场景的点云表示,场景中的空洞部分直接就可以得到,不需要像上一篇文章中,需要不断训练得到。

Plenoxels(显式表达)

outside_default.png

《Plenoxels:Radiance Fileds without Neural Network》中完全放弃了 MLP 神经网络,仅使用体素网格来表达整个场景,渲染时采用和 NeRF 同样的体渲染技术,通过三线性插值,得到采样点的密度和球谐函数的参数,之后通过反向传播进行优化。

采用这种方式,整体的训练时间缩短了百倍以上,达到 NeRF 同样的效果只需要平均 15 分钟的训练时间,而 NeRF 的训练时间通常需要一到两天。这证明了一件事情,在场景重建的技术中,MLP 神经网络并不是必要的,可微渲染与反向传播才是关键。这为后续的研究指明了一条道路,我们可以引入了更多 CG 领域的方法,来对场景进行表示,或许会得到更好的结果。

3D Gaussian Splatting 介绍

困扰 NeRF 的两个问题:训练慢和渲染慢,3D Gaussian Splatting 都基本解决了,因此 NeRF 技术大规模应用到商业实践中的进程,被大大的推进了一步。而这种进步,并不是凭空发生的,是建立在之前各种实践探索上的,尤其是沿袭了 Plenoxels 的思路,完全抛弃了 MLP 神经网络,在此之上又抛弃了光线追踪的体渲染方法,利用了基于光栅化的 3D Gaussian Splatting 的渲染方式。

下面详细分析下 3D Gaussian Splatting 方法中是如何解决训练慢和渲染慢的问题的:

  1. 采用点云结合 3D Gaussian 的方式,作为显式的场景表达:从 Plenoxels 我们可以得知,MLP 隐式表达并不是 NeRF 的关键,可微渲染才是关键,所以采用 3D Gaussian 来表示点云中的每个点的性质,就是利用了 3D Gaussian 函数可微的性质,同时,使用点云表达空间结构,避免了对于空场景的训练,大大提高了训练速度;

  2. 使用的 3D Gaussian Splatting 的渲染方式是一种基于光栅化的方式,避免了体渲染中光线追踪的方式:利用了 3D Gaussian 函数的轴向积分等同于 2D Gaussian 函数的性质,可以直接用 2D Gaussian 函数替换掉体渲染中沿着视线积分的过程,从数学层面摆脱了采样量的限制,并且可以直接使用光栅化管线进行渲染,在保证渲染效果的同时,把渲染速度提升到了 1080 分辨率下 60 FPS 的程度,已经达到了 Real-Time 的程度;

3D Gaussian Splatting 的原理

下图是 3D Gaussian Splatting 技术合成后的画面:

下图是 3D Gaussian Splatting 技术中,将每个 3D Gaussian 透明度设置为 1 后的画面,可以看到画面是由半透明的小椭圆叠加而成:

outside_default.png

3D Gaussian Splatting 的点云中的每个点,都采用以下参数,显式描述场景:

outside_default.png outside_default.png

3D Gaussian Splatting 整体的流程如上图:

  1. 使用运动结构恢复(SfM:Structure from Motion)方法从一组图像中估计点云的位置和颜色,作为初始化的参数(SfM 是一种从一组 2D 图像估计 3D 点云的方法,可以通过 COLMAP 库来完成);

  2. 点云中的每个点会表达成 3D Gaussian 的形式,之后通过投影与可微光栅化后,得到合成的图像;

  3. 和参考图像对比计算损失函数,进行反向传播,调整 3D Gaussian 的参数;

  4. 在此过程中,会进行自适应的密度调整:

  • 如果对于给定的高斯梯度很大,则分割或者克隆一个新的高斯;

  • 如果高斯很小,则克隆一个新的高斯;

  • 如果高斯很大,则将其分割;

  • 如果高斯的 alpha 太低,则将其删除;

3D Gaussian Splatting 的关键技术

3D高斯函数沿某一轴进行积分后等同于2D高斯函数,这是由于高斯函数的一些性质决定的。
首先,高斯函数是可以分离的,即多维高斯函数可以表示为各个维度上的一维高斯函数的乘积。这意味着,多维高斯函数沿某一维度进行积分,就相当于将这一维度的一维高斯函数积分到1,剩下的就是其他维度的高斯函数,即一个低一维的高斯函数。
其次,高斯函数的边缘分布也是高斯的。多维高斯函数的边缘分布就是将某一维度积掉,得到的结果仍然是高斯的。这再次证明了3D高斯函数沿某一轴进行积分后等同于2D高斯函数。
这个性质在图形学中有很重要的应用,例如在3D Gaussian Splatting中,将3D高斯投影到投影平面后得到的2D图形称为Splat,然后通过计算待求解像素和椭圆中心的距离,可以得到不透明度。由于3D高斯的轴向积分等同于2D高斯,可以用2D高斯直接替换积分过程,从数学层面摆脱了采样量的限制,计算量由高斯数量决定,而高斯又可以使用光栅化管线快速并行渲染。

outside_default.png

如今的 CG 界,三角图元已经一统江湖啊,而在 CG 刚刚起步的年代,其实人尝试了多种表达场景的方式,比如 1994 年发售的魔城迷踪 ecstatica,就是以椭球为基础元素的游戏。

为什么选择 3D Gaussian 这种表达方式?主要优点有两个:

  1. 3D Gaussian 是连续可微的;

  2. 3D Gaussian 可以用光栅化渲染;

单个的 3D Gaussian 可以作为小型可微空间进行优化,不同的 3D Gaussian 则能够像三角形一样并行光栅化渲染,从而在可微和离散之间做了一个微妙平衡。

3D Gaussian 的数学表达

outside_default.png outside_default.png
  1. 均值为 0;

  2. 方差为 1;

  3. 概率密度的积分为 1;

outside_default.png outside_default.png outside_default.png outside_default.png

根据联合概率密度公式

outside_default.png

把转化为二次型的形式

outside_default.png outside_default.png outside_default.png

根据对角阵的性质可知,其逆矩阵是

outside_default.png

由于对角阵的行列式等于对角上元素的乘积,所以我们可以得到

outside_default.png

综合上述公式可得

outside_default.png

由此,我们得到了独立多元高斯函数的公式。

outside_default.png outside_default.png outside_default.png outside_default.png

结合上述两个公式可得

outside_default.png outside_default.png outside_default.png outside_default.png outside_default.png outside_default.png outside_default.png outside_default.png

综合上述公式可得

outside_default.png

由此,我们得到了相关多元高斯函数的公式。

3D Gaussian 的参数构成
回顾《3D Gaussian Splatting 的原理》一节,我们使用 3D Gaussian 描述空间中的一个椭球,结合上述公式可知,3D Gaussian 中最重要的两个参数是期望值和协方差矩阵,那我们如何获得这两个参数呢?

结合几何意义可知,期望值就是椭球的圆心,所以可以用点云的位置P(x,y,z)来表示。

outside_default.png outside_default.png outside_default.png outside_default.png outside_default.png

3D Gaussian 的投影

我们已经知道了如何通过 3D Gaussian 表示空间中的椭球,那么又该如何对其进行光栅化渲染出来呢?

outside_default.png outside_default.png

对于传统的三角形图元,光栅化的过程如下:

  1. 世界空间中的点,转换到视图空间;

  2. 视图空间中的点,转换到裁剪空间;

  3. 裁剪空间中的点,转换到 NDC 空间;

  4. 在 NDC 空间的xy平面使用扫描线算法进行填充;

3D Gaussian 的投影过程与之类似,该过程我们称之为 Splatting。我们也需要将 3D Gaussian 代表的椭球,从世界空间转换到 NDC 空间,然后沿着z轴进行投影,再对投影在xy平面上的椭圆进行扫描线填充。

不同于三角形图元的光栅化过程,对于 3D Gaussian 的变换需要保证变换完成后,依然保持是高斯函数,这样才可以利用多元高斯函数的投影依然是高斯函数的性质,来快速得到投影后的图像。

我们知道确定一个 3D Gaussian 的参数包括期望值和协方差:

  1. 对于期望值,表示的是椭球的圆心,可以通过类似三角图元的变换过程得到在投影空间里的坐标;

  2. 对于协方差,表示的是椭球的缩放和旋转,如果直接使用三角图元的变换过程,由于投影变换不是线性的,会导致变换后不再保持高斯函数的性质;

outside_default.png outside_default.png outside_default.png

可以看到,一阶导的泰勒展开满足线性变换的条件,同时当x在附近时,

outside_default.png

可以表示为处一阶导数的展开形式。

outside_default.png outside_default.png outside_default.png outside_default.png outside_default.png outside_default.png outside_default.png outside_default.png outside_default.png outside_default.png outside_default.png outside_default.png

我们假设变换前的 3D Gaussian 的协方差为,对于变换后的 3D Gaussian 求协方差

outside_default.png outside_default.png outside_default.png

所以变换后的协方差为

outside_default.png outside_default.png outside_default.png outside_default.png outside_default.png

投影到平面后的 2D Gaussian 函数为

outside_default.png

3D Gaussian 的渲染

在得到每个 3D Gaussian 投影到平面的公式后,我们可以开始着手将其渲染出来,但是投影后的 2D Gaussian 函数的函数值,并不能直接得到颜色和透明度,其值表示的是相对于中心处的颜色和透明度的百分比。其中,透明度可以直接和百分比值相乘,而颜色则需要通过球谐函数计算才能得到,这里需要简单介绍一下球谐函数,简单来说球谐函数是一组正交基函数,可以对分布在球面上的实函数进行方便的展开。之所以用球谐函数表示颜色,正是为了能够表示从不同的角度观察,得到不同颜色的现象,比如像光滑的金属表面,对于同一个位置,从不同的角度观察,就能得到不同的反射影像,而球谐函数只需要存储几个简单的参数,就能模拟出这种现象,如下图,可以看到左边的桌面随着不同的观察视角,会有明显的明暗变化:

outside_default.png

与傅里叶级数展开类似,傅里叶级数是把任何的周期函数都表示成一组正余弦函数的和的形式,如下:

outside_default.png

其中:

outside_default.png

而分布在球面上的任意函数,都可以像上面展开傅里叶级数那样,通过一组球谐函数进行展开

outside_default.png outside_default.png outside_default.png

其中是展开式中不同球谐函数的系数,其值可以通过和球谐函数进行积分得到

outside_default.png outside_default.png outside_default.png outside_default.png outside_default.png

前三阶的球谐基函数的可视化如下

outside_default.png

在实际操作中,我们通过球谐函数进行展开的时候,不可能展开成无穷多项,一般会选取前 3 阶或者 2 阶,这样就会把原来函数中的高频部分过滤掉,如下图可以看到,球谐展开的阶数越高,保留的高频信息就越多,还原的函数细节就越丰富

outside_default.png outside_default.png

了解了如何求得颜色和透明度,我们就可以采用的是分 tile 的渲染方式来得到最终图像,具体步骤如下:

outside_default.png
  1. 将屏幕划分为 16x16 大小的 tiles;

  2. 将每个 3D Gaussian 点投影到视平面后,根据中心点的位置,计算出该点所处的 tile 和相对视平面的深度;

  3. 对每个 tile 中的所有 3D Gaussian 点,根据相对视平面的深度进行排序;

  4. 排序完成后,每个 tile 都可以得到一个按照从近到远记录了该 tile 中所有 3D Gaussian 点的 list;

  5. 对应每个 tile,运行一个 16x16 的 thread block,并将 tile 对应的 list 加载进 block 的 shared memory 里;

  6. thread block 中的每个 thread 对应 tile 中的一个像素,从 list 中依次取出 3D Gaussian 点,根据投影后的 2D Gaussian 公式,可以计算出该像素位置处的百分比,然后通过球谐函数得到 3D Gaussian 点中心出的颜色和透明度,乘以百分比后,按照以下规则进行累加:

  • 将颜色与 frame buffer 中的颜色按照 frame buffer 中的透明度混合;

  • 将透明度与 frame buffer 中的透明度相加;

  • 如果透明度的值大于阈值则退出计算;

  1. 每个像素的颜色都计算完成后,也就渲染出了整个画面。

3D Gaussian Splatting 的未来展望

Animatable 3D Gaussian

《Animatable 3D Gaussian: Fast and High-Quality Reconstruction of Multiple Human Avatars》中提出了一种可动画化的 3D Gaussian 技术,从输入图像和姿势中学习人类的形象。我们通过在正则空间中建模一组蒙皮的 3D Gaussian 模型和相应的骨架,并根据输入姿态将 3D Gaussian 模型变形到姿态空间,从而将 3D Gaussian 扩展到动态人类场景。

HUGS: Human Gaussian Splats

《HUGS: Human Gaussian Splats》中提出了一种使用 3D Gaussian 来表示可动画化的人体和场景的方法,该方法只需要一个具有少量(50-100)帧的单眼视频,就能在 30 分钟内,通过机器学习自动将静态场景和完全可动画化的人体分开,并且可以使用全新的姿势与场景进行融合。如下视频所示:

  1. 左上,是用来训练的视频;

  2. 右上,是训练出来的可动画化的人体表示;

  3. 左下,是训练出来的静态场景;

  4. 右下,是使用全新的姿势驱动人体,并且和静态场景结合,可以通过各种视角进行观察;

该方法也可以推广到多人的场景:

参考资料

  1. 《神经渲染的进展综述》

  2. 《NeRF论文阅读》

  3. 《NeRF的数学推导》

  4. 《NeRF及其发展》

  5. 《【NeRF】基于Mindspore的NeRF实现》

  6. 《NeRF介绍+体渲染+神经网络+源码链接+UE实践一条龙(上)》

  7. 《NeRF介绍+体渲染+神经网络+源码链接+UE实践一条龙(下)》

  8. 《mipnerf原理》

  9. 《PlenOctrees for Real-time Rendering of Neural Radiance Fields》

  10. 《【论文讲解】DVGO:用粗糙体素网格实现精细NeRF重建,还把训练加速了两个数量级(CVPR 2022 Oral)》

  11. 《【论文讲解】Point-NeRF:用点云做NeRF重建,既抽象又具体,既新奇又传统(2022 CVPR Oral)》

  12. 《【论文讲解】Plenoxels:没有神经的辐射场,把NeRF提速两个数量级(CVPR 2022)》

  13. 《多元高斯分布》

  14. 《理解协方差矩阵》

  15. 《3D Gaussian Splatting中的数学推导》

  16. 《3D Gaussian Splatting源码解读》

  17. 《[NeRF坑浮沉记]3D Gaussian Splatting入门:如何表达几何》

  18. 《《3D Gaussian Splatting for Real-Time Radiance Field Rendering》3D高斯的理论理解》

  19. 《3D Gaussian Splatting 原理略解》

  20. 《Animatable 3D Gaussian:3D高斯最新工作,25s重建一场十人篮球赛,每个人都可随意驱动!》

  21. 《HUGS: Human Gaussian Splats》

自动驾驶之心知识星球』欢迎加入交流!重磅,自动驾驶之心科研论文辅导来啦,申博、CCF系列、SCI、EI、毕业论文、比赛辅导等多个方向,欢迎联系我们!

outside_default.png

① 全网独家视频课程

端到端自动驾驶、仿真测试、自动驾驶C++、BEV感知、BEV模型部署、BEV目标跟踪、毫米波雷达视觉融合多传感器标定多传感器融合多模态3D目标检测车道线检测轨迹预测在线高精地图世界模型点云3D目标检测目标跟踪Occupancy、CUDA与TensorRT模型部署大模型与自动驾驶NeRF语义分割自动驾驶仿真、传感器部署、决策规划、轨迹预测等多个方向学习视频(扫码即可学习

outside_default.png

网页端官网:www.zdjszx.com

② 国内首个自动驾驶学习社区

国内外最大最专业,近4000人的交流社区,已得到大多数自动驾驶公司的认可!涉及30+自动驾驶技术栈学习路线,从0到一带你入门自动驾驶感知端到端自动驾驶世界模型仿真闭环2D/3D检测、语义分割、车道线、BEV感知、Occupancy、多传感器融合、多传感器标定、目标跟踪)、自动驾驶定位建图SLAM、高精地图、局部在线地图)、自动驾驶规划控制/轨迹预测等领域技术方案大模型,更有行业动态和岗位发布!欢迎扫描下方二维码,加入自动驾驶之心知识星球,这是一个真正有干货的地方,与领域大佬交流入门、学习、工作、跳槽上的各类难题,日常分享论文+代码+视频

outside_default.png

③【自动驾驶之心】技术交流群

自动驾驶之心是首个自动驾驶开发者社区,聚焦感知、定位、融合、规控、标定、端到端、仿真、产品经理、自动驾驶开发、自动标注与数据闭环多个方向,目前近60+技术交流群,欢迎加入!扫码添加汽车人助理微信邀请入群,备注:学校/公司+方向+昵称(快速入群方式)

outside_default.png

④【自动驾驶之心】全平台矩阵

outside_default.png

### 实现 3D Gaussian Splatting 的准备工作 为了在 Ubuntu 上成功实现 3D Gaussian Splatting (3DGS),需要确保操作系统环境已经准备好并安装必要的依赖项。对于 Ubuntu 22.04 版本,建议按照以下指南操作。 #### 安装基础软件包 首先更新系统的软件源列表,并安装一些基本工具和库: ```bash sudo apt-get update && sudo apt-get upgrade -y sudo apt-get install build-essential cmake git wget unzip pkg-config libopencv-dev python3-pip -y ``` #### 设置 Python 和 PyTorch 环境 由于 3D Gaussian Splatting 需要使用到 PyTorch 进行模型训练与推理,因此需先确认 CUDA 版本再选择合适的 PyTorch 版本来安装[^1]。可以通过命令 `nvcc --version` 来查看当 GPU 所支持的 CUDA 版本号。接着通过 pip 工具来安装对应版本的 PyTorch 及其扩展组件 torchvision: ```bash pip3 install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117 ``` 这里假设使用的 CUDA 是 11.7 版本;如果不是,则应调整 URL 中 cu 后面的部分以匹配实际的 CUDA 版本。 #### 获取项目代码 从 GitHub 下载官方提供的 3D Gaussian Splatting 源码仓库: ```bash git clone https://github.com/graphdeco-inria/gaussian-splatting.git cd gaussian-splatting ``` #### 编译 C++ 组件 进入克隆下来的目录后,编译所需的 C++ 插件模块: ```bash mkdir build && cd build cmake .. make -j$(nproc) ``` 这一步骤会生成执行文件和其他必需的支持文件。 #### 准备数据集 如果打算测试自采集的数据集,在此之还需要做额外的工作来处理这些原始图像序列或者点云数据,使其能够被算法所接受。具体方法可以参见相关文档说明[^3]。 #### 测试运行 最后,尝试启动示例程序验证整个流程是否正常工作: ```bash python3 main.py --config configs/example.yaml ``` 以上就是在 Ubuntu 平台上部署 3D Gaussian Splatting 技术的大致过程概述。需要注意的是,不同硬件配置可能会遇到不同的兼容性和性能优化问题,所以在实践中可能还需进一步调试参数设置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值