视频理解大模型
视频理解大模型将视觉语言模型的能力从静态图像扩展到动态视频,需要建模时空信息、理解动作语义和时序关系,是通向通用视觉智能的关键方向。
核心挑战
视频理解相比图像理解面临独特挑战:
- 时空复杂性:视频包含时间维度的额外信息,需要同时建模空间和时间
- 长序列处理:一段视频可能包含数百帧,Token 数量远超图像
- 动作与因果:理解动作的语义和因果关系,而非仅识别静态对象
- 计算成本:处理视频的计算量远大于单张图像
主流架构方案
均匀采样 + 时序聚合
最简单的方案是从视频中均匀采样若干关键帧,分别提取视觉特征后聚合:
python
import torch
import torch.nn as nn
class VideoLLM(nn.Module):
"""基于帧采样的视频理解模型"""
def __init__(self, vision_encoder, temporal_aggregator, llm):
super().__init__()
self.vision_encoder = vision_encoder
self.temporal_aggregator = temporal_aggregator
self.llm = llm
def forward(self, video_frames, text_tokens):
# 均匀采样 8 帧
T = video_frames.shape[1]
indices = torch.linspace(0, T-1, 8).long()
sampled_frames = video_frames[:, indices]
# 逐帧提取视觉特征
frame_features = []
for frame in sampled_frames.unbind(1):
feat = self.vision_encoder(frame) # [B, num_patches, dim]
frame_features.append(feat)
# 时序聚合
video_features = self.temporal_aggregator(
torch.stack(frame_features, dim=1) # [B, 8, num_patches, dim]
)
# 输入语言模型
return self.llm(video_features, text_tokens)时序注意力
在视觉 Token 序列上添加时序维度的注意力,让不同帧的特征交互:
- 时空注意力:在空间和时间维度上交替计算注意力
- 帧间注意力:帧与帧之间的全局注意力
- 压缩时序表示:使用 Perceiver 或 Q-Former 压缩视频 Token
代表性模型
| 模型 | 帧采样 | 时序建模 | 最大视频长度 |
|---|---|---|---|
| Video-LLaVA | 8 帧 | 帧拼接 | ~8 帧 |
| Qwen2-VL | 动态 | M-RoPE | ~20 分钟 |
| LLaVA-NeXT-Video | 8-16 帧 | 时序池化 | ~30 秒 |
| InternVL-2-Video | 动态 | 时序注意力 | ~5 分钟 |
| GPT-4o | 未知 | 未知 | 数分钟 |
视频理解任务
视频理解大模型支持的核心任务包括:
- 视频描述:生成视频内容的自然语言描述
- 视频问答:基于视频内容回答问题
- 动作识别:识别视频中的动作类型
- 时序定位:定位视频中特定事件的发生时间
- 视频摘要:提取视频的关键片段和内容
视频与图像的统一
Qwen2-VL 等模型通过 M-RoPE 实现了图像和视频的统一处理。图像被视为单帧视频,文字在时间维度上顺序排列,实现了真正的多模态统一编码。
高效视频处理
处理长视频的核心优化策略:
- 动态帧采样:根据视频内容自适应采样关键帧
- Token 压缩:将视觉 Token 数量压缩到 LLM 可处理的范围
- 流式处理:按时间窗口逐段处理,维护记忆状态
- 缓存机制:缓存已处理的帧特征,避免重复计算