共计 2564 个字符,预计需要花费 7 分钟才能阅读完成。
Ava 数据集概述
Ava 数据集是谷歌发布的用于视频动作识别任务的大规模数据集,包含来自 YouTube 的短视频片段,标注了 80 类人类动作(如走路、握手、拥抱等)。数据集特点包括:

- 数据规模:约 21.5 万视频片段,平均时长 3 -15 秒
- 标注粒度:每段视频以 1 秒间隔标注多人动作(边界框 + 动作类别)
- 场景多样性:涵盖日常生活、运动、社交等场景
典型应用场景包括智能监控、人机交互、视频内容分析等。数据集采用 Creative Commons 许可,可自由用于非商业研究。
环境准备
推荐使用 Python 3.7+ 环境,核心依赖库及版本:
# requirements.txt
numpy>=1.19.5
opencv-python>=4.5.1
torch>=1.8.0
torchvision>=0.9.0
pandas>=1.2.0
matplotlib>=3.3.0
安装命令:
pip install -r requirements.txt
数据加载
官方提供两种数据获取方式(需同意使用协议):
-
通过 AWS CLI 下载(约 300GB)
aws s3 cp s3://ava-dataset/train/ /local_path --no-sign-request --recursive -
使用 Python 脚本加载标注(示例):
import pandas as pd # 加载标注 CSV(需提前下载)annotations = pd.read_csv('ava_train_v2.2.csv', header=None, names=['video_id', 'timestamp', 'x1', 'y1', 'x2', 'y2', 'action_id', 'person_id']) # 查看前 5 条标注 print(annotations.head())
数据预处理
关键步骤分为视频帧提取和标注解析:
-
视频帧提取(使用 OpenCV):
import cv2 def extract_frames(video_path, output_dir, fps=1): cap = cv2.VideoCapture(video_path) frame_count = 0 while True: ret, frame = cap.read() if not ret: break # 按指定 FPS 保存帧 if frame_count % int(cap.get(cv2.CAP_PROP_FPS)/fps) == 0: cv2.imwrite(f"{output_dir}/frame_{frame_count:04d}.jpg", frame) frame_count += 1 cap.release() -
标注解析(匹配时间戳):
def get_annotations_for_video(video_id, timestamp, annotations_df): return annotations_df[(annotations_df['video_id'] == video_id) & (annotations_df['timestamp'] == timestamp)]
模型训练
基于 PyTorch 的简单 3D CNN 示例:
import torch
import torch.nn as nn
class ActionClassifier(nn.Module):
def __init__(self, num_classes=80):
super().__init__()
self.conv3d = nn.Sequential(nn.Conv3d(3, 64, kernel_size=(3, 3, 3), padding=1),
nn.ReLU(),
nn.MaxPool3d(2)
)
self.fc = nn.Linear(64*7*7*5, num_classes) # 假设输入尺寸(16 帧,112x112)
def forward(self, x):
x = self.conv3d(x)
x = x.view(x.size(0), -1)
return self.fc(x)
# 训练循环示例
model = ActionClassifier()
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
for epoch in range(10):
for batch_x, batch_y in train_loader: # 需自定义 DataLoader
outputs = model(batch_x)
loss = criterion(outputs, batch_y)
optimizer.zero_grad()
loss.backward()
optimizer.step()
常见问题
- 内存不足:
- 症状:加载视频时卡死或报 MemoryError
-
解决:改用帧采样(如每 2 秒取 1 帧),或使用 Dataloader 的迭代加载
-
标注不匹配:
- 症状:视频 ID 在标注文件中找不到
-
解决:检查视频文件名是否包含完整 YouTube ID(如『-Kbxkf』需转为『Kbxkf』)
-
动作类别混淆:
- 症状:模型无法区分相似动作(如『握手』vs『击掌』)
- 解决:增加时序特征(如光流)或改用 SlowFast 等专用网络
性能优化
处理大规模视频数据的技巧:
- 内存管理:
- 使用 PyTorch 的 Dataloader 设置
num_workers>0实现并行加载 -
对长视频采用
torch.utils.data.Subset分块处理 -
存储优化:
- 将提取的帧保存为 HDF5 文件替代单独图片
-
使用 LMDB 等高效键值存储数据库
-
计算加速:
- 用
torchvision.io.read_video替代 OpenCV(支持 GPU 解码) - 启用混合精度训练(
torch.cuda.amp)
延伸学习
推荐练习:
1. 尝试在验证集上达到 15% 以上的 Top- 1 准确率
2. 实现基于 ResNet3D 的改进模型
3. 探索多人物交互场景的标注处理方法
参考资源:
– 官方数据集论文《AVA: A Video Dataset of Spatio-temporally Localized Atomic Visual Actions》
– MMAction2 工具箱(GitHub 开源项目)
– TorchVideo 库(Facebook 视频处理工具包)
通过本教程,你应该已经掌握 Ava 数据集的基础使用方法。接下来可以尝试调整模型结构或结合其他模态数据(如音频)来提升性能。
