NeRF和3DGS
- 一、传统三维表征方法
- 1.1 显示表征
- 1.2 隐式表征
- 二、NeRF(Nerual Radiance Field)
- 2.1 NeRF场景表示
- 2.2 NeRF训练流程
- 2.3 NeRF体渲染
- 2.4 NeRF位置编码
- 2.5 NeRF体素分层采样(Volume Hierarchical Sampling)
- 2.6 NeRF网络结构
- 2.7 NeRF总结
- 2.8 NeRF相关研究
- 三、3DGS
- 3.1 3DGS"显示"三维特征
- 3.2 3DGS原理介绍
- 3.3 3DGS前向渲染
- 3.3.1 坐标系变换
- 3.3.2 颜色渲染(alpha-blending)
- 3.3.3 按图像块Tile并行化渲染
- 3.4 3DGS优化训练过程
- 3.5 3DGS相关研究
- 3.6 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原理