论文解读:【CVPR2025最佳论文】VGGT: Visual Geometry Grounded Transformer

1.1 VGGT: Visual Geometry Grounded Transformer(CVPR 2025 | Meta & 牛津
论文链接:https://openaccess.thecvf.com/content/CVPR2025/html/Wang_VGGT_Visual_Geometry_Grounded_Transformer_CVPR_2025_paper.html
代码链接:https://github.com/facebookresearch/vggt

一图概括任务

在这里插入图片描述

1.1.1 Introduction
研究背景:挑战传统三维重建方法
传统的3D场景重建严重依赖于经典的视觉几何(visual geometry)方法。这些方法,如BA(Bundle Adjustment,光束法平差)和SfM(Structure-from-Motion,运动恢复结构),虽然是领域基石,但存在两大核心问题:

  1. 复杂性与计算成本高: 它们通常涉及复杂的迭代优化过程,计算量巨大且耗时。
  2. 依赖后处理: 即便在现代方法中结合了机器学习(如特征匹配、单目深度预测),视觉几何依然扮演着不可或缺的角色,通常作为模型的后处理步骤存在,限制了整体效率。
    随着神经网络日益强大,研究者们提出了一个根本性的问题:我们能否设计一个神经网络,直接“端到端”地解决3D任务,从而几乎完全摆脱对几何后处理的依赖? 此前的尝试如DUST3R和MASi3R等模型虽然取得了一定进展,但仍存在局限,例如MASi3R仅能处理两张图片的重建,并且两者都依赖于后处理来融合和优化结果。
    二、 VGGT的核心创新与工作原理
    VGGT正是在这样的背景下被提出,旨在彻底移除对几何后处理的依赖。其核心创新点如下:
  3. 真正的端到端重建: VGGT是一个前馈式(feed-forward)神经网络,仅需一次前向传播,就能在数秒内直接从输入的单张、少量或数百张图像中,一次性预测出场景的全套3D关键属性,包括相机内外参数、深度图、点图和3D点轨迹。这与依赖昂贵后优化的DUST3R或VGGSfM等模型形成了鲜明对比。
  4. 简化且强大的架构: 与需要特殊设计的3D网络不同,VGGT的架构出人意料地简洁。它基于一个标准的Transformer模型,没有引入特别的3D或几何先验知识(inductive biases)。其强大的能力源于在大规模、带有3D标注的公开数据集上进行训练,采用了类似GPT、CLIP等大规模模型的构建思路。
  5. 协同学习提升整体性能: VGGT使用一个共享的骨干网络来同时预测所有相关的3D属性。研究证明,让模型学习预测这些相互关联的3D任务,可以增强其对几何的整体理解,从而提升了预测的准确性,尽管这在任务间存在一定的潜在冗余。
  6. 推理时的巧妙分离: 尽管是协同学习,但在推理阶段,模型可以从独立预测的深度图和相机参数中,直接推导出点图(point maps)。这种方法比直接预测点图能获得更优的结果,展示了其设计的灵活性和高效性。
    三、 成果与意义
    VGGT的成果是显著的:
  • 全面的领先水平(State-of-the-Art): 如第三张图片所述,VGGT在各项3D任务中均取得了最顶尖的结果,其性能甚至超越了那些专门为某一子任务(如仅做深度估计或相机姿态估计)而优化的模型,并且提升巨大。
  • 高效且准确: 它的直接预测结果不仅具有很强的竞争力,而且在很多情况下优于那些依赖缓慢后处理优化技术的传统方法。
    总结而言,VGGT的出现标志着一个范式的转变: 它证明了通过大规模数据训练的标准Transformer模型,有能力“学会”场景的内在几何规律,从而将复杂的、多步骤的3D重建流程,简化为一个快速、精准且端到端的神经网络推理过程。这为实现更高效、更普及的实时3D视觉应用开辟了新的道路。
    1.1.2 Overview
    在这里插入图片描述

pipeline解读:

第一步:输入与特征提取 (Input & DINO)

  1. Input (输入):最左侧是模型的输入,这里显示了从不同视角拍摄同一场景(一个教堂)的多张图像。
  2. DINO (特征提取):这些输入图像首先被送入一个名为 DINO 的模型。DINO 是一个自监督学习模型,在这里它的作用是将每一张图像“特征化”或“块化”(patchify),转换成一系列的 Tokens。您可以将每个 Token 理解为图像中一个小区域的高度浓缩的特征描述。处理后,每张图片都变成了一组特征向量(图中用不同颜色的方块表示,例如蓝色、绿色、浅蓝色代表来自三张不同图片的 Tokens)。
    第二步:加入相机信息 (Add camera token)
  3. Concat (拼接):在将图像特征送入核心处理模块之前,模型为每一组图像特征(即每一帧)添加了一个特殊的 “相机令牌”(camera token),图中用深橙色的方块表示。
  4. 目的:这个“相机令牌”是一个可学习的参数,它的使命是在模型处理过程中不断地汇总和学习与该图像对应的相机位姿信息(例如相机在哪里,朝向哪里)。
    第三步:核心处理单元 - 交替注意力 (Alternating Attention)
    这是整个架构的核心,对应了您之前提问的“Alternating-Attention”概念。特征向量会被送入一个重复 L 次的处理块中。
  5. Global Attention (全局注意力):首先,所有的 Tokens(包括来自所有图像的特征 Tokens 和所有相机 Tokens)会一起被处理。在这一层,模型会计算所有特征之间的关联性,无论它们来自哪一张图片。这使得模型能够建立起跨图像的全局理解,例如,识别出不同图像中相同的建筑角落在三维空间中的对应关系。
  6. Frame Attention (帧内注意力):紧接着,模型进行帧内注意力计算。注意力被限制在单一图像内部的 Tokens 之间(如图中黄色框所示,每个框代表一帧)。这让模型可以专注于理解单张图像内部的细节和结构。
  7. 交替循环 (× L times):这个“全局注意力 -> 帧内注意力”的过程会交替重复 L 次。通过这种方式,模型既能进行宏观的、跨视角的场景理解,又能进行微观的、单一视角的细节分析,从而有效地整合多视图信息。
    第四步:输出预测 (Output Prediction)
    经过 L 次的交替注意力处理后,特征 Tokens 和相机 Tokens 都包含了丰富的场景几何信息。
  8. Camera Head (相机头):
  • 之前添加的“相机令牌”(深橙色方块)会被分离出来。
  • 它们被送入一个专门的“相机头”网络。
  • 这个网络负责解码这些令牌中包含的信息,最终预测出每张输入图像对应的相机内参 (intrinsics) 和外参 (extrinsics),即相机的焦距、畸变参数以及它在三维空间中的位置和姿态。这对应了图右上角的 Cameras 输出。
  1. DPT (Dense Prediction Transformer):
  • 图像的特征 Tokens(蓝色、绿色等方块)则被送入另一个名为 DPT 的模块。
  • DPT 是一个用于进行“密集预测”的 Transformer 模型,它善于将特征图转换为像素级的预测结果。
  • 它利用这些包含全局信息的特征,生成深度图 (Depth maps)、点云地图 (Point maps) 以及特征轨迹 (Tracks) 等密集的输出。

Method

  1. 问题定义与模型输出
  • 输入 (Input): 模型接收一个由 N 张 RGB 图像组成的序列 (Ii)i=1N,这些图像观察的是同一个三维场景。每张图像 Ii 的维度为 H×W。
  • 输出 (Output): VGGT的核心是一个Transformer函数 f,它将输入的图像序列映射为一套对应的3D标注信息。对于输入序列中的每一帧图像 Ii,模型都会输出一组对应的结果 (gi,Di,Pi,Ti)。这些输出的具体含义如下:
    • gi∈R9 (相机参数 Camera Parameters): 这是一个9维向量,包含了相机的内参(intrinsics)和外参(extrinsics)。具体由旋转四元数 (q, 4维)、平移向量 (t, 3维) 和 视场角 (f, 2维) 拼接而成。模型假设相机的主点位于图像中心。
    • Di∈RH×W (深度图 Depth Map): 为图像 Ii 中的每一个像素位置 y 赋予一个深度值 Di(y)∈R+,表示该点在第 i 个相机视角下的深度。
    • Pi∈R3×H×W (点图 Point Map): 为图像 Ii 中的每一个像素关联其在世界坐标系下的三维坐标点 Pi(y)∈R3。一个关键的定义是,这些点图是**“视角无关的” (viewpoint invariant),并且所有点的坐标都定义在第一个相机 (g1) 的坐标系**中,该坐标系被作为全局参考的世界坐标系。
    • Ti∈RC×H×W (追踪特征图 Tracking Features): 这是一个C维的特征图,它本身不直接输出追踪轨迹,而是作为后续一个独立追踪模块的输入,用于关键点追踪任务。
  1. 关键点追踪的实现
    模型的追踪功能被巧妙地分成了两步:
  2. 主Transformer (f) 为每一帧图像生成密集的追踪特征图 Ti。
  3. 一个独立的追踪模块接收用户的查询点 yq 以及由主模型生成的特征图序列 (Ti)i=1N,然后计算出该点在所有图像中的2D轨迹。 重要的是,这两个网络(主Transformer f 和追踪模块)是端到端联合训练的,确保了生成的特征图 Ti 是为追踪任务专门优化的。
  4. 核心设计哲学:过完备预测 (Over-complete Predictions)
    这是VGGT方法论中最核心、最巧妙的一点。模型的多个输出(如相机参数 g、深度图 D、点图 P)在几何上是相关的、非独立的。例如:
  • 理论上,可以通过点图 P 反向求解出相机参数 g (即PnP问题)。
  • 理论上,可以通过点图 P 和相机参数 g 推导出深度图 D。
    尽管存在这种冗余(被称为“过完备”),但研究者发现:
  • 训练时 (During Training): 显式地让模型同时预测所有这些相关的量,会带来显著的性能提升。换句话说,强制模型在多个相互关联的任务上都表现良好(即多任务学习),能让它学习到更鲁棒、更准确的场景几何表示。
  • 推理时 (During Inference): 实践观察到,最佳的3D点云结果并非来自直接使用模型预测的点图 P 分支。相反,通过组合独立预测的深度图 D 和相机参数 g 来计算得到的3D点,其精度更高。
  1. 输入顺序
    除了第一张图像被固定为参考坐标系外,输入图像序列的顺序是任意的。网络被设计为对除了第一帧之外的所有其他帧具有**“排列等变性” (permutation equivariant)**,这意味着打乱后续图像的顺序不会影响它们各自的预测结果(相对于参考帧)。
    核心概念:输出之间存在冗余
    首先,文章指出VGGT模型预测的多个物理量(例如相机参数、点图、深度图)并非相互独立的。它们在三维几何上存在着内在的、可以用数学公式表达的强关联性。
  • 例子1: 相机参数 g 理论上可以从模型输出的点图 P (即三维点云)中通过解决PnP (Perspective-n-Point) 问题反推出来。
  • 例子2: 深度图也可以通过已知的点图 P 和相机参数 g 计算得出。
    因为存在这种几何约束,所以让模型同时预测所有这些量,就构成了“过完备”或“冗余”的预测。
    训练策略:利用冗余提升性能
    这里是关键的创新点。尽管这些预测是冗余的,但研究者发现:
    在训练阶段,强制让VGGT模型去显式地、同时地预测所有这些相关的量,反而会带来显著的性能提升。
    这可以理解为一种非常有效的多任务学习。通过要求模型在多个相互关联的任务上都做到最好,模型被“逼迫”去学习场景内在的、更一致、更鲁棒的几何结构。这种内部约束帮助模型泛化得更好,最终提升了所有任务的预测质量。
    推理策略:择优组合获得最佳结果
    然而,在模型训练完成后的实际使用(推理)阶段,策略有所不同。研究者观察到:
    直接使用模型“点图分支”输出的三维点,其精度不如将模型独立输出的“深度图”和“相机参数”这两个结果组合起来计算出的三维点。
    这意味着,虽然在训练时“什么都预测”能让模型学得更好,但在最终生成结果时,需要聪明地选择模型最擅长的几个输出进行组合,而不是盲目相信每一个直接输出。

Dense Predictions.
这段文字解释了模型如何从其内部的图像特征(t̂ᵢ)生成三种重要的密集输出:深度图 (depth maps)、点图 (point maps) 和 追踪特征 (tracking features)。

  • 核心流程:
    1. 特征转换: 模型首先将输出的图像令牌 (image tokens) t̂ᵢ 通过一个 DPT (Dense Prediction Transformer) 层 转换为密集的特征图 (feature maps) Fᵢ。这个特征图 Fᵢ 包含了丰富的、像素级的空间信息。
    2. 生成深度和点图: 每一个特征图 Fᵢ 接着被一个 3x3 的卷积层 (convolutional layer) 处理,从而分别映射生成对应的深度图 Dᵢ 和点图 Pᵢ。深度图 Dᵢ 记录了每个像素对应的场景深度,而点图 Pᵢ 可能记录了每个像素对应的三维空间坐标。
    3. 生成追踪特征: 除了生成几何信息(深度和点图),DPT 模块的“头”部(DPT head)还会输出另一组密集的追踪特征 Tᵢ。这组特征专门用于下一阶段的追踪任务。
    4. 不确定性预测 (Aleatoric Uncertainty): 模型还为每个深度图和点图预测了它们的任意不确定性 Σᵢᴰ 和 Σᵢᴾ。这个不确定性图衡量了模型对每个像素预测结果的置信度。在训练过程中,这个不确定性被用于损失函数 (loss) 的计算中;训练完成后,它可以反映出预测结果在哪些区域可能不可靠。
  • 小结: 这一部分描述了一个“解码”过程。模型从一个抽象的特征表示出发,通过专门的神经网络层(DPT、卷积层),并行地生成了三种不同但互相关联的像素级输出:场景的几何形状(深度/点图)、用于追踪的身份特征(追踪特征),以及对自身预测有多自信的评估(不确定性)。

Tracking.
这段文字描述了系统的追踪模块(tracking module T)如何工作,其核心任务是:给定一个图像中的一个点,在所有其他图像中找到与之对应的点。

  • 核心流程:
    1. 架构: 追踪功能基于 CoTracker2 架构实现,并使用前一阶段生成的密集追踪特征 Tᵢ 作为其输入。
    2. 查询过程:
    • 在一个查询图像 Iₒ 中选定一个查询点 yⱼ。
    • 模型首先通过双线性采样 (bilinearly sampled) 的方式,在查询图像的特征图 Tₒ 中提取出查询点 yⱼ 对应的特征向量。
    • 然后,将这个特征向量与所有其他图像的特征图 Tᵢ (i ≠ q) 进行相关性计算 (correlated),生成一系列相关性图 (correlation maps)。这些图谱的高亮区域表示在其他图像中可能与查询点 yⱼ 匹配的位置。
    1. 预测对应点:
    • 这些相关性图谱会被送入自注意力层 (self-attention layers) 进行处理。自注意力机制能够整合全局信息,更准确地判断出最佳匹配点。
    • 最终,模型预测出一组二维点 ŷᵢ,这些点是在所有其他图像 Iᵢ 中与原始查询点 yⱼ 相对应的点(即它们都指向同一个三维空间点)。
    1. 无时序假设: 一个重要的特性是,该追踪器不假设输入图像有任何时间顺序。这意味着它可以处理无序的图像集合,而不仅仅是按时间顺序播放的视频帧。
  • 小结: 这一部分描述了一个“匹配”过程。它利用第一部分生成的“追踪特征”作为点的“身份证”,通过特征匹配和注意力机制,在一个无序的图像集合中高效地找到同一个三-维空间点在不同视角下的二维投影位置。
    整体概括
    这两部分共同构成了一个强大的视觉感知系统。
  1. 感知阶段 (Dense Predictions): 系统首先对每一张输入的图像进行深入“理解”,提取出其三维几何结构(深度/点图)和可供追踪的密集特征。同时,它还能量化自己预测的置信度。
  2. 关联阶段 (Tracking): 然后,系统利用这些提取出的追踪特征,建立起不同图像之间的联系。通过在一个图像上指定一个点,系统就能在所有其他图像中找到这个点的“分身”,实现了跨视图的稳定追踪。
### 部署 VGG 模型的方法 VGG 是一种经典的卷积神经网络架构,在图像分类领域表现优异。以下是关于如何部署 VGG 模型的具体方法: #### 1. 使用 TensorFlow/Keras 进行模型导出 在完成模型训练后,可以通过 `model.save()` 方法将整个 Keras 模型保存为 HDF5 文件或 SavedModel 格式[^1]。SavedModel 格式更适合生产环境下的部署。 ```python import tensorflow as tf # 假设 model 已经定义并完成了训练 model.save('vgg_model.h5') # 导出为 HDF5 格式 tf.saved_model.save(model, 'saved_vgg_model/') # 导出为 SavedModel 格式 ``` #### 2. 将模型转换为 ONNX 格式 ONNX(Open Neural Network Exchange)是一种开放的机器学习模型交换格式,支持多种框架之间的互操作性。可以使用 `tensorflow-onnx` 库将 Keras 模型转换为 ONNX 格式。 ```python import tf2onnx # 转换为 ONNX 格式的代码 onnx_model, _ = tf2onnx.convert.from_keras(model, opset=13) with open("vgg_model.onnx", "wb") as f: f.write(onnx_model.SerializeToString()) ``` #### 3. 利用 TensorFlow Serving 实现在线服务化 TensorFlow 提供了一个名为 TensorFlow Serving 的工具,用于高效地提供预训练模型的服务接口。通过 Docker 容器运行 TensorFlow Serving 并加载已保存的模型。 启动命令如下: ```bash docker run -p 8501:8501 --mount type=bind,source=$(pwd)/saved_vgg_model/,target=/models/vgg/ \ -e MODEL_NAME=vgg -t tensorflow/serving & ``` 客户端请求示例: ```python import requests data = {'instances': [[...]]} # 输入数据需按照模型输入形状准备 response = requests.post('http://localhost:8501/v1/models/vgg:predict', json=data) print(response.json()) # 输出预测结果 ``` --- ### VGGT 技术的部署方案 VGGT 是一种基于 Transformer 架构的技术,主要用于从二维感知三维的任务,例如姿态估计、密集重建和点跟踪等[^2]。其部署流程与传统 CNN 类似,但由于涉及更复杂的推理过程,需要注意以下几点: #### 1. 数据预处理优化 由于 VGGT 处理的是多帧序列数据,因此需要对输入数据进行高效的批量化处理。建议采用 GPU 加速的数据管道来提升性能。 #### 2. 模型压缩与加速 对于大规模 Transformer 模型,通常会面临较大的内存占用问题。可考虑以下策略减少资源消耗: - **剪枝 (Pruning)**:移除冗余权重以降低参数量。 - **量化 (Quantization)**:将浮点数精度从 FP32 减少到 INT8 或更低。 - **蒸馏 (Distillation)**:训练一个小规模的学生模型模仿教师模型的行为。 #### 3. 接口封装与 RESTful API 设计 类似于 VGG 模型的部署方式,可通过 Flask/Django 等 Python Web 框架创建 RESTful API 来暴露 VGGT 功能。 示例代码片段: ```python from flask import Flask, request, jsonify app = Flask(__name__) @app.route('/predict', methods=['POST']) def predict(): data = request.get_json() input_data = preprocess(data['frames']) # 自定义预处理函数 result = vgg_model(input_data).numpy() # 执行推断 return jsonify({'result': result.tolist()}) if __name__ == '__main__': app.run(host='0.0.0.0', port=5000) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值