引言
在计算机视觉领域,单目深度估计 (Monocular Depth Estimation, MDE) ——即从单张图像判断每个像素的距离——已经取得了革命性的进展。像 Depth Anything V2 这样的模型,仅仅通过观察一张平面照片,就能以惊人的准确度直观地理解场景的 3D 几何结构。然而,在理解静态图像与理解视频之间,仍然存在着巨大的鸿沟。
如果你简单地将标准的图像深度模型逐帧应用于视频,你会遇到一种被称为“闪烁 (flickering) ”的现象。由于模型是孤立地处理每一帧,光照或摄像机角度的微小变化都会导致预测的深度发生不稳定的跳动。其结果就是产生抖动、不连贯的画面,无法用于机器人技术、增强现实或视频编辑。
现有的解决方案通常分为两派: 要么是计算昂贵的扩散模型,处理一帧需要近一秒钟;要么依赖于“光流 (optical flow) ”——跟踪像素运动——但这在物体快速移动或相互遮挡时容易出错。此外,大多数方法在处理长视频时都很吃力,因为累积的误差会导致深度尺度随时间发生漂移。
Video Depth Anything (VDA) 应运而生。

如图 1 所示,Video Depth Anything背后的研究人员提出了一种解决方案,击中了权衡三角的“甜蜜点”: 它实现了高精度、高时间一致性和低延迟。最令人印象深刻的是,它引入了一种处理“超长”视频 (超过几分钟) 的策略,而且不会丢失对场景几何结构的追踪。
在这篇深度文章中,我们将探索这种新架构的工作原理、稳定预测且不依赖光流的巧妙数学损失函数,以及使其能够扩展到任意长度序列的推理策略。
背景: 一致性的挑战
要理解 Video Depth Anything 的重要性,我们需要先了解它建立的基础。
基础: Depth Anything V2
该模型的核心是 Depth Anything V2 , 这是一个用于单目深度估计 (MDE) 的强大“基础模型”。基础模型在大规模数据集上进行训练,使其对一般场景具有极其稳健的理解能力。与仅在小型特定数据集 (如仅室内房间或仅驾驶场景) 上训练的旧模型相比,它们能更好地处理复杂的光照、透明表面和复杂的几何结构。
然而,Depth Anything V2 是一个空间专家,而非时间专家。它不知道第 2 帧是紧跟在第 1 帧之后的。
以前视频处理方法的问题
研究人员曾尝试通过几种方式将时间一致性强加给 MDE 模型:
- 测试时优化 (Test-Time Optimization) : 这涉及针对你要处理的特定视频对模型进行微调。虽然准确,但在推理时极其缓慢,对于实时应用来说是不切实际的。
- 光流后处理 (Post-Processing with Optical Flow) : 一些方法试图通过计算“光流” (像素在帧之间如何移动) 并扭曲深度图以进行匹配,来平滑抖动。然而,如果光流计算失败 (在复杂场景中经常发生) ,深度图就会崩溃。
- 视频扩散模型 (Video Diffusion Models) : 像 DepthCrafter 这样的模型使用生成式 AI 来“想象”深度。这些模型提供了极好的细节,但计算量极大。正如我们在图 1 中看到的,其中一些模型处理单帧需要近一秒 (910毫秒) ,而 Video Depth Anything 只需毫秒级。
研究人员确定了一种需求: 需要一种前馈 (feedforward) 模型——即无需迭代步骤直接运行——它既能继承基础模型的泛化能力,又能原生添加时间稳定性。
核心方法: 架构与设计
Video Depth Anything 背后的理念是保持图像模型强大的视觉理解能力,但替换掉网络中负责进行最终预测的部分,代之以能够理解时间的部分。
架构: 编码器与时空头
模型架构在重用现有技术方面非常优雅。它由两个主要部分组成: 编码器 (Encoder) 和 时空头 (Spatiotemporal Head) 。

1. 编码器 (冻结)
研究人员使用了来自 Depth Anything V2 的预训练编码器。该组件从输入图像中提取丰富的特征图。至关重要的是,他们在训练期间冻结了这个编码器。这一决定有两个目的:
- 效率: 减少了训练的计算成本。
- 保留: 确保模型保留从数百万张图像中学到的强大泛化能力,而不是为了过拟合较小的视频数据集而“遗忘”它们。
然而,为了处理视频,输入被重新整形。输入不再是单张图像 (\(B \times C \times H \times W\)) ,而是一批视频片段 (\(B \times N \times C \times H \times W\)) ,其中 \(N\) 是帧数 (例如,32 帧) 。
2. 时空头 (STH)
这是创新的关键所在。图像模型的标准“头” (通常是 DPT 头) 只关注空间特征。研究人员将其替换为 时空头 (Spatiotemporal Head, STH) 。
如图 2 右侧所示,STH 从编码器的不同阶段 (\(F_1\) 到 \(F_4\)) 获取特征。它通过“重组 (Reassemble) ”和“融合 (Fusion) ”模块处理这些特征,这与标准深度网络类似。关键的区别在于插入了 时间层 (Temporal Layers) 。
时间层
时间层是一种允许模型在视频片段的 \(N\) 帧之间比较特征的机制。

图 10 详细说明了这一操作。系统获取特征图并重新整形以隔离时间维度 (\(N\)) 。然后,它仅沿时间轴应用 多头自注意力 (Multi-Head Self-Attention) 。
这意味着对于特定的像素位置 (比如左上角) ,模型会观察该位置的特征在所有 32 帧中是如何变化的。这使得网络能够在预测最终深度图之前平滑不一致性并理解运动动态。
损失函数: 时序梯度匹配
设计架构只是成功了一半。你还需要通过损失函数从数学上告诉模型什么样的结果是“成功”的。
为什么“光流扭曲”是有缺陷的
传统的视频深度方法通常使用基于光流的扭曲 (Optical Flow Based Warping, OPW) 损失。其逻辑是: “如果我知道第 1 帧中的像素 A 移动到了第 2 帧中的位置 B,那么 A (在第 1 帧) 的深度应该与 B (在第 2 帧) 的深度非常相似。”
\[ \mathcal { L } _ { \mathrm { O P W } } = \frac { 1 } { N - 1 } \sum _ { i = 2 } ^ { N } \parallel p _ { i } - \hat { p _ { i } } \parallel _ { 1 } , \]
这种假设 (如上方程 1) 的问题在于深度并非不变的。如果一辆车正朝摄像机开过来,两帧之间车的深度会减小。强行要求深度保持不变实际上会在训练期间混淆模型。此外,计算光流会增加额外的计算开销和潜在的误差。
解决方案: 梯度守恒
研究人员没有强制深度值匹配,而是提出了 时序梯度匹配 (Temporal Gradient Matching, TGM) 。
这个见解微妙但强大: 预测中深度变化的速率应该与真实值 (ground truth) 中深度变化的速率相匹配。
如果真实值显示一个物体靠近了 1 米,预测值也应该靠近 1 米。这允许处理动态场景 (移动的车辆、行走的人) ,在这些场景中深度自然会发生变化。
\[ \mathcal { L } _ { \mathrm { T G M } } = \frac { 1 } { N - 1 } \sum _ { i = 1 } ^ { N - 1 } \Vert | d _ { i + 1 } - d _ { i } | - | g _ { i + 1 } - g _ { i } | \Vert _ { 1 } . \]
在方程 5 (上图) 中:
- \(d_{i+1} - d_i\) 代表帧之间预测深度的变化。
- \(g_{i+1} - g_i\) 代表帧之间真实深度的变化。
- 损失函数最小化这两个变化量之间的差异。
这种方法完全消除了对光流的需求。它纯粹关注深度值的时序梯度。
最终的损失函数将这个新的 TGM 损失与标准的空间损失 (尺度和平移不变损失,即 SSI) 结合起来,以确保每一帧本身看起来也是正确的:
\[ \mathcal { L } _ { \mathrm { a l l } } = \alpha \mathcal { L } _ { \mathrm { T G M } } + \beta \mathcal { L } _ { \mathrm { s s i } } , \]
超长视频的推理策略
在视频片段上进行训练是一回事,但在一段 5 分钟的视频上进行推理又是另一回事。GPU 内存是有限的;你不能一次性将 10,000 帧输入模型。必须分块 (窗口) 处理视频。
分块处理的危险在于,模型可能会对“块 1”和“块 2”的尺度产生不同的理解。这会导致“尺度漂移 (scale drift) ”,即一个物体可能在这一秒看起来距离 5 米,下一秒看起来距离 10 米,仅仅是因为处理窗口移动了。
为了解决这个问题,作者设计了一种复杂的 关键帧参考 (Key-Frame Referencing) 策略。

如图 3 所示,构建下一个推理窗口的输入涉及三个部分:
- 未来帧 (Future Frames) : 我们想要估计的新内容 (\(N - T_o - T_k\)) 。
- 重叠帧 (Overlapping Frames, \(T_o\)) : 来自前一个窗口末尾的帧。这些提供了直接的连续性。
- 关键帧 (Key Frames, \(T_k\)) : 从视频更早的时间点采样的帧 (使用间隔 \(\Delta_k\)) 。
为什么要用关键帧? 通过在当前窗口的输入中包含来自遥远过去的帧,模型被“提醒”它早先建立的全局尺度。这锚定了预测,防止尺度随时间漂移。
最后,重叠区域使用线性插值 (混合) 拼接在一起,以确保窗口之间没有可见的接缝。
实验与结果
研究人员将 Video Depth Anything (VDA) 与顶级竞争对手进行了评估,其中包括像 DepthCrafter 和 DepthAnyVideo 这样的基于扩散的模型。
零样本性能
主要的测试是“零样本 (zero-shot) ”,意味着模型在训练期间从未见过的数集上进行测试。这测试了真正的泛化能力。

表 1 突出了结果。
- 准确度 (\(\delta_1\)): VDA (特别是大型模型 VDA-L) 在几乎所有数据集 (KITTI, Scannet, Bonn, NYUv2) 上都取得了最高分。
- 一致性 (TAE): VDA 的时间对齐误差 (0.570) 明显低于 NVDS (2.176) 或 DepthCrafter (0.639) 等竞争对手。TAE 越低意味着闪烁越少。
长视频稳定性
该论文最大胆的主张之一是能够处理超长视频。为了测试这一点,他们评估了长度达 500 帧的视频性能。

图 4 绘制了准确度与视频长度的关系。
- DepthCrafter (蓝线) : 随着视频变长,准确度显著下降。这表明存在尺度漂移或累积误差。
- VDA-L (红线) : 线条几乎是平的。无论视频是 100 帧还是 500 帧,性能都保持稳定。这验证了关键帧推理策略的成功。
视觉质量
数字固然有用,但深度估计是一项视觉任务。让我们看看定性对比。
长视频场景

在图 5 中,观察时间线切片 (垂直条带) 。
- DAv2: 显示锯齿状条纹,表明随时间推移存在闪烁。
- DepthCrafter (DC): 显示“漂移”。即使物体距离没有改变,深度颜色也会逐渐偏移。
- Ours (我们的) : 时间线平滑且一致,与真实值 (GT) 紧密匹配。
短视频场景

在图 6 中,我们看到了困难的“野外 (in-the-wild) ”场景。
- 第 2 行 (拉力赛车) : 注意烟雾。DepthCrafter 被烟雾搞糊涂了,产生了伪影 (红框) 。VDA 更好地处理了半透明体积。
- 第 5 行 (熊) : 熊毛皮和岩石的复杂纹理导致其他模型产生不一致的几何幻觉。VDA 将熊的形状与背景清晰地区分开来。
计算效率
VDA 最实用的优势可能在于速度。

表 3 揭示了延迟 (每帧处理时间) 的巨大差异:
- DepthCrafter: 910毫秒 (每帧近 1 秒) 。
- VDA-L (Large): 67毫秒。
- VDA-S (Small): 9.1毫秒。
VDA 的小型版本能够在 A100 GPU 上以超过 100 FPS 的速度运行,使其成为这些高质量模型中唯一可用于机器人或自动驾驶等实时应用的可行选项。
应用: 3D 点云
一致的深度允许创建 3D 点云。如果深度闪烁,3D 重建看起来就像一团嘈杂的灰尘。如果深度漂移,几何形状就会拉伸和扭曲。

图 12 展示了从 5 秒的驾驶镜头生成的点云。
- DepthCrafter: 在道路中产生了“分层”或可见的切片,这是深度步进不一致的结果。
- VDA: 生成了平滑、连续的道路表面以及树木和标志的清晰垂直结构。
结论
Video Depth Anything 代表了视频深度估计领域的显著成熟。通过摒弃光流的复杂性和扩散模型的高计算成本,作者回归了一种更清洁、更高效的基于 Transformer 的方法。
主要结论包括:
- 时间注意力是高效的: 你不需要重新训练一个庞大的编码器。一个轻量级的时空头足以教会图像模型关于时间的概念。
- 梯度 > 值: 匹配深度的变化 (时序梯度匹配) 比基于光流扭曲像素是一种更稳健的训练信号。
- 上下文为王: 对于长视频,回顾遥远的关键帧可以防止模型“遗忘”世界的尺度。
随着运行速度仅需 9 毫秒的 VDA-Small 模型的发布,我们可能会看到这项技术迅速集成到下游应用中,为机器人和软件提供一双一致、可靠的眼睛来理解移动的世界。
](https://deep-paper.org/en/paper/2501.12375/images/cover.png)