当前位置:   article > 正文

3D Gaussian Splatting for Real-Time Radiance Field Rendering 阅读笔记

3d gaussian splatting for real-time radiance field rendering

感谢B站意の茗的讲解。
论文地址:https://arxiv.org/abs/2308.04079
项目主页:https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/

概述

  • 从已有点云模型出发(sfm),以每个点为中心建立可学习的3D高斯表达,Splatting方法进行渲染,实现高分辨率实时渲染。(推动NERF加速方向)
  • 能用训练好的点云在windows上进行实时渲染。随机初始化点云,不提供初始点云也行,在训练过程中可以对点云进行生长和修剪。(一般NeRF需要从COLMAP计算相机位姿,此时已经得到初始点云。)
  • 用instant-NGP的速度,实现了mid-nerf360的渲染质量。
    在这里插入图片描述

总体介绍

1、文章简介(主要思想和贡献)

  • 引入了一种各向异性(anisotropic)的3D高斯分布作为高质量、非结构化的辐射场表达。
    从sfm点云出发,以每个点为中心生成3D高斯分布。
    各向异性:从各个方向上看过去长得都不一样,即把一个点往不同相机位姿上投影的时候投出的样子不一样。
  • 实现了使用GPU进行快速可微的渲染,允许各向异性的拋雪球(Splatting)和快速反向传播。
    抛雪球Splatting:图形学中用三维点进行渲染的方法,将三维点视为雪球往图像平面抛,雪球在平面留下扩散痕迹,这些点的扩散痕迹叠加在一起构成最后的图像。
    是一种方便的针对点云的渲染方法,是渲染速度比NeRF快的原因。
  • 提出了针对3D高斯特性的优化方法,并同时进行自适应密度控制。
    储存在点里的高斯函数,需要在反向传播的时候进行优化更新。根据梯度自适应调整点云分布(Adaptive Density
    Control部分)。 若某点3D高斯太大,不能拟合此处细节,则对其进行分割,用两个点表达。
    若某位置点太多太密集,用不到太多的3D高斯,则将这些吞并为一个3D高斯。

2、预备知识(3D高斯的公式推导)

  • 一维高斯分布的概率密度函数:x服从均值μ方差σ2的高斯分布
    在这里插入图片描述

  • 扩展到三维高斯分布的概率密度函数:假设a,b,c均服从0,1正态分布,且相互独立
    在这里插入图片描述

  • 对于一般的情况(注意粗体是向量,斜体是标量) 给出一个3*1向量x=[x,y,z]T,其中想,y,z可能并不是独立同分布,因此做线性变换。
    把均值不一定为0的,方差不一定为1(不满足上述N(0,1))的[x,y,z]T,变换到均值为μ方差为1的[a,b,c]T。 矩阵表示:
    在这里插入图片描述

    其中,均值向量的E(x)为x的均值。 (x-μ)表示x,y,z减去各自的均值,即将数据分布中心化。

  • 变换矩阵A对[x,y,z]进行线性组合,让[x,y,z]变成[a,b,c] 变换后带入到上式p(v)中,即
    在这里插入图片描述

  • 转化为x的概率密度函数 两边积分
    在这里插入图片描述

    dv换成dx:求雅克比矩阵,把dv里的v换成包含x的表达式
    在这里插入图片描述

    so,向量x的概率密度函数
    在这里插入图片描述

  • 1维高斯用均值和方差表示->多维高斯用均值向量(μ)和协方差矩阵表示。

  • 把变换矩阵A转化成协方差矩阵(对称矩阵,能进行特征值分解)。

  • 矩阵U的每一列都是相互正交的特征向量,单位向量。Λ矩阵对角线元素是协方差矩阵的特征值(矩阵论内容)。

    在这里插入图片描述

  • 一组正交基乘一个对角阵,构成线性变换
    在这里插入图片描述

  • 变换矩阵A=UΛ{1/2},协方差矩阵Λ=AT(UU^T=I)

  • 完整的3D高斯概率密度函数(椭球,形状有Σ决定)
    在这里插入图片描述

3、相关工作(point-NeRF和Plenoxels)

从CG角度,梳理了基于点的渲染方法
与NeRF相关的两个工作:

3.1 Point-NeRF:第一个用点云做NeRF的工作

在这里插入图片描述

  • 从点云出发构建辐射场(同3DGS),然后为每个点提取一个特征(特征向量),存储在点里。
  • 体渲染:从相机光心发出的穿透像素的采样射线,采样射线上取采样点,采样点周边一定范围内的三维点的特征向量被取出来之后做插值,得到采样位置的特征表达,将这个特征解码得到采样位置的颜色和体密度。堆叠整条射线上的点,得到像素RGB的值。(NeRF常见思路)
    3D高斯从CG出发,点里存储物理含义更加明确的3D高斯,避开了Point-NeRF对抽象特征的学习过程,从而让训练更加收敛
    渲染方面,3D高斯的Splatting更传统,效率更高。Point-NeRF浪费了点云携带的精确几何信息,存储的特征向量表征了点的空间信息,但插值,MLP之后可能会拟合出一个不符合实际情况的几何构造出来(空间信息储存在抽象特征中),不像高斯分布有明确的几何中心(三维点峰值,告诉系统这有很高的不透明度)。
    3D高斯比Point-NeRF,点云对整个模型起到的锚定作用更强,最大程度上用到初始
  • 点云表达的空间几何信息。 自适应点云生长和剔除

3.2 Plenoxels(没有神经网络的辐射场)

在这里插入图片描述

  • 同样继承很多NeRF要素(体素、三线性插值、体渲染)
  • 体素格点存储球谐函数(spherical harmonic)系数,系数做插值得到采样位置的球谐函数。
  • 抛弃了常用的MLP和隐式特征,用更显式的CG的球谐函数。3DGS同用传统但高效的方法,提高模型表达能力的下线,并结合可微和可学习思想,拉高模型拟合的上限。

具体方法

1、可微的3D高斯Splatting

1.1 每个点存储数据

  • Position(Mean):点的位置xyz,也是3D高斯分布的均值向量。
  • Covariance matrix:协方差矩阵,决定高斯(绿色椭球)形状和方向。
  • Opacity α :不透明度,用于渲染Splatting把它往图像平面上投的时候,扩散痕迹通过不透明度叠加在一起。
  • Spherical harmonics:球谐函数,拟合视角相关的外观。用一组正交基的线性组合来拟合光场。

1.2 为什么选择3D高斯

需要选择一种图元能够在拥有场景表达能力的同时可微,而且显式地支持快速渲染。3D高斯点云里的参数可以再迭代优化的过程中更新,并且能够容易地用splat的方法投影到2D图像,做很快的α混合(渲染)。
其他人构建辐射场的方法:把每个点视为带方向的小平面,但方向需要准确的表面法向量信息,难以从稀疏的sfm模型中得到精确地法向量。(3DGS不需要法向量)

1.3 3D高斯的定义:协方差矩阵控制3DGS的形状

相较于前面推导的表达式:

  • 去掉了均值μ:因为高斯分布以点为中心,xyz均值就在点上,已经中心化了。所以将均值设为0。
  • 去掉了exp前面的系数:系数为了控制整个概率密度函数积分为1,但此处不需要,而是让整个分布的大小自由控制。

协方差矩阵的物理含义:为什么这个矩阵能够控制3DGS的形状(下面例子是二维的,实际是三维)
在这里插入图片描述

A为线性变换,把任意一个分布变换到均值μ方差1的范围内,如图所示(二维分布,先y方向压缩,再绕原点旋转一定角度)
在这里插入图片描述

因此矩阵A构造:变换矩阵A=旋转矩阵R*缩放(尺度变换)矩阵S
在这里插入图片描述

  • 优化:在迭代优化过程中,优化矩阵A的内容,即可改变高斯椭球的形状、大小、方向等几何外观(点里存储的数据),从而使它在Splatting的时候投影出正确的效果。

    旋转矩阵的优化:不适合直接让3*3的旋转矩阵参与优化,因此用四元数参与优化并转化。将参数从9个降低到4个,而且能保持协方差矩阵的半正定性质,同时四元数方便插值。

  • 求导:如何让矩阵A对尺度s和四元数q求偏导?论文附录有推导过程。

  • 渲染:椭球怎样投影成平面的图像?CG有深入研究,对协方差矩阵做变换即可,文中引用的01年文献有说明。

2、优化与自适应密度控制

2.1 优化

  • 每个点里存储的上述四个数据都要参与优化。
  • 优化策略:随机梯度下降(Stochastic Gradient Descent)
  • 自写CUDA核心加速
  • 快速光栅化,提高效率
  • Sigmoid和Exponential激活函数:Sigmoid函数限制不透明度在[0,1)之内;协方差矩阵里的尺度用指数激活函数(常规细节)。
  • 损失函数: L1 loss,渲染图像和GT图像求光度误差,按一定比例λ加上SSIM结构相似性的误差。
    在这里插入图片描述

在这里插入图片描述

小实验:用3DGS这种紧凑的表达方式,确实能在优化之后拟合复杂的几何细节。
渲染了一张图像后把3DGS Shrink,收缩到原来的60%,细节仍然在(但也可能是点云的功劳)。

2.2 点云密度自适应控制

  • 使系统能够从稀疏的,质量不高的初始点云,甚至是随机初始化的点云里拟合出比较好的模型。
  • 每隔一定迭代次数,移除不透明度α小于阈值(接近透明)的点。
  • 对重建不充分的区域进行处理:往往有较大的梯度。 欠重建Under-reconstruction:clone
    过重建Over-reconstruction:split
    判断重建是否充分的依据:梯度。更新点的位置的时候如果梯度太大,说明这个位置误差比较大,需要修正的量比较大。梯度超过阈值,执行densify操作。
    在第一行克隆的过程中按梯度方向安置新的点。 怎么区分上述两种情况:方差大,说明这个3DGS很大,需要分割;方差小,,,克隆。
    在这里插入图片描述
  • 靠近相机的地方可能学出一些floaters(可能是漂浮的一些东西),属于模型的错误重建。因此周期性的把不透明度重置为0,去除floaters,后续学习中真正要用到的点的不透明度将会回到正确的值,不用的不透明度太低的点会被剔除。
  • 周期性移除较大的高斯用于避免重叠。

3、快速可微光栅化

Tile-based Rasterizer(渲染不仅仅是splatting)

  • 把整个图像分为16*16个tiles(区块),每个tile视锥内挑选可视的3DGS。
  • 对于每个视锥内只取置信度大于99%的高斯,实例化为一个个高斯对象,包含所在tile的id以及对应视域下的深度,并按深度排序。(不需要逐像素地进行排序,突破了传统光栅化的瓶颈)
  • 排序之后,按这些GS到图像平面的深度值的排序顺序,从近到远往对应的tile上做splat。把splat留下的痕迹做堆叠累积,直到不透明度饱和(为1)。每个tile单独开一个线程块,可以认为所有tile上的光栅化(从堆叠的splat痕迹中去划分像素网格,生成像素值)是并行运行的。
  • 有像素的不透明度达到饱和,就停止对应的线程。(而不是所有像素都饱和之后才停止,加速)
  • 渲染完图像,求出误差反向传播的时候,就可以根据刚才的排序来找到需要优化的GS。在tile的尺度上回溯做了splat的点。(之前的工作中,这种像素误差传递需要对每个像素记下哪些点位颜色做了贡献。)之前的NeRF方法为了加速训练过程中的渲染往往不会做全图的渲染,而是随机选取一定数量的像素点采样来求误差。而本文每次迭代都在做全图的渲染,因此图像会有更高的收敛速度和更高的训练效率。

总结流程:
在这里插入图片描述

  1. 从初始的sfm点云出发,以每个点为中心生成3DGS。
  2. 用相机参数把点投影到图像平面上(splatting)。
  3. 从splatting的痕迹中tile-based光栅化,得到渲染图像,将渲染图像和GT求LOSS,反向传播。
  4. 自适应的密度控制模块根据传递到点上的梯度,来决定是否需要对3DGS做分割或者克隆。梯度传递到3DGS里面对其存储的那几个参数进行更新。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/86617
推荐阅读
相关标签
  

闽ICP备14008679号