3D Gaussian Splatting学习笔记
从NeRF到3DGS
简述
简要回顾NeRF原理
神经辐射场(Neural Radiance Fields)是一种计算机视觉技术,是使用神经网络(MLP)来隐式的存储3D信息,用于生成高质量的三维重建模型。它利用深度学习技术从多个视角的图像中提取出对象的几何形状和纹理信息,然后使用这些信息生成一个连续的三维辐射场,从而可以在任意角度和距离下呈现出高度逼真的三维模型。
辐射场:
辐射场(Radiance Field)描述了光的传播行为。在三维空间中,对于任意一条光线(即起点和方向),场景中的每个点都可以计算出该光线在该点的辐射度。对于每个点,辐射场可以用一个颜色值和一个辐射度值来表示。颜色值指的是该点的表面颜色,而辐射度值指的是该点在光照下的明暗程度。通过在整个三维场景中计算光线的辐射度,可以生成高质量的渲染图像。
在NeRF(神经辐射场)中,辐射场的概念被扩展为在三维空间中对于任意一条光线,计算场景中的每个点在该光线方向上的颜色和密度。因此,NeRF的辐射场可以用来表示三维场景中的物体表面颜色和密度信息。利用这些信息,可以在任意角度和距离下呈现出高度逼真的三维模型。
显式的3D信息: 有明确x,y,z的值(mesh,voxel,点云…等)
隐式的3D信息: 无明确的x/y/z的值,只能输出指定角度的2D图片。
NeRF的输入输出
NeRF(神经辐射场)的输入是多个视角的图像和相机参数,输出是连续的三维辐射场。具体来说,输入是一组二维图像和相应的摄像机参数(包括相机位置和方向),输出是一个表示三维场景中每个点的颜色和密度的函数。
优缺点
NeRF技术的优点是生成的三维模型质量高、逼真度高,可以在任意角度和距离下呈现出真实的物体表面和纹理细节。此外,它可以从任意数量的输入图像中生成三维模型,而不需要对输入进行特定处理或标记。但是,NeRF技术也存在一些缺点,例如需要大量的计算资源和时间进行训练,且难以处理大规模的场景和复杂的光照条件。此外,由于NeRF是基于视图合成的技术,因此在生成模型时需要确保输入的视角足够广泛和充分,否则可能会导致模型中存在遮挡和空洞。
原理
NeRF技术通过将输入的多个视角的图像和相机参数组合起来,建立一个多层感知机(MLP)模型来表示场景中每个点的颜色和密度。在训练阶段,NeRF使用图像渲染技术将生成的三维场景渲染为二维图像,并与真实图像进行对比,以优化模型参数。NeRF模型的关键在于如何表示场景中每个点的颜色和密度。为此,NeRF使用了一种称为体积渲染(volume rendering)的技术。体积渲染将三维空间分成许多小的体素(voxel),并对每个体素中的颜色和密度进行插值。通过对所有体素进行插值,可以得到整个场景的颜色和密度值。
为了从二维图像生成用于NeRF模型的粒子,需要进行一系列的前处理步骤:
- 光线投射(Ray Casting):将每个像素的光线从相机的视点投射到三维空间中。这些光线通过相机的内参和外参计算得到。
- 采样点生成:沿着每条光线均匀地生成采样点。例如,从近平面到远平面之间生成64个均匀分布的采样点。
- 输入预处理:每个采样点的三维坐标和视角方向作为NeRF模型的输入。
(如图a所示,黑色的点就是粗均匀采样的点)
NERF的假设:
- 物体是一团自发光的粒子。
- 粒子有密度和颜色。
- 外射光和内射光抵消。
- 多个粒子被渲染成指定角度的图片。
粒子采集的原理
首先对于一个自发光的粒子的空间坐标为空间坐标 (x, y, z)。其发射出来的光线会通过相机模型。成为图片上的像素坐标(u,v)粒子颜色即是像素颜色。
通过将一条光线上的许多(无数)的点的这些视为向量,进行一个合成的操作,最终就可以的得到该条光线在输出图像上的像素值。将该参数值与真实的图像的参数值进行计算,就会得到我们的LOSS
我们的神经辐射场是将2d的输入表征为一个3d场景的过程。而我们的体渲染Rendering Volume是将3d场景下的许多点位给投射出一个二维图像的过程。
结构
NeRF(神经辐射场)的实现结构包括两个主要组件:编码器(encoder)和解码器(decoder)。
NeRF模型由两个类似的全连接神经网络组成:粗模型(Coarse Model)和细模型(Fine Model)。
编码器通常由卷积神经网络(CNN)组成,负责从输入的多个视角图像和相机参数中提取出场景中每个点的空间位置和视角特征。编码器中的每个卷积层都可以将输入数据从低维空间映射到高维空间,并提取出更复杂的特征表示。
解码器通常由多层感知机(MLP)组成,负责从编码器提取的特征中生成连续的三维辐射场。具体来说,解码器接受来自编码器的每个点的空间位置和视角特征作为输入,并输出该点的颜色和密度值。解码器中的每个MLP层都可以将输入数据映射到另一个高维空间,并提取出更复杂的特征表示。
在训练阶段,NeRF使用一组二维图像和相应的相机参数作为输入,并使用渲染方程将输入数据转换为三维场景。渲染方程用于计算从相机位置和方向发出的光线与场景中对象的相交点,并确定每个点的颜色和密度值。然后,NeRF使用神经网络逼近渲染方程,以最小化生成场景与真实图像之间的差异。
粗模型(Coarse Model):
输入:位置编码后的三维点坐标γ ( x ) 和视角方向 γ ( d )。
网络结构:包含8层,每层256个单元,激活函数为ReLU。在第4层之后,将中间特征与原始输入拼接(skip connection)。
输出:体积密度(不透明度) σ 和颜色 c ∈ ( R G B ) 。
细模型(Fine Model):
输入:来自粗模型的重要性采样点,位置编码后的三维点坐标 γ ( x )和视角方向 γ ( d )。
网络结构:与粗模型相似的多层感知机结构,但处理的是更加细化的采样点。
(粗细模型的结构是一样的,只是尺寸不太一样,粗模型处理的是64个采样点的输入,而细模型处理的是64+128=192个采样点的输入。其中,128是在粗模型中输出为高密度的地方进行二次采样的,也就是说这个地方有东西,多采样,重建效果更好)
如下图,左侧是粗模型,右侧是精细模型。
- 8层全连接层
- 半路再次输入位置坐标
- 后半路输出密度の
- 后半路输入方向视角
- 最后输出颜色RGB
训练方法
- 从数据集中采样一批相机光线(batch_size=4096)
- 使用分层采样查询粗略点和精细点
- 使用体渲染公式计算光线的颜色
- 计算渲染图像和真实图像像素之间的平方误差
3D Gaussian Splatting
- 通过sfm获取初始化稀疏点云(采样点)
- 基于初始化点云生成3d高斯椭球集
- 投影到图像平面
- 光栅化
- 渲染
- loss对比迭代
- 基于梯度自适应改变点云的分布方式
3DGS过程
下图左上角的图片为sfm离散的稀疏点云,右上角图片为计算出高斯椭球中心点之后的图像,但是此时还没有高斯椭球还没有旋转和形状的, 右下角是加入形状和旋转后的图像,但是此时还没有不透明度,左下角是加入不透明度的图像,此时达到最逼真的画面。
为什么选择3D高斯椭球?
很好的数学性质:
仿射变换后高斯核仍然闭合
3D降维到2D后(沿着某个轴积分)仍然为高斯
sfm初始化稀疏点云
优化从稀疏sfm点云开始,创建一组三维高斯分布。
多视角图片通过colmap计算相机之间的位姿变换,创建一个初始化点云。
3D高斯椭球集的创建——位置和形状
3D高斯椭球集的创建——颜色和不透明度
颜色信息:点云颜色–使用球谐函数来表示,使得点云在不同角度呈现不同的颜色,并有利于提高迭代的效率。
球谐函数: 可以类似看作一个多项式拟合(泰勒展开)
例如:f(x) = ax^3 + bx^2 + cx^1 + dx^0是三次多项式拟合,共有4个参数,可以把 x^2, x^2, x^1, x^0视作构建三次多项式函数的基函数
也类似傅里叶级数的展开,分别用sin和cos作为基函数的组合可以近似你和不同的周期函数。
如下图红色线段:
当M=0时,y=ax^0
当M=1时,y=ax^1 + bx^0
当M=2时,y=ax^2 + bx^1 +cx^0
当M=3时,y=ax^3 + bx^2 +cx^1 +dx^0
可知:随着函数的阶数越高,表达的信息更加丰富
未完待续…