VastGaussian:用于大型场景重建的巨大3D高斯函数

2024-05-06 18:52

本文主要是介绍VastGaussian:用于大型场景重建的巨大3D高斯函数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

VastGaussian:用于大型场景重建的巨大3D高斯函数

  • 摘要
  • Introduction
  • Related Work
  • Preliminaries
  • Method

VastGaussian: Vast 3D Gaussians for Large Scene Reconstruction.

摘要

现有基于NeRF的大型场景重建方法在视觉效果和渲染速度方面往往存在限制。虽然最近的3D高斯分裂在小型和以目标为中心的场景上表现良好,但将其扩展到大型场景由于受到有限的视频内存、漫长的优化时间和明显的视觉外观变化等问题而面临挑战。

为了解决这些挑战,作者提出了VastGaussian,这是第一种基于3D高斯喷射的高质量重建和大型场景实时渲染的方法。作者提出了一种逐步分割策略,将大型场景划分为多个单元,其中训练相机和点云根据一种空中空间感知的可见性标准进行适当分布。这些单元在并行优化后合并成一个完整的场景。作者还将在优化过程中引入解耦的外观建模,以减少渲染图像中的外观变化。作者的方法优于现有的NeRF-based方法,并在多个大型场景数据集上取得了最先进的结果,实现了快速优化和高保真的实时渲染。

项目页面:https://vastgaussian.github.io

Introduction

大规模场景重建对于许多应用至关重要,包括自动驾驶[22, 33, 54],航空测绘[6, 13]以及虚拟现实,这些应用需要照片级的视觉质量和实时渲染。一些方法[41, 44, 52, 53, 61]被提出来扩展神经辐射场(NeRF)[31]到大规模场景,但它们仍然缺乏细节或者渲染速度缓慢。近期,3D高斯 splatting (3DGS) [21]作为一项具有视觉质量和渲染速度优异性能的有前景的方法出现,使得在1080p分辨率下实现照片级实时渲染成为可能。它也被应用于动态场景重建[28, 51, 55, 56]和3D内容生成[12, 42, 59]。然而,这些方法专注于小规模和以目标为中心的场景。当应用于大规模环境时,存在几个可扩展性问题。首先,3D高斯函数的数量受到给定视频内存的限制,而大型场景丰富的细节需要大量的3D高斯函数。简单地将3DGS应用于大规模场景将导致要么重建质量低,要么内存不足错误。为了直观解释,一个32GB的GPU可以用来优化大约1100万个3D高斯函数,而在Mip-NeRF 360数据集[3]中的小型Garden_场景,其面积不足100平方米,已经需要大约580万个3D高斯函数进行高保真重建。其次,需要对整个大型场景作为一个整体进行足够次数的迭代优化,这可能是耗时的,并且在没有良好正则化的情况下可能不稳定。第三,在大规模场景中,光照通常不均匀,捕获的图像中存在明显的外观变化,如图2(a)所示。3DGS倾向于生成低不透明度的大型3D高斯函数来补偿不同视角之间的差异。例如,明亮的斑点往往出现在曝光高的图像中靠近相机的地方,而暗斑点与曝光低的图像相关联。这些斑点在从新视角观察时变成了空中不愉快的漂浮物,如图2(b, d)所示。在这里插入图片描述
为了解决这些问题,作者提出了基于3D高斯溅射的大场景重建方法——Vast 3D高斯(VastGaussian)。作者以分而治之的方式重建大型场景:将大型场景划分为多个单元,独立优化每个单元,并最终将它们合并成完整的场景。由于这些单元在空间尺度上更精细且数据大小较小,因此更容易优化。一种自然而简单的划分策略是根据它们的位置将训练数据地理分布。这可能导致由于相邻两个单元之间通用相机较少而在边界处产生伪影,且如果没有足够的监督可能会在空中产生悬浮物。因此,作者提出了基于可见性的数据选择方法,以逐步融入更多训练相机和点云,这确保了无缝合并并消除了空中的悬浮物。作者的方法比3DGS具有更好的灵活性和可扩展性。这些单元中的每一个都包含较少的3D高斯分布,这降低了内存需求和优化时间,尤其是在使用多个GPU并行优化时。合并场景中包含的3D高斯总数可以大大超过整个场景训练时的数量,从而提高重建质量。此外,作者可以通过融入新单元或仅对特定区域进行微调来扩展场景,而无需重新训练整个大型场景。

为了减少由外观变化引起的漂浮物,提出了结合外观嵌入[29]的生成潜在优化(GLO)[5]用于基于NeRF的方法[41, 61]。这种方法通过光线行进采样点,并将点特征与外观嵌入一起输入到MLP中,以获得最终的颜色。渲染过程与优化相同,仍然需要外观嵌入作为输入。它不适合3DGS,因为其渲染是通过逐帧栅格化而不是通过MLP完成的。因此,作者提出了一种新颖的解耦外观建模,仅在优化过程中应用。作者逐像素地将外观嵌入附加到渲染的图像上,并将它们输入到CNN中,以获得用于在渲染图像上应用外观调整的变换图。作者通过惩罚渲染图像与其真实图像之间的结构差异来学习常数信息,同时,在调整后的图像上计算光度损失,以适应训练图像中的外观变化。作者只需要一致的渲染,所以这个外观建模模块在优化后可以丢弃,从而不会降低实时渲染速度。

在几个大型场景基准测试上的实验证实了作者的方法优于基于NeRF的方法。作者的贡献总结如下:

作者介绍了VastGaussian,这是第一种基于3D高斯溅射的大场景高保真重建和实时渲染方法。

作者提出了一种逐步数据划分策略,该策略将训练视图和点云分配到不同的单元格中,从而实现并行优化和无缝合并。

作者引入了解耦的外观建模到优化过程中,这可以抑制由于外观变化引起的漂浮物。在优化后,可以丢弃这个模块以获得实时渲染速度。

Related Work

Large Scene Reconstruction
在过去的几十年中,基于图像的大型场景重建取得了重大进展。一些研究[1、16、23、34、38、39、62]遵循运动结构(SfM)流程来估计相机姿态和稀疏点云。后续研究[17、19]基于多视图立体(MVS)从SfM输出生成密集点云或三角网格。随着NeRF[31]近年来成为照片级真实新颖视图合成的流行3D表示形式[35],许多变体被提出以改善质量[2、45、47、48、49、57、2、24、44、54],提高速度[8、9、11、14、20、32、36、37、40、43、46、58、60],扩展到动态场景[7、15、18、25、27、50]等。一些方法[41、44、52、53、61]将其扩展到大型场景。Block-NeRF[41]将城市划分为多个区块,并根据其位置分配训练视图。Mega-NeRF[44]使用基于网格的划分,并将图像中的每个像素通过其射线穿过的不同网格分配给它们。与这些启发式分割策略不同,Switch-NeRF[61]引入了NeRF专家混合框架来学习场景分解。Grid-NeRF[53]不执行场景分解,而是结合了基于NeRF和基于网格的方法。尽管这些方法的渲染质量显著优于传统方法,但它们仍然缺乏细节并且渲染速度慢。最近,3D高斯溅射[21]引入了一种具有高质量和实时渲染能力的表达性显式3D表示,在1080p分辨率下。然而,将其扩展到大型场景并不是一件容易的事。作者的VastGaussian是第一个通过场景划分、优化和合并的新颖设计来实现这一点的。

Varying Appearance Modeling
外观变化是在变化的光照或不同的摄像机设置(如自动曝光、自动白平衡和色调映射)下基于图像的重建中常见的问题。NRW [30] 以数据驱动的方式训练一个外观编码器,使用对比损失,它以延迟着色的深度缓冲区作为输入并生成一个外观嵌入(AE)。NeRF-W [29] 将AE附加到基于射线的行进中的点状特征上,并将它们输入到MLP以获得最终颜色,这在许多基于NeRF的方法[41, 44, 61]中成为了标准做法。Ha-NeRF [10] 将AE设置为跨不同视图的全局表示,并通过视图一致性损失来学习它。在作者的VastGaussian中,作者将AE与渲染的图像连接起来,将它们输入到CNN以获得变换图,并使用变换图来调整渲染的图像以适应外观变化。

Preliminaries

在本文中,作者提出了基于三维高斯溅射(3DGS)[21]的大场景重建和渲染方法 VastGaussian。3DGS通过一组三维高斯分布 G G G来表示几何和外观。每个三维高斯由其位置、各向异性协方差、不透明度和用于视点相关颜色的球面谐波系数来描述。在渲染过程中,每个三维高斯被投影到图像空间作为一个二维高斯。这些投影的二维高斯被分配到不同的图块中,然后按点基体积渲染方式[63]对它们进行排序和alpha混合,形成一个渲染图像。

用于优化场景的数据集包含一个稀疏点云 P P P和训练视图 V = { ( C i , I i ) } V=\{(C_i, I_i)\} V={(Ci,Ii)},其中 C C C是第 i i i个相机, I I I是相应的图像。 P P P C C C是通过从 V V V中进行Structure-from-Motion(SfM)估计得到的。 P P P用于初始化3D高斯分布,而 V V V用于基于可微渲染和梯度优化的3D高斯分布。对于相机 C C C,通过可微光栅化器 R R R获得的渲染图像 I R = R ( G , C ) I_{R}=R(G,C) IR=R(G,C)。以下是根据 I R I_{R} IR I I I之间的损失函数优化3D高斯分布属性:
L = ( 1 − α ) L 1 ( I R , I i ) + α L D − S S I M ( I T , I i ) L = (1 - \alpha) L1(I_{R}, I_{i}) + \alpha LD-SSIM(I_{T}, I_{i}) L=(1α)L1(IR,Ii)+αLDSSIM(IT,Ii)
其中 α \alpha α是一个超参数,而 L D − S S I M LD-SSIM LDSSIM表示D-SSIM损失[21]。这个过程与自适应点加密交错进行,当点的累积梯度达到一定阈值时触发。

Method

3DGS [21] 在小规模和以目标为中心的场景中表现良好,但当扩展到大型环境时,由于视频内存限制、漫长的优化时间和外观变化,它会遇到困难。在本文中,作者将3DGS扩展到大型场景,以实现实时和高品质的渲染。作者 Proposal 将大型场景划分为多个单元格,并在单独优化后进行合并。在第四部分1.1节,作者引入了一种渐进式数据分区策略,该策略具有考虑空中可见性的计算。第四部分1.2节详细阐述了如何优化单个单元格,展示了作者解耦的外观建模方法,以捕捉图像中的外观变化。最后,在第四部分1.3节中,作者描述了如何合并这些单元格。

Progressive Data Partitioning
作者将大型场景划分为多个单元格,并将点云P的一部分和视图V分配给这些单元格以进行优化。这些单元格中的每一个都包含较少的3D高斯分布,这对于内存容量较低情况下的优化更加适合,并且在并行优化时需要的训练时间较少。作者的渐进式数据分区策略的流程图如图3所示。在这里插入图片描述
基于摄像机位置的分区划分。 如图3(a)所示,作者根据摄像机在地面平面上的投影位置来划```
分场景,并确保每个单元格包含相似数量的训练视图,以保证在相同迭代次数下不同单元格之间的优化平衡。不失一般性,假设一个 m × n m \times n m×n的网格单元很好地适应所讨论的场景,作者首先沿着一个轴线将地面平面划分为 m m m个部分,每个部分大约包含 ∣ V ∣ / m |V|/m V∣/m个视图。然后这些部分沿着另一个轴线进一步细分为 n n n段,每段大约包含 ∣ V ∣ / ( m × n ) |V|/(m \times n) V∣/(m×n)个视图。虽然这里作者以网格为基础的划分为例,但作者的数据分区策略同样适用于其他基于地理划分的方法,比如扇区化和四叉树。

基于位置的数据选择。如图3(b)所示,作者在扩展边界后,将训练视角 V V V和点云 P P P的一部分分配给每个单元格。具体来说,假设第 j j j个区域在一个 h × C h \times C h×C的矩形内界定;原始边界按照一定的比例扩大,本文中为20%,从而得到一个更大的尺寸为 ( 1 + 0.2 ) × ( C + 0.2 ) × C ′ (1+0.2) \times (C+0.2) \times C' (1+0.2)×(C+0.2)×C的矩形。作者根据扩展后的边界将训练视角 V V V分割为 { V } i \{V\}_i {V}i,并以同样的方式将点云 P P P分割为 { P } i \{P\}_i {P}i

基于可见性的相机选择。作者发现上一步选择的相机不足以进行高保真重建,这可能导致细节较差或出现漂浮物伪影。为了解决这个问题,作者提出根据可见性标准增加更多相关的相机,如图3©所示。对于一个尚未选择的相机 C C C,设 Q i j Q_{ij} Qij为图像 I j I_j Ij中第 j j j个单元的投影面积, Q j Q_j Qj I j I_j Ij的面积;可见性定义为 Q i j / Q j Q_{ij}/Q_j Qij/Qj。那些可见性值大于预定义阈值 T T T的相机被选中。

请注意,不同的计算 Q i j Q_{ij} Qij的方式会导致不同的摄像机选择。如图3(e)所示,一种自然而简单的解决方案是基于分布在物体表面的三维点。这些点投影到 I j I_j Ij上形成一个面积为 S Q SQ SQ的凸包。这种计算对空域是盲目的,因为它只考虑了表面。因此,在这种计算中,由于在第 j j j个单元上的低可见性,一些相关的摄像头没有被选中,这导致了对空域的监督不足,并且无法抑制空中漂浮物。

作者引入了一种考虑空域的可见性计算方法,如图3(f)所示。具体来说,由第 j j j个单元格中的点云形成一个轴对齐的边界框,其高度选为最高点与地面平面之间的距离。作者将边界框投影到 I j I_j Ij上,并得到一个凸包区域 Q j ′ Q_j' Qj. 这种考虑空域的解决方案考虑了所有可见空间,这确保了给定一个适当的可见性阈值,选择对该单元格优化有重要贡献的视图,并为空域提供足够的监督。

基于覆盖范围的点选择。在将更多相关的摄像头添加到第 j j j个单元的摄像头集合 V j V_j Vj之后,作者将所有在 V j V_j Vj中视图覆盖的点添加到 P j P_j Pj中,如图3(d)所示。新选择的点可以为该单元的优化提供更好的初始化。如图3(g)所示,一些在第 j j j个单元外的物体可以被 V j V_j Vj中的某些视图捕捉到,由于没有适当的初始化而导致深度歧义,会在错误的位置生成新的3D高斯分布来拟合这些物体。然而,通过添加这些物体点进行初始化,可以轻松创建正确位置的新3D高斯分布来拟合这些训练视图,而不是在第 j j j个单元中产生浮动点。需要注意的是,在单元优化后,单元外部生成的3D高斯分布将被移除。

Decoupled Appearance Modeling
在光照不均匀条件下拍摄的图像中存在明显的外观变化,如图2 (a-d)所示,3DGS倾向于在不同视图中产生浮点物以补偿这些变化。
为了解决这个问题,一些基于NeRF的方法[29,41,44,61]在逐像素光线行进中,将外观嵌入与基于点的特征连接起来,并将它们输入到辐射MLP中以获得最终的颜色。这种方法不适合3DGS,因为3DGS的渲染是通过逐帧光栅化实现的,不使用MLPs。相反,作者将解耦的外观建模引入到优化过程中,这产生了一个转换图来调整渲染图像以适应训练图像中的外观变化,如图4所示。具体来说,作者首先将渲染图像进行下采样,这不仅可以防止转换图学习高频细节,还可以减少计算负担和内存消耗。然后,作者将一个长度为 m m m的外观嵌入 L L L连接到下采样后三通道图像的每个像素上,得到一个具有 3 + m 3+m 3+m个通道的2D图 D i D_i Di。将 D i D_i Di输入到一个卷积神经网络(CNN)中,该网络逐步将 D i D_i Di上采样以生成与 T T T同分辨率的 M i M_i Mi。最后,通过使用 M i M_i Mi进行逐像素转换 T T T,得到具有外观变化图像 I j I_j Ij在这里插入图片描述

=T(I_j;M_i;).
在作者的实验中,一个简单的逐像素乘法在作者使用的数据集上表现良好。外观嵌入和卷积神经网络(CNN)与3D高斯分布一同优化,使用的损失函数是根据方程式( 1 1 1)修改得来的: = ( 1 − α ) L 1 ( I i , I i ) + α L D − s s I M ( I ′ , I i ) =(1 - \alpha)L1(I_i,I_i) + \alpha LD-ssIM(I',I_i) =(1α)L1(Ii,Ii)+αLDssIM(I,Ii)
由于LD-ssIM主要惩罚结构的不相似性,将它应用于 I j I_j Ij 和真实图像 I i I_i Ii之间使得 I j I_j Ij中的结构信息接近 I i I_i Ii,而将外观信息留给和卷积神经网络(CNN)去学习。损失 L L L被用于外观可变渲染和 I j I_j Ij之间,它用于拟合可能与其他图像在外观上有所变化的真实图像 I i I_i Ii。经过训练后,期望 I j I_j Ij能与其他图像保持外观一致,从而让3D高斯分布能够学习所有输入视图的平均外观和正确的几何形状。这种外观建模在优化后可以被丢弃,而不会降低实时渲染的速度。
Seamless Merging
在独立优化所有单元之后,作者需要将它们合并以获得完整的场景。对于每个优化的单元,在边界扩展之前,作者删除了原始区域外的3D高斯分布(图3(a))。否则,它们可能成为其他单元中的浮动物。然后作者合并这些非重叠单元的3D高斯分布。由于在作者数据划分中相邻单元之间有一些共同的训练视角,因此合并后的场景在外观和几何上是无缝的,没有明显的边界伪影。因此,无需像Block-NeRF [41]那样进行进一步的外观调整。合并场景中包含的3D高斯分布总数可以大大超过整个场景训练时的数量,从而提高重建质量。

这篇关于VastGaussian:用于大型场景重建的巨大3D高斯函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/965091

相关文章

Python函数的基本用法、返回值特性、全局变量修改及异常处理技巧

《Python函数的基本用法、返回值特性、全局变量修改及异常处理技巧》本文将通过实际代码示例,深入讲解Python函数的基本用法、返回值特性、全局变量修改以及异常处理技巧,感兴趣的朋友跟随小编一起看看... 目录一、python函数定义与调用1.1 基本函数定义1.2 函数调用二、函数返回值详解2.1 有返

Python Excel 通用筛选函数的实现

《PythonExcel通用筛选函数的实现》本文主要介绍了PythonExcel通用筛选函数的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录案例目的示例数据假定数据来源是字典优化:通用CSV数据处理函数使用说明使用示例注意事项案例目的第一

防止Linux rm命令误操作的多场景防护方案与实践

《防止Linuxrm命令误操作的多场景防护方案与实践》在Linux系统中,rm命令是删除文件和目录的高效工具,但一旦误操作,如执行rm-rf/或rm-rf/*,极易导致系统数据灾难,本文针对不同场景... 目录引言理解 rm 命令及误操作风险rm 命令基础常见误操作案例防护方案使用 rm编程 别名及安全删除

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

Three.js构建一个 3D 商品展示空间完整实战项目

《Three.js构建一个3D商品展示空间完整实战项目》Three.js是一个强大的JavaScript库,专用于在Web浏览器中创建3D图形,:本文主要介绍Three.js构建一个3D商品展... 目录引言项目核心技术1. 项目架构与资源组织2. 多模型切换、交互热点绑定3. 移动端适配与帧率优化4. 可

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

Python Counter 函数使用案例

《PythonCounter函数使用案例》Counter是collections模块中的一个类,专门用于对可迭代对象中的元素进行计数,接下来通过本文给大家介绍PythonCounter函数使用案例... 目录一、Counter函数概述二、基本使用案例(一)列表元素计数(二)字符串字符计数(三)元组计数三、C

Python中的filter() 函数的工作原理及应用技巧

《Python中的filter()函数的工作原理及应用技巧》Python的filter()函数用于筛选序列元素,返回迭代器,适合函数式编程,相比列表推导式,内存更优,尤其适用于大数据集,结合lamb... 目录前言一、基本概念基本语法二、使用方式1. 使用 lambda 函数2. 使用普通函数3. 使用 N

Spring Security 前后端分离场景下的会话并发管理

《SpringSecurity前后端分离场景下的会话并发管理》本文介绍了在前后端分离架构下实现SpringSecurity会话并发管理的问题,传统Web开发中只需简单配置sessionManage... 目录背景分析传统 web 开发中的 sessionManagement 入口ConcurrentSess

MySQL中REPLACE函数与语句举例详解

《MySQL中REPLACE函数与语句举例详解》在MySQL中REPLACE函数是一个用于处理字符串的强大工具,它的主要功能是替换字符串中的某些子字符串,:本文主要介绍MySQL中REPLACE函... 目录一、REPLACE()函数语法:参数说明:功能说明:示例:二、REPLACE INTO语句语法:参数