引言

视频理解是计算机视觉领域的核心问题之一,旨在让机器能够”看懂”视频内容。与静态图像相比,视频额外包含了时间维度信息,这对建模提出了更高的要求。视频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数为

这导致计算复杂度随帧数呈二次方增长

长程依赖建模

视频中的长程依赖体现在:

  1. 跨帧依赖:视频开头和结尾可能存在语义关联
  2. 动作完整性:一个完整动作可能跨越数十帧
  3. 上下文理解:需要结合前后帧理解当前帧

时空注意力机制设计范式

联合时空注意力

**联合注意力(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位置编码:

  1. 空间位置编码:编码 位置
  2. 时间位置编码:编码 帧位置
  3. 时空位置编码:编码 三元组

可学习的位置编码:

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通常采用两阶段训练:

  1. 大规模视频预训练

    • 使用Kinetics-400/600进行预训练
    • 学习通用的时空表示
  2. 任务特定微调

    • 在目标任务数据集上微调
    • 较小的学习率,较短的训练周期

数据增强

视频特有的数据增强策略:

  • 时间增强:随机时间采样、速度变化
  • 空间增强:随机裁剪、水平翻转、颜色抖动
  • 时空增强:MixUp、CutMix的时空扩展

与CNN方法的对比

3D CNN vs Video Transformer

方面3D CNNVideo Transformer
归纳偏置局部性、平移不变性更少的归纳偏置
计算效率较高(可利用GPU加速)较低(注意力计算量大)
长程依赖需要深层网络自注意力直接建模
数据需求相对较少需要大规模数据
可解释性有限注意力图可可视化

混合架构

结合CNN和Transformer优势的混合方法:

  1. CNN特征提取 + Transformer时序建模

    • I3D/R(2+1)D作为Backbone
    • Transformer处理时序关系
  2. Token化CNN特征

    • 将CNN特征图作为Transformer输入
    • 减少序列长度

参考文献