【论文笔记】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是重建和渲染逼真图像的流行技术。然而,…...
AtCoder - arc058_d Iroha Loves Strings解答与注意事项
链接:Iroha Loves Strings - AtCoder arc058_d - Virtual Judge 利用bitset这一数据结构,定义bitset类型的变量dp[i]表示第i到n个字符串能拼成的字符串长度都有哪些,比如00100101,表示能拼成的长度有0,2,5,࿰…...
企业使用统一终端管理(UEM)工具提高端点安全性
什么是统一终端管理(UEM) 统一终端管理(UEM)是一种从单个控制台管理和保护企业中所有端点的方法,包括智能手机、平板电脑、笔记本电脑、台式机和 IoT设备。UEM 解决方案为 IT 管理员提供了一个集中式平台,用于跨所有作系统和设备类型部署、配置、管理和…...
Leetcode 算法题 9 回文数
起因, 目的: 数学法。 % 求余数, 拆开组合,组合拆开。 这个题,翻来覆去,拆开组合, 组合拆开。构建的过程。 题目来源,9 回文数: https://leetcode.cn/problems/palindrome-number…...
设计模式Python版 命令模式(上)
文章目录 前言一、命令模式二、命令模式示例 前言 GOF设计模式分三大类: 创建型模式:关注对象的创建过程,包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式。结构型模式:关注类和对象之间的组合&…...
C语言之循环结构:直到型循环
C语言 循环结构 直到型循环的实现 特点:先执行,后判断,不管条件是否满足,至少执行一次。典型代表:do…while,goto(已淘汰,不推荐使用) do…while 语法: d…...
细说STM32F407单片机RTC的备份寄存器原理及使用方法
目录 一、备份寄存器的功能 二、示例功能 三、项目设置 1、晶振、DEBUG、CodeGenerator、USART6 2、RTC 3、NVIC 4、GPIO 及KEYLED 四、软件设计 1、main.h 2、main.c 3、rtc.c 4、keyled.c、keyled.h 五、运行调试 本实例旨在介绍备份寄存器的作用。本实例继续使…...
MATLAB计算反映热需求和能源消耗的度数日指标(HDD+CDD)(全代码)
目录 度数日(Degree Days, DD)概述计算公式MATLAB计算代码调用函数1:计算单站点的 CDD参考度数日(Degree Days, DD)概述 度数日(Degree Days, DD)是用于衡量建筑、城市和地区的热需求和能源消耗模式的指标。它分为两部分: 加热度日(Heating Degree Days, HDD):当室…...
J6 X8B/X3C切换HDR各帧图像
1、OV手册上的切换命令 寄存器为Ox5074 各帧切换: 2、地平线control tool实现切换命令 默认HDR模式出图: HCG出图: LCG出图 SPD出图 VS出图...
09-轮转数组
给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 方法一:使用额外数组 function rotate(nums: number[], k: number): void {const n nums.length;k k % n; // 处理 k 大于数组长度的情况const newNums new A…...
用vue3写一个好看的wiki前端页面
以下是一个使用 Vue 3 Element Plus 实现的 Wiki 风格前端页面示例,包含现代设计、响应式布局和常用功能: <template><div class"wiki-container"><!-- 头部导航 --><el-header class"wiki-header"><d…...
瑞芯微烧写工具
文章目录 前言一、安装驱动二、安装烧写工具1.直接解压压缩包2. 如何使用 三、MASKROM 裸机必备四、LOADER 烧写,前提是搞过第三步没问题五、Update.img包的烧录六、linux下烧写总结 前言 提示:这里可以添加本文要记录的大概内容: 项目需要…...
说下JVM中一次完整的GC流程?
大家好,我是锋哥。今天分享关于【说下JVM中一次完整的GC流程?】面试题。希望对大家有帮助; 说下JVM中一次完整的GC流程? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 JVM中的一次完整的垃圾回收(GC)流程可以概括为…...
Open FPV VTX开源之OSD使用分类
Open FPV VTX开源之OSD使用分类 1. 源由2. 硬件2.1 【天空端】SigmaStar2.2 【天空端】Raspberry Pi2.3 【地面端】 3. 软件3.1 天空端软件3.2 地面端软件 4. 分类4.1 嵌入式OSD分类A1-嵌入式OSD:SigmaStar Android分类A2-嵌入式OSD:SigmaStar Hi3536分…...
智慧农业-虫害及生长预测
有害生物防控系统是一个综合性的管理体系,旨在预防和控制对人类生活、生产甚至生存产生危害的生物。这些生物可能包括昆虫、动物、植物、微生物乃至病毒等。 一、系统构成 1、监测预警系统:利用智能传感器、无人机、遥感技术等手段,实时监测…...
Python 识别图片和扫描PDF中的文字
目录 工具与设置 Python 识别图片中的文字 Python 识别图片中的文字及其坐标位置 Python 识别扫描PDF中的文字 注意事项 在处理扫描的PDF和图片时,文字信息往往无法直接编辑、搜索或复制,这给信息提取和分析带来了诸多不便。手动录入信息不仅耗时费…...
C语言如何知道当前系统中的编译器数据类型的大小是多少?
在 C 语言中,你可以使用sizeof运算符来确定当前系统中编译器数据类型的大小,该运算符返回一个size_t类型的值,表示所操作对象或数据类型占用的字节数。下面为你详细介绍使用方法: 1. 基本数据类型大小的获取 基本数据类型如char…...
gitlab Webhook 配置jenkins时“触发远程构建 (例如,使用脚本)”报错
报错信息: <html> <head> <meta http-equiv"Content-Type" content"text/html;charsetISO-8859-1"/> <title>Error 403 No valid crumb was included in the request</title> </head> <body><h2…...
Mysql中使用sql语句生成雪花算法Id
🍓 简介:java系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢…...
/etc/profile vs ~/.bashrc:如何正确使用?
在 Linux 或 WSL 环境中,我们经常需要配置环境变量、命令别名、路径等信息。然而,许多人在配置时会纠结:到底应该放在 /etc/profile 还是 ~/.bashrc?本文将全面解析它们的区别,并帮助你做出正确的选择。 1. 什么是 /et…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...
Linux系统部署KES
1、安装准备 1.版本说明V008R006C009B0014 V008:是version产品的大版本。 R006:是release产品特性版本。 C009:是通用版 B0014:是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存:1GB 以上 硬盘…...
tomcat指定使用的jdk版本
说明 有时候需要对tomcat配置指定的jdk版本号,此时,我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...
DiscuzX3.5发帖json api
参考文章:PHP实现独立Discuz站外发帖(直连操作数据库)_discuz 发帖api-CSDN博客 简单改造了一下,适配我自己的需求 有一个站点存在多个采集站,我想通过主站拿标题,采集站拿内容 使用到的sql如下 CREATE TABLE pre_forum_post_…...
