3D Guassian Splatting

Alt text 上图为整个系统的示意图,系统首先对SfM点云进行初始化,得到3D高斯,然后借助相机外参将点投影到图像平面上(即Splatting),接着用可微光栅化,渲染得到图像。得到渲染图像Image后,将其与Ground Truth图像比较求loss,并沿蓝色箭头反向传播。蓝色箭头向上,更新3D高斯中的参数,向下送入自适应密度控制中,更新点云。

什么是3D高斯点染

每个高斯图像可由以下参数来描述:

  • 位置: 所在位置 (XYZ)

  • 协方差: 缩放程度 (3x3 矩阵)

  • 颜色: 颜色 (RGB)

  • Alpha: 透明度 (α)

Alt text

3DGS是一个非常厉害的技术,为了先有一个笼统的认知,我们可以简单将其概括为如下几步:

  • 录一段视频或者拍一组不同角度的照片,用一些技术(例如SfM)估计点云。或者直接随机初始化一组点云。

  • 点云中的每一个点,代表着一个三维的高斯分布,所以除了点的位置(均值)以外,还有协方差,以及不透明度,以及颜色(球谐系数)。直观可以理解为一个”椭球体“。

  • 将这些椭球体沿着特定的角度投影到对应位姿所在的投影平面上,这一步也叫“splatting“,一个椭球体投影到平面上会得到一个椭圆(代码实现时其实是以长轴为直径的圆),然后通过计算待求解像素和椭圆中心的距离,我们可以得到不透明度(离的越近,说明越不透明)。每个椭球体又各自代表自己的颜色,这是距离无关的。于是就可以进行alpha compositing,来合成颜色。然后快速的对所有像素做这样的计算,这被称作”快速可微光栅化“。

  • 于是可以得到整个图片,再和ground truth比较,得到损失,然后梯度反传,随机梯度下降,进行优化。 Alt text

SFM

https://colmap.github.io/index.html https://github.com/colmap/colmap

3D Gaussian

Gaussian

1D 高斯 Alt text 3D 高斯 Alt text Alt text

各向异性(anisotropic)

指的是从各个方向上看过去,物体的外观表现都不同。

抛雪球(splatting)

一种计算机图形学中用三维点进行渲染的方法,该方法将三维点视作雪球往图像平面上抛,雪球在图像平面上会留下扩散痕迹,这些点的扩散痕迹叠加在一起就构成了最后的图像,是一种针对点云的渲染方法。

Structure-from-Motion(SfM)

COLMAP stands for “Structure from Motion” (SfM), which is an algorithm used to reconstruct the 3D structure of objects and camera poses from multi-view images of the same object taken from different angles. Alt text Incremental Structure-from-Motion pipline Alt text https://demuc.de/papers/schoenberger2016sfm.pdf

协方差

协方差(covariance)是两个变量的相关性度量,可以用来描述两个变量是否存在线性关系。方差是用来度量单个随机变量的离散程度,而协方差则一般用来刻画两个随机变量的相似程度,其中,方差的计算公式为 Alt text 其中,n 表示样本量,符号 \bar{x} 表示观测样本的均值,这个定义在初中阶段就已经开始接触了。 在此基础上,协方差的计算公式被定义为Alt text

球谐函数(Spherical Harmonics)

在机器学习中,球谐函数可以用来表示球面上的特征,可以用于训练机器学习模型。协方差可以用来描述两个特征之间的相关性,可以用于选择特征、评估模型等 Alt text Alt text 当SH的系数用的越多,那么表达能力就越强,跟原始的函数就越接近 Alt text Alt text Alt text Alt text Alt text

Repo

Installation

Cuda Download Visual Studio 2019 with Desktop C++ Anconda

conda env list
conda info --envs
conda config --show channels
conda config --add channels pytorch
conda config --add channels nvidia
conda config --add channels conda-forge
conda remove -n gaussian_splatting --all

SET DISTUTILS_USE_SDK=1 # Windows only
conda create --name gaussian_splatting python=3.11.5
conda activate gaussian_splatting
conda install pip=22.3.1
conda install tqdm
conda install plyfile=0.8.1
pip install torch-2.0.0+cu118-cp311-cp311-win_amd64.whl
pip install torchaudio-2.0.1+cu118-cp311-cp311-win_amd64.whl
pip install torchvision-0.15.1+cu118-cp311-cp311-win_amd64.whl

pip install ninja
pip install .\submodules\diff-gaussian-rasterization\

conda deactivate

Prepare Images

ffmpeg -i {video} -vf fps={fps} %05d.jpg

python.exe .\convert.py -s .\datasets\truck\ –colmap_executable .\tool\COLMAP-3.8-windows-cuda\COLMAP.bat

python.exe .\train.py -s .\datasets\truck\ -m .\datasets\trained-model\

python.exe .\train.py -s .\datasets\truck\ -m .\datasets\trained-model\ –data_device cpu –debug_from 0 –densify_from_iter 0 –densification_interal 1

Reference

FAQ

  • python -m pip uninstall pip==20.0.2

  • git submodule update –init –recursive

  • git submodule update –init –recursive –force