第一次接触AVA数据集的研究者,往往会被它的庞大规模和精细标注所震撼。这个由谷歌DeepMind团队发布的时空行为检测数据集,已经成为当前动作识别领域的黄金标准。我在2018年刚开始做行为检测研究时,花了两周时间才完全搞懂这个数据集的结构,现在回想起来,如果能有个系统性的指导该多好。
AVA最突出的特点是它的原子动作标注。与我们常见的UCF101、Kinetics等数据集不同,它标注的不是"打篮球"、"游泳"这类复合动作,而是更基础的"站立"、"行走"、"伸手"等80种原子动作。每个标注都精确到视频中的具体人物框,并带有时间戳信息。举个例子,在同一个视频帧中,左侧人物可能被标注为"站立"(action_id=77),而右侧人物同时被标注为"行走"(action_id=79)。
数据集包含437段15分钟的电影片段,全部来自公开的YouTube视频。这些片段经过精心挑选,涵盖了丰富的人物交互场景。最令人印象深刻的是它的标注密度——平均每个片段有超过3000个标注框,全数据集共有159万个人物动作标签。这种密集标注对于训练现代时空行为检测模型(比如SlowFast、ActionFormer)简直是天赐良物。
官方获取途径是通过Google Research的AVA项目页面,需要填写使用申请并等待审核。我在2019年尝试过这个方式,整个过程耗时约5个工作日。更麻烦的是,由于网络原因,实际下载速度可能只有100KB/s左右,对于总共超过200GB的数据量来说简直是噩梦。
相比之下,国内研究者更常用的方式是百度网盘。这里分享一个经过验证的稳定资源(链接见文末)。这个网盘包包含了完整的数据:
重要提示:下载时请确保网盘客户端已更新到最新版。旧版本在下载大文件时容易出现校验错误,我曾在这一点上浪费了整整两天时间。
由于数据集体积庞大,网盘资源通常采用分卷压缩。下载完成后你会看到类似这样的文件列表:
code复制AVA_dataset_15min_430.tar.gz.001
AVA_dataset_15min_430.tar.gz.002
...
AVA_dataset_15min_430.tar.gz.010
合并这些文件的正确姿势是使用cat命令(Linux/macOS):
bash复制cat AVA_dataset_15min_430.tar.gz.* > merged_dataset.tar.gz
Windows用户可以用PowerShell的Copy-Item:
powershell复制Copy-Item -Path "AVA_dataset_15min_430.tar.gz.*" -Destination "merged_dataset.tar.gz" -ToFile
解压时有个细节需要注意:由于压缩包内路径层次较深,建议先创建一个专用目录:
bash复制mkdir ava_data && tar -zxvf merged_dataset.tar.gz -C ava_data
这个文件夹是AVA的核心价值所在,包含以下关键文件:
行为定义文件:
ava_action_list_v2.2.pbtxt:80个原子动作的完整定义ava_action_list_v2.2_for_activitynet_2019.pbtxt:60个动作的子集(用于特定比赛)时空标注文件:
ava_train_v2.2.csv:训练集标注ava_val_v2.2.csv:验证集标注code复制-1KQfqD6JjU,0903,0.341,0.401,0.424,0.557,12,1
分别表示:视频ID、时间戳(秒)、bbox坐标(x1,y1,x2,y2)、动作ID、人物ID
时间戳排除文件:
ava_*_excluded_timestamps_v2.2.csv:标注了哪些时间段的视频质量较差,应该排除原始视频需要转换为帧序列才能用于训练。典型的目录结构如下:
code复制frames/
├── -1KQfqD6JjU/
│ ├── -1KQfqD6JjU_000001.jpg
│ ├── -1KQfqD6JjU_000002.jpg
│ └── ...
└── -2zqQfqD6JjU/
├── -2zqQfqD6JjU_000001.jpg
└── ...
帧提取的黄金参数是:
我强烈建议使用FFmpeg的硬件加速选项,可以提升5倍以上的提取速度:
bash复制ffmpeg -hwaccel cuda -i input.mp4 -r 30 -q:v 1 output_%06d.jpg
这个文件夹看似简单,却决定着训练/验证/测试的划分逻辑。主要包含三个文件:
train.csvval.csvtest.csv文件内容示例:
code复制original_vido_id,video_id,frame_id,path,labels
-1KQfqD6JjU,0,1,frames/-1KQfqD6JjU/-1KQfqD6JjU_000001.jpg,
特别要注意的是frame_id字段,它表示该帧在原始视频中的绝对位置。在构建数据加载器时,需要根据这个ID找到对应的标注信息。
直接加载JPEG图像会成为训练瓶颈。我的解决方案是:
示例代码:
python复制import h5py
import cv2
with h5py.File('ava_frames.hdf5', 'w') as hf:
for video in video_list:
group = hf.create_group(video)
for frame in frames:
img = cv2.imread(frame_path)
group.create_dataset(frame_id, data=img, compression='gzip')
AVA的标注CSV可以直接用pandas加载,但更高效的方式是预处理为二进制格式:
python复制import numpy as np
# 将bbox和动作标签转换为结构化数组
dtype = np.dtype([
('video_id', 'S32'),
('timestamp', 'i4'),
('bbox', 'f4', (4,)),
('action_id', 'i4'),
('person_id', 'i4')
])
annotations = np.fromfile('ava_annotations.bin', dtype=dtype)
由于AVA的标注是时空敏感的,常规的翻转/旋转可能破坏时空一致性。我推荐:
最后分享一个资源清单: