当前位置: 首页 > news >正文

3DGS:3D Gaussian Splatting for Real-Time Radiance Field Rendering 论文解读

目录

一、导言

二、相关工作

1、传统场景重建

2、神经渲染与辐射场

3、点云渲染

三、3DGS

1、SFM初始化稀疏点云

2、3D高斯椭球

3、协方差

4、球谐函数

5、3D高斯椭球集建立

6、3D投影2D 

7、3D渲染公式

四、损失函数

五、基于梯度自适应改变点云的分布方式

六、快速可微光栅化


一、导言

        该论文是2023年SIGGRAPH的新论文,收录于ACM T GRAPH。该论文第一次提出3DGS这一新场景表达。

(1)第一次使用3D高斯场景表示,保留了连续体积径向场的优点,同时也支持高效的优化和渲染。

(2)采用一种优化方法,交替更新3D高斯参数和自适应密度控制。

(3)3DGS也是第一个达到对于开放完整场景、无边界、1080p分辨率下实现高效渲染并达到SOTA性能的工作。

二、相关工作

1、传统场景重建

(1)基于光场的方法

        最初为密集采样光场方法,通过光场相机或多个相机阵列捕捉场景光场数据(包含坐标与方向),然后通过光场估计深度信息,进一步通过深度信息和光场数据来进行三维重建,一般用于早期的VR,AR工作。但存在计算量较大,且易受到光场条件影响的问题。

        之后也产生了无序采集方法,在不同时间不同位置进行采集,之后通过传统匹配算法(SIFT等)实现特征匹配,但由于时序问题,重建过程中在时间维度上存在不真实性,不连贯性,也缺失了上下文信息,这也导致快速运动物体的运动模糊,长时间容易改变的自然场景下时间连续性较差导致的重建模糊。

(2)结构恢复方法

        SFM方法通过一组照片合成欧式结构下新的视角下的图片,首先通过一组图片使用SIFT算法提取特征,并进行特征匹配去除噪声影响,并使用RANSAC后处理得到位姿估计。

        详细原理看下面链接:

三维重建(7)--运动恢复结构SfM系统解析_sfm三维重建-CSDN博客

(3)多视角立体算法(MVS)

        MVS相比于SFM来说,生成更为稠密的点云来满足稠密重建过程,而SFM生成稀疏的点云针对于位姿估计。另外就是MVS涉及多视角图像中推断每个像素的深度(利用相机参数),并使用几何图形约束来密集化点云。

        由于MVS输入特定的几何图形,当重建得到不存在的图形时不能进行恢复。

2、神经渲染与辐射场

        由于使用CNN改进MVS的渲染会存在受到光线的时间闪烁现象。

        NeRF解决了质量和速度的问题,对于基于NeRF的Mip-NeRF360上虽然渲染质量相当高,但渲染时间极长,所以难以做到高质量的实时渲染。

        InstantNGP使用哈希网格和占用网格来加速,并且使用小的MLP来表示密度和外观,保证渲染速度,但质量略逊于Mip-NeRF。

3、点云渲染

        通过点云渲染容易存在孔洞、锯齿、不连续性的问题,后续通过溅射点大于像素点来解决的,这也是3DGS的雏形。

三、3DGS

        下图为3DGS的流程图示。

1、SFM初始化稀疏点云

         相当于首先用colmap初始化一组点云,原理是通过输入一组图片使用sfm算法先估算一组点,作为初始稀疏点云。

2、3D高斯椭球

        椭球几何形状:首先将点云的位置信息,作为椭球集中每一个椭球的中心点,椭球使用三个高斯分布来规划三个方向的长短轴。类似于下面的这个图,只不过三个高斯分布并不是相同的,也就导致了椭球的不唯一性。

        高斯椭球的几何表示(协方差矩阵):\Sigma =RSS^T R^T ,其中R代表旋转矩阵(满足正交矩阵),S是缩放矩阵(对角矩阵)。

        3D高斯数学表达G(x)如下,上式通过3D高斯分布概率函数积分而来,其中由于均值\mu在椭球中心,所以可以忽略,另外前面的系数是为了高斯分布面积为1导致的,所以去除系数,达到更高的椭球伸缩性。

3、协方差

        协方差物理含义:\Sigma=AA^T,其中A是一个变换,将任意一个函数变换到均值为0,方差为1的分布中,而对于该论文定义A=RS,其中R为旋转矩阵,S为缩放矩阵。后续对于A进行改变即可对椭球实现放缩、旋转、方向等工作。

        另外在实际实现中,旋转矩阵R是使用四元数形式处理。

        协方差的目的就是将椭球的几何特征存储起来。

        下图为对于线性变换A的理解,可以解释为先进行缩放矩阵S(Y轴方向压缩),再进行旋转矩阵R(顺时针旋转)。

A=RS这样设计的原因?

(1)结合旋转和缩放矩阵的嵌套,可以通过协方差矩阵将原来的标准高斯分布推到一个带有任意形状的高斯分布椭球体。

(2)另外这样的表达,可以满足\Sigma仍然是一个对称半正定矩阵,保证特征值均非负,也就可以进行特征值分解。

4、球谐函数

        3DGS使用球谐函数的目的:存储椭球的颜色信息。

        球谐函数可以类比使用多项式或者傅里叶级数去近似拟合一条曲线,球谐函数使用不同阶的基函数(类似球体,化学的元素原子轨道围成的曲面)线性组合,去拟合一个不规则的曲面。

        球谐函数的基函数定义一般是f(\theta,\varphi) 。

        将基函数降维到2维便于理解,而此处是基函数,对于拟合的曲面则需要取多个加权求和。

阶数第几个公式
01r=\sqrt{1/2\pi}
11r=\sqrt{1/\pi}cos\theta
12r=\sqrt{1/\pi}sin\theta
21r=\sqrt{1/\pi}cos2\theta
22r=\sqrt{1/\pi}sin2\theta

 参考:

https://zhuanlan.zhihu.com/p/351289217

https://www.cnblogs.com/GeraltofChina/p/15542446.html

https://zhuanlan.zhihu.com/p/681085846

        对于三维情况,也类似于二维情况,取多个基函数并加权求和,在3DGS中我们取3阶内的16个基函数进行加权求和。

        对于3DGS,我们使用球谐函数分别来计算RGB三个颜色值,即对于不同\theta,\varphi下距离球心的距离r映射为[0,255]的颜色值。所以三通道乘以基函数数量为16*3=48个参数。

         如下图所示。

5、3D高斯椭球集建立

        对于每一个椭球都有下面的参数:分别是椭球中心位置信息(3维),法向量信息(没有用上),颜色信息(48维),不透明度\alpha,缩放矩阵(3维),旋转矩阵(四元数4维)。

6、3D投影2D 

        投影变换如下:  \Sigma'=JW\Sigma W^TJ^T

        其中\Sigma代表三维协方差矩阵,J代表投影变换雅克比矩阵(通过多元函数求导而来),W是视图变换矩阵(这里就是图中使用到Camera相机参数的地方),从世界坐标系到相机坐标系的变换。这一变换目的是将世界坐标系下三维椭球变换到相机坐标系下二维的光栅化平面空间。之后也便于与相机参数进行交互。

        转换后光栅化的平面空间的已进行CUDA加速以及自适应的密度控制(对于前后不透明度对颜色的影响的处理)

7、3D渲染公式

        C=\sum_{i \in N}c_i \alpha_iT_i,其中T_i= \Pi_{j=1}^{i-1}(1-\alpha_j)

        其中\alpha_i指当前点不透明度,T_i代表前i-1个透明度的和,所以值越大前面越透明。此处由于没有NeRF的光线取采样点,所以前i-1个计算一定范围内椭球集的透明度。

四、损失函数

        损失函数由L1范数和D-SSIM指标构成。

        L1损失:计算渲染图像与真实图像的绝对差值。下式两幅图的所有像素点值作差并取平均。

                                           Loss_{L1}=\frac{1}{N}\sum_{i=1}^N |A_i-B_i|

        D-SSIM损失:渲染图像与真实图像之间的结构相似性差异。下式中\mu_x代表图x的均值,\sigma_x^2代表图像x的方差,\sigma_{xy}代表图像x和y的均方差,C_1,C_2是为避免分母为0而引入的小常数。

        其中,D-SSIM值越小,两幅图像之间相似性越高。

                                        Loss_{D-SSIM}=1-\frac{(2\mu_x\mu_y+C_1)(2\sigma_{xy}+C_2)}{(\mu_x^2+\mu_y^2+C_1)(\sigma_x^2+\sigma_y^2+C_2)}

        总损失表示:L=(1-\lambda)L_1+\lambda L_{D-SSIM},一般取λ为0.2

五、基于梯度自适应改变点云的分布方式

        由于我们不能保证初始化的点云建立椭球集一定满足当前所需要拟合的模型,可能存在以下两个问题:

(1)由于离相机距离过近的一些点而造成伪影,这里我们将不透明度低于一定阈值或者距离相机过近的点进行删除,每100次删除一次这种点。

(2)存在上图的欠采样和过重建问题,基于梯度变化来进行判断。

        欠采样(方差过小)就是椭球不足够覆盖整个重建区域,过重建(方差过大)是过度覆盖整个重建区域。

        这里对于欠采样问题,我们克隆一个椭球一模一样的重新加入迭代,对于过重建问题,我们分裂为两个椭球集,将分布等比除以因子1.6之后复制为两个更小集。

        对于如何判断欠采样和过重建?

        监控点云中Gaussian的平均位置梯度幅度是否到达阈值 \tau_{pos}(设置为0.0002)。如果超过该阈值,说明存在"欠重建"或"过重建"的区域,需要进行处理。

六、快速可微光栅化

        快速可微光栅化(Tile-based Rasterizer):目的是渲染不同视角下的图像。

        流程:

(1)将图像分割为16*16的tiles,每个tile视锥内挑选合适的3DGS椭球

(2)每个视锥内只取置信度大于99%的3DGS,并且按照深度排序,其中每个高斯实例化一个key,key由视空间深度和title ID组成。

(3)并行的在每个tile上进行抛雪球,逐个像素进行前向遍历以及累加不透明度和颜色值。

(4)当存在像素不透明度达到饱和则停止线程。

(5)反向传播误差按title进行遍历,计算梯度。

        一个问题就是:对于这个得到2D协方差后进行光栅化得到图像的过程,不太清晰。

参考文献:https://arxiv.org/abs/2308.04079

参考代码:https://github.com/graphdeco-inria/gaussian-splatting

参考视频1:3D Gaussian Splatting原理速通(三)--迭代参数与渲染_哔哩哔哩_bilibili

参考视频2:​​​​​​​【论文讲解】用点云结合3D高斯构建辐射场,成为快速训练、实时渲染的新SOTA!_哔哩哔哩_bilibili

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Leetcode 移动零
  • OA项目值用户登入首页展示
  • docker镜像源更换
  • 华为云分布式缓存服务DCS 8月新特性发布
  • uniapp业务实现
  • 快速完成论文初稿写作的ChatGPT提示词分享
  • 前端三件套
  • Qt-QPushButton按钮类控件(22)
  • 联合仿真(FMI,FMU)资料收集
  • 【三】TDengine 3.3.2 生产级别集群搭建
  • 非线性规划及其MATLAB实现
  • 2024世界技能大赛某省选拔赛“网络安全项目”B模块--数字取证解析②(超详细~)
  • Linux:命令行参数
  • 微服务CI/CD实践(五)Jenkins Docker 自动化构建部署Java微服务
  • 使用 .NET 6 构建跨平台 Worker Service 服务:跨越平台的 C# 服务开发——解决Windows服务跨平台问题
  • 【前端学习】-粗谈选择器
  • CAP理论的例子讲解
  • CEF与代理
  • Invalidate和postInvalidate的区别
  • Java的Interrupt与线程中断
  • jquery cookie
  • python学习笔记-类对象的信息
  • React Transition Group -- Transition 组件
  • SQLServer插入数据
  • Yii源码解读-服务定位器(Service Locator)
  • 巧用 TypeScript (一)
  • 区块链分支循环
  • 思否第一天
  • 《天龙八部3D》Unity技术方案揭秘
  • Mac 上flink的安装与启动
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • 数据库巡检项
  • 选择阿里云数据库HBase版十大理由
  • #etcd#安装时出错
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (C++17) optional的使用
  • (C语言)二分查找 超详细
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (算法)求1到1亿间的质数或素数
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (一)Kafka 安全之使用 SASL 进行身份验证 —— JAAS 配置、SASL 配置
  • (一)Linux+Windows下安装ffmpeg
  • (转)四层和七层负载均衡的区别
  • *** 2003
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .Net Core与存储过程(一)
  • .Net MVC + EF搭建学生管理系统
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .NET开发人员必知的八个网站
  • .net中我喜欢的两种验证码
  • .pub是什么文件_Rust 模块和文件 - 「译」
  • .pyc文件是什么?
  • @DateTimeFormat 和 @JsonFormat 注解详解
  • @Service注解让spring找到你的Service bean