视频-语言模型:时间 token 与 grounding
视频不是一摞照片。一段 5 秒的片段有因果顺序、动作动词和事件时序,是图像模型表示不了的。Video-LLaMA(Zhang 等人,2023 年 6 月)出货了第一个带视听 grounding 的开放视频 LLM。VideoChat 和 Video-LLaVA 放大了这个模式。到 2025 年,Qwen2.5-VL 的 TMRoPE 缩小了与前沿专有模型的差距。每个系统解决时间 token 的方式都不同——每片段一个 Q-former、每帧 concat-pool、每 token 一次 TMRoPE。本节课通读这些模式,搭一个均匀 vs 动态帧采样器,并在时间 grounding 任务上评测。
类型: Build 语言: Python(标准库,帧采样器 + 时间 grounding 评测器) 前置要求: Phase 12 · 08(LLaVA-OneVision) 预计时间: ~180 分钟
学习目标
- 解释为什么时间位置编码独立于视觉编码器改变视频 VLM 的性能。
- 在每秒 token 数 vs grounding 准确率上把均匀、动态 FPS、事件驱动三种帧采样作比较。
- 描述每片段一个 Q-former(Video-LLaMA)vs 每帧池化(Video-LLaVA)vs 每 token 一次 M-RoPE(Qwen2.5-VL)的设计。
- 说出四个视频基准:VideoMME、TempCompass、EgoSchema、Video-MMMU。
问题背景
一段 1 分钟、30 FPS 的视频是 1800 帧。每帧 196 个视觉 token(224 下的 ViT-B)算,就是 35.2 万个 token——比任何 2024 年时代的 LLM 上下文都大。
存在三种缩减策略:
- 帧下采样(按内容 1-8 FPS)。
- 激进地池化每帧的 patch token(3x3 或 4x4 双线性池化)。
- 用一个 Q-former 压缩,它吃一段 16 帧片段、吐 64 个 token。
每种取舍都不同。下采样丢时间细节。池化丢空间细节。Q-former 两者各丢一点但省 token。
时间位置编码是另一条轴:模型怎么知道第 5 帧在第 6 帧之前?选项包括简单的一维时间 RoPE(Video-LLaMA)、学出来的时间嵌入(Video-LLaVA),以及 TMRoPE(Qwen2.5-VL,完整 3D)。
核心概念
Video-LLaMA:每片段一个 Q-former + 音频分支
Video-LLaMA(2023)是第一个开放视频 LLM。架构:
- 2 FPS 下的 16 帧片段(即 8 秒)。
- 逐帧 ViT 特征 -> 视频 Q-former,它交叉关注全部 16 帧 -> 32 个学出的 query -> LLM。
- 并行音频分支:波形 -> ImageBind 音频编码器 -> 音频 Q-former -> 32 个 query -> LLM。
强项:视听联合推理。弱项:片段长度固定,无任意时间 grounding。
VideoChat 与 Video-LLaVA
VideoChat 保留 Video-LLaMA 的想法但去掉了音频并简化。Video-LLaVA(Lin 等人,2023)在图像和视频帧上训了单个视觉编码器("投影前对齐"),给出统一表示。两者都是冻结 CLIP 编码器 + MLP + LLM。
两者都不处理长视频。都是 8-16 帧系统。
Qwen2.5-VL 与 TMRoPE
Qwen2.5-VL 引入了 TMRoPE——时间-模态旋转位置嵌入。每个 patch token 携带一个 (t, h, w) 位置,其中 t 是真实时间戳(不是帧索引)。
与简单时间嵌入的关键区别:
- 绝对时间,不是索引。模型看到"在 4.2 秒",而非"在第 15 帧"。
- 每 token 旋转,不是每片段。每个视觉 token 按它的时间戳独立旋转。
- 与动态 FPS 兼容。如果你这里按 2 FPS、那里按 4 FPS 采样,TMRoPE 原生处理这种不均匀间距。
TMRoPE 让"猫在第几秒跳起来?"这类查询成为可能。模型能输出"在 4.2 秒"。Video-LLaMA 只能说"片段早段"。
帧采样策略
均匀:在时长上均匀采 N 帧。简单,丢掉运动峰值。
动态 FPS:基于运动强度自适应采样。光流或帧差分挑出高运动段做更密集采样。Qwen2.5-VL 在这上面训练。
事件驱动:跑一个轻量检测器,在有动作的地方多采。VideoAgent 用这个。
关键帧 + 上下文:在镜头边界 + 邻近几帧采样。用于影视内容。
每帧池化
在 1 FPS、每帧 576 token 下,一段 5 分钟片段是 172,800 个 token。用 Qwen2.5-VL-72B 的 128k 上下文能做,但贵。
3x3 双线性池化减到每帧 64 token -> 5 分钟 19,200 个 token。大多数任务的甜点区。
对空间细节没那么要紧的 agent 工作流,池化更激进(6x6 -> 每帧 16 token)。
四个视频基准
- VideoMME:综合视频理解,短 + 中 + 长。
- TempCompass:细粒度时间推理,"之前"/"之后"类问题。
- EgoSchema:长时程第一人称视频。
- Video-MMMU:多模态多学科视频问题。
一次完整的视频 VLM 评测会全打到这四个。它们各压不同的轴——TempCompass 全是关于排序,EgoSchema 关于 3 分钟以上推理,VideoMME 横跨时长。
grounding 输出格式
时间 grounding 的输出格式:
- 自由文本:"猫在大约 4 秒处跳起。"易解析但不精确。
- 结构化 JSON:
\{"event": "jump", "start": 4.1, "end": 4.3\}。Qwen2.5-VL 训这个。 - 基于 token:与答案交错的特殊
<time>4.1</time>token。Qwen2.5-VL 的内部格式。
基于 token 的对下游使用最准。Qwen2.5-VL 的 JSON 输出格式可直接解析。
2026 年最佳实践
2026 年的视频 VLM:
- 编码器:带 M-RoPE 或 TMRoPE 的 SigLIP 2(Qwen2.5-VL)。
- 帧采样:动态 FPS(按运动 1-4)配最大帧上限。
- 每帧池化:3x3 双线性。
- 输出:带 time + event 字段的结构化 JSON。
- 基准:通用用 VideoMME + TempCompass;长时程用 EgoSchema。
video-temporal-patches实际使用
code/main.py 包含:
- 均匀和动态 FPS 帧采样器。
- 一个玩具时间 grounding 评测器:给定时间 T 处的"真值"事件和一个模型输出,带容差地为准确率打分。
- 一份横跨 Video-LLaMA(16 帧,Q-former)、Video-LLaVA(8 帧,MLP)、Qwen2.5-VL(动态 FPS + TMRoPE)的对比。
拿去用
本节课产出 outputs/skill-video-vlm-frame-planner.md。给定一个视频任务(监控、动作识别、时间 grounding、摘要),它挑出帧采样器、池化倍数、输出格式和预期准确率档。
练习
对一段 3 分钟烹饪演示,在均匀 vs 动态 FPS 之间挑选。用一个 token 数来辩护。
TMRoPE 具体加入了什么是简单时间嵌入表做不到的?
写一个 VLM 能学会吐出的时间 grounding JSON schema。包含错误情形。
读 Video-LLaVA 第 3 节关于"投影前对齐"的内容。为什么这比训分开的图像和视频编码器更好?
给定 VideoMME 排行榜,截至 2026 年顶级开放模型与顶级专有模型的差距有多大?这差距里有多少能归因于时间编码 vs 基座 LLM 规模?
关键术语
| 术语 | 大家怎么说 | 它实际指什么 |
|---|---|---|
| 时间 grounding | "时间定位的答案" | VLM 为某事件何时发生输出一个具体的时间戳范围 |
| TMRoPE | "时间-多模态 RoPE" | 带绝对时间戳的 3D 旋转位置,Qwen2.5-VL 所用 |
| 动态 FPS | "运动感知采样" | 在高运动段多采帧,在静态段少采 |
| 帧池化 | "每帧空间压缩" | 在进 LLM 前用双线性插值减少每帧 patch |
| 视频 Q-former | "片段压缩器" | 把 N 帧映射到 K 个学出 query 的交叉注意力瓶颈 |
| VideoMME | "视频基准" | 综合短/中/长视频基准,2500+ 样本 |