注意
点击 此处 下载完整的示例代码
准备 UCF101 数据集¶
UCF101 是一个动作识别数据集,包含从 YouTube 收集的真实动作视频。该数据集包含来自 101 个动作类别的 13,320 个剪辑短视频,是研究界用于基准测试最先进的视频动作识别模型的最广泛使用的数据集之一。本教程将逐步介绍如何为 GluonCV 准备此数据集。

设置¶
我们需要 UCF101 的以下两个文件:数据集和官方的训练/测试分割。
文件名 |
大小 |
---|---|
UCF101.rar |
6.5 GB |
UCF101TrainTestSplits-RecognitionTask.zip |
114 KB |
下载和解压这些文件的最简单方法是下载辅助脚本 ucf101.py
并运行以下命令
python ucf101.py
此脚本将帮助您下载数据集、从压缩文件中解压数据、将视频解码为帧并为您生成训练文件。默认情况下,所有文件将存储在 ~/.mxnet/datasets/ucf101
中。
注意
下载和提取数据集需要至少 60 GB 的磁盘空间。由于速度更快,建议使用 SSD(固态硬盘)而非 HDD。
您可能需要通过 sudo apt install unrar
安装 unrar
。
您可能需要通过 pip install rarfile Cython mmcv
安装 rarfile
、Cython
、mmcv
。
数据准备过程可能需要一段时间。准备数据集的总时间取决于您的互联网速度和磁盘性能。例如,在具有 EBS 的 AWS EC2 实例上大约需要 30 分钟。
使用 GluonCV 读取¶
准备好的数据集可以直接使用工具类 gluoncv.data.UCF101
加载。在本教程中,我们提供了三个从数据集中读取数据的示例:(1) 每视频加载一帧;(2) 每视频加载一个片段,该片段包含五个连续帧;(3) 每视频均匀加载三个片段,每个片段包含 12 帧。
我们首先展示一个示例,每次随机读取 25 个视频,每个视频随机选择一帧并执行中心裁剪。
from gluoncv.data import UCF101
from mxnet.gluon.data import DataLoader
from mxnet.gluon.data.vision import transforms
from gluoncv.data.transforms import video
transform_train = transforms.Compose([
video.VideoCenterCrop(size=224),
video.VideoToTensor()
])
# Default location of the data is stored on ~/.mxnet/datasets/ucf101.
# You need to specify ``setting`` and ``root`` for UCF101 if you decoded the video frames into a different folder.
train_dataset = UCF101(train=True, transform=transform_train)
train_data = DataLoader(train_dataset, batch_size=25, shuffle=True)
我们可以看到加载的数据形状如下。extra
指示我们是否从视频中选择多个裁剪区域或多个片段。在这里,我们每个视频只选取一帧,所以 extra
维度是 1。
输出
Video frame size (batch, extra, channel, height, width): (25, 1, 3, 224, 224)
Video label: (25,)
让我们绘制几个训练样本。索引 0 是图像,1 是标签
from gluoncv.utils import viz
viz.plot_image(train_dataset[7][0].squeeze().transpose((1,2,0))*255.0) # Basketball
viz.plot_image(train_dataset[22][0].squeeze().transpose((1,2,0))*255.0) # CricketBowling
这是第二个示例,每次随机读取 25 个视频,每个视频随机选择一个片段并执行中心裁剪。一个片段可以包含 N 个连续帧,例如 N=5。
train_dataset = UCF101(train=True, new_length=5, transform=transform_train)
train_data = DataLoader(train_dataset, batch_size=25, shuffle=True)
我们可以看到加载的数据形状如下。现在我们有另一个 depth
维度,它指示每个片段中有多少帧(也称为时间维度)。
输出
Video frame size (batch, extra, channel, depth, height, width): (25, 1, 3, 5, 224, 224)
Video label: (25,)
让我们绘制一个包含 5 个连续视频帧的训练样本。索引 0 是图像,1 是标签
from matplotlib import pyplot as plt
# subplot 1 for video frame 1
fig = plt.figure()
fig.add_subplot(1,5,1)
frame1 = train_dataset[7][0][0,:,0,:,:].transpose((1,2,0)).asnumpy()*255.0
plt.imshow(frame1.astype('uint8'))
# subplot 2 for video frame 2
fig.add_subplot(1,5,2)
frame2 = train_dataset[7][0][0,:,1,:,:].transpose((1,2,0)).asnumpy()*255.0
plt.imshow(frame2.astype('uint8'))
# subplot 3 for video frame 3
fig.add_subplot(1,5,3)
frame3 = train_dataset[7][0][0,:,2,:,:].transpose((1,2,0)).asnumpy()*255.0
plt.imshow(frame3.astype('uint8'))
# subplot 4 for video frame 4
fig.add_subplot(1,5,4)
frame4 = train_dataset[7][0][0,:,3,:,:].transpose((1,2,0)).asnumpy()*255.0
plt.imshow(frame4.astype('uint8'))
# subplot 5 for video frame 5
fig.add_subplot(1,5,5)
frame5 = train_dataset[7][0][0,:,4,:,:].transpose((1,2,0)).asnumpy()*255.0
plt.imshow(frame5.astype('uint8'))
# display
plt.show()

最后一个示例是,我们每次随机读取 25 个视频,每个视频均匀选择三个片段并执行中心裁剪。一个片段包含 12 个连续帧。
train_dataset = UCF101(train=True, new_length=12, num_segments=3, transform=transform_train)
train_data = DataLoader(train_dataset, batch_size=25, shuffle=True)
我们可以看到加载的数据形状如下。现在 extra
维度是 3,这表明每个视频有三个片段。
输出
Video frame size (batch, extra, channel, depth, height, width): (25, 3, 3, 12, 224, 224)
Video label: (25,)
有许多不同的方式可以加载数据。我们建议用户阅读参数列表以获取更多信息。
脚本总运行时间:(0 分 14.890 秒)