高斯泼溅的全面概述

一、说明

        高斯泼溅是一种用于表示 3D 场景和渲染新颖视图的方法,在“实时辐射场渲染的 3D 高斯泼溅”中引入。它可以被认为是 NeRF² 类模型的替代品,就像当年的 NeRF 一样,高斯分布导致了许多新的研究工作,这些工作选择将其用作各种用例的 3D 世界的底层表示。那么它有什么特别之处以及为什么它比 NeRF 更好呢?或者甚至是这样?让我们来看看吧!

二、概说

        首先也是最重要的,这项工作的主要特点是渲染速度快,这一点从标题中就可以理解。这是由于下面将介绍的表示本身,以及使用自定义 CUDA 内核定制的渲染算法的实现。

图 1:之前的高质量表示和高斯泼溅(标记为“我们的”)在渲染速度 (fps)、训练时间(分钟)和视觉质量(峰值信号到噪声比,越高越好)[来源:摘自[1]]

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

三、代表 3D 世界

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

图 2:高斯中心(平均值)[来源:取自 Dynamic 3D Gaussians⁴]

每个 3D 高斯均通过以下参数化:

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

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

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

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

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

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

图 3: 3D 高斯 i 对 3D 中点 p 的影响 [来源:作者提供的图片]

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

四、图像形成模型和渲染

4.1 图像形成模型

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

        您可以参考 NeRF 论文了解 σ 和 δ 的定义,但从概念上讲,这可以理解如下:图像像素p中的颜色是通过沿穿过该像素的光线对样本进行积分来近似的。最终颜色是沿该光线采样的 3D 点颜色的加权和,并按透射率进行加权。考虑到这一点,我们最后看一下高斯泼溅的成像模型:

        事实上,公式(2)和(3)几乎是相同的。唯一的区别是两者之间𝛼 的计算方式不同。然而,这种微小的差异在实践中却非常重要,并导致渲染速度截然不同。事实上,它是高斯泼溅实时性能的基础

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

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

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

这里“z”下标代表 z 归一化。二维协方差使用 (4), J 的雅可比行列式定义:

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

4.2 渲染

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

  • 对于给定的相机,每个 3D 点的f(p)可以在迭代像素之前提前投影到 2D 中。这样,当高斯混合几个附近的像素时,我们不需要一遍又一遍地重新投影它。
  • 没有MLP 可以对单个图像进行 H·W·P 次推断,2D 高斯直接混合到图像上。
  • 沿着射线评估哪个 3D 点没有歧义,无需选择射线采样策略。与每个像素的光线重叠的一组 3D 点(参见(3)中的N)是离散的,并且在优化后是固定的。
  • 使用可微 CUDA 内核的自定义实现,在 GPU 上每帧完成一次预处理排序阶段。

概念上的差异如图 4所示:

图 4: NeRF 和 GS 之间的概念差异,左:沿射线查询连续MLP,右:混合与给定射线相关的一组离散高斯函数 [来源:作者提供的图片]

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

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

五、优化

        我可能会想到一个天真的问题:如何从太空中的一堆斑点中获得看起来像样的图像?好吧,确实,如果高斯没有正确优化,您将在渲染中得到各种尖锐的伪影。在图 6 中,您可以观察到此类伪影的示例,它们看起来非常像椭球体。获得良好渲染的关键是三个组成部分:良好的初始化、可微优化和自适应致密化

图 6:未优化场景的渲染示例 [来源:作者提供的图片]

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

图 7: SfM 生成的稀疏 3D 点云,意味着初始化 [来源:取自此处]

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

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

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

图 8:自适应致密化。一个拟合豆子形状的玩具示例,我们想用几个点来渲染它。[来源:摘自[1]]

六、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 个学习系数的点的与视图相关的颜色(红色分量)的过程。sigmoid 函数将值映射到 [0, 1] 区间。通常,会使用剪裁来代替[来源:作者提供的图片]

七、局限性

        尽管整体效果出色且渲染速度令人印象深刻,但表示的简单性是有代价的。最重要的考虑因素是在优化过程中引入的各种正则化启发法,以防止模型出现“损坏”高斯分布:太大、太长、冗余等点。这部分至关重要,提到的问题可以在任务中进一步放大超越新颖的视图渲染。

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

        此外,高斯泼溅也存在 NeRF 中存在的一些众所周知的伪影,它们都继承自共享图像形成模型:较少看到或不可见的区域质量较低,靠近图像平面的漂浮物等。

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

八、哪里可以玩它

没有任何博客文章能够公正地描述一种方法以及仅运行它并亲自查看结果。这里是你可以玩的地方:

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

米哈尔·盖耶

参考

  1. Kerbl, B.、Kopanas, G.、Leimkühler, T. 和 Drettakis, G. (2023)。用于实时辐射场渲染的 3D 高斯喷射。SIGGRAPH 2023。
  2. Mildenhall, B.、Srinivasan, PP、Tancik, M.、Barron, JT、Ramamoorthi, R. 和 Ng, R. (2020)。NeRF:将场景表示为神经辐射场以进行视图合成。欧洲CV 2020。
  3. Zwicker, M.、Pfister, H.、van Baar, J. 和 Gross, M. (2001)。表面喷溅。2001年SIGGRAPH
  4. Luiten, J.、Kopanas, G.、Leibe, B. 和 Ramanan, D. (2023)。动态 3D 高斯:通过持久动态视图合成进行跟踪。3D 视觉国际会议。
  5. Zwicker, M.、Pfister, H.、van Baar, J. 和 Gross, M. (2001)。EWA 体积溅射。IEEE 可视化 2001。
  6. Yu, A.、Fridovich-Keil, S.、Tancik, M.、Chen, Q.、Recht, B. 和 Kanazawa, A. (2023)。Plenoxels:没有神经网络的辐射场。CVPR 2022。
  7.  凯特·尤尔科娃

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

线上隐私保护的未来:分布式身份DID的潜力

在日益数字化的世界中,人们的生活越来越多地依赖于互联网,数字身份也因而变得越来越重要。根据法律规定,互联网应用需要确认用户的真实身份才能提供各种服务,而用户则希望在进行身份认证的同时能够尽量保护他们的个人隐私&#xf…

OpenHarmony 应用通用签名

一.背景 由于hap包需要经过签名才能安装到设备上,在DevEco Studio可以进行自动签名,但是自动签名只能安装在当前的设备上,在其他设备上不能安装,所以我们需要进行通用的手动签名,手动签名HarmonyOS和OpenHarmony流程是…

Windows Sockets 2 笔记

文章目录 一、Winsock简介二、Windows中Winsock对网络协议支持的情况三、使用Winsock3.1 关于服务器和客户端3.2 创建基本Winsock应用程序3.3 初始化Winscok3.3.1 初始化步骤3.3.2 初始化的核心代码3.3.3 WSAStartup函数的协调3.3.4 WSACleanup函数3.3.5 初始化的完整代码 3.4 …

Python基础进阶3:函数和方法不是一回事

你好,我是kelly,今天分享的是Python的函数与方法的不同点。 对于Python的函数和方法是不一样的,这一点需要注意下。 一、结论 1、不存在隐式传参,所有参数都是显式传递的是函数。 2、存在隐式传参的是方法,一般指隐式…

懒加载的el-tree中没有了子节点之后还是有前面icon箭头的展示,如何取消没有子节点之后的箭头显示

没有特别多的数据 <template><el-tree:props"props":load"loadNode"lazyshow-checkbox></el-tree></template><script>export default {data() {return {props: {label: name,children: zones,isLeaf:"leaf",//关…

Matlab:BP神经网络算法,二叉决策树

1、BP神经网络算法 (1)步骤 1.准备训练数据和目标值 2.创建并配置BP神经网络模型 3.训练BP神经网络模型 4.用BP神经网络模型预测数据 例&#xff1a;某企业第一年度营业额为132468&#xff0c;第二年度为158948&#xff0c;第三年度为183737&#xff0c;预测第四年度的营…

VSCode Python开发环境配置

目录 1 插件安装2 Debug和测试配置常见问题 1 插件安装 1.1 基础编译插件&#xff0c;Python、Pylance 1.2 修改语言服务器类型&#xff0c;进入用户配置页面搜索Python: Language Server&#xff0c;选择Pylance&#xff08;一定要修改可以提供很多语法提示&#xff09; 1…

4.21 构建onnx结构模型-Resize

前言 构建onnx方式通常有两种&#xff1a; 1、通过代码转换成onnx结构&#xff0c;比如pytorch —> onnx 2、通过onnx 自定义结点&#xff0c;图&#xff0c;生成onnx结构 本文主要是简单学习和使用两种不同onnx结构&#xff0c; 下面以 Resize 结点进行分析 方式 方法一…

如何编译代码,把RustDesk主页面背景白色改成自己想要的图片

环境&#xff1a; RustDesk1.1.9自建服务器 问题描述&#xff1a; 如何编译代码&#xff0c;把RustDesk主页面背景白色改成自己想要的图片 解决方案&#xff1a; 详细方案&#xff0c;有需要私聊

启动springboot时报错 APPLICATION FAILED TO START 包冲突

启动springboot时报错 APPLICATION FAILED TO START 包冲突 problem 具体日志如下 *************************** APPLICATION FAILED TO START ***************************Description:An attempt was made to call a method that does not exist. The attempt was made fr…

【Java 进阶篇】Redis 缓存优化:提升应用性能的不二选择

在现代的软件开发中&#xff0c;性能一直是开发者们追求的目标之一。对于数据库访问频繁、数据读取较慢的场景&#xff0c;使用缓存是提升性能的有效手段之一。而 Redis 作为一款高性能的内存数据库&#xff0c;被广泛用作缓存工具。本文将围绕 Redis 缓存优化进行详解&#xf…

JMX使用详解

JMX简介JMX优缺点JMX的功能JMX的用法JMX和Activiti的区别JMX使用案例JMX架构JMX支持的协议JMX工作原理JMX主要方法JMX中的MBean的注册JMX拓展SNMP网络管理协议TMN网络管理协议CIM网络管理协议Activiti JMX简介 JMX&#xff08;Java Management Extensions&#xff0c;即Java管…

拍照就能建模!手机就能访问! 这个技术正成为宣传新手段!

随着人工智能技术的不断进步&#xff0c;现在可以通过拍摄照片结合AI技术来实现3D模型生成。这种技术的出现&#xff0c; 不仅能更加方便快捷地创建3D模型&#xff0c;而且还能真实复原现实中物件的质感、纹理等。同时&#xff0c;极大地降低了各行业对3D技术的应用门槛&#x…

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK设置相机的固定帧率(C#)

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK设置相机的固定帧率&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机的固定帧率功能的技术背景CameraExplorer如何查看相机固定帧率功能在NEOAPI SDK里通过函数设置相机固定帧率 Baumer工业相机通过NEOAPI SDK设置相机固…

Scrapy使用案例——爬取豆瓣Top 250电影数据

文章目录 什么是Scrapy&#xff1f;创建Scrapy项目编写Scrapy Spider创建Item类配置数据存储运行Scrapy爬虫处理常见问题结论Python技术资源分享1、Python所有方向的学习路线2、学习软件3、入门学习视频4、实战案例5、清华编程大佬出品《漫画看学Python》6、Python副业兼职与全…

用通俗易懂的方式讲解大模型:使用 FastChat 部署 LLM 的体验太爽了

之前介绍了Langchain-Chatchat 项目的部署&#xff0c;该项目底层改用了 FastChat 来提供 LLM(大语言模型)的 API 服务。 出于好奇又研究了一下 FastChat&#xff0c;发现它的功能很强大&#xff0c;可以用来部署市面上大部分的 LLM 模型&#xff0c;可以将 LLM 部署为带有标准…

Sensor Demosaic IP 手册PG286笔记

《 UG1449 Multimedia User Guide》中包含了大量的多媒体IP简介。 本IP 用于对bayer RGB&#xff08;每个pixel只有单个R/G/B&#xff09;做去马赛克处理&#xff0c;恢复成每个pixel点都有完整的RGB值。通过axi接口配置IP内部erg。 1、算法手册中的描述 提到了几种插值算法&…

IPD-PDP产品开发流程-PDT产品开发计划Charter文档模板(word)3

今天继续为家分享PDT的产品开发计划Charter模板的内容。 Charter任务书模板内容7&#xff1a;人力资源和技能需求 在这一部分&#xff0c;列出项目在不同阶段所需要的不同人力资源需求、数量、能力要求&#xff0c;以及对于一些特殊人力资源的需求。 7.1不同阶段的人力资源汇…

QT上位机开发(乘法计算小软件)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面一篇文章&#xff0c;我们学习了怎么创建qt的第一个工程&#xff0c;怎么用designer给qt修改界面。虽然我们到目前为止&#xff0c;还没有编写…

雪花旅游网的前端html模板推荐

一、需求获取 该网站是一个社交网络平台&#xff0c;也是一个提供旅行攻略、游记、景点介绍、交通信息等旅行相关内容的网站。它为用户提供了丰富的旅行信息&#xff0c;包括国内外的旅游目的地、景点推荐、旅行攻略、游记分享等。用户可以在该网站上查找各地的旅游信息&#…