2. 视频预测基础
视频预测(Video Prediction)是计算机视觉与时序建模交叉领域的核心任务,其目标是在给定历史帧序列的条件下,预测未来若干帧的像素或语义内容。与单帧图像识别不同,视频预测模型必须同时理解空间结构(物体外观、纹理)与时间动态(运动趋势、遮挡关系)。因此,在进入模型训练之前,首先需要建立对视频数据表示方式的清晰认知,并熟悉领域内常用的基准数据集及其预处理流程。本章将系统梳理帧序列、光流、时空张量三种核心表示方法,并深入解析KTH、UCF101、Moving MNIST、BAIR Robot Pushing四个数据集的特性与预处理要点。
上图展示了视频预测中三种数据表示与四个基准数据集之间的映射关系。帧序列是最直接的原始输入,光流提供了显式的运动信息,而时空张量则是深度学习模型实际处理的标准格式。数据集的选择取决于任务目标:KTH和UCF101侧重于人类动作,Moving MNIST适合算法快速迭代,BAIR则面向真实机器人操作场景。下面将逐一展开详细说明。
2.1 视频数据表示:从像素到张量
2.1.1 帧序列:最直观的时空采样
视频本质上是一系列按时间顺序排列的图像帧。对于视频预测任务,帧序列通常表示为 F = {I_1, I_2, ..., I_T},其中 I_t ∈ R^{H×W×C} 是第 t 帧的图像矩阵,H、W 分别为高度和宽度,C 为通道数(灰度图为1,RGB图为3)。帧序列保留了完整的像素级信息,包括纹理、颜色、光照变化等,是模型学习外观表征的基础。
在实际处理中,帧序列需要经过以下标准化步骤:
- 尺寸统一:将所有帧缩放到固定分辨率(如 64×64、128×128 或 256×256),以保证张量形状一致。
- 归一化:将像素值从 [0, 255] 映射到 [0, 1] 或 [-1, 1],加速模型收敛。
- 帧采样:对于长视频,通常采用均匀采样或随机裁剪的方式选取连续 T 帧作为输入窗口。
2.1.2 光流:显式的运动编码
光流(Optical Flow)描述了图像中每个像素在相邻帧之间的瞬时运动矢量。对于第 t 帧中的像素 (x, y),其光流向量 (u, v) 表示该像素在 t+1 帧中的位移。光流场可以表示为 O_t ∈ R^{H×W×2},其中两个通道分别对应水平位移 u 和垂直位移 v。
计算光流的经典算法包括 Lucas-Kanade(稀疏光流)和 Farnebäck(密集光流)。在深度学习时代,FlowNet、RAFT 等神经网络方法能够实现端到端的高精度光流估计。光流表示的优势在于:
- 运动显式化:模型无需从像素变化中隐式推断运动,降低了学习难度。
- 计算高效:光流场是稀疏的运动信息,相比原始帧序列,数据量更小。
- 对光照鲁棒:光流基于梯度计算,对光照变化不敏感。
然而,光流也存在局限性:它无法处理大位移运动(如快速旋转)、遮挡区域以及新出现/消失的物体。因此,在实际项目中,光流常与帧序列结合使用,形成双流输入。
2.1.3 时空张量:模型的标准输入格式
无论采用帧序列还是光流,最终都需要转换为统一的时空张量(Spatiotemporal Tensor)供深度学习模型处理。时空张量的标准形状为 T × C × H × W,其中 T 为时间维度(帧数),C 为通道数,H 和 W 为空间维度。例如,一个包含 10 帧 RGB 视频、分辨率为 64×64 的输入张量形状为 [10, 3, 64, 64]。
在构建时空张量时,需要注意以下关键点:
- 通道顺序:PyTorch 默认使用
[T, C, H, W],而 TensorFlow 通常使用[T, H, W, C],需根据框架调整。 - 批处理维度:实际训练时会在最前面增加 batch 维度,形状变为
[B, T, C, H, W]。 - 数据增强:对视频张量进行随机裁剪、水平翻转、时间抖动等操作时,需保证所有帧使用相同的变换参数,以维持时间一致性。
| 表示方法 | 维度 | 信息类型 | 优点 | 缺点 | 典型应用 |
|---|---|---|---|---|---|
| 帧序列 | T×H×W×C | 像素级外观 | 信息完整、直观 | 冗余大、计算开销高 | 视频预测、动作识别 |
| 光流 | T×H×W×2 | 运动矢量 | 运动显式、计算高效 | 大位移失效、遮挡问题 | 运动分割、目标跟踪 |
| 时空张量 | T×C×H×W | 统一封装 | 模型友好、标准化 | 需额外转换步骤 | 所有深度学习模型 |
2.2 常见数据集详解与预处理
2.2.1 KTH Actions:经典动作识别基准
KTH Actions 数据集由瑞典皇家理工学院于2004年发布,包含 6 类人类动作(走路、慢跑、跑步、拳击、挥手、拍手),由 25 名受试者在 4 种不同场景(室外、室内、室外缩放、室外不同衣着)下录制。视频为灰度格式,分辨率为 160×120,帧率为 25fps,总时长约 10 小时。
预处理要点:
- 将灰度帧转换为 3 通道(复制灰度值)以适配预训练模型。
- 统一裁剪为 128×128 或 64×64 的中心区域,去除背景干扰。
- 按受试者划分训练集(16人)、验证集(4人)、测试集(5人),避免数据泄漏。
2.2.2 UCF101:大规模真实动作视频
UCF101 包含 101 类动作,共 13320 个视频片段,来源于 YouTube 真实场景。视频分辨率为 320×240,帧率 25fps,总时长超过 27 小时。动作类别涵盖体育、乐器演奏、日常活动等,背景复杂、视角多变、光照条件差异大。
预处理要点:
- 视频解码:使用 OpenCV 或 PyAV 按需解码帧,避免一次性加载全部帧导致内存溢出。
- 短边缩放:将视频短边缩放到 256 像素,保持宽高比不变。
- 随机裁剪:训练时随机裁剪 224×224 区域,测试时中心裁剪。
- 时间采样:均匀采样 16 帧或 32 帧作为输入片段。
2.2.3 Moving MNIST:合成数据的快速验证
Moving MNIST 是视频预测领域最常用的合成数据集。每个样本包含两个手写数字(从 MNIST 中随机选取),在 64×64 的黑色背景上以恒定速度移动,并发生弹性碰撞反弹。视频长度为 20 帧,通常使用前 10 帧预测后 10 帧。
生成与预处理:
- 官方提供生成脚本,可自定义数字数量、速度、噪声水平。
- 像素值归一化到 [0, 1],无需复杂的数据增强。
- 由于是合成数据,可以无限生成样本,适合大规模预训练。
2.2.4 BAIR Robot Pushing:真实物理交互场景
BAIR Robot Pushing 数据集由加州大学伯克利分校发布,包含 79000 个机器人推物体视频片段。每个视频长度为 30 帧,分辨率为 64×64,RGB 格式。机器人手臂推动桌面上的随机物体(如积木、玩具),场景包含真实的物理交互、遮挡和光照变化。
预处理要点:
- 帧裁剪:去除画面边缘的固定背景区域,聚焦于机器人操作区域。
- 数据增强:随机水平翻转(注意同时翻转动作标签)、小幅随机旋转。
- 归一化:像素值缩放到 [-1, 1],配合 tanh 输出层使用。
| 数据集 | 样本量 | 分辨率 | 帧数 | 场景复杂度 | 主要用途 |
|---|---|---|---|---|---|
| KTH | 2391 | 160×120 | 可变 | 低 | 动作预测基线 |
| UCF101 | 13320 | 320×240 | 可变 | 高 | 真实场景验证 |
| Moving MNIST | 无限生成 | 64×64 | 20 | 极低 | 算法快速迭代 |
| BAIR | 79000 | 64×64 | 30 | 中 | 物理交互预测 |
2.3 案例拆解:Moving MNIST 数据流水线搭建
下面以一个完整的 Moving MNIST 数据预处理流程为例,展示从原始生成到模型输入的完整链路。该案例在 8GB 显存的 GPU 上运行,目标是在 30 分钟内完成数据准备并启动训练。
初始现象与目标:直接使用官方生成脚本时,发现数据加载速度仅为每秒 20 个样本,成为训练瓶颈。目标是将数据吞吐量提升至每秒 200 个样本以上。
关键参数与日志:
原始生成脚本参数:
- 数字数量: 2
- 图像尺寸: 64×64
- 视频长度: 20帧
- 噪声标准差: 0.05
性能瓶颈日志:
- 数据加载耗时: 45ms/样本
- GPU利用率: 35%
分析判断过程:通过性能剖析发现,瓶颈在于每次迭代都重新生成数字图像并计算碰撞物理,导致 CPU 计算密集。同时,数据加载未使用多进程并行,GPU 大量时间处于等待状态。
实际操作步骤:
- 预生成缓存:启动时一次性生成 10000 个样本并保存为 NumPy 数组文件,后续训练直接读取。
- 多进程加载:使用 PyTorch DataLoader 的
num_workers=4参数,并行读取缓存文件。 - 内存映射:使用
np.memmap将缓存文件映射到内存,避免重复 I/O。 - 混合精度:将数据转换为 float16 存储,减少内存带宽占用。
结果对比:
| 方案 | 数据加载耗时 | GPU利用率 | 训练速度 |
|---|---|---|---|
| 原始方案 | 45ms/样本 | 35% | 22 样本/秒 |
| 优化后 | 4ms/样本 | 92% | 210 样本/秒 |
风险与代价:预生成缓存需要约 2GB 磁盘空间,且如果修改了生成参数(如数字数量),需要重新生成缓存。此外,内存映射在 Windows 系统上可能存在文件锁问题,需注意兼容性。
复盘经验:视频数据预处理的优化应遵循"先缓存、后并行、再压缩"的原则。对于合成数据,预生成是性价比最高的方案;对于真实视频数据,则应重点优化视频解码和帧采样策略。