slam系列4:nerf和3dgs

常用的3维表示法:

NeRF属于是density的模型,模型的参数如下:

传统的 3D 模型表示方法,如 离散的Mesh 和点云,以及连续的 Nerf,通常面临着一个主要问题:随机采样过程中产生的噪声,这直接影响了渲染质量。3DGS 是在离散和连续间的一个平衡:在高斯球内部是连续的、可微的;在整个空间中,每个高斯球又是离散的。

1. NeRF基本概念

1.1 建模方法

训练一个函数,将位置和摄像头参数转化为颜色和体密度

然后使用体渲染技术,生成图片:

神经网络是用了一个9层256通道的全连接MLP,姑且算是神经网络。训练过程如下:

1.2 Instant NGP

Instant NGP相对于NeRF的核心改进在于它采用了"多分辨率哈希编码" (Multi-resolution hash encoding) 的数据结构。

你可以理解为 Instant NGP 把原始 NeRF 中神经网络的大部分参数扔掉,换成一个小得多的神经网络;同时额外训练一组编码参数 (feature vectors),这些编码参数是存储在网格的顶点上的,这样的网格一共有 层,它们按照分辨率从低到高,用于学习场景不同层次的细节。在每次训练时,小神经网络的参数和每层网格上只有点周围的 8 个顶点中的编码参数会被更新。

Instant NGP 的另一个重要的工程优化是将整个网络实现在一个 CUDA kernel 中 (Fully-fused MLP),使得网络的所有计算都在 GPU 的 local cache 中进行。据论文所称这会带来 10x 的效率提升。

2. 3dgs

2.1 建模方法

3D Gaussian Splatting 干了什么:使用3D Gaussian球表示三维模型,并通过 Splatting 技术渲染出来。

在 NeRF 里去表达一个三维场景的信息时,使用的是三维场景的点和它的体密度值σ、颜色C。3DGS内不再用点表达,而是使用 3D 高斯组件替代了点,所以在空间中的表达是一堆堆的3D高斯。这些3D高斯的信息没有保存在神经网络里,而是存在了硬盘上,所以它是一个显式的表达场景。

3D高斯体参数包括:

2.1.1 谐波函数

球面谐波是一种类似高斯展开的在极坐标系上的函数,用来拟合空间体

作为对比,我们来看另一种球面高斯函数:

和SH定死的基函数相比,SG的特点就是自由度极高:基函数用几个、怎么分布、胖瘦如何,都随意。然而SH也有很多长处是SG没有的,比如SH除了正交性还有旋转不变性。

反馈到实际高光计算上,就会发现SG不能很好地保持高光形状。基函数定义方向上的高光形状能保持的比较好,但如果位置在几个基函数的角度之间,高光形状就会比较散了。

2.1.2 协方差

协方差用于控制高斯体各方向的尺寸。

2.1.3 splating

Splatting是一种传统的3D->2D的光栅化渲染方式。

3DGS首先将这些3D高斯投影到基于像素的图像平面上,这一过程被称为"splatting"。然后,3DGS对这些高斯进行排序,并计算每个像素的值。

给定像素位置 x x x,通过视图变换 W W W,可以计算与所有重叠高斯体的距离,即这些高斯体的深度,形成高斯体的排序列表 N N N。然后,进行Alpha Blending,也就是混合 alpha 合成来计算整体图像的最终颜色:

2.1.4 α blending

多个高斯体splat到平面上,最终形成的图形需要使用α blending进行叠加。

2.1.5 光栅渲染

2.2 初始化点云

初始化时的输入量使用的是 COLMAP 等 SFM 方式输出的点云,这里与 NeRF 就完全不同了,NeRF 使用的 仅是 COLMAP 等输出的相机位姿,而 3DGS 中,这些点云是有用的。3DGS 将根据这些点云进行初始化:基于这些点云的位置,会在每一个位置上放置一个高斯球,系数随机。

2.3 训练过程


3DGS 从近到远每个球投下来以后都形成了一个图像区,那么在重叠区域就可以进行光栅化的融合了。每个点都进行融合以后就可以得到图像。为了避免为每个像素推导高斯系数的成本计算,3D GS将精度从像素级转移到patch级细节。每个瓦片包括16×16个像素。3D GS进一步确定哪些tiles与这些投影的高斯图相交,然后按照tile进行排序,最后并行地对tile进行计算:

NeRF 内逐像素进行计算,即采集一个 batch 的像素,送进去训练,然后输出损失;而在 3DGS 内,每次采集一小批图,以图像为单位进行损失计算。

训练图中,上面的分支更新 3D 高斯椭球体的属性,下支实现 3D 高斯椭球体的克隆和分裂等:


3. 软件

通用软件splatviz,见https://github.com/Florian-Barthel/splatviz。支持实时编辑和分析。通过利用Python GUI库pyimgui,splatviz能够在渲染前直接操作高斯对象,从而实现无限的编辑和可视化可能性。

存储为ply文件,压缩文件为yml文件。

相关推荐
LeapMay14 小时前
3D Gaussian Splatting代码详解(一):模型训练、数据加载
人工智能·深度学习·3d
LeapMay14 小时前
3D Gaussian Splatting 入门
计算机视觉·3d
xhload3d16 小时前
掌控物体运动艺术:图扑 Easing 函数实践应用
大数据·3d·智慧城市·html5·webgl·数字孪生·可视化·数据可视化·工业互联网·轻量化·demo·hightopo·大屏展示·图形组件
贵州晓智信息科技19 小时前
Three.js Shader 与自定义材质—深入理解与应用
开发语言·javascript·3d·材质
Extraovo20 小时前
利用 Direct3D 绘制几何体—8.光栅器状态
c++·笔记·学习·3d
Extraovo20 小时前
利用 Direct3D 绘制几何体—10.几何图形辅助结构体
c++·笔记·学习·3d
zlyicheng1 天前
SOLIDWORKS 2025用户体验新功能
3d
zjj5872 天前
3D Gaussian Splatting学习日记
学习·3d
YesPMP平台官方2 天前
探索Unity:从游戏引擎到元宇宙体验,聚焦内容创作
3d·unity·游戏引擎·vr·动画制作·文娱场景
YesPMP252 天前
探索Unity:从游戏引擎到元宇宙体验,聚焦内容创作
3d·unity·游戏引擎·vr·动画制作·文娱场景