NeRF和3DGS原理详细

一、传统三维表征方法

1.1 显示表征

在这里插入图片描述

补充:

  • 多边形网格:明确的拓扑关系,便于可视化,内存占用低;非结构化网格生成难度高;
  • 体素:难以支撑高精度、大规模场景重建;
  • 点云:易获取(可直接通过激光雷达深度相机采集),无需复杂预处理;缺乏拓扑关系,难以直接表征孔洞遮挡等表面连续性关系;噪声,数据缺失;存储计算效率低。
    在这里插入图片描述

1.2 隐式表征

在这里插入图片描述
蓝色三角形:相机的视场范围
绿色:物体截面;

二、NeRF(Nerual Radiance Field)

2.1 NeRF场景表示

思想:将场景表达为与空间信息相关的可优化的函数,并通过优化方法拟合该函数。

在这里插入图片描述

函数输入:采样点位置+观测方向,五维向量;
函数参数化为一个全连接的深度神经网络,将输入信息处理后输出相应空间位置的体素密度以及依赖观测方向的RGB颜色;
再利用提渲染技术将颜色俺体素密度沿相机光纤进行积分渲染相应像素的颜色,此渲染过程可微,像素颜色真值已知;所以可通过最小化所有相机射线渲染颜色与真实像素的误差来优化此全连接网络,即场景的表示。

在这里插入图片描述

在这里插入图片描述

2.2 NeRF训练流程

观测角度也做自变量原因:不同角度的光影有区别变化。
在这里插入图片描述
1)光线采样
对于每张训练图像中的每个像素根据相机位姿生成一条从相机中心穿过该像素的光纤,随后沿光线在近处远处截断平面之间均匀或分层采样多个3D点。

2)神经网络预测

将每个采样点的3D坐标以及观测方向输入多层感知机MLP,输出该位置的集合不透明度和从观测方向看到的颜色。

3)体渲染
沿光线积分3D点的密度和颜色合成2D像素颜色(此过程可微,公式中仅包含+、-、exp三种可微运算,为后续可优化提供条件)。

4)损失计算与优化
计算渲染像素颜色与真实像素之间的均方误差,并通过梯度下降的方法更新MLP参数逐步最小化损失函数。

2.3 NeRF体渲染

NeRF体渲染(Volunme Rendering)公式理解
在这里插入图片描述
包含两个部分:(1)射线上颜色的积累;(2)射线上各采样点的累计不透明度

  • 累计透射率
    在这里插入图片描述
    穿过推土机密度场和辐射场的一条射线从tn出发射向无穷远tf处,该射线传播到多远处会停止?

在这里插入图片描述

  • 颜色累计
    在这里插入图片描述
    在这里插入图片描述
    o:坐标原点;d:描述射线方向的单位向量

在这里插入图片描述

核心思路:假设在两个采样点之间的密度颜色都是均匀且固定的,采样间隔相距越小最终累计颜色越精确。

在这里插入图片描述

2.4 NeRF位置编码

在这里插入图片描述

类似vision transformer,像素坐标(x,y)输入网络之前,利用三角函数对其进行类似傅里叶变换操作。
与VIT不同之处在于,VIT进行位置编码是使网络能够注意到图像块之间的相对位置信息。NeRF是为了带训练优化的场函数mlp可以更好地拟合高频信息,更具体讲,神经网络对于相近的输入有着相近的输出,现实中,观测位置的小变化也会引起观测结果的细节存在巨大改变。神经网络可能会以一种偏向于平均的方式进行拟合,反映到渲染结果会形成模糊笑果。引入位置编码将位置与视角方向映射到高维且高频空间后,再作为神经网络输入,此时微小的输入变化也会引起编码结果的巨大变化,间接提高了神经网络的输出对于输入微小变化的敏感度。

2.5 NeRF体素分层采样(Volume Hierarchical Sampling)

在这里插入图片描述
普通情况下密度场中存在大片空白区域,若采用均匀采样,极有可能导致在信息密集的区域采样不足,而在无信息的空白区域过度采样,极大浪费资源(网络训练过程中会对空区域进行过度拟合)。

故采用多层级采样。

首先大尺度采样,判断密度场的密度集中区域;
再对密度集中区域进行精细采样。
最终采样结果包含两个部分:粗采样和精采样。

2.6 NeRF网络结构

在这里插入图片描述
全连接+Relu激活层。
位置编码后的位置量→5层网络编码→再次将位置信息接入到第5层的激活层之后(避免多层编码后网络对于原始位置信息的遗忘)→3层全连接,输出256维的特征向量,解码该向量可计算出采样点的体素密度;此处对于密度的计算只考虑采样点的未知量,对颜色的计算需要考虑未知量和观测视角方向;即在第9层会将前8层编码的特征向量与经过位置编码的视角方向进行串联→随后经过128维的全连接层→最后输出网络预测的在相应空间位置与观测视角相关的采样点颜色。
其中位置编码后的坐标由原来的三维升维到60维,视角方向编码由2维升到24维。

2.7 NeRF总结

在这里插入图片描述

2.8 NeRF相关研究

在这里插入图片描述
在这里插入图片描述

Nvidia提出,NeRF研究工作者集大成之作。
在这里插入图片描述

三、3DGS

3.1 3DGS"显示"三维特征

在这里插入图片描述

  • 1、各向异色的3DGS经过训练后仍然保留了原始的三维几何信息,NeRF不具备,因为NeRF的渲染是通过对神经辐射场中的采样点经过MLP解码实现,其实际上是将三维点的位置信息隐藏在了训练好的MLP中,不利于直观理解。
    3DGS重建场景放大可看到很多半透明椭球叠加,可从细节上拟合细节处纹理,进而展现逼真渲染效果。

在这里插入图片描述

  • 2、NeRF是依赖黑盒式神经网络构建依赖关系。

3.2 3DGS原理介绍

在这里插入图片描述

  • 将3DGS重建场景投射到不同视角的相机平面,颜色形状均都是不同的。其中形状的各向异性,是由于它本身是一个三维椭球而非正球体;颜色的各向异性则是通过球谐函数实现。
  • 可实现快速的抛雪球渲染与反向传播。抛雪球计算机图形学中经典概念,把三维点视作雪球朝相机平面进行泼洒,雪球在平面扩散开,当有很多大大小小不同形状、颜色各异的雪球进行泼洒和叠加时便形成期望渲染的图像。这种方法无需像NeRF一样进行光线采样。这是3DGS比NeRF更快的主要原因之一。另外,这样的抛溅过程显示可微,因此3DGS源码无论在前向渲染还是梯度反向传播阶段均利用cuda手动计算而非深度学习中常用的pytorch自动求梯度的方式。
  • 根据反向传播计算出的梯度,自适应调整3DGS的数量。若空间某一处的3DGS太大,无法拟合高纹理区域的细节,则像细胞一样分裂成两个或多个。

在这里插入图片描述

  • 首先从一组图像中恢复出场景的系数点云和相机位姿,这一过程通常是通过colmap实现。
  • 利用点云初始化3DGS,即赋予其初始的颜色、尺寸、不透明度等属性。
  • 利用相机内外参将3DGS投影到相机平面
  • 利用可微的光栅化方法渲染得到一张图像。有了图像后即可与相应的真值图像进行比对,计算损失函数。并沿蓝色箭头反传梯度。
  • 梯度两个作用。其一,用来更新3DGS的属性值,即上方蓝色箭头传播方向;其二,用来指导自适应密度控制,通过对梯度进行一定的阈值判断来决定各个3DGS到底是分裂克隆还是删除。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二维高斯分布大体呈现椭圆形状,离椭圆中心越远的地方数值越小。
均值和方差依旧用来控制概率分布的中心位置与形状;增加的相关系数ρ控制该分布的旋转角度。

在这里插入图片描述
三维高斯分布类似一个椭球,椭球在三维空间中的位置由均值决定,形状和姿态由协方差矩阵决定。
考虑到标准三维高斯分布的形状是正球体,而任意圆球都可以通过仿射变换变为椭球,所以实际上协方差矩阵就是从标准高斯分布到任意高斯分布的仿射变换,因此可将协方差矩阵进一步拆解为尺度矩阵与旋转矩阵的组合形式。
在这里插入图片描述
R为旋转矩阵,一个行列式唯一的正交矩阵;
S为尺度矩阵,一个三维的对角矩阵,对角线的元素对应椭球三个主轴的缩放尺度。
此处协方差矩阵的拆解还有另一个好处,高斯分布要求协方差矩阵式半正定的,但随着训练优化的不断进行,直接对协方差矩阵做梯度下降时无法保证这一特性,而将其进行拆解为缩放和旋转矩阵即有效保证协方差矩阵的半正定性。

更详细数学推导可见博文:场景重建——3DGS重建和闭环仿真相关概念综述

除了位置和形状,3DGS还具备颜色和不透明度(此处和NeRF一致)。

  • 颜色
    在这里插入图片描述
    球谐函数,一组定义在球面上的特殊函数。在计算机图形学领域,通常用它来表示近似的光照或颜色的分布。
    阶数l为0时,止呕一个球谐基且为常数,也就是说无论输入的方式是什么永远返回一个固定颜色;当阶数升高时,对应球谐系数变多,且数值依赖于输入的视角方向,这就意味着可以用它来实现各向异性的颜色表示。
    在3DGS源代码中,初始球谐函数阶数设为0,随着训练优化过程的进行,逐步增加到3,初始设为0是由于在训练初始阶段相较于3DGS的颜色,其位置信息更能影响渲染质量。因此为了提高训练效率,在初始阶段会将球谐函数阶数设为0。最终增长到阶数3后不会再继续增长,因为一般情况下,三阶的球谐函数已可以拟合绝大多数场景的各向异性的颜色细节。

3阶情况下,各个球谐基的具体公式:在这里插入图片描述
一共16个球谐基,每一组球谐基对应RGB3原色中的一个,为了形成最终的颜色,需要训练的球谐系数16*3=48个。

3DGS模型需要优化的属性值。

在这里插入图片描述
在优化过程中,算法会根据反传回来的梯度,也就是损失函数相对于以上各个属性的偏导数不断更新迭代这些变量。

3.3 3DGS前向渲染

3.3.1 坐标系变换

在这里插入图片描述
传统图形学渲染管线中,坐标系变换用于将世界坐标系中的3D位置信息映射到图像空间,这个流程主要由三部分组成:

  • 相机变换,刚体变换,一般通过旋转矩阵与位移向量将物体从世界坐标系转换至相机坐标系。

  • 投影变换,相机空间中的点映射到xyz三个坐标范围都在-1~1之间的立方体中,该立方体被视为规范化视图体积,即NDC标准化坐标。
    在针孔摄像模型假设前提下,所以实际上存在一个如下上方视椎体,在该视椎体里,发射的光线并不是平行的,在原始NeFR中不存在次问题,因为NeRF本来就是从每条不同方向的光线上进行采样,再通过查询的方式来确认相应坐标的采样点的属性等。
    但在3DGS中,每次都计算不同方向的射线和哪些高斯椭球有接触是比较麻烦的,所以希望能在一个对于不同光线都是平行的空间里完成这一步骤,如此,便不需要每次都计算光线和高斯是否接触。
    在这里插入图片描述

  • 视角变换,viewpoint transformation。用来将NDC标准立方体沿Z轴压扁,并将得到的22正方形映射到WH的屏幕空间。

与传统SLAM不同在于,传统视觉SLAM在做完世界坐标系to相机坐标系的转化后会利用内参矩阵直接将三维点投影到相机的归一化平面。

椭球投影到平面

在这里插入图片描述
Σ:3DGS的三维协方差矩阵。
Σ:投影到2D屏幕后的二维协方差矩阵。
W:从世界坐标系到相机坐标系的转换矩阵,即相机变化。
J:投影变换的一阶导数,即雅克比矩阵。

大致思路:三维椭球体经过仿射变换后投影到二维平面,呈现的不一定是椭圆,而是如图右侧呈现出局部被扭曲的形状,而为了后续方便计算,希望投影结果仍然是一个椭圆形,也就是继续用二维协方差矩阵表示。
所以需要采取一定的近似方法,便引入了对投影变换的局部反射近似。其本质是对该过程进行一个一阶泰勒展开。
通过以上过程,即可获知将3D高斯泼溅到屏幕所产生的2D高斯位置信息。

3.3.2 颜色渲染(alpha-blending)

在计算颜色之前,需要首先计算泼溅的2DGS在屏幕上会影响哪些像素,而被影响的像素应该呈现怎样的透明度呢?

在这里插入图片描述

论文中利用高斯分布的在这里插入图片描述原理,即服从正态分布的随机变量有99%或几乎所有的观测值都会落在均值正负3三个标准差的范围范围内。

具体来说,首先以均值为中心,取2D高斯的长轴,即较大的标准差,它的三倍为半径做圆,以此划定高斯分布对周边的影响范围。距离2DGS中心越远的像素其透明度也应该越低。

随后通过alpha-blending渲染,给定任意像素位置,可通过前面讲的投影变换计算出像素与所有影响到它的3DGS的距离,即这些高斯的深度。目的是形成一个经过排序的高斯列表。便可以利用alpha-blending的方式来计算该像素的颜色。

N高斯点颜色的加权和就是该像素最终的颜色C。α是最终的不透明度,它是通过3DGS的不透明度和2D高斯的概率分布密度决定,对应物理含义为高斯点在概率密度越低的地方越不可见。
逐像素渲染较慢。

3.3.3 按图像块Tile并行化渲染

在这里插入图片描述
为了实现快速光栅化而做的并行化操作。

为了降低为每个像素计算有序列表的计算成本,3DGS将精度从像素级别转移到块级别。如上图图(b)所示,3D高斯最初将图像划为多个不重叠的图像块,这些图像块在论文中成为Tile。每个块包含16*16像素。

3DGS进一步确定哪些图像块与这些投影的高斯,也就是2D椭圆相交。考虑到一个投影的高斯可能覆盖多个块,一种合理的方式是复制高斯,为每个副本分配一个标识符即块的ID。
复制后如图(c)所示,3D高斯会将各自的块ID与每个高斯视图变换得到的深度值结合,得到一个未排序的字节列表,其中高位代表块ID,低位表示深度。如此,排序后的列表就可直接用于渲染,如图(c)和图(d)所示。

每个块和像素的渲染都是独立进行的,因此这一过程非常适合并行计算,这样做的另一个好处是每个块的像素都可以访问一个公共的共享内存,并保持一个统一的读取系列,从而提高渲染的并行执行效率。

至此已可以利用3DGS渲染出建模后的三维世界的图片,再计算其与真实图片的差异,也就是loss function,见下节。

3.4 3DGS优化训练过程

反向传播梯度:更新优化3D高斯的均值、协方差矩阵、不透明度和球谐函数并指导3D高斯群体的自适应密度的控制策略。
在这里插入图片描述
D-SSIM:基于结构相似性的损失函数,同时考虑深度信息,可以衡量两个图片在结构亮度对比度上的相似性。

自适应密度控制策略包括三种:
在这里插入图片描述

  • 每100次迭代会删除几乎透明的高斯点,不透明度α小于一定阈值的3D高斯;克隆一个相同大小的副本,并沿着位置梯度方向进行摆放;分裂可能会导致密度不合理的增加,所以采用4,每迭代3000次,重置不透明度。

3.5 3DGS相关研究

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.6 3DGS相关研究点

在这里插入图片描述
up主讲得很好:3DGS原理

### 3DGS 原理中的协方差矩阵解释与应用 #### 协方差矩阵的定义性质 协方差矩阵是一个重要的统计工具,在多维数据处理中扮演着核心角色。对于三维高斯分布(3DGaussian Splats),协方差矩阵不仅描述了各维度间的线性关联程度,还决定了其形状特征。该矩阵是对称正定阵,意味着它可以被分解成旋转平移两部分[^1]。 #### 几何意义 当应用于3D场景时,协方差矩阵能够决定一个椭圆体的方向、大小以及轴的比例。具体来说: - **方向**:由旋转矩阵\( R \)来表征,它负责调整椭球沿不同坐标轴的角度位置; - **尺度变化**:通过缩放矩阵 \( S \) 实现,这影响到各个主轴上的长度伸展情况; 这种特性使得协方差矩阵非常适合用来建模具有复杂结构的对象表面细节或动态物体运动轨迹等情形下的不确定性区域[^2]。 #### 应用于3D Gaussian Splatting (3DGS) 在3D Gaussian Splatting技术里,每一个采样点都被赋予了一个对应的Gaussian模型,其中心位于该点处,而散布则依赖于局部邻域内的像素强度差异等因素构建而成的协方差矩阵。这样做的好处是可以更精确地捕捉并重现目标物的真实外观属性,比如颜色过渡平滑度、边界清晰度等等[^3]。 ```python import numpy as np def create_covariance_matrix(sigma_x, sigma_y, sigma_z): """ 创建一个代表3D空间内某一点周围不确定性的协方差矩阵 参数: sigma_x : float - X轴的标准偏差 sigma_y : float - Y轴的标准偏差 sigma_z : float - Z轴的标准偏差 返回值: cov_mat : ndarray - 形状为(3, 3) 的numpy数组表示的协方差矩阵 """ # 构造对角线上分别为三个标准差平方的对角矩阵作为初始状态 diag_elements = [sigma_x**2, sigma_y**2, sigma_z**2] cov_mat = np.diag(diag_elements) return cov_mat ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我宿孤栈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值