3D Gaussian Splatting学习

总体框架

新视角生成:3D Gaussian Splatting for Real-Time Radiance Field Rendering (SIGGRAPH 2023)
在这里插入图片描述
算法流程:3D高斯表示(利用从相机校准过程中生成的稀疏点进行初始化)—>优化高斯属性(包括位置、不透明度、各向异性协方差和球形谐波系数)—>高斯密度自适应控制(增加或减少高斯球数量)—>快速可微分栅格化器(渲染)

Contributions:

  1. 引入一种各向异性的3D高斯进行高质量、非结构化的辐射场表达
  2. 快速可微的渲染,允许各向异性的抛雪球和快速反向传播
  3. 针对高斯特性的优化方法与自适应密度控制

3D高斯表示

3D高斯在三维空间中表现为椭球形(每个高斯分布都覆盖整个空间,等高线是椭球),描述该椭球形需要知道以下参数(均可微):三个轴的轴长和三个方向(由高斯函数协方差矩阵中的9个参数描述)、球谐函数(拟合视角相关的外观)和不透明度。

本文用截断的3D高斯椭球显式描述场景(在概率积分99%的等高线截,一个中心透明度高周围透明度低的椭球),既保留了连续体积辐射场的理想属性以进行场景优化,又避免了在空白空间中进行不必要的计算。

3D高斯椭球的位置初始化:录一段视频或者拍一组不同角度的照片,用一些技术(例如SfM)估计点云。或者直接随机初始化一组点云。

SfM算法

输入:同一物体五张不同角度的图片
输出:初始的点云
算法流程:

  1. 特征检测和匹配:使用SIFT算法检测每张照片中的特征点,并在相邻照片之间匹配这些特征点。
  2. 初始相机姿态估计:从两张照片开始,利用基础矩阵或本质矩阵估计相机的相对姿态。
  3. 三角测量:根据初始估计的相机姿态和特征点匹配结果,计算出建筑物的三维点云。
  4. 增量式重建:逐步加入剩余的照片,更新三维点云和相机姿态,最终得到完整的建筑物三维模型。
  5. 全局姿态优化:优化所有照片的相机位置和三维点的位置,以最小化重投影误差,得到更精确的三维结构。

球谐函数

球谐函数是一组定义在球面上的正交函数基(任意一个函数都可以描述为基函数的加权和,基函数越多,表达能力越强)。
在这里插入图片描述
若采用J=3的三阶球谐函数,则一个高斯球有(7+5+3+1)*3=48个参数。

Splatting

各向异性(anisotropic):指的是从各个方向上看过去,物体的外观表现都不同。

抛雪球(splatting):一种计算机图形学中用三维点进行渲染的方法,该方法将三维点视作雪球往图像平面上抛,雪球在图像平面上会留下扩散痕迹,这些点的扩散痕迹叠加在一起就构成了最后的图像,是一种针对点云的渲染方法。本文指借助相机外参将这些椭球体沿着特定的角度投影到对应位姿所在的投影平面上。(渲染速度比NeRF更快的重要原因之一)

如何将3D高斯球投影到图像平面:利用相机参数进行线性仿射变换,具体参考[1]:

  1. 从世界坐标系到相机坐标系:
    在这里插入图片描述
    在这里插入图片描述
  2. 从相机坐标系到图像坐标系
    在这里插入图片描述
    在这里插入图片描述

快速可微分栅格化(Tiled-based Rasterizer)

该系统的渲染方法为Tiled-based Rasterizer,本质是基于画家算法的α-Blending,其流程为:

  1. 将整个图像划分为16*16像素大小的bins,并计算每个执行度大于99%的Gaussian点(99%必须投影到当前图像)所处的bins和相对视平面的深度;
  2. 在渲染时,要考虑遮挡关系,因此必须对Gaussian点按照其与相机的距离(深度)进行排序,为每个bin创建一个splats列表,和这个bin相交的所有Gaussian点在这个list里面从近到远依次存放;
  3. 并行地在每个bin上splat,即对每一个bin中的像素执行α-Blending:
    (1)计算list里下一个高斯点在当前像素投影出的颜色和α值
    (2)将颜色与frame buffer中的颜色混合
    (3)将α与透明度buffer中的透明度值相加,如果透明度值大于阈值则退出计算

P.S. 一个椭球体投影到平面上会得到一个椭圆(代码实现时其实是以长轴为直径的圆),然后通过计算待求解像素和椭圆中心的距离,我们可以得到不透明度(离的越近,说明越不透明,用Sigmoid函数限制在[0,1)之内)。每个椭球体又各自代表自己的颜色,这是距离无关的。于是就可以进行alpha compositing,来合成颜色。快速的对所有像素做这样的计算被称作”快速可微光栅化“。
在这里插入图片描述

密度自适应控制

根据梯度自适应调整点云分布:

  1. 需要增加Gaussian点的情况:
    (1)“欠重建”(under-reconstruction)区域:位置梯度很大但方差很小的Gaussian点—>缺少Gaussian点—>对点云进行clone,再沿位置梯度进行移动;
    (2)“过重建”(Over-reconstruction)区域:位置梯度很大且方差很大的Gaussian点—>每个Gaussian点覆盖范围很大—>split,减小这个Gaussian点的值,再复制这个Gaussian点,再沿位置梯度进行移动。

  2. 需要减少Gaussian点的情况:
    (1)每100次迭代移除不透明度小于阈值的点;
    (2)周期性地将所有Gaussian点的透明度设为0,(正常的点在之后的迭代过程中会回归),以除掉离相机比较近的floaters;禁用点的增减和移动功能,仅对Gaussian点的参数进行一段时间训练,有些Gaussian点会在训练过程中变大,盖住其他点或者盖住相机,删除这些点;训练完成后会有一些Gaussian点透明度仍然接近0,删除这些点。
    若一个点的3D高斯太大,无法完全拟合该处细节,就对该点进行分割,该处用两点来表达;若某处的点太密集,就将多个3D高斯合并为一个3D高斯。

训练过程

得到渲染图像Image后,将其与Ground Truth图像比较求loss(损失函数:L1+SSIM结构误差),并反向传播。一方面用随机梯度下降法更新3D高斯中的参数,另一方面在自适应密度控制中更新点云。可微光栅化部分的反向传播误差时按bin对高斯进行索引。

交错优化

需要优化的参数有:包括位置、不透明度、各向异性协方差、球形谐波系数和密度
高斯函数的协方差矩阵必须是半正定的,不能通过梯度下降法直接优化。因此作者把协方差矩阵按如下方式分解:
在这里插入图片描述
其中,S(scale)为对角阵,代表三个轴的长度;R(Rotation)为旋转矩阵。旋转矩阵也不能直接参与优化,所以用四元数将9个参数降到了4个。
在这里插入图片描述

论文
代码

参考1
Matthias Zwicker, Hanspeter Pfister, Jeroen Van Baar, and Markus Gross. 2001a. EWA volume splatting. In Proceedings Visualization, 2001. VIS’01. IEEE, 29–538.
参考2
参考3

### 实现 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 技术的大致过程概述。需要注意的是,不同硬件配置可能会遇到不同的兼容性和性能优化问题,所以在实践中可能还需进一步调试参数设置。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值