高斯泼溅综合指南

news2024/12/23 0:39:43

高斯泼溅(Gaussian Splatting)是一种表示 3D 场景和渲染新视图的方法,在“实时辐射场渲染的 3D 高斯泼溅” 中引入。它可以被认为是 NeRF 类模型的替代品,就像当年的 NeRF 一样,高斯泼溅引发了大量新的研究工作,这些研究选择将其用作各种用例的 3D 世界的底层表示。那么它有什么特别之处,为什么它比 NeRF 更好呢?或者说,它真的比 NeRF 更好吗?让我们来一探究竟吧!

TL;DR

首先,从标题就可以看出,这项工作最出名的地方是高渲染速度。这要归功于下面将要介绍的表示本身,以及使用自定义 CUDA 内核定制实现的渲染算法。

图 1:在渲染速度(fps)、训练时间(分钟)和视觉质量(峰值信噪比,越高越好)方面,之前的高质量表示和高斯分布(标记为“我们的”)的并排比较

此外,高斯分布根本不涉及任何神经网络。甚至没有一个小型的 MLP,没有任何“神经”,场景本质上只是空间中的一组点。这本身就已经吸引了人们的注意力。在我们痴迷于人工智能的世界中,研究公司追逐由越来越多的数十亿个参数组成的模型,看到这种方法越来越受欢迎,这令人耳目一新。其理念源自“表面溅射”³ (2001),因此它树立了一个很酷的例子,表明经典的计算机视觉方法仍然可以启发相关的解决方案。其简单而明确的表示使高斯溅射特别易于解释,这是在某些应用中选择它而不是 NeRF 的一个很好的理由。

2、3D 世界的表示

如前所述,在高斯分布中,3D 世界由一组 3D 点表示,实际上有数百万个 3D 点,数量大约为 50 万到 500 万。每个点都是一个 3D 高斯,具有自己独特的参数,这些参数根据场景进行拟合,以便该场景的渲染与已知的数据集图像紧密匹配。优化和渲染过程将在后面讨论,因此我们暂时先讨论必要的参数。

图 2:高斯中心(均值)

每个 3D 高斯都由以下参数化:

  • 均值 μ, 可解释为位置 x、y、z;
  • 协方差 Σ;
  • 不透明度 σ(𝛼),应用 S 型函数将参数映射到 [0, 1] 区间;
  • 颜色参数,(R、G、B) 的 3 个值或球谐函数 (SH) 系数。

这里有两组参数需要进一步讨论,即协方差矩阵和 SH。有专门讨论后者的单独部分。至于协方差,它在设计上被选择为各向异性的,也就是说,不是各向同性的。实际上,这意味着 3D 点可以是沿空间中任何方向旋转和拉伸的椭圆体。它可能需要 9 个参数,但是它们无法直接优化,因为协方差矩阵只有在为半正定矩阵时才具有物理意义。使用梯度下降进行优化很难直接对矩阵施加此类约束,因此它被分解为如下形式:

这种分解称为协方差矩阵的特征分解,可以理解为椭圆体的配置,其中:

  • S 是一个对角缩放矩阵,具有 3 个缩放参数;
  • R 是一个 3x3 旋转矩阵,用 4 个四元数解析表示。

使用高斯函数的妙处在于每个点都有双重影响。一方面,根据其协方差,每个点实际上代表了接近其均值的空间有限区域。另一方面,它具有理论上无限的范围,这意味着每个高斯函数都定义在整个 3D 空间中,并且可以针对任何点进行评估。这很棒,因为在优化过程中,它允许梯度从远距离流动。⁴

3D 高斯函数 i 对 3D 中任意 3D 点 p 的影响定义如下:

图 3:3D 高斯 i 对 3D 中点 p 的影响

该方程看起来几乎像多元正态分布的概率密度函数,只是忽略了具有协方差决定因素的正则化项,而是通过不透明度进行加权。

3、图像形成模型

给定一组 3D 点,可能最有趣的部分是看看它如何用于渲染。你可能之前熟悉 NeRF 中使用的逐点 𝛼 混合。事实证明,NeRF 和高斯 splatting 共享相同的图像形成模型。为了了解这一点,让我们稍微绕道并重新查看 NeRF² 中给出的体积渲染公式及其许多后续作品 (1)。我们还将使用简单的过渡重写它 (2):

你可以参考 NeRF 论文了解 σ 和 δ 的定义,但从概念上讲,可以这样理解:在 NeRF 中,图像像素 p 中的颜色是通过沿着穿过该像素的射线对样本(MLP 预测)进行积分来近似的。最终颜色是沿着该射线采样的 3D 点颜色的加权和,通过透射率降低权重。考虑到这一点,让我们最后看一下高斯溅射的图像形成模型:

实际上,公式 (2) 和 (3) 几乎完全相同。唯一的区别在于两者之间如何计算 𝛼。在高斯溅射中,每个像素的聚合都是通过投影的 2D 高斯的有序列表的贡献进行的。这种微小的差异在实践中变得极为重要,并导致渲染速度截然不同。事实上,这是高斯溅射实时性能的基础。

要理解为什么会出现这种情况,我们需要了解 f^{2D} 的含义以及它提出了哪些计算要求。这个函数只是我们在上一节中看到的 f(p) 在 2D 中的投影,即在正在渲染的相机的图像平面上的投影。 3D 点及其投影都是多元高斯函数,因此可以使用与 3D 高斯函数对 3D 中其他点的影响相同的公式来计算投影的 2D 高斯函数对像素的影响(见图 3)。唯一的区别是,均值 μ 和协方差 Σ 必须投影到 2D 中,这可以使用 EWA splatting⁵ 的推导来完成。

通过使用固有相机矩阵 K 和外部相机矩阵 W=[R|t],将齐次坐标中的向量 μ(带有额外的 1 个坐标)投影到图像平面,可以轻松获得 2D 中的均值:

也可以用一行来写,如下所示:

这里“z”下标代表 z 标准化。二维中的协方差使用雅可比矩阵 (4) J 定义:

整个过程仍然是可微分的,这对于优化当然至关重要。

3、渲染

公式 (3) 告诉我们如何在单个像素中获得颜色。要渲染整个图像,仍然需要遍历所有 HxW 像素,就像在 NeRF 中一样,但是,该过程要轻量得多,因为:

对于给定的相机,每个 3D 点的 f(p) 可以预先投影到 2D 中,然后再迭代像素。这样,当高斯分布与几个附近的像素混合时,我们就不需要一遍又一遍地重新投影它了。

没有 MLP 需要对单个图像进行 H·W·P 次推理,2D 高斯分布直接混合到图像上。
在射线上评估哪个 3D 点没有歧义,无需选择射线采样策略。与每个像素的射线重叠的一组 3D 点(参见 (3) 中的 N)在优化后是离散的和固定的。

在 GPU 上,使用可微分 CUDA 内核的自定义实现,每帧进行一次预处理排序阶段。

概念上的差异可以在图 4 中看到:

图 4:NeRF 和 GS 之间的概念差异,左:沿射线查询连续 MLP,右:混合与给定射线相关的一组离散高斯

上面提到的排序算法是本文的贡献之一。其目的是使用公式 (3) 为颜色渲染做准备:按深度(与图像平面的接近度)对 3D 点进行排序,并按图块对它们进行分组。前者是计算透射率所必需的,后者允许将每个像素的加权和限制为仅对相关 3D 点(或更具体地说,它们的 2D 投影)进行 α 混合。分组是使用简单的 16x16 像素图块实现的,并且实现方式是,如果高斯与多个视锥体重叠,则可以落在几个图块中。由于排序,每个像素的渲染可以简化为像素所属图块中预先排序的点的 α 混合。

图 5:视锥体,每个视锥体对应一个 16x16 图像块。颜色没有特殊含义。排序算法的结果是每个块内按深度排序的 3D 点子集。

4、优化

一个幼稚的问题可能会浮现在脑海中:如何从空间中的一堆斑点中获得一张看起来不错的图像?好吧,如果高斯函数没有得到适当的优化,渲染中就会出现各种尖锐的伪影。在图 6 中,您可以观察到此类伪影的一个例子,它们看起来非常像椭圆体。获得良好渲染的关键是 3 个组件:良好的初始化、可微分优化和自适应致密化。

图 6:未优化场景的渲染示例 

初始化是指在训练开始时设置的 3D 点的参数。对于点位置(均值),作者建议使用由 SfM(运动结构)生成的点云,见图 7。逻辑是,对于任何 3D 重建,无论是使用 GS、NeRF 还是更经典的方法,你都必须知道相机矩阵,因此你可能还是会运行 SfM 来​​获取这些矩阵。由于 SfM 会产生稀疏点云作为副产品,为什么不使用它进行初始化呢?这就是本文所建议的。当由于某种原因无法获得点云时,可以使用随机初始化,但可能会损失最终重建质量。

图 7:SfM 生成的稀疏 3D 点云,均值初始化 

协方差被初始化为各向同性,换句话说,3D 点以球体开始。半径是根据到相邻点的平均距离设置的,这样 3D 世界就可以很好地覆盖,没有“洞”。

初始化后,使用简单的随机梯度下降来正确拟合所有内容。场景针对损失函数进行了优化,该函数是地面真实视图和当前渲染之间的 L1 和 D-SSIM(结构差异指数测量)的组合。

然而,这还不是全部,另一个关键部分仍然存在,那就是自适应致密化。它在训练期间偶尔启动一次,比如每 100 个 SGD 步骤,其目的是解决重建不足和过度重建的问题。需要强调的是,SGD 本身只能调整现有点。但在完全缺乏点或点太多的区域,很难找到好的参数。这就是自适应致密化的作用所在,它分割梯度大的点(图 8),并删除已经收敛到非常低的 α 值的点(如果一个点如此透明,为什么要保留它?)。

图 8:自适应致密化。一个玩具示例,用几个点来拟合我们想要渲染的豆形

5、使用 SH 的视图相关颜色

球谐函数,简称 SH,在计算机图形学中起着重要作用,最初被提出作为一种学习 Plenoxels⁶ 中离散 3D 体素的视图相关颜色的方法。视图依赖性是一种很好的属性,它可以提高渲染质量,因为它允许模型表示非朗伯效应,例如金属表面的镜面反射。然而,这当然不是必须的,因为可以进行简化,选择用 3 个 RGB 值表示颜色,并且仍然使用高斯溅射,就像在 [4] 中所做的那样。这就是为什么我们在布置整个方法之后单独审查这个表示细节。

SH 是在球体表面上定义的特殊函数。换句话说,你可以对球体上的任何一点求出这样的函数并得到一个值。所有这些函数都是从这个单一公式中推导出来的,通过为 ℓ 和 −ℓ ≤ m ≤ ℓ 选择正整数,每个 SH 一个 (ℓ, m) 对:

虽然一开始有点吓人,但对于较小的 l 值,这个公式会大大简化。事实上,对于 ℓ = 1,Y = ~0.282,只是整个球面上的一个常数。相反,较高的 ℓ 值会产生更复杂的表面。理论告诉我们,球谐函数形成一个正交基,因此球面上定义的每个函数都可以通过 SH 来表达。

这就是为什么表达视点相关颜色的想法是这样的:让我们将自己限制在一定的自由度 ℓ_max 上,并说每种颜色(红色、绿色和蓝色)都是前 ℓ_max 个 SH 函数的线性组合。对于每个 3D 高斯,我们都希望学习正确的系数,以便当我们从某个方向看这个 3D 点时,它将传达最接近地面真实颜色的颜色。获取视点相关颜色的整个过程可以在图 9 中看到。

图 9:获取 ℓ_max = 2 且有 9 个学习系数的点的视图相关颜色(红色分量)的过程。S 型函数将值映射到 [0, 1] 区间。通常,会改用裁剪

6、限制

尽管总体效果很好且渲染速度惊人,但表示的简单性是有代价的。最重要的考虑是在优化过程中引入的各种正则化启发式方法,以防止模型出现“破碎的”高斯分布:点太大、太长、冗余等。这部分至关重要,提到的问题可以在新视图渲染之外的任务中进一步放大。

选择放弃连续表示而采用离散表示意味着 MLP 的归纳偏差会丢失。在 NeRF 中,MLP 执行隐式插值并消除给定视图之间可能存在的不一致,而 3D 高斯则更为敏感,这又回到了上面描述的问题。

此外,高斯溅射并不能摆脱 NeRF 中存在的一些众所周知的伪影,它们都从共享图像形成模型中继承了这些伪影:在较少看到或未看到区域的质量较低、靠近图像平面的漂浮物等。

检查点的文件大小是另一个需要考虑的属性,即使新颖的视图渲染还远未部署到边缘设备。考虑到 3D 点的大致数量和流行 NeRF 的 MLP 架构,两者都占用相同数量级的磁盘空间,而 GS 的平均重量仅是后者的几倍。

7、在哪里试用

没有一篇博客文章可以像运行并亲眼看到结果一样公正地介绍一种方法。你可以在这里试用:

  • gaussian-splatting — 使用自定义 CUDA 内核的官方实现;
  • nerfstudio — 是的,nerfstudio 中的高斯 splatting。这是一个最初专用于 NeRF 类模型的框架,但自 23 年 12 月以来,它也支持 GS;
  • threestudio-3dgs — 另一个跨模型框架 threestudio 的扩展。如果你有兴趣从提示生成 3D 模型而不是学习现有的一组图像,则应该使用这个;
  • UnityGaussianSplatting — 如果你喜欢 Unity,可以将训练好的模型移植到这个插件中进行可视化;
  • gsplat — 一个从 nerfstudio 分支出来的用于 CUDA 加速高斯光栅化的库。它可以作为 splatting 的可区分模块用于独立的基于 torch 的项目。

原文链接:高斯泼溅综合指南 - BimAnt

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2044821.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android Kotlin - 通过 URL Scheme 打开应用

在 Android 应用中,可以通过自定义 URL Scheme 或 Deep Links 打开应用。这允许你定义一个自定义的 URL 格式,使得当用户点击包含这个 URL 的链接时,系统可以识别并打开你的 APP。以下是详细的实现步骤和一些注意事项。 1. 配置 AndroidMani…

RISC-V特权架构 - 时钟中断处理

RISC-V特权架构 - 时钟中断处理 1 MTI中断处理1.1 触发中断1.2 查询mie.MTIE与mip.MTIE1.3 若运行在M模式下1.4 若运行在S模式下1.5 若运行在U模式下 2 STI中断处理2.1 触发中断2.2 查询mie.STIE与mip.STIE2.3 若运行在M模式下2.4 若运行在S模式下2.5 若运行在U模式下 3 知识总…

Transformer架构的演进之路探究

1 引言 在2017年的开创性论文《Attention is All You Need(注意力就是你所需要的一切)》中,Vaswani等人提出了Transformer架构,这不仅在语音识别领域引起了一场革命,也对其他多个领域产生了深远的影响。本文将探讨Tra…

【早鸟优惠券】PostgreSQL 16 专栏优惠券

PostgreSQL 从入门到熟悉,本专栏只能做到从入门到熟悉。本专栏以 Markdown 格式书写,格式精美。有需要的朋友可以看下,使用的版本是 16。本专栏大约 20 万字左右,目前已完成了 18 万多字了。还有两篇(事务、性能调优&a…

搭建内网开发环境(一)|基于docker快速部署开发环境

引言 最近因需要搭建一套简易版的纯内网的开发环境,服务器采用 centos8.0,容器化技术采用 docker 使用 docker-compose 进行容器编排。 该系列教程分为两大类: 软件安装和使用,这类是开发环境常用的软件部署和使用,涉…

Vue框架学习笔记-8

Vue中的跨域问题 在Vue项目中遇到跨域问题,通常是因为前端(Vue)和后端(如Node.js, Django, Spring Boot等)部署在不同的域名或端口上,浏览器出于安全考虑,会阻止跨域请求。解决Vue中的跨域问题…

获取专项练习

文章目录 1.sun-club-practice-api1.vo构建1.SpecialPracticeVO.java2.SpecialPracticeCategoryVO.java3.SpecialPracticeLabelVO.java 2.SubjectInfoTypeEnum.java 2.sun-club-practice-server1.PracticeSetController.java2.service1.PracticeSetService.java2.PracticeSetSe…

基于SpringBoot的秒杀系统设计与实现

TOC springboot193基于SpringBoot的秒杀系统设计与实现 第1章 绪论 1.1 研究背景 互联网时代不仅仅是通过各种各样的电脑进行网络连接的时代,也包含了移动终端连接互联网进行复杂处理的一些事情。传统的互联网时代一般泛指就是PC端,也就是电脑互联网…

开放式耳机怎么样好用吗?六个专业好招教你选!

传统入耳式耳机容易滑落,而且戴久了耳朵疼,近段时间,耳机圈开始流行开放式耳机。开放式耳机的出现就避免了这个问题的出现,本文就为大家推荐几款使用感较好的开放式耳机,一起来看看吧~现在开放式耳机太多了&#xff0c…

IO进程(学习)2024.8.15

目录 重定向打开文件 文件IO 概念 特点 函数 1.打开文件 2.关闭文件 3.读写文件 read write 4.文件定位操作 重定向打开文件 FILE * freopen(const char *pathname, const char *mode, FILE* fp) 功能:将指定的文件流重定向到打开的文件中 参数&#…

离散数学概论

目录 一、引言 二、离散数学的主要内容 1. 集合论 1.1 集合的基本概念 1.2 集合的运算 集合运算总结表格 2. 数理逻辑 2.1 命题逻辑 2.2 逻辑推理 2.3 逻辑等价 逻辑联结词与逻辑等价总结表格 3. 组合数学 3.1 计数原理 3.2 排列与组合 3.3 容斥原理 组合数学总…

15.基于session实现登录 前端项目部署

前端项目nginx部署 nginx配置文件 worker_processes 1;events {worker_connections 1024; }http {include mime.types;default_type application/json;sendfile on;keepalive_timeout 65;server {listen 8080;server_name localhost;# 指定前端项目所…

手把手教你CNVD漏洞挖掘 + 资产收集

0x1 前言 挖掘CNVD漏洞有时候其实比一般的edusrc还好挖,但是一般要挖证书的话,还是需要花时间的,其中信息收集,公司资产确定等操作需要花费一定时间的。下面就记录下我之前跟一个师傅学习的一个垂直越权成功的CNVD漏洞通杀&#…

【案例42】“”引发的“血案”--建表带双引号

问题现象 数据抽取工具报错。 研发排查后发现,这条语句不执行导致。转来让解决此问题。 问题分析 与研发沟通发现。是因为在user_segments 中一直有FIP_OPERATINGLOG_copy1 造成的。 询问可以直接drop掉相关表, drop table FIP_OPERATINGLOG_copy1 ; …

十一、实现逻辑层

系列文章目录:C asio网络编程-CSDN博客 1、服务器架构设计 2、单例模板类 我们的LogicSystem类为单例类,可以只把这个类写为单例,也可以写一个单例模板类,让其它类继承它就可以形成单例。这里选择第二种,因为后面可能…

Python利用openpyxl复制Excel文件且保留样式—另存为副本(附完整代码)

目录 专栏导读库的介绍库的安装前言结果预览目录结构完整代码总结专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️‍🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注 👍 该系列文章专栏:请点击——>Python办公自动化专…

配电房动环监控系统 温湿度环境、供配电、UPS集中管控@卓振思众

在现代电力网络中,配电房作为供电系统的核心节点,承担着至关重要的角色。为了保障电力供应的稳定性与可靠性,配电房的管理与监控显得尤为重要。随着技术的不断进步,【卓振思众】智能的配电房动环监控系统应运而生,成为…

# Spring Cloud Alibaba Nacos_配置中心与服务发现(四)

Spring Cloud Alibaba Nacos_配置中心与服务发现(四) 一、Nacos 配置管理-集群部署 1、 把 nacos 应用程序包,复制3份,分别命名为 nacos1, nacos2, nacos3 分别在 conf 目录下,修改 application.properties 配置文件…

【大模型LLMs】LLMs-based Summarization研究进展梳理

【大模型LLMs】LLMs-based Summarization方法梳理 Survey1 Knowledge Distillation from LLMsRefereeInheritSumm 2 Prompt Engineering2.1 Template EngineeringOdSum 2.2 CoTSumCoTCoDSuReSliSumRefiner 梳理基于大模型的摘要总结方案,持续汇总中(更关…

数据埋点系列 9|数据伦理与隐私-在合规与创新间寻找平衡

在数据驱动决策的时代,数据伦理和隐私保护已成为至关重要的议题。组织必须在利用数据创新和保护用户隐私之间找到平衡。本文将探讨数据伦理的核心原则、隐私保护的技术实现,以及如何在合规和创新之间取得平衡。 目录 1. 数据伦理的核心原则1.1 透明度1…