Chapter 7:视频理解与长视频评测 (MVBench / LongVideoBench 等)
导读:视频是视觉模态的终极形态。如果不考虑时间 ,视频只是堆叠的图片。但当引入 轴后,信息量呈指数级爆炸。 本章我们将从“静态图理解”跨越到“动态时空推理”。我们将探讨模型如何克服“遗忘”来处理 1 小时的电影(LongVideoBench),如何通过 20 个子任务体检表(MVBench)发现细粒度缺陷,以及在显存有限的情况下,如何设计高效的 Frame Sampling(帧采样) 策略。
7.1 视频理解的维度:从 2D 到 3D+Audio
视频理解模型(Video-LMM)并非简单的 Image Encoder + LLM。在评测前,我们需要建立一个多维度的能力坐标系。
视频任务谱系图
[ 高阶认知 (Reasoning) ]
/ | \
因果推理 (Why) 意图预测 (Next) 剧情摘要 (Summary)
| | |
------------------------------------------
| | |
动作识别 (Action) 时序定位 (Grounding) 物体追踪 (Tracking)
| | |
------------------------------------------
[ 基础感知 (Perception) ]
物体检测 OCR文字识别 音频感知 (ASR/Audio)
- 基础感知层:视频里有什么?(车、人、字幕)。这部分主要继承自 Image Encoder 的能力。
- 时序动态层:变化是如何发生的?(车在向左转、人在挥手)。这是视频特有的,要求模型理解 与 的差异。
- 高阶认知层:为什么会这样?(因为红灯亮了,所以车停了)。这通常需要结合世界知识(World Knowledge)和长上下文记忆。
7.2 代表性基准深度解析
我们需要不同的尺子来衡量上述不同的层级。
1. MVBench:细粒度能力的“全科体检”
- 定位:短视频、原子能力评测。
- 核心痛点解决:传统的 VideoQA(如 MSR-VTT)往往存在静态偏见 (Static Bias)。比如问题是“人在做什么运动?”,画面是一个拿着篮球的人。模型根本不需要看动作,只要看到“篮球”和“人”就能猜出“打篮球”。
- 设计机制:
- MVBench 设计了 20 个子任务,包括 Action Sequence(先做什么后做什么)、Moving Direction(往哪边走)、Object Interaction(人如何操作物体)。
- 很多题目设计成“反直觉”或强时序依赖,逼迫模型必须看懂“动”的过程。
2. LongVideoBench & VideoMME:长程依赖的挑战
- 定位:长视频(15分钟 ~ 1小时+)、大海捞针、多模态融合。
- 核心痛点解决:遗忘 (Forgetting) 与 上下文溢出 (Context Overflow)。
- 典型任务:
- 跨度检索:“视频第 5 分钟出现的那个杀手,在第 45 分钟再次出现时换了什么武器?”
-
全剧理解:“这部纪录片的主旨是什么?请结合开头和结尾的解说词分析。”
-
VideoMME 特色:强调 Audio 和 Subtitle 的多模态输入。如果模型是“聋子”,在 VideoMME 上会丢掉约 30% 的分数。
3. EgoSchema:第一人称的逻辑推理
- 定位:Egocentric 视角、无旁白、纯视觉推理。
- 难度:被公认为目前的 SOTA 杀手。
- 特点:
- 视频很长(3分钟),但没有任何语言提示。
- 问题通常涉及意图(Intent)和物理常识。
- 例如:看着一个人翻箱倒柜找东西,最后拿出一个螺丝刀。问题:“他原本想找什么?”(答案可能是“锤子”,因为他试了锤子不行才换的)。这需要极强的非语言推理。
4. Chart Comparison Table
| 基准名称 | 平均时长 | 核心侧重 | 评测形式 | 关键挑战 |
| 基准名称 | 平均时长 | 核心侧重 | 评测形式 | 关键挑战 |
|---|---|---|---|---|
| MVBench | < 30s | 20项细粒度原子能力 | 选择题 | 去除静态偏见,时序动作分辨 |
| LongVideoBench | > 20min | 长程记忆、检索 | 选择/问答 | 显存限制,信息密度稀疏 |
| VideoMME | 1min-1h | 多模态(音/图/文)综合 | 选择题 | 字幕与画面的对齐,多源信息融合 |
| EgoSchema | 3min | 第一人称、物理常识 | 选择题 | 无语音提示,纯视觉因果推理 |
| MathVista | 静态为主 | (虽然含少量视频,主打数学) | 问答 | 视觉与数值推理的结合 |
7.3 工程与实战:采样策略与 Token 经济学
在评测和训练视频模型时,如何把视频塞进 LLM 是最大的工程难题。我们不能输入所有帧,必须进行压缩。
常见的采样策略 (Sampling Strategies)
Rule-of-Thumb:
视频信息的冗余度极高。对于大部分任务,64 帧是目前的上限阈值,再多则收益递减(Diminishing Returns)。8-16 帧是效率与效果的最佳平衡点。
1. Uniform Sampling (均匀采样)
最简单,最常用。将视频等分为 个片段,每个片段取一帧。
- 优点:覆盖全局,实现简单。
- 缺点:容易漏掉短促的关键动作(如“眨眼”、“掉落”)。
2. Keyframe Extraction (关键帧提取)
使用传统 CV 算法(如计算帧间差分、光流变化)检测“场景切换”或“动作突变”,只保留变化大的帧。
- 优点:信息密度高,去除静止冗余。
- 缺点:计算开销大(预处理慢),且可能丢失微小的时序线索。
3. Token Compression (视觉 Token 压缩)
这是 LLaVA-Next-Video、Qwen-VL 等模型的做法。
- 原理:如果不压缩,1张图=256 tokens,8张图=2048 tokens(太贵)。
- 方法:使用 Pooler (池化) 或 Q-Former,将每一帧的 256 tokens 压缩为 个(例如 64 或 32)摘要 tokens。
- ASCII 示意:
[视频流] -> [Frame 1] -> [ViT] -> (256 tokens) -> [Pooler] -> (64 tokens) -\
-> [Frame 2] -> [ViT] -> (256 tokens) -> [Pooler] -> (64 tokens) --+-> [LLM]
-> ... /
-> [Frame 8] -> [ViT] -> (256 tokens) -> [Pooler] -> (64 tokens) -/
Total: 512 tokens
7.4 本章小结
- 时序即逻辑:视频评测的核心在于考察模型是否理解时间轴上的因果与顺序,而不仅仅是物体识别。
- 基准分层:使用 MVBench 调试基础动作能力,使用 LongVideoBench 调试长窗口记忆能力,使用 EgoSchema 调试高阶推理。
- Token 预算:视频理解本质上是一场“压缩”游戏。如何在有限的 Token 预算(显存/成本)内,保留最多的时空信息,是模型设计的关键。
- 多模态对齐:不要忽视音频。在 VideoMME 等基准中,音频往往包含画面中不存在的关键信息。
7.5 练习题
说明:本节包含 8 道题目。请先思考,再点击展开查看答案与解析。
基础题 (Fundamentals)
Q1: 视频处理的计算量
假设你使用 CLIP ViT-L/14 作为视觉编码器(Patch size 14x14),输入图像分辨率为 336x336。不考虑 CLS token,单帧图像产生的 Token 数量是多少?如果处理一个 1 分钟视频,采用 1fps 采样,总视觉 Token 数大约是多少?
点击查看答案与提示
答案: 单帧 576 tokens;总共约 34,560 tokens。
解析:
- Patch 数量计算: tokens。
- 1 分钟 @ 1fps = 60 帧。
- 总 Token = 。
Q2: 静态偏见 (Static Bias) 测试
你训练了一个 Video-LLM,在 MSR-VTT 上准确率很高,但在 MVBench 的 "Action Sequence" 上得分很低。这说明模型可能存在什么问题? A. 视觉编码器分辨率太低 B. 模型过拟合了静态场景物体,忽略了时序关系 C. 模型的词表(Vocabulary)太小 D. 视频采样率太高
点击查看答案
答案:B
解析: 这是典型的“单帧偏见”。模型学会了看到“厨房+蔬菜”就猜“做饭”,但无法区分是“正在切菜”还是“已经切好”。MVBench 的 Action Sequence 专门通过打乱顺序或细微动作对比来惩罚这种投机取巧。
Q3: 采样率的选择
对于一个检测“人是否在眨眼”的任务,与检测“这一集新闻讲了什么”的任务,采样策略应该有何不同?
点击查看答案
答案:
- 眨眼检测:需要高频采样(High FPS)甚至针对眼部区域的裁剪。因为眨眼是毫秒级动作,低频采样(如 1fps)极大概率直接漏掉闭眼的帧。
- 新闻摘要:需要低频采样(Low FPS)但长跨度。新闻画面变化慢(主播大头照),核心信息在音频和字幕,视觉只需提供大致场景确认。
Q4: 指标含义
在 Video Grounding(时序定位)任务中,指标 R@1, IoU=0.5 代表什么意思?
点击查看答案
答案: Recall at Rank 1, with IoU threshold 0.5。
通俗解释: 模型预测出的那一个(Rank 1)时间片段,与真实时间片段的重叠度(IoU)大于 50% 的比例。即“模型最自信的那次预测,有多少概率是大致对得上的”。
挑战题 (Challenge & Open-ended)
Q5: 长视频的“滑动窗口”陷阱
场景:为了处理 1 小时的视频,你决定使用滑动窗口(Sliding Window)策略:每次读入 1 分钟视频,让 LLM 生成摘要,最后将 60 个摘要合并再做一次总结。 问题:这种策略在回答 LongVideoBench 中关于“跨段因果”(Inter-clip Causality)的问题时(例如:结尾的爆炸是因为开头埋下的炸弹吗?),会遇到什么致命缺陷?如何改进?
点击查看答案
答案思路:
- 缺陷 - 信息隔离:滑动窗口切断了上下文。第 1 分钟的摘要可能忽略了“埋炸弹”这个细节(因为当时看起来不重要),导致第 60 分钟爆炸时,最后的总结模型找不到原因。这叫 "Lossy Summarization"。
- 改进策略: * Memory Bank / KV Cache:保留关键信息的向量表示,而不是压缩成文本。 * Hierarchical Structure:采用层级结构,但保留跨窗口的 Attention 机制(如 StreamingLLM)。 * Query-Aware Extraction:先看问题,带着问题去原始视频里检索片段,而不是先做通用摘要。
Q6: 视频中的 OCR 问题
场景:视频中出现了一个手机屏幕,屏幕上的文字滚动速度很快。你需要让模型读取完整的短信内容。 问题:简单的均匀采样(Uniform Sampling)会导致 OCR 识别出现大量乱码或重复。为什么?你应该使用什么后处理技术?
点击查看答案
答案思路:
- 原因 - 运动模糊与截断:滚动文字在每一帧的位置不同,且可能存在 Motion Blur。均匀采样可能截断了某一行文字的一半。
- 技术: * Video OCR (Stitching):先在单帧做 OCR,然后利用时序重叠区域进行文本拼接 (Stitching/Mosaicing)。 * 去重逻辑:计算相邻帧文本的编辑距离(Levenshtein Distance),过滤重复内容。
Q7: 多模态冲突处理
场景:在 VideoMME 的一个 case 中,视频画面是一个人在哭笑不得(表情复杂),但音频里充满了欢快的笑声,字幕也是欢快的。模型最终判断该人“非常开心”,但标准答案是“苦笑/尴尬”。 问题:这暴露了多模态融合中的什么问题?如果你是算法工程师,如何调试权重的分配?
点击查看答案
答案思路:
- 问题:模态主导 (Modality Dominance)。LLM 往往更信任文本(字幕)和音频,因为这些模态语义更明确,而视觉表情微妙且难以编码。这里发生了模态冲突。
- 调试/改进: * Modality Dropout:在训练时随机丢弃音频/字幕,强迫模型只看画面。 * CoT Prompting:强制模型先分别描述画面表情、声音情感,再做综合判断("The face looks sad, but the voice is happy...")。
Q8: 评估指标的设计
设计一个评测“视频生成”(Video Generation)一致性的 Benchmark。 背景:现在的 Sora / Gen-2 生成视频往往开头是穿蓝衣服的人,结尾变成绿衣服。 任务:请提出一个自动化的 Metric 来量化这种“对象一致性”(Object Consistency)。
点击查看答案
答案思路:
- 方法:利用检测跟踪 + 相似度计算。
- 步骤: * Step 1: 使用 Object Tracker (如 DEVA) 在视频中追踪主要主体。 * Step 2: 提取该主体在第 1 帧、第 帧、第 帧的 Crop 图像。 * Step 3: 使用 Re-ID 模型(Re-identification)或 DINOv2 计算特征余弦相似度。 * Step 4: 绘制相似度随时间变化的曲线。曲线下降越快,一致性越差。
7.6 常见陷阱与错误 (Gotchas)
1. 忽略 Temporal Positional Embedding
- 现象:模型能回答“有什么”,但完全分不清“顺序”。
- 原因:如果你直接把 8 帧图像的 tokens 扔进 LLM,而没有告诉 LLM 哪是第一帧、哪是第八帧,LLM 会把它们当作“一堆乱序的照片”。
- 对策:必须在 Visual Encoder 后或 LLM Embedding 层加入
time_embedding。
2. Dataloader 的性能瓶颈
- 现象:GPU 利用率忽高忽低(0% -> 100% -> 0%),训练极慢。
- 原因:视频解码(Decoding)是 CPU 密集型操作。
decord或opencv在读取高清视频时非常慢,跟不上 GPU 的计算速度。 - 对策:
- 离线预处理:先将视频抽帧存为 JPG/PNG。
- 使用主要针对 GPU 解码的库(如 NVIDIA DALI)。
- 多进程 Worker 设置恰当。
3. "Middle-Cut" 的误导
- 现象:为了省事,只取视频正中间的一帧作为代表。
- 问题:很多短视频(TikTok/Reels)的结构是“铺垫-高潮-结局”。中间帧往往是过渡状态,既不是起因也不是结果。
- 建议:最差也要用“首-中-尾”三帧采样。
4. 显存泄漏 (OOM)
- 现象:跑 LongVideoBench 时,跑着跑着就 OOM 了。
- 原因:Python 的垃圾回收机制在处理大量大尺寸 Tensor(视频帧)时可能不及时。或者 KV Cache 随着对话轮数增加而爆炸。
- 对策:在处理完一个长视频后,显式调用
torch.cuda.empty_cache()和gc.collect()。