高斯泼溅的全面概述

一、说明

        高斯泼溅是一种用于表示 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.  凯特·尤尔科娃

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

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

相关文章

2020年认证杯SPSSPRO杯数学建模B题(第一阶段)分布式无线广播全过程文档及程序

2020年认证杯SPSSPRO杯数学建模 B题 分布式无线广播 原题再现: 以广播的方式来进行无线网通信,必须解决发送互相冲突的问题。无线网的许多基础通信协议都使用了令牌的方法来解决这个问题,在同一个时间段内,只有唯一一个拿到令牌…

世界经济论坛制定了五项指导原则,实现跨OT环境的网络安全。

内容概述: 世界经济论坛在其题为“解锁工业环境中的网络弹性:五项原则”的报告中列出:原则一:执行全面风险管理OT 环境、原则二:确保OT工程师和安装操作员对OT网络安全负责、原则三:与高层组织领导、战略规…

冒泡排序--------(C每日一题)

冒泡排序&#xff1a; 每次将相邻的两个数比较,将小的调到前头--升序 冒泡排序一个结论&#xff1a; n个数要进行n-1轮比较&#xff0c;第j轮要进行n-j次两两比较 循环体代码&#xff1a; int main() {int i, j,n,a[10],t;//n是几个数比较for(j1;j<n-1;j)//控制轮次for…

一篇文章深入认识微服务SpringCloud和Dubbo的区别

1、SpringCloud是什么 SpringCloud, 基于SpringBoot提供了一套微服务解决方案&#xff0c;包括服务注册与发现&#xff0c;配置中心&#xff0c;全链路监控&#xff0c;服务网关&#xff0c;负载均衡&#xff0c;熔断器等组件&#xff0c;除了基于NetFlix的开源组件做高度抽象…

鸿蒙系列--组件介绍之容器组件

一、Badge 描述&#xff1a;给其他组件添加标记 子组件&#xff1a;支持单个子组件 1.创建数字标记 Badge(value: {count: number, position?: BadgePosition, maxCount?: number, style: BadgeStyle}) 2.创建字符串标记 Badge(value: {value: string, position?: Badge…

【Bootstrap学习 day4】

Bootstrap5 列表组 使用Bootstrap创建列表 可以创建三种不类型的HTML列表&#xff1a; 无序列表—顺序无关紧要的项目列表。无序列表中的列表标有项目符号&#xff0c;例如。、等ul>li有序列表—顺序确实很重要的项目列表。有序列表中的列表项用数字标记&#xff0c;例如1、…

linux休眠机制介绍

一、概述 Linux系统提供了休眠和低功耗模式&#xff0c;可以帮助节省电力和延长电池寿命&#xff0c;休眠对应的另外一种模式就是唤醒。 二、常用的休眠方式 常用的休眠方式有freeze,standby, mem, disk&#xff0c;hibernate freeze: 冻结所有的进程&#xff0c;包括用户空…

【设计模式】外观模式

文章目录 前言一、外观模式1.案例2.优缺点3.使用场景4.源码解析 总结 前言 【设计模式】外观模式 一、外观模式 有些人可能炒过股票&#xff0c;但其实大部分人都不太懂&#xff0c;这种没有足够了解证券知识的情况下做股票是很容易亏钱的&#xff0c;刚开始炒股肯定都会想&am…

Can‘t locate IPC/Cmd.pm in @INC (@INC contains:解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

适应变化:动态预测在机器学习中的作用

一、介绍 机器学习 (ML) 中的动态预测是指随着新数据的出现而不断更新预测的方法。这种方法在从医疗保健到金融等各个领域越来越重要&#xff0c;其中实时数据分析和最新预测可以带来更好的决策和结果。在本文中&#xff0c;我将讨论机器学习中动态预测的概念、其优势、挑战以及…

网络瑞士军刀应用Cyber​​Chef

本文软件由网友 zxc 推荐&#xff1b; 什么是 Cyber​​Chef ? Cyber​​Chef 是一款简单、直观的网络应用程序&#xff0c;用于在网络浏览器中执行各种“网络”操作。这些操作包括 XOR 和 Base64 等简单编码、AES、DES 和 Blowfish 等更复杂的加密、创建二进制和十六进制转储…

【HarmonyOS】鸿蒙开发简介与项目基础配置演示

从今天开始&#xff0c;博主将开设一门新的专栏用来讲解市面上比较热门的技术 “鸿蒙开发”&#xff0c;对于刚接触这项技术的小伙伴在学习鸿蒙开发之前&#xff0c;有必要先了解一下鸿蒙&#xff0c;从你的角度来讲&#xff0c;你认为什么是鸿蒙呢&#xff1f;它出现的意义又是…

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

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

概率论基础复习题

一、填空题 二、选择题 答案&#xff1a;B 答案&#xff1a;C 答案&#xff1a;C 答案&#xff1a;D。统计量不含任何未知参数。 答案&#xff1a;A 答案&#xff1a;C 样本均值是总体均值的无偏估计&#xff1b;样本方差是总体方差的无偏估计。 答案&#xff1a;B。统计值是一…

4.25 构建onnx结构模型-Split

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

elasticsearch+Kibana

什么是es(elasticsearch) Elasticsearch是一个开源的分布式搜索和分析引擎&#xff0c;它构建在Apache Lucene搜索引擎库之上。它提供了一个分布式多用户能力的实时搜索和分析引擎&#xff0c;能够处理大规模的数据。Elasticsearch被广泛用于构建全文搜索、日志分析、实时应用…

4.24 构建onnx结构模型-Slice

前言 构建onnx方式通常有两种: 1、通过代码转换成onnx结构,比如pytorch —> onnx 2、通过onnx 自定义结点,图,生成onnx结构 本文主要是简单学习和使用两种不同onnx结构, 下面以 Slice 结点进行分析 方式 方法一:pytorch --> onnx 暂缓,主要研究方式二 方法…

omlox定位标准(二)——定位核心

上一篇文章中介绍了关于omlox hub相关内容&#xff0c;可以用于整合多种API接口&#xff0c;便于实现统一的应用&#xff0c;本文中介绍omlox core&#xff0c;介绍了基础设施、定位技术、定位引擎等内容。 2.omlox core zone and air-interface 随着越来越多的业务应用基于室…

鸿蒙4.0实战教学—基础ArkTS(简易视频播放器)

构建主界面 主界面由视频轮播模块和多个视频列表模块组成&#xff0c;效果图如图&#xff1a; VideoData.ets中定义的视频轮播图数组SWIPER_VIDEOS和视频列表图片数组HORIZONTAL_VIDEOS。 // VideoData.ets import { HorizontalVideoItem } from ./HorizontalVideoItem; impo…

优化v-viewer加载性能

v-viewer简介 v-viewer 是一个 Vue 组件&#xff0c;用于显示图片和其他媒体内容的全屏查看器。它基于 Viewer.js&#xff0c;一个强大的图片查看库。 以下是一个基本的使用示例&#xff1a; <template><div v-viewer><img src"image1.jpg" />&…