视频理解与生成
视频分类 / 动作识别、视频理解模型 VideoMAE / TimeSformer、文生视频 Sora / 可灵 / Runway
视频 AI 任务概览
视频领域的 AI 任务可以划分为两大方向:视频理解 与 视频生成。视频理解侧重于从视频中提取语义信息,包括视频分类、动作识别、时序动作定位、视频字幕生成等;视频生成则关注根据文本提示、图像或视频片段生成新的视频内容,代表性技术如 OpenAI 的 Sora、快手的可灵、Runway Gen-3 等。这两大方向共享底层视觉表示学习的进展,但在模型架构、训练目标和评估方式上存在显著差异。
视频分类与动作识别
任务定义
视频分类与动作识别是视频理解中最基础的任务。根据输出粒度的不同,可分为:
- 视频级别分类:为整个视频分配一个类别标签,例如判断一段视频属于"打篮球"还是"做瑜伽"。该任务假设视频中仅包含一个主要动作。
- 时序动作定位:不仅识别动作类别,还要定位动作在时间维度的起始和结束位置。模型需要输出一组三元组
(动作类别, 开始时间, 结束时间)。
经典方法
在 Transformer 架构普及之前,主流方法分为两类:
- 3D CNN(C3D / I3D):将 2D 卷积核扩展为 3D 卷积核,在空间维度的同时引入时间维度。C3D(Tran et al., 2015)使用 3x3x3 的小卷积核堆叠深度网络;I3D(Carreira & Zisserman, 2017)将 ImageNet 上预训练的 2D Inception 网络膨胀为 3D,显著提升了动作识别的性能。
- 双流网络(Two-Stream Network):Simonyan & Zisserman(2014)提出的架构,使用两条独立的网络分别处理 RGB 帧和光流(optical flow),在预测层融合两个分支的输出。RGB 流捕捉外观信息,光流捕捉运动信息,两者互补。
视频理解模型
随着 Transformer 在 NLP 和图像领域的成功,研究者将其引入视频理解领域,催生了 TimeSformer 和 VideoMAE 等代表性模型。
TimeSformer
TimeSformer(Bertasius et al., 2021)是首个纯 Transformer 架构的视频分类模型,由 Facebook AI 提出。其核心创新包括:
- 时空分离注意力(Divided Space-Time Attention):在标准的 Transformer 编码器中,多头自注意力机制同时建模空间和时间维度。TimeSformer 将其分解为两个连续的步骤——先在空间维度做自注意力(同一帧内的 Patch 之间),再在时间维度做自注意力(不同帧的对应 Patch 之间)。这种分离设计大幅降低了计算复杂度。
- Tubelet Embedding:将连续帧中相同空间位置的 Patch 组合成一个 Tubelet,送入线性投影层。这种方式比逐帧独立 Patch Embedding 更好地保留了时序结构。
TimeSformer 在 Kinetics-400 和 Something-Something V2 数据集上取得了当时最优的结果,证明纯 Transformer 架构在多帧建模中的有效性。
VideoMAE
VideoMAE(Tong et al., 2022)将掩码自编码器(Masked Autoencoder, MAE)从图像扩展到视频领域。VideoMAE 的设计基于一个关键的观察:视频数据具有极高的时空冗余,因此可以采用比图像 MAE 更高的掩码比率。具体特点包括:
- 极高的掩码比率:VideoMAE 将输入视频立方体(Video Cubes)的 90%-95% 区域进行掩码,仅保留 5%-10% 的可见 Patch。如此极端的不对称设计迫使编码器学习真正有意义的时空表示。
- Tube 掩码策略:不同于图像 MAE 的随机掩码,VideoMAE 采用 Tube 掩码——在全时间维度上掩码同一空间位置的 Tubelet。这种策略有效地防止模型通过相邻帧的外观信息轻易重建被掩码区域,迫使模型学习运动信息。
- 轻量解码器:与 MAE 类似,VideoMAE 使用一个浅层解码器仅做重建任务,预训练完成后丢弃。编码器则作为预训练好的视觉 backbone 迁移到下游任务。
VideoMAE 在 Kinetics-400/600/700、Something-Something V2 和 AVA 等多个基准上刷新了记录,证明了掩码预训练在视频领域的巨大潜力。
模型对比
| 维度 | 3D CNN(C3D / I3D) | TimeSformer | VideoMAE |
|---|---|---|---|
| 骨干架构 | 3D 卷积网络 | 时空分离注意力 Transformer | ViT + 掩码自编码器 |
| 输入处理 | 密集采样视频帧序列 | Tubelet Embedding | Tube 掩码 + Patch Embedding |
| 预训练策略 | ImageNet 2D 预训练膨胀 | ImageNet-21K 图像预训练 | 视频掩码自编码重建(自监督) |
| 时间建模方式 | 3D 卷积核同时建模时空 | Divided Space-Time Attention | Tube 掩码迫使运动信息学习 |
| 计算效率 | 中等 | 较高(分离注意力降低复杂度) | 极高(仅处理 5-10% 可见 Patch) |
| 适用场景 | 中等规模数据集、实时推理 | 大规模视频分类、动作识别 | 大规模预训练、下游微调迁移 |
文生视频技术
文生视频(Text-to-Video)是近年来生成式 AI 最引人注目的方向之一。相比于文生图,视频生成需要在时间维度上保持连贯性,对模型的时序建模能力提出了更高要求。
Sora(OpenAI)
Sora 是 OpenAI 于 2024 年发布的文生视频模型,以其惊人的生成质量和物理世界模拟能力引起广泛关注。其核心技术要点包括:
- DiT(Diffusion Transformer)架构:Sora 摒弃了传统的 U-Net 扩散主干,采用 Transformer 作为扩散模型的去噪网络。DiT 将视频压缩为 Patch 序列,使用 Transformer 进行噪声预测,具有良好的可扩展性。
- Patch 时空编码:Sora 将视频数据压缩为低维潜在空间中的时空 Patch 序列。该编码方式统一了不同分辨率、时长和宽高比的视频表示,使模型能够处理多样化的输入。
- Scaling Law 的体现:Sora 的成功验证了视频生成领域同样存在 Scaling Law——随着模型参数量、训练数据和计算资源的增加,生成质量持续提升。大量训练数据还赋予了 Sora 涌现能力,使其能够模拟物体运动、光影变化等物理规律,尽管尚未达到完全物理精准。
可灵(Kling)
可灵是快手 AI 团队开发的文生视频模型,在中文语境下的表现尤为突出。其技术特点包括:
- 3D VAE + 扩散 Transformer:可灵使用 3D VAE 将视频压缩到潜在空间,再基于扩散 Transformer 进行生成。3D VAE 在空间和时间维度同时做压缩,有效降低了视频数据的表示维度。
- 物理模拟的理解:可灵在训练中注重大规模真实视频数据的学习,因此能够较好地理解物体运动、重力效应、碰撞反应等物理规律。生成的视频中,人物的肢体动作、衣物的飘动、水花的飞溅等细节表现自然。
Runway Gen-3
Runway Gen-3 是 Runway 公司推出的视频生成模型,侧重于视频编辑与合成的应用场景。其核心特点包括:
- 多模态训练:Gen-3 采用文本、图像、视频多模态数据联合训练,模型能够理解不同模态之间的语义对齐关系,支持丰富的输入控制方式。
- 视频编辑与合成:区别于单纯的文生视频,Gen-3 在视频编辑领域具有独特优势,支持文字指导的视频风格迁移、局部修改、背景替换等操作。这使得 Gen-3 更适用于创意工作流中的实际生产环节。
文生视频模型对比
| 维度 | Sora(OpenAI) | 可灵(Kling) | Runway Gen-3 |
|---|---|---|---|
| 架构基础 | Diffusion Transformer(DiT) | 3D VAE + 扩散 Transformer | 多模态扩散模型 |
| 生成质量 | 极高,物理模拟能力强 | 高,中文场景表现优秀 | 高,编辑能力突出 |
| 最长生成时长 | 约 60 秒 | 约 30 秒 | 约 30 秒 |
| 可控性 | 文本 + 图像输入 | 文本 + 图像输入 | 文本 + 图像 + 视频编辑指令 |
| 核心优势 | 物理世界模拟、Scaling Law | 中文理解、肢体动作自然 | 视频编辑与合成工作流 |
| 可用性 | 有限制开放 | 开放使用 | 开放使用 |
代码示例:使用 Hugging Face VideoMAE 进行视频分类
以下代码演示如何使用 Hugging Face transformers 库加载预训练的 VideoMAE 模型,对一段视频进行动作分类推理。
import torch
import av
import numpy as np
from transformers import VideoMAEImageProcessor, VideoMAEForVideoClassification
from huggingface_hub import snapshot_download
# 加载预训练模型和图像处理器
model_name = "MCG-NJU/videomae-base-finetuned-kinetics"
processor = VideoMAEImageProcessor.from_pretrained(model_name)
model = VideoMAEForVideoClassification.from_pretrained(model_name)
def read_video_pyav(video_path: str, num_frames: int = 16) -> torch.Tensor:
"""使用 PyAV 读取视频并均匀采样指定帧数"""
container = av.open(video_path)
total_frames = container.streams.video[0].frames
indices = np.linspace(0, total_frames - 1, num_frames, dtype=int)
frames = []
container.seek(0)
for i, frame in enumerate(container.decode(video=0)):
if i in indices:
frames.append(frame.to_rgb().to_ndarray())
container.close()
return np.stack(frames)
def classify_video(video_path: str) -> dict:
"""对视频进行动作分类并返回 top-5 预测结果"""
frames = read_video_pyav(video_path, num_frames=16)
# 预处理输入
inputs = processor(
list(frames),
return_tensors="pt",
)
# 推理
with torch.no_grad():
outputs = model(**inputs)
logits = outputs.logits
probs = torch.nn.functional.softmax(logits, dim=-1)
# 获取 top-5 预测
top5_probs, top5_indices = torch.topk(probs.squeeze(0), k=5)
results = {}
for prob, idx in zip(top5_probs, top5_indices):
label = model.config.id2label[idx.item()]
results[label] = prob.item()
return results
if __name__ == "__main__":
result = classify_video("path/to/your/video.mp4")
for label, score in result.items():
print(f"{label}: {score:.4f}")该示例演示了完整流程:使用 PyAV 从视频文件中均匀采样 16 帧,通过 VideoMAE 的图像处理器进行标准化和尺寸调整,最后利用预训练模型输出分类结果。开发者可根据实际需求调整采样帧数或更换为 TimeSformer 模型("facebook/timesformer-base-finetuned-k400")。