3d gaussian splatting笔记(paper部分翻译)

本文为3DGS paper的部分翻译。

基于点的𝛼混合和 NeRF 风格的体积渲染本质上共享相同的图像形成模型。 具体来说,颜色 𝐶 由沿射线的体积渲染给出:
在这里插入图片描述

其中密度 𝜎、透射率 𝑇 和颜色 c 的样本是沿着射线以间隔 𝛿 𝑖 采集的。 这可以重写为

在这里插入图片描述

典型的基于神经点的方法通过混合与像素重叠的 N 个有序点来计算像素的颜色 𝐶:
在这里插入图片描述

其中 c 𝑖 是每个点的颜色,𝛼 𝑖 是通过评估一个2D 高斯,用协方差 Σ 乘以学习的每点不透明度。

从等式2,3 可以清楚地看到成像模型是相同的。 然而,渲染算法却有很大不同。 NeRF 是隐式表示空/占用空间的连续表示; 需要昂贵的随机抽样才能找到等式2中的样本。 随之而来的噪声和计算开销。 相比之下,点是一种非结构化、离散的表示形式,它足够灵活,可以像 NeRF 一样创建、破坏和位移几何图形。 这是通过优化不透明度和位置来实现的,同时避免了完整体积表示的缺点。

最近的一种方法使用点通过径向基函数方法来表示辐射场。 他们在优化过程中采用点修剪和致密化技术,但使用体积光线行进并且无法实现实时显示速率。
在人体表演捕捉领域,3D 高斯已被用来表示捕捉到的人体。最近,它们已与体积光线行进一起用于视觉任务。 神经体积基元已在类似的背景下被提出。 虽然这些方法启发了我们选择 3D 高斯作为我们的场景表示,但它们专注于重建和渲染单个孤立对象(人体或面部)的特定情况,从而产生深度复杂度较小的场景。 相比之下,我们对各向异性协方差的优化、交错优化/密度控制以及用于渲染的高效深度排序使我们能够处理完整、复杂的场景,包括室内和室外的背景,并且具有较大的深度复杂性。

输入是一组静态场景的图像,以及由 SfM校准的相应摄像机,这会产生稀疏点云作为副作用。 从这些点出发,我们创建了一组 3D 高斯(第 4 节),由位置(均值)、协方差矩阵和不透明度 𝛼 定义,这允许非常灵活的优化机制。 这会产生 3D 场景的相当紧凑的表示,部分原因是高度各向异性的体积片可用于紧凑地表示精细结构。 辐射场的方向外观分量(颜色)通过球谐函数 (SH) 表示。 我们的算法继续通过 3D 高斯参数的一系列优化步骤来创建辐射场表示(第 5 节),即位置、协方差、𝛼 和 SH 系数与高斯密度自适应控制的操作交织在一起。 我们方法效率的关键是我们基于图块的光栅化器(第 6 节),它允许各向异性图块的𝛼混合,通过快速排序尊重可见性顺序。 快速光栅化器还包括通过跟踪累积的 𝛼 值进行快速向后传递,并且对可以接收梯度的高斯数量没有限制。 我们的方法的概述如图 2 所示。

流程如图:
在这里插入图片描述
可微3d gaussian splatting

我们的目标是优化场景表示,从一组没有法线的稀疏 (SfM) 点开始,实现高质量的新颖视图合成。 为此,我们需要一个基元,它继承可微分体积表示的属性,同时是非结构化和显式的,以允许非常快速的渲染。 我们选择 3D 高斯,它是可微分的,可以轻松投影到 2D splats,从而允许快速𝛼混合进行渲染。
我们的表示与以前使用 2D 点的方法有相似之处 [Kopanas 等人。 2021 年; 一帆等人。 2019]并假设每个点都是一个具有法线的小平面圆。 鉴于 SfM 点极其稀疏,很难估计法线。 同样,从这样的估计中优化非常嘈杂的法线将非常具有挑战性。 相反,我们将几何体建模为一组不需要法线的 3D 高斯函数。 我们的高斯函数由世界空间中定义的完整 3D 协方差矩阵 Σ 定义 [Zwicker 等人,2017]。 2001a] 以点(平均值)𝜇 为中心:

在这里插入图片描述
在我们的混合过程中,该高斯乘以 𝛼。
然而,我们需要将 3D 高斯投影到 2D 进行渲染。 茨威克等人。 [2001a] 演示如何对图像空间进行投影。 给定观察变换 𝑊,相机坐标中的协方差矩阵 Σ ′ 如下:

在这里插入图片描述

其中 𝐽 是射影变换的仿射近似的雅可比行列式。 茨威克等人。 [2001a] 还表明,如果我们跳过 Σ ′ 的第三行和第三列,我们将获得一个具有相同结构和属性的 2×2 方差矩阵,就好像我们从具有法线的平面点开始一样,如之前的工作 [Kopanas et 等人。 2021]。

一种明显的方法是直接优化协方差矩阵 Σ 以获得表示辐射场的 3D 高斯分布。 然而,协方差矩阵仅在半正定时才具有物理意义。 为了优化所有参数,我们使用梯度下降,它不能轻易地被约束来产生这样的有效矩阵,并且更新步骤和梯度可以很容易地创建无效的协方差矩阵。
因此,我们选择了一种更直观、但同样具有表达能力的表示方式来进行优化。 3D 高斯的协方差矩阵 Σ 类似于描述椭球体的配置。 给定缩放矩阵𝑆和旋转矩阵𝑅,我们可以找到相应的Σ:

在这里插入图片描述
为了允许对这两个因素进行独立优化,我们将它们分开存储:用于缩放的 3D 向量 𝑠 和表示旋转的四元数 𝑞。 这些可以简单地转换为各自的矩阵并组合,确保标准化 𝑞 以获得有效的单位四元数。
为了避免训练过程中自动微分带来的巨大开销,我们显式地导出所有参数的梯度。 精确导数计算的详细信息在附录 A 中。各向异性协方差的这种表示(适合优化)允许我们优化 3D 高斯以适应捕获场景中不同形状的几何形状,从而产生相当紧凑的表示。 图 3 说明了这种情况。

在这里插入图片描述

通过 3D 高斯自适应密度控制进行优化

我们方法的核心是优化步骤,它创建一组密集的 3D 高斯函数,准确地表示自由视图合成的场景。 除了位置 𝑝、𝛼 和协方差 Σ 之外,我们还优化表示每个高斯颜色 𝑐 的 SH 系数,以正确捕获场景的依赖于视图的外观。 这些参数的优化与控制高斯密度的步骤交织在一起,以更好地表示场景。

优化

优化基于渲染的连续迭代并将生成的图像与数据集中的训练视图进行比较。 由于 3D 到 2D 投影的模糊性,几何图形不可避免地可能会被错误放置。 因此,我们的优化需要能够创建几何体,并且如果几何体定位不正确,还需要破坏或移动几何体。 3D 高斯协方差参数的质量对于表示的紧凑性至关重要,因为可以用少量大的各向异性高斯函数捕获大的均匀区域。

我们使用随机梯度下降技术进行优化,充分利用标准 GPU 加速框架,以及为某些操作添加自定义 CUDA 内核的能力。 特别是,我们的快速光栅化(参见第 6 节)对于优化的效率至关重要,因为它是优化的主要计算瓶颈。
我们对 𝛼 使用 sigmoid 激活函数将其限制在 [0 − 1) 范围内并获得平滑梯度,出于类似的原因,我们对协方差尺度使用指数激活函数。
我们将初始协方差矩阵估计为各向同性高斯矩阵,其轴等于到最近三个点的距离的平均值。 我们使用类似于 Plenoxels 的标准指数衰减调度技术,但仅适用于位置。 损失函数是 L 1 与 D-SSIM 项的结合:

在这里插入图片描述
高斯自适应控制

我们从 SfM 的初始稀疏点集开始,然后应用我们的方法自适应地控制单位体积 1 上高斯的数量及其密度,从而使我们能够从初始的稀疏高斯集变为更好地表示 场景,并具有正确的参数。 优化预热后(参见第 7.1 节),我们每 100 次迭代进行一次致密化,并删除任何本质上透明的高斯分布,即 𝛼 小于阈值 𝜖 𝛼 。 我们对高斯的自适应控制需要填充空白区域。 它专注于缺少几何特征的区域(“重建不足”),但也关注高斯覆盖场景中大面积的区域(通常对应于“过度重建”)。 我们观察到两者都有很大的视图空间位置梯度。 直观上,这可能是因为它们对应于尚未很好重建的区域,并且优化尝试移动高斯来纠正这一点。

由于这两种情况都是致密化的良好候选者,因此我们用高于阈值 𝜏 的视空间位置梯度的平均幅度来致密高斯,我们在测试中将其设置为 0.0002。

接下来我们将详细介绍该过程,如图 4 所示。

图 4.我们的自适应高斯致密化方案。 顶行(重建中):当小规模几何体(黑色轮廓)未被充分覆盖时,我们克隆相应的高斯。 底行(过度重建):如果小规模几何体由一个大的板表示,我们将其分成两部分。

在这里插入图片描述
对于重建区域中的小高斯,我们需要覆盖必须创建的新几何形状。 为此,最好通过简单地创建相同大小的副本并将其沿位置梯度的方向移动来克隆高斯。

另一方面,具有高方差的区域中的大高斯需要被分割成更小的高斯。 我们用两个新的高斯函数替换这些高斯函数,并将它们的尺度除以我们通过实验确定的系数 𝜙 = 1.6。 我们还通过使用原始 3D 高斯作为 PDF 进行采样来初始化它们的位置。

在第一种情况下,我们检测并处理增加系统总体积和高斯数量的需要,而在第二种情况下,我们保留总体积但增加高斯数量。 与其他体积表示类似,我们的优化可能会因靠近输入摄像机的浮动体而陷入困境; 在我们的例子中,这可能会导致高斯密度的不合理增加。 调节高斯数量增加的有效方法是每 𝑁 = 3000 次迭代将 𝛼 值设置为接近于零。 然后,优化会在需要时增加高斯的 𝛼,同时允许我们的剔除方法删除 𝛼 小于 𝜖 𝛼 的高斯,如上所述。 高斯可能会缩小或增长,并且与其他高斯有相当大的重叠,但我们会定期删除在世界空间中非常大的高斯以及在视空间中具有较大足迹的高斯。 该策略可以总体上很好地控制高斯总数。 我们模型中的高斯始终在欧几里得空间中保持原语; 与其他方法不同,我们不需要针对远距离或大高斯的空间压缩、扭曲或投影策略。

高斯快速可微光栅化器

我们的目标是实现快速整体渲染和快速排序,以允许近似 𝛼 混合(包括各向异性图片),并避免对先前工作中存在的可以接收梯度的图片数量进行硬性限制 [Lassner 和 Zollhofer 2021]。

为了实现这些目标,我们受最新软件光栅化方法 [Lassner 和 Zollhofer 2021] 的启发,为高斯图设计了一个基于图块的光栅化器,一次对整个图像的图元进行预排序,避免了对每个像素进行排序的开销,而这会阻碍之前的 𝛼-混合解决方案。 我们的快速光栅化器允许在任意数量的混合高斯上进行有效的反向传播,并且附加内存消耗低,每个像素只需要恒定的开销。 我们的光栅化管道是完全可微分的,并且考虑到 2D 投影(第 4 节)可以对各向异性 splats 进行光栅化,类似于以前的 2D splatting 方法。

我们的方法首先将屏幕分割成 16×16 块,然后根据视锥体和每个块剔除 3D 高斯。 具体来说,我们只保留与视锥体相交的置信区间为 99% 的高斯分布。 此外,我们使用保护带来简单地拒绝极端位置处的高斯分布(即那些均值接近近平面且远离视锥体的位置),因为计算它们的投影 2D 协方差将不稳定。 然后,我们根据每个高斯重叠的图块数量来实例化它们,并为每个实例分配一个结合了视图空间深度和图块 ID 的键。 然后,我们使用单个快速 GPU 基数排序根据这些键对高斯进行排序 [Merrill 和 Grimshaw 2010]。 请注意,没有额外的每像素点排序,并且混合是基于此初始排序执行的。 因此,我们的 𝛼 混合在某些配置中可以是近似的。 然而,当图块接近单个像素的大小时,这些近似值变得可以忽略不计。 我们发现这种选择极大地增强了训练和渲染性能,而不会在融合场景中产生可见的伪影。

对高斯进行排序后,我们通过识别第一个和最后一个映射到给定图块的深度排序条目来为每个图块生成一个列表。 对于光栅化,我们为每个图块启动一个线程块。 每个块首先协作地将高斯数据包加载到共享内存中,然后对于给定的像素,通过从前到后遍历列表来累积颜色和𝛼值,从而最大化数据加载/共享和处理的并行性增益。 当我们达到像素中的目标饱和度 𝛼 时,相应的线程就会停止。 每隔一段时间,就会查询图块中的线程,并且当所有像素都饱和时(即 𝛼 变为 1),整个图块的处理就会终止。 附录 C 中给出了排序的详细信息和总体光栅化方法的高级概述。

在光栅化过程中,𝛼的饱和度是唯一的停止标准。 与之前的工作相比,我们不限制接收梯度更新的混合基元的数量。 我们强制执行此属性,以允许我们的方法处理具有任意、不同深度复杂性的场景并准确地学习它们,而不必求助于特定于场景的超参数调整。 因此,在后向传递过程中,我们必须恢复前向传递中每个像素的混合点的完整序列。 一种解决方案是将每个像素的任意长混合点列表存储在全局内存中[Kopanas et al. 2021]。 为了避免隐含的动态内存管理开销,我们选择再次遍历 Pertile 列表; 我们可以重用前向传递中的高斯排序数组和平铺范围。 为了便于梯度计算,我们现在从后到前遍历它们。

遍历从影响图块中任何像素的最后一个点开始,并且将点加载到共享内存中再次协作发生。 此外,如果每个像素的深度低于或等于前向传递过程中对其颜色有贡献的最后一个点的深度,则每个像素只会开始(昂贵的)点重叠测试和处理。 第 4 节中描述的梯度计算需要原始混合过程中每个步骤的累积不透明度值。 我们可以通过在前向传递结束时仅存储累积的总不透明度来恢复这些中间不透明度,而不是在后向传递中遍历逐渐缩小的不透明度的显式列表。 具体来说,每个点存储的是前向过程中最终累积的不透明度𝛼; 我们在从后到前的遍历中将其除以每个点的𝛼,以获得梯度计算所需的系数。

优化细节。 为了稳定性,我们以较低的分辨率“预热”计算。 具体来说,我们使用 4 倍小的图像分辨率开始优化,并在 250 次和 500 次迭代后上采样两次。
SH 系数优化对角度信息的缺乏很敏感。 对于典型的“类似 NeRF”的捕捉,通过在其周围的整个半球拍摄的照片来观察中心物体,优化效果很好。 然而,如果捕获丢失了角度区域(例如,当捕获场景的角落或执行“由内而外”[Hedman et al. 2016]捕获时)SH 的零阶分量可以通过优化产生完全不正确的值( 即,基础颜色或漫反射颜色)。 为了克服这个问题,我们首先仅优化零阶分量,然后每 1000 次迭代后引入一个 SH 频带,直到表示所有 4 个 SH 频带。

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

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

相关文章

VSCode插件 —— Cody AI (免费AI助手!)

之前介绍过一款 阿里云免费的AI开发工具——通义灵码 TONGYI Lingma 本文再推荐一个可以极大提高开发前端开发效率的工具 —— Cody AI (Sourcegraph),同样是免费的! 不过,使用Cody AI需要有github 或 Google 、 git…

vue3相比vue2的效率提升

1、静态提升 2、预字符串化 3、缓存事件处理函数 4、Block Tree 5、PatchFlag 一、静态提升 在vue3中的app.vue文件如下: 在服务器中,template中的内容会变异成render渲染函数。 最终编译后的文件: 1.静态节点优化 那么这里为什么是两部分…

内网安全管理系统(保密管理系统)

在当今信息化的时代,企业的内网已经成为其核心资产的重要组成部分。 随着企业的快速发展和信息化程度的提升,内网安全问题日益凸显,如何保障内网的安全和机密信息的保密性,已经成为企业亟待解决的问题。 内网安全管理系统(保密管…

现在的小年轻真的卷得过分了,真是完全不把自己当人啊

现在的小年轻真的卷得过分了,真是完全不把自己当人啊 都说00后躺平了,但是有一说一,该卷的还是卷。这不,前段时间我们公司来了个00后,工作都没两年,跳槽到我们公司起薪18K,都快接近我了。后来才…

常用电子器件学习——MOS管

MOS管介绍 MOS,是MOSFET的缩写。MOSFET 金属-氧化物半导体场效应晶体管,简称金氧半场效晶体管(Metal-Oxide-Semiconductor Field-Effect Transistor, MOSFET)。 一般是金属(metal)—氧化物(oxide)—半导体(semiconductor)场效应晶…

RabbitMQ消息应答与发布

消息应答 RabbitMQ一旦向消费者发送了一个消息,便立即将该消息,标记为删除. 消费者完成一个任务可能需要一段时间,如果其中一个消费者处理一个很长的任务并仅仅执行了一半就突然挂掉了,在这种情况下,我们将丢失正在处理的消息,后续给消费者发送的消息也就无法接收到了. 为了…

OpenHarmony驱动消息机制管理

驱动消息机制管理 当用户态应用和内核态驱动需要交互时,可以使用HDF框架的消息机制来实现。 消息机制的功能主要有以下两种: 用户态应用发送消息到驱动。 用户态应用接收驱动主动上报事件。 配置管理 HCS(HDF Configuration Source&…

深入分析 Linux 网络丢包问题

热门IT课程【视频教程】-华为/思科/红帽/oraclehttps://xmws-it.blog.csdn.net/article/details/134398330 所谓丢包,是指在网络数据的收发过程中,由于种种原因,数据包还没传输到应用程序中,就被丢弃了。这些被丢弃包的数量&#…

C++进阶:多态(下)

1、多态的原理 多态之所以可以实现,主要是因为虚函数表的存在,虚函数表用于记录虚函数的地址,他是一个函数指针数组,在类中用一个函数指针数组指针来指向数组,子类继承了父类的虚函数表,当有重写的情况发生…

基于SAM的视频标注

在本文中,我们将演示基础模型的应用,例如 Meta 的 Segment Anything 和 YOLOv8,以自动检测、分类和绘制视频中感兴趣对象的蒙版。这是之前指南的后续:使用 Meta 的 Segment Anything 和 YOLOv8 自动分类掩码。在本指南中&#xff…

【RabbitMQ】快速入门及基本使用

一、引言 1、、消息队列 Ⅰ、什么是消息队列? 消息队列是一种进程间通信或同一进程的不同线程间的通信方式,软件的贮列用来处理一系列的输入,通常是来自用户。消息队列提供了异步的通信协议,每一个贮列中的纪录包含详细说明的数据…

PySimpleGUI:让spin支持循环

需求 自己用PySimpleGUI写了个小工具,但是发现它的spin不支持循环。 Tkinter本身的Spinbox有wrap这个开关可以觉得是否支持循环,但是没看到PySimpleGUI也支持这个特性。 代码实现 所谓spin的循环,是指当值变换到最大最小值时,可…

移动开发行业——鸿蒙OS NEXT开出繁花

1月18日,华为宣布HarmonyOS NEXT开发者预览版开放申请,根据官方注解,这个版本的鸿蒙系统有个更通俗易懂的名字——“星河版”,也被称为“纯血”鸿蒙。 根据官方解释,之所以取名星河版,寓意鸿蒙OS NEXT就像…

Screen 简介

目录 1. screen 简介2. screen 基本命令 1. screen 简介 screen 是一个在 Unix 和类 Unix 系统上的 终端复用 工具。它允许用户在单个终端窗口中运行多个终端会话,并提供了一些其他功能,如会话断开后的恢复和远程连接的分离。以下是 screen 的一些主要特…

【C语言】扫雷游戏完整代码实现

目录 1.game.h 2.game.c 3.progress.c 4.运行结果 1.game.h #define _CRT_SECURE_NO_WARNINGS#include <string.h> #include <stdio.h> #include <time.h> #include<stdlib.h>#define ROW 9 #define COL 9 #define ROWS 11 #define COLS 11 #defin…

SpringBoot 中配置处理

1、简介 本文介绍一些 springboot 配置管理相关的内容&#xff0c;如何自定义配置&#xff0c;导入配置&#xff0c;配置绑定和基于 profiles 的配置。 2、springboot 配置管理 2.1、自定义配置类 在 spring 中使用 Configuration 注解定义配置类&#xff0c;在 springboot 中…

进程线程知识

一 初识linux线程 1 线程由来 我们之前说创建一个进程&#xff0c;要创建进程控制块pcb&#xff0c;进程地址空间&#xff0c;页表&#xff0c;而且我之前的博客中都有意无意的说明这个pcb是描述进程的&#xff0c;是os用来管理进程的&#xff0c;而有了线程后&#xff0c;就要…

Python基础第八篇(Python异常处理,模块与包)

文章目录 一、了解异常二、捕获异常&#xff08;1&#xff09;.异常案例代码&#xff08;2&#xff09;.读出结果 三、异常的传递&#xff08;1&#xff09;.异常传递案例代码&#xff08;2&#xff09;.读出结果 四、Python模块&#xff08;1&#xff09;.模块的导入&#xff…

大模型+自动驾驶

论文&#xff1a;https://arxiv.org/pdf/2401.08045.pdf 大型基础模型的兴起&#xff0c;它们基于广泛的数据集进行训练&#xff0c;正在彻底改变人工智能领域的面貌。例如SAM、DALL-E2和GPT-4这样的模型通过提取复杂的模式&#xff0c;并在不同任务中有效地执行&#xff0c;从…

k8s使用ingress实现应用的灰度发布升级

v1是1.14.0版本nginx ,实操时候升级到v2是1.20.0版本nginx&#xff0c;来测试灰度发布实现过程 一、方案&#xff1a;使用ingress实现应用的灰度发布 1、服务端&#xff1a;正常版本v1&#xff0c;灰度升级版本v2 2、客户端&#xff1a;带有请求头versionv2标识的请求访问版…