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

news/2024/9/18 8:34:52/ 标签: 人工智能, 三维重建, 3DGS, 场景重建

目录

一、导言

二、相关工作

1、传统场景重建

2、神经渲染与辐射场

3、点云渲染

3DGS-toc" style="margin-left:40px;">三、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

        下图为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


http://www.ppmy.cn/news/1525342.html

相关文章

.json文件的C#解析,基于Newtonsoft.Json插件

目录 1. 前言 2. 正文 2.1 问题 2.2 解决办法 2.2.1 思路 2.2.2 代码实现 2.2.3 测试结果 3. 备注 1. 前言 天气晚来秋,这几天天气变凉了,各位同学注意好多穿衣服。回归正题 由于需要,需要将json的配置里面的调理解析出来,做成接口,以便于开发。 2. 正文 2.1 …

回(1)——BT服务器管理

住院半个月,导致博客断更了,重新开始一个新系列。 BT服务器的管理相关梳理: 当服务器项目很多,特别是几十个服务器需要进入管理的时候,会比较麻烦,一般是需要一个专门的项目管理面板里面,点击每个不同的项…

ping操作

Ping(发音为“拼”)是一种广泛使用的网络诊断工具,用于测试计算机或设备在IP网络上的可达性以及测量数据包往返所需的时间。它基于ICMP(Internet Control Message Protocol,互联网控制消息协议)来发送和接收…

Spring Boot实战-文章管理系统(1.用户相关接口)

一、用户相关接口 1.注解 RestController:是一个组合注解,它结合了 Controller 和 ResponseBody 注解的功能(就相当于把两个注解组合在一起)。 在使用 RestController 注解标记的类中,每个方法的返回值都会以 JSON 或…

基于Matlab的模拟答题卡识别阅卷可以识别指定答题卡的各个部分-界面

识别指定答题卡的各个部分-界面-如学号,准考证号,客观题答案,主观题分数等用户可以在Excel中自行设置标准答案,并对六十题客观题进行批改,并显示分数。 项目介绍 本项目旨在开发一个基于MATLAB的答题卡识别阅卷系统&a…

Pr 入门系列之三:挑选与添加媒体到序列(上)

掌握如何使用源监视器预览和筛选媒体素材,了解新建序列以及设置序列的方法。 ◆ ◆ ◆ 查看及挑选素材内容 源 Source面板,又称源监视器 Source Monitor。其主要作用是:预览源剪辑、选取片段、插入或覆盖剪辑到序列。 双击项目面板里的素材…

linux-centos 设置系统时间

CentOS 系统提供了多种方式来设置和管理时间,包括手动设置时间和使用网络时间协议 (NTP) 自动同步时间。以下是几种常见的方法: 手动设置时间 使用date命令临时设置时间: 如果你只需要临时设置时间,可以使用 date 命令&#xff1…

unity3d入门教程三

unity3d入门教程三 8.1游戏脚本8.2脚本的使用8.3认识脚本组件8.4帧率9.1游戏脚本9.2获取节点和组件9.3MonoBehaviour9.4父节点与子节点9.5组件的属性9.6脚本的单步调试 8.1游戏脚本 通过程序控制对象属性(如运动,修改transform的位置属性) …

docker查看从当前最后100条起看日志

logs.sh 使用说明 logs.sh 是一个用于查看 Docker 容器日志的脚本。该脚本支持两种使用方式: 默认查看 video-console 容器的日志。通过指定容器 ID 来查看相应容器的日志。 1. 默认方式 不需要任何参数,直接运行脚本,将自动查找名为 vid…

宝塔面板优化:提升服务器性能的实用指南

引言 在服务器管理中,宝塔面板以其易用性和强大的功能,成为了许多站长和开发者的首选。然而,随着网站流量的增长,服务器性能的优化变得尤为重要。本文将分享一些实用的宝塔面板优化技巧,帮助你提升服务器的性能和稳定…

多语言文本检测系统源码分享

多语言文本检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer V…

常见的泛型集合

集合(Collections) 集合 是存储多个对象的结构。C# 提供了两类集合: 非泛型集合:如 ArrayList、Hashtable,在 C# 2.0 之前常用,但由于它们使用 object 类型存储元素,因此需要进行类型转换&…

rust + bevy 实现小游戏 打包成wasm放在浏览器环境运行

游戏界面 代码地址 github WASM运行 rustup target install wasm32-unknown-unknown cargo install wasm-server-runner cargo run --target wasm32-unknown-unknowncargo install wasm-bindgen-cli cargo build --release --target wasm32-unknown-unknown wasm-bindgen --…

VSCode 渲染 markdown md , 设置插件的背景颜色 Markdown Preview Enhanced

起因, 目的: VSCode 中, 安装 Markdown Preview Enhanced 这个插件之后,能渲染,但是背景颜色太亮了。 最近正在学习 css, 所以一试身手。 先看效果: 过程: Ctrl Shift P 打开命令面板。输入: Markdown Preview…

MapBox Android版开发 4 国际化功能v11

MapBox Android版开发 4 国际化功能v11 前言遇到的问题国际化功能原文给出的方案(V10版)migrate-to-v11适用于V11版的代码 示例MapStyle类运行效果图 前言 在前文MapBox地图样式v11中,使用Style的localizeLabels方法本地化地图语言。但Mapbox Standard样式和Mapbox…

YOLOv9改进策略【卷积层】| SCConv:即插即用,减少冗余计算并提升特征学习

一、本文介绍 本文记录的是利用SCConv优化YOLOv9的目标检测网络模型。深度神经网络中存在大量冗余,不仅在密集模型参数中,而且在特征图的空间和通道维度中。SCConv模块通过联合减少卷积层中空间和通道的冗余,有效地限制了特征冗余&#xff0…

POW和POS区别

工作量证明(Proof of Work, PoW)和权益证明(Proof of Stake, PoS)是两种不同的共识机制,它们用于确保区块链网络的安全性和完整性。以下是这两种机制的主要区别: 工作量证明 (PoW) 概念: 在PoW机制中&…

性能测试 —— docker容器下搭建JMeter+Grafana+Influxdb监控可视化平台!

前言 在当前激烈的市场竞争中,创新和效率成为企业发展的核心要素之一。在这种背景下,如何保证产品和服务的稳定性、可靠性以及高效性就显得尤为重要。 而在软件开发过程中,性能测试是一项不可或缺的环节,它可以有效的评估一个系…

遇到僵尸进程,怎么处理---学习笔记

僵尸进程解释 当 iowait 升高时,进程很可能因为得不到硬件的响应,而长时间处于不可中断状态。从 ps 或者 top 命令的输出中,你可以发现它们都处于 D 状态,也就是不可中断状态(Uninterruptible Sleep)。既然…

vTaskCoreAffinitySet绑定cpu

1,在有些M4 单片机中,存在多核cpu,那么我们如何绑定需要用到的cpu呢,M4有4个core,core0-core3。 在freertos_config.h里面有配置configUSE_CORE_AFFINITY 1才能使用vTaskCoreAffinitySet绑定cpu.,rtos不叫绑cpu&…