引言
视频理解是计算机视觉领域的核心问题之一,旨在让机器能够”看懂”视频内容。与静态图像相比,视频额外包含了时间维度信息,这对建模提出了更高的要求。视频Transformer将自然语言处理领域成功的Transformer架构扩展到视频领域,通过自注意力机制建模时空依赖关系,取得了显著进展。
本文系统介绍视频理解任务分类、从图像到视频的扩展挑战,以及时空注意力机制的主要设计范式。
视频理解任务概述
核心任务类型
视频理解涵盖多种不同粒度的任务:
| 任务类型 | 输入 | 输出 | 典型应用 |
|---|---|---|---|
| 视频分类 | 整个视频 | 单一类别标签 | 内容推荐、情感分析 |
| 动作识别 | 短视频片段 | 动作类别 | 监控分析、体育分析 |
| 时序动作检测 | 长视频 | 动作起止时间+类别 | 视频摘要、行为分析 |
| 视频分割 | 视频帧 | 像素级分割掩码 | 视频编辑、增强现实 |
| 视频问答 | 视频+文本问题 | 文本答案 | 智能交互、视频检索 |
数据集与基准
主流视频理解数据集包括:
动作识别数据集:
- Kinetics-400/600/700:Google DeepMind发布的大规模动作识别数据集
- Something-Something V1/V2:强调动作语义理解的数据集
- UCF-101 / HMDB-51:早期小规模数据集
时序动作检测数据集:
- ActivityNet:长视频中的动作检测
- THUMOS:时序动作检测基准
视频分割数据集:
- YouTube-VOS / DAVIS:视频目标分割
- LVOS:大型视频分割数据集
从图像到视频的扩展挑战
维度扩展问题
将2D图像模型扩展到3D视频面临的核心挑战:
图像输入: [B, C, H, W] → 3D张量
视频输入: [B, T, C, H, W] → 4D张量
其中 T 为帧数,通常 T = 8~32
Token数量变化:
- ViT (图像): N = (H/16) × (W/16)
- Video Transformer: N = T × (H/16) × (W/16)
如果 T=8, H=W=224:
- ViT: 196 tokens
- Video: 1568 tokens (8倍)
计算复杂度膨胀
时空注意力的计算复杂度分析:
对于联合时空注意力(Joint Space-Time Attention):
假设输入包含 帧,每帧 个空间patch,总token数为 :
这导致计算复杂度随帧数呈二次方增长。
长程依赖建模
视频中的长程依赖体现在:
- 跨帧依赖:视频开头和结尾可能存在语义关联
- 动作完整性:一个完整动作可能跨越数十帧
- 上下文理解:需要结合前后帧理解当前帧
时空注意力机制设计范式
联合时空注意力
**联合注意力(Joint Attention)**是最直接的扩展方式,将所有时空位置放在一起计算注意力:
输入: [B, T, N, d] 其中 T=帧数, N=每帧patch数
Q = Linear([B,T,N,d] → [B,T,N,d])
K = Linear([B,T,N,d] → [B,T,N,d])
V = Linear([B,T,N,d] → [B,T,N,d])
注意力矩阵形状: [B, T×N, T×N]
每个token与所有时空token交互
代表工作:
- ViViT (Video Vision Transformer):直接扩展ViT到视频
- TimeSformer (Later):联合时空注意力(实验发现计算量大)
优点:能够捕捉任意位置的依赖关系
缺点: 复杂度,难以处理长视频
分解放置注意力
**分解放置注意力(Divided Space-Time Attention)**将时空注意力分解为两个独立的步骤:
阶段1: 时间注意力
┌─────────────────────────────────────┐
│ 对每个空间位置 (h,w),跨时间帧计算注意力 │
│ Attn_time: [B, T, N, d] → [B, T, N, d]│
└─────────────────────────────────────┘
↓
阶段2: 空间注意力
┌─────────────────────────────────────┐
│ 对每个时间步 t,跨空间位置计算注意力 │
│ Attn_space: [B, T, N, d] → [B, T, N, d]│
└─────────────────────────────────────┘
数学表示:
时间注意力(Time Attention):
空间注意力(Space Attention):
代表工作:
- TimeSformer:首个成功应用分解放置注意力的视频Transformer
- SlowFast Networks:虽然不是Transformer,但其快慢通道思想类似
优点:复杂度降为 ,更高效
缺点:时间维度和空间维度的交互被限制
跨帧注意力
**跨帧注意力(Cross-Frame Attention)**是一种更轻量级的方法:
稀疏连接模式:
- 每帧只与部分其他帧交互
- 典型:只与相邻帧或稀疏采样的帧交互
代表工作:
- Sparse Temporal Attention:
- Local Attention:只与相邻帧交互
- Global Attention:稀疏连接的关键帧
- Random Attention:随机采样的帧
Longformer-Video:
- 将Longformer的稀疏注意力扩展到视频
- 局部窗口 + 全局tokens + 随机tokens
各范式对比
| 范式 | 时间复杂度 | 空间复杂度 | 表达力 | 代表工作 |
|---|---|---|---|---|
| 联合注意力 | 高 | 最强 | ViViT | |
| 分解放置注意力 | 中 | 较强 | TimeSformer | |
| 跨帧注意力 | 低 | 中等 | Sparse Attn | |
| 局部注意力 | 最低 | 有限 | Video Swin |
视频Transformer架构设计
Patch Embedding扩展
2D Patch Embedding → 3D Patch Embedding:
class VideoPatchEmbed(nn.Module):
"""
视频Patch Embedding
将 [B, T, C, H, W] 的视频转换为时空token序列
"""
def __init__(self, patch_size=(2, 16, 16), tublet_size=2):
# patch_size[0]: 时间维度的patch大小 (tublet)
# patch_size[1]: 空间patch大小
super().__init__()
self.tublet_size = tublet_size
self.patch_size = patch_size
# 3D卷积实现
self.proj = nn.Conv3d(
in_channels=3,
out_channels=768, # embed_dim
kernel_size=patch_size,
stride=patch_size
)
def forward(self, x):
# x: [B, T, C, H, W]
B, T, C, H, W = x.shape
# 转换为 [B, C, T, H, W]
x = x.permute(0, 2, 1, 3, 4)
# 3D卷积投影
x = self.proj(x) # [B, embed_dim, T', H', W']
# 展平为序列
B, d, T', H', W' = x.shape
x = x.reshape(B, d, T' * H' * W').permute(0, 2, 1)
# 输出: [B, N, d] 其中 N = T' × H' × W'
return x位置编码设计
视频Transformer需要3D位置编码:
- 空间位置编码:编码 位置
- 时间位置编码:编码 帧位置
- 时空位置编码:编码 三元组
可学习的位置编码:
class VideoPositionalEncoding(nn.Module):
def __init__(self, num_frames, num_patches, embed_dim):
super().__init__()
# 时间位置编码
self.time_pos = nn.Parameter(
torch.randn(1, num_frames, 1, embed_dim)
)
# 空间位置编码
self.space_pos = nn.Parameter(
torch.randn(1, 1, num_patches, embed_dim)
)
def forward(self, x):
# x: [B, T, N, d]
x = x + self.time_pos + self.space_pos
return x视频Transformer Block
典型视频Transformer的Block结构:
VideoTransformerBlock:
1. LayerNorm
2. 时间注意力 (或联合注意力)
3. 残差连接
4. LayerNorm
5. 空间注意力 (或FFN)
6. 残差连接
7. FFN (可选)
视频Transformer训练策略
预训练策略
视频Transformer通常采用两阶段训练:
-
大规模视频预训练
- 使用Kinetics-400/600进行预训练
- 学习通用的时空表示
-
任务特定微调
- 在目标任务数据集上微调
- 较小的学习率,较短的训练周期
数据增强
视频特有的数据增强策略:
- 时间增强:随机时间采样、速度变化
- 空间增强:随机裁剪、水平翻转、颜色抖动
- 时空增强:MixUp、CutMix的时空扩展
与CNN方法的对比
3D CNN vs Video Transformer
| 方面 | 3D CNN | Video Transformer |
|---|---|---|
| 归纳偏置 | 局部性、平移不变性 | 更少的归纳偏置 |
| 计算效率 | 较高(可利用GPU加速) | 较低(注意力计算量大) |
| 长程依赖 | 需要深层网络 | 自注意力直接建模 |
| 数据需求 | 相对较少 | 需要大规模数据 |
| 可解释性 | 有限 | 注意力图可可视化 |
混合架构
结合CNN和Transformer优势的混合方法:
-
CNN特征提取 + Transformer时序建模
- I3D/R(2+1)D作为Backbone
- Transformer处理时序关系
-
Token化CNN特征
- 将CNN特征图作为Transformer输入
- 减少序列长度