【论文笔记】ZeroGS:扩展Spann3R+GS+pose估计
spann3r是利用dust3r做了增量式的点云重建,这里zeroGS在前者的基础上,进行了增量式的GS重建以及进行了pose的联合优化,这是一篇dust3r与GS结合的具有启发意义的工作。
abstract
NeRF和3DGS是重建和渲染逼真图像的流行技术。然而,他们需要以SfM作为前提。虽然之前的方法可以从少量无姿态图像中重建,但它们不适用于图像无序或密集采集的情况。在本研究中,我们提出了ZeroGS,用于从数百张无姿态和无序的图像中训练3DGS。我们的方法利用预训练的基础模型作为神经场景表示。由于预测的点图精度不足以支持精确的图像配准和高保真图像渲染,我们提出通过从种子图像初始化和微调预训练模型来缓解这一问题。然后,图像逐步配准并添加到训练缓冲区中,进一步用于训练模型。我们还提出通过最小化多视角之间的点到相机光线一致性损失来优化相机姿态和点图。在LLFF数据集、MipNeRF360数据集和Tanks-and-Temples数据集上的实验表明,我们的方法比当前最先进的无姿态NeRF/3DGS方法恢复了更准确的相机姿态,甚至渲染出比使用COLMAP姿态的3DGS更高质量的图像。
1. Introduction
NeRF和3DGS正逐渐成为用于重建三维场景的最流行技术。尽管NeRF/3DGS能够重建逼真的场景,但它们需要从结构从运动(SfM)工具(如COLMAP [47])中获取准确的相机姿态。NeRF/3DGS在初始化时难以处理不准确的相机姿态,通常会生成模糊的图像。并且现在很少有研究尝试用3DGS解决这些问题。尽管CF-3DGS [21] 可以在不依赖COLMAP相机姿态的情况下训练3DGS,但它仅适用于相机姿态在连续帧之间变化不大的短序列图像。
DUSt3R [59] 提出了将相机姿态与可泛化 3D 生成系统 (3DGS) [49, 64] 的训练过程分离的方法。DUSt3R 接收一对图像作为输入,并输出在参考图像坐标系中的点对点地图。DUSt3R 使用大量包含准确相机姿态和 3D 点的真实世界数据进行训练,因此对未见过的图像对具有很好的泛化能力。然而,这些可泛化的 3DGS 方法 [49, 64] 由于严重依赖 DUSt3R,因此只能处理图像对的少量样本设置。InstantSplat [18] 利用预训练的 DUSt3R 作为一个离线工具。给定同一场景中的成对图像,InstantSplat 首先使用 DUSt3R 计算成对的点地图,然后通过联合优化相机姿态和密集点图到全局坐标系中来对齐这些密集点图。随后,InstantSplat 使用来自 DUSt3R 的对齐密集点来训练 3DGS。但是,优化密集点图所需的大量 GPU 内存限制了 InstantSplat 处理只有少量图像的场景。

我们提出了 ZeroGS,用于在不依赖 COLMAP 相机姿态的情况下训练 3DGS。我们的方法能够从数百张无序图像中重建场景(参见图 1)。具体地,我们利用一个预训练的 3D 基础模型作为神经场景表示。除了预测点图外,我们将模型扩展以预测 3D 高斯基元的属性。预训练模型已经学到了粗略的场景几何先验,这使得从零开始联合优化模型和相机参数变得容易得多。在定义了我们的神经场景表示后,我们采用了一种增量训练管道来微调模型。我们首先通过在全局坐标系中使用预测的点图计算粗略的相机姿态(使用 RANSAC 和 PnP)来注册图像。然后,通过点到相机射线的一致性损失来细化粗略的相机姿态,并在新注册的图像上进一步微调我们的模型。我们重复这一过程,直到所有图像都注册完毕。这样,我们的增量训练管道类似于经典的增量 SfM 方法 [47],但有以下不同之处:
种子初始化:增量式SfM从一对图像初始化,其中图像对的相机姿态在初始化后被固定以解决尺度自由度问题。然而,我们的方法从预训练模型和单张种子图像初始化。
图像配准:与增量式SfM逐张配准图像不同,我们的方法每次配准一批图像。配准后的图像进一步用于微调神经模型。
目标函数:我们使用渲染损失微调模型,而SfM通过重投影误差优化场景。
场景稀疏性:我们的模型预测密集的场景几何结构,而SfM输出稀疏的场景结构。
2. Related Work
3DGS:从稀疏点云初始化 3D 高斯,并通过可微分光栅化渲染场景,能够实现实时渲染性能。然而,当从无纹理区域初始化时,3DGS 在识别更多高斯点方面可能遇到困难。为了促进更好的场景几何学习,ScaffoldGS [38] 从初始点云初始化稀疏体素网格,并将 3D 高斯的特征编码到相应的特征向量中。通过避免场景表面的不必要稠密化,稀疏体素的引入减少了高斯密度。SAGS [56] 隐式地将场景结构编码到图神经网络 (GNN) 中。其他工作也尝试学习 2D 高斯 [25],以更准确地拟合场景表面 [24]。类似于 NeRF,3DGS 在光栅化过程中由于固定窗口的高斯核也会面临量化问题。这一问题在 MipSplatting [67] 以及许多后续工作中 [32, 50, 63] 得到了处理。VastGaussian [34] 及其后续工作 [14, 29, 37] 专注于开发分布式训练方法,以重建大规模场景。
尽管 3DGS 可以渲染更高保真度的图像,但它依赖于准确的相机姿态。与 NeRF 不同,许多工作已经提出了解决相机姿态不准确的问题,而 3DGS 中的相同问题尚未得到广泛解决。与我们最相关的工作是 CF-3DGS [21] 和 InstantSplat [18]。然而,CF-3DGS 需要深度估计来初始化 3D 高斯点,并且只能在短连续图像序列之间优化相机姿态和 3DGS。当相机姿态发生显著变化或图像是无序的时,CF-3DGS 非常容易失败。InstantSplat [18] 利用现有的预训练 3D 基础模型 DUSt3R [59] 来回归图像对之间的密集点图,然后通过将点图对齐到全局坐标系中来获取相机姿态。然而,对齐密集点图既耗时又耗内存。因此,InstantSplat 只能处理非常少的图像。其他相关工作包括 Splatt3R [49],它扩展了 DUSt3R,无需已知相机姿态即可预测 3D 高斯点。尽管如此,它只能处理图像对,因为 DUSt3R 生成的是参考图像的第一幅图中的点图,而不是全局坐标系中的点图。我们的工作也利用了一个基于预训练 DUSt3R 的网络,即 Spann3R [57]。然而,与 InstantSplat 和 Splatt3R 不同,我们的方法无需对齐密集点图即可在种子图像的全局坐标系中回归点,随后通过增量注册图像和微调网络来处理。我们的方法能够处理数百张图像,并且可以在 24GB 消费级 GPU 上运行。
3. Method
如图 2,我们首先使用 Spann3R 作为场景回归网络,从图像对中预测 3D 高斯点 Gk 和点图 Xk。然后,我们利用 RANSAC 和 PnP 求解器基于 2D-3D 对应关系来获取初始相机姿态。进一步,我们通过最小化 3D 点与相机中心之间的点到相机射线一致性损失来细化粗略的相机姿态。随后,我们使用细化后的相机姿态对 3D 高斯点进行光栅化以渲染图像。为了反向传播梯度,我们采用了 RGB 损失。在每个训练周期的末尾,我们通过使用 RANSAC 和 PnP 求解器注册新图像来更新我们的训练缓冲区。这个过程会一直重复,直到所有图像都注册完毕或无法再注册更多图像。

3.1. Preliminaries
我们的网络架构基于DUST3R [59]和SPANN3R [57]。 给定图像对
,DUST3R预测每个图像的相应指数
,其中
表示在相机i 的坐标系中的
。
DUSt3R 使用一个 ViT [17] 作为两个图像的共享编码器,并分别为参考/源图像 i 和目标图像 j 使用两个变压器解码器。这两个解码器分别表示为参考解码器
和目标解码器
,它们包含两个head
,用于将解码器特征映射到点图。

DUSt3R 在局部坐标系中重建图像对。当处理超过两张图像时,DUSt3R 使用后处理步骤是将成对的密集点图对齐到全局坐标系中,这一过程耗时且可能会OOM。
Spann3R 提出了一种特征融合机制,用于在全局坐标系中预测点图
。它在第 t 个训练周期从空间特征内存中计算融合特征
。参考解码器输入融合特征进行重建,而目标解码器生成用于查询内存的特征。此外,Spann3R 使用两个额外的投影头来计算重建下一个图像对所需的关键特征和查询特征,并使用一个记忆编码器
对参考解码器生成的点图进行编码:
![]()
3.2. Neural Scene Representation
在本工作中,我们使用Spann3R[57]作为神经场景表示,并将其扩展以预测3D高斯基元。我们将我们的神经场景表示称为场景回归网络(scene regressor network)
,类似于pose回归或定位网络中的场景回归器[8, 9]。与稀疏场景回归器(以单张图像作为输入)不同,我们的场景回归器以一对图像作为输入,并预测全局坐标系中的密集点图(pointmaps)Xi和每个像素的3D高斯分布Gi:
![]()
其中
是是参考图像,
是目标图像。然后通过对3D高斯基元集合![]()
进行光栅化,我们使用RGB损失将梯度反向传播到模型中。
在这里,我们不是直接预测每个3D高斯的均值uu,而是预测一个偏移量ΔX,并将其应用于点图以得到均值![]()
。然后使用渲染函数:

公式(4)通过可微分光栅化器[28]计算:
![]()
其中T是相机pose,K是内参。
3.3. Incremental Reconstruction
我们使用场景回归器(scene regressor)作为神经表示,增量式地重建每个场景。我们强调,在未见过的场景上微调预训练模型(如DUSt3R或Spann3R)是具有挑战性的。这是因为现有的基于DUSt3R的模型是通过真实3D点进行训练的。然而,获取真实3D点在大多数场景中既昂贵又不可行。
3.3.1. Seed Initialization
给定一组无序图像
,我们首先选择一张种子图像进行初始化。这与incremental SfM不同,后者需要一对种子图像进行双视图重建。种子图像对必须具有足够的匹配内点和宽基线。这一标准保证了初始图像对与尽可能多的其他图像重叠,以便后续的配准。为了实现类似的目标,我们使用NetVLAD[1]计算每张图像的全局描述符,然后计算每对图像之间的相似度分数。
基于NetVLAD,然后我们进一步构建一个相似度图
,其中节点表示图像,边表示图像对,边权重表示相似度分数。如果边的权重小于阈值
,则丢弃该边。然后我们选择具有最大度数的节点作为种子图像
。
选择种子图像后,我们以自监督的方式微调场景回归器。具体来说,我们将种子图像设置为参考帧,并将种子图像的相机姿态
设置为单位矩阵。然后我们计算RGB损失:
![]()
在初始化过程中,种子图像同时作为场景回归器的参考图像和目标图像:
![]()
3.3.2. Image Registration
在种子初始化之后,我们在每个训练周期中逐步配准一批图像
。我们将一批新配准的图像添加到训练缓冲区中,并训练场景回归器。当训练收敛以后,我们选择新的一批图像来扩展训练缓冲区。重复此过程,直到所有图像都被配准。
Coarse Camera Pose Estimation.
给定一张已配准的参考图像
和一张待配准的目标图像
,我们将它们传递给场景回归器,并获得全局坐标系中的3D点
。由于我们拥有每个图像像素的坐标
及其对应的3D坐标
,我们可以轻松找到2D-3D对应关系
。然后我们使用RANSAC和PnP求解器来获得粗略的相机姿态:
![]()
其中
是内点数量,且
。
是参考图像,
是我们想要配准的目标图像。只有当内点数量大于内点阈值
时,我们才将目标图像
添加到训练缓冲区中。初始化后,种子图像被选为参考图像。在后续的训练批次中,我们从已配准的图像中选择参考图像,该图像与大多数未配准的图像相连。

Camera Pose Refinement.
由于场景回归器尚未见过这些图像,新配准图像的相机姿态可能不准确。由于我们使用基于Transformer的解码器,并且受GPU内存限制,我们只能在每个训练批次中使用有限的视图(实际上我们在24GB消费级GPU上使用批量大小为1),这很容易导致网络训练发散。
为了解决上述问题,我们提出通过最小化以下点对相机射线一致性损失来进一步优化粗略相机姿态:

其中
是图像
的相机中心,
是3D点
与相机中心
之间的缩放因子,
是
与
之间的射线方向。在优化过程中,我们固定种子图像的相机姿态以解决尺度模糊问题,并固定种子图像与其最相似相邻图像之间的缩放因子以解决尺度模糊问题。此外,对于新的训练周期,我们固定在前一周期中配准的相机姿态,仅优化当前训练周期中配准的相机姿态,以提高优化效率。
3.3.3. Finalizing Neural Scene Reconstruction
当所有图像都已配准或无法将更多图像添加到训练缓冲区时,我们提出了一种两阶段策略来提高最终重建质量。
第一阶段是使用公式(8)优化所有相机姿态。这是因为我们在训练过程中逐步配准图像,误差会累积。在此阶段,我们仅固定种子图像的相机姿态,并将所有先前训练周期中获得的相机姿态用作优化的初始值。由于初始值足够准确,最终优化收敛得非常快。
在第二阶段,使用显式3D高斯基元[28]来优化场景细节。这是因为在训练场景回归器时,由于GPU内存限制,我们仅使用了固定的低分辨率图像。因此,场景回归器只能表示粗略的场景几何。在第二阶段,我们使用与[28]相同的策略进行3D高斯密集化和剪枝优化。
4. Experiments
我们使用预训练的Spann3R模型[57]初始化场景回归器网络。在训练过程中,所有数据集的图像分辨率均为512×512。对于种子初始化,我们通过500次迭代微调场景回归器。在增量训练过程中,我们在LLFF数据集上微调场景回归器1,000次迭代,在Mip-NeRF360数据集上微调1,500次迭代。对于新视角合成任务,图像在训练和推理过程中被下采样4倍。

在MipN-eRF360 数据集上面的新视角合成:

相机pose估计效果如下:


相关文章:
【论文笔记】ZeroGS:扩展Spann3R+GS+pose估计
spann3r是利用dust3r做了增量式的点云重建,这里zeroGS在前者的基础上,进行了增量式的GS重建以及进行了pose的联合优化,这是一篇dust3r与GS结合的具有启发意义的工作。 abstract NeRF和3DGS是重建和渲染逼真图像的流行技术。然而,…...
《Python 中 JSON 的魔法秘籍:从入门到精通的进阶指南》
在当今数字化时代,网络编程无处不在,数据的高效传输与交互是其核心。JSON 作为一种轻量级的数据交换格式,凭借其简洁、易读、跨语言的特性,成为网络编程中数据传输与存储的关键技术。无论是前后端数据交互,还是不同系统…...
【漫话机器学习系列】091.置信区间(Confidence Intervals)
置信区间(Confidence Intervals)详解 1. 引言 在统计学和数据分析中,我们通常希望通过样本数据来估计总体参数。然而,由于抽样的随机性,我们不可能得到精确的总体参数,而只能通过估计值(如均值…...
查看引脚电平
在Linux系统中,通过cat命令查看/sys/class/gpio/export文件并不能直接获取GPIO引脚的高低电平。/sys/class/gpio/export文件用于向系统请求导出(即启用)某个特定的GPIO引脚,而不是用于读取引脚的状态。 1.导出GPIO引脚࿱…...
回归预测 | Matlab实现PSO-HKELM粒子群算法优化混合核极限学习机多变量回归预测
回归预测 | Matlab实现PSO-HKELM粒子群算法优化混合核极限学习机多变量回归预测 目录 回归预测 | Matlab实现PSO-HKELM粒子群算法优化混合核极限学习机多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.回归预测 | Matlab实现PSO-HKELM粒子群算法优化混合核…...
QTreeView添加网格线
一.效果 二.实现 网格线虽然可以用样式表添加,但效果不好。这里重写QTreeView的drawRow函数来实现网格线的绘制。 void QHTreeView::drawRow(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const {QTreeView::drawRow(painter…...
nvidia-smi执行失败,报错-实战生产
目录 报错日志 解决办法 步骤 1: 检查当前安装的 NVIDIA 驱动版本 步骤 2: 检查 NVIDIA 内核模块是否已加载 步骤 3: 重新安装 NVIDIA 驱动程序 使用 apt 重新安装驱动程序 或者使用 dkms 重新生成内核模块 步骤 4: 确认内核版本和驱动兼容性 步骤 5: 更新 initramfs …...
大脑神经网络与机器神经网络的区别
大脑神经网络(生物神经网络)与机器神经网络(人工神经网络,ANN)虽然名称相似,但在结构、功能、学习机制等方面存在显著差异。以下是两者的主要区别: 1. 基础结构与组成 大脑神经网络: 由 生物神经元(约860亿个)通过突触连接形成动态网络。 神经元通过电化学信号(动作…...
firewall-cmd --zone=public --list-ports 已经添加端口了但是仍无法访问
当您使用 firewall-cmd 命令在 Linux 系统中配置防火墙规则时,确保端口可以被访问通常涉及几个步骤。即使您已经使用 firewall-cmd 添加了端口,但仍可能遇到无法访问的问题。以下是一些解决步骤,帮助您确认和解决端口无法访问的问题ÿ…...
Golang的多团队协作编程模式与实践经验
Golang的多团队协作编程模式与实践经验 一、多团队协作编程模式概述 在软件开发领域,多团队协作编程是一种常见的工作模式。特别是对于大型项目来说,不同团队间需要协同合作,共同完成复杂的任务。Golang作为一种高效、并发性强的编程语言&…...
DevOps 进化论:腾讯云 CODING-TM 如何助力企业敏捷转型?
在当今数字化竞争激烈的时代,企业的软件开发模式正经历从传统开发向敏捷开发、DevOps 转型的深刻变革。如何在保证代码质量的同时,加快开发、测试与交付流程,成为众多企业研发团队面临的核心挑战。腾讯云 CODING-TM 作为一站式 DevOps 平台&a…...
前端骨架怎样实现
前端骨架屏(Skeleton Screen)是一种优化页面加载体验的技术,通常在内容加载时展示一个简易的占位符,避免用户看到空白页面。骨架屏通过展示页面结构的骨架样式,让用户有页面正在加载的感觉,而不是等待内容加…...
AI前端开发的学习成本与回报——效率革命的曙光
近年来,人工智能技术飞速发展,深刻地改变着各行各业。在软件开发领域,AI写代码工具的出现更是掀起了一场效率革命。AI前端开发,作为人工智能技术与前端开发技术的完美结合,正展现出巨大的发展潜力,为开发者…...
[NOIP2007 普及组] 奖学金 题解
(一)读懂题目 关键句:期末,每个学生都有3门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,…...
[创业之路-297]:经济周期与股市、行业的关系
目录 一、经济周期的种类 1、短周期(基钦周期) 2、中周期(朱格拉周期) 3、长周期(康德拉季耶夫周期) 当下处于康波周期的哪个阶段? 4、建筑周期(库涅茨周期) 二、…...
Dav_笔记14:优化程序提示 HINTs -3
查询转换的提示 以下每个提示都指示优化程序使用特定的SQL查询转换: ■NO_QUERY_TRANSFORMATION ■USE_CONCAT ■NO_EXPAND ■REWRITE和NO_REWRITE ■MERGE和NO_MERGE ■STAR_TRANSFORMATION和NO_STAR_TRANSFORMATION ■事实和NO_FACT ■UNNEST和NO_UNNEST…...
递归乘法算法
文章目录 递归乘法题目链接题目详解解题思路:代码实现: 结语 欢迎大家阅读我的博客,给生活加点impetus!! 让我们进入《题海探骊》,感受算法之美!! 递归乘法 题目链接 在线OJ 题目…...
从当下到未来:蓝耘平台和 DeepSeek 应用实践的路径探索,勾勒 AI 未来新蓝图
我的个人主页 我的专栏:人工智能领域,希望能帮助到大家!!!点赞👍收藏❤ 引言:AI 浪潮中的双引擎 在人工智能蓬勃发展的时代,蓝耘平台与 DeepSeek 宛如推动这一浪潮前进的双引擎。…...
非标准纸张Word文件无损转换为A4标准纸张的完整教程
在日常办公中,常会遇到需要将非标准纸张大小的Word文档(如A3、B5等)调整为A4标准尺寸的需求。直接修改Word页面设置可能导致排版错乱,而通过 Adobe Acrobat 的印前检查功能可实现内容格式无损缩放。以下是详细操作流程: 一、Word转PDF:保留原始布局 保存为PDF格式 在Word…...
Xlua中C#引用Lua变量,导致Lua侧的GC无法回收的原因及解决方法
1. 引用关系导致: 在 XLua 中,当 C# 端引用了 Lua 变量时,Lua 的垃圾回收器(GC)不会回收这些被引用的变量。这是因为 Lua 的 GC 机制是基于引用计数和标记 - 清除算法的。当 C# 端持有对 Lua 变量的引用时,…...
38.日常算法
1.最短无序连续子数组 题目来源 给你一个整数数组 nums ,你需要找出一个 连续子数组 ,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。请你找出符合题意的 最短 子数组,并输出它的长度。 示例 1: 输入…...
Leetcode 算法题 9 回文数
起因, 目的: 数学法。 % 求余数, 拆开组合,组合拆开。 这个题,翻来覆去,拆开组合, 组合拆开。构建的过程。 题目来源,9 回文数: https://leetcode.cn/problems/palindrome-number…...
docker compose部署flink集群
本次部署2个jobmanager和3个taskmanager 一、部署zookeeper集群 flink使用zookeeper用作高可用 部署集群参考:docker compose部署zookeeper集群-CSDN博客 二、创建目录及配置文件 创建timezone文件,内容填写Asia/Shanghai 手动创建目录:…...
树和二叉树_13
树和二叉树_13 一、HZOJ-245二、题解1.引库2.代码 一、HZOJ-245 货仓选址 在一条数轴上有 N 家商店,他们的坐标分别为 A[1]−A[N]。现在需要在数轴上建立一家货仓,每天清晨,从货仓到每家商店都要运送一车商品。为了提高效率,求…...
常用架构图:业务架构、产品架构、系统架构、数据架构、技术架构、应用架构、功能架构及信息架构
文章目录 引言常见的架构图I 业务架构图-案例模块功能说明1. 用户界面层 (UI)2. 应用服务层3. 数据管理层4. 基础设施层业务流程图示例技术实现II 功能架构图 -案例功能模块说明1. 船舶监控模块2. 报警管理模块3. 应急响应模块4. 通信管理模块5. 数据分析模块数据管理层基础设施…...
AI前端开发:解放创造力,而非取代它
近年来,人工智能技术飞速发展,深刻地改变着各行各业,前端开发领域也不例外。越来越多的AI写代码工具涌现,为开发者带来了前所未有的效率提升。很多人担心AI会取代程序员的创造力,但事实并非如此。本文将探讨AI辅助前端…...
qt的QMainWindow保存窗口和恢复窗口状态
保存窗口状态 QSettings settings("MyCompany", "MyApp"); // 指定存储的应用信息 settings.setValue("mainWindowState", saveState());saveState() 返回一个 QByteArray,包含 所有停靠窗口和工具栏的状态。QSettings 用于存储数据…...
Linux下使用poll函数编写UDP客户端、服务器程序
一、UDP服务器与客户端的区别 对于UDP服务器与客户端,两者都可以通过sendto和recvfrom函数收发数据,它们的主要区别是: 1.服务器一般是等待并响应来自客户端的请求,客户端则是主动发送请求并且等待服务器的响应。 2.服务器端要…...
算法17(力扣217)存在重复元素
1、问题 给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false 。 2、示例 (1) 示例 1: 输入:nums [1,2,3,1] 输出:…...
NO.16十六届蓝桥杯备战|for循环|七道习题|ceil|floor|pow(C++)
for循环 for循环语法形式 for 循环是三种循环中使⽤最多的, for 循环的语法形式如下: //形式1 for(表达式1; 表达式2; 表达式3) 语句;//形式2 //如果循环体想包含更多的语句,可以加上⼤括号 for(表达式1; 表达式2; 表达式3) { …...
