注意
点击此处下载完整的示例代码
3. 开始使用 Kinetics400 上预训练的 I3D 模型¶
Kinetics400 是一个真实的动作视频动作识别数据集,从 YouTube 收集。包含 306,245 个来自 400 个动作类别的短裁切视频,它是研究界用于评估最先进视频动作识别模型的最大、最广泛使用的数据集之一。
I3D (Inflated 3D Networks) 是一种广泛采用的 3D 视频分类网络。它使用 3D 卷积直接从视频中学习时空信息。提出 I3D 是为了通过从 2D 模型“膨胀”来改进 C3D (Convolutional 3D Networks)。我们不仅可以重用 2D 模型的架构(例如,ResNet、Inception),还可以从 2D 预训练模型引导模型权重。通过这种方式,用于视频分类的 3D 网络训练变得可行,并且取得了更好的结果。
在本教程中,我们将演示如何从gluoncv 模型库加载预训练的 I3D 模型,并将来自互联网或本地磁盘的视频片段分类到 400 个动作类别之一。
分步指南¶
我们将在一个视频片段上试用预训练的 I3D 模型。
首先,如果您还没有安装 MXNet
和 GluonCV
,请按照安装指南进行安装。
import matplotlib.pyplot as plt
import numpy as np
import mxnet as mx
from mxnet import gluon, nd, image
from mxnet.gluon.data.vision import transforms
from gluoncv.data.transforms import video
from gluoncv import utils
from gluoncv.model_zoo import get_model
然后,我们下载视频并从中提取一个 32 帧的片段。
from gluoncv.utils.filesystem import try_import_decord
decord = try_import_decord()
url = 'https://github.com/bryanyzhu/tiny-ucf101/raw/master/abseiling_k400.mp4'
video_fname = utils.download(url)
vr = decord.VideoReader(video_fname)
frame_id_list = range(0, 64, 2)
video_data = vr.get_batch(frame_id_list).asnumpy()
clip_input = [video_data[vid, :, :, :] for vid, _ in enumerate(frame_id_list)]
现在我们为视频片段定义转换。此转换函数执行三件事:将图像中心裁剪为 224x224 大小,将其转置为 num_channels*num_frames*height*width
,并使用在所有 ImageNet 图像上计算的均值和标准差进行归一化。
transform_fn = video.VideoGroupValTransform(size=224, mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
clip_input = transform_fn(clip_input)
clip_input = np.stack(clip_input, axis=0)
clip_input = clip_input.reshape((-1,) + (32, 3, 224, 224))
clip_input = np.transpose(clip_input, (0, 2, 1, 3, 4))
print('Video data is downloaded and preprocessed.')
输出
Video data is downloaded and preprocessed.
接下来,我们加载一个预训练的 I3D 模型。
model_name = 'i3d_inceptionv1_kinetics400'
net = get_model(model_name, nclass=400, pretrained=True)
print('%s model is successfully loaded.' % model_name)
输出
Downloading /root/.mxnet/models/i3d_inceptionv1_kinetics400-81e0be10.zip from https://apache-mxnet.s3-accelerate.dualstack.amazonaws.com/gluon/models/i3d_inceptionv1_kinetics400-81e0be10.zip...
0%| | 0/51277 [00:00<?, ?KB/s]
0%| | 100/51277 [00:00<01:02, 820.07KB/s]
1%| | 508/51277 [00:00<00:21, 2341.81KB/s]
4%|4 | 2188/51277 [00:00<00:06, 7633.88KB/s]
16%|#5 | 8084/51277 [00:00<00:01, 25659.59KB/s]
28%|##8 | 14495/51277 [00:00<00:00, 38505.38KB/s]
40%|#### | 20665/51277 [00:00<00:00, 45780.50KB/s]
56%|#####6 | 28810/51277 [00:00<00:00, 57007.25KB/s]
69%|######9 | 35557/51277 [00:00<00:00, 60251.00KB/s]
86%|########6 | 44111/51277 [00:00<00:00, 67160.94KB/s]
51278KB [00:01, 48589.43KB/s]
i3d_inceptionv1_kinetics400 model is successfully loaded.
请注意,如果要使用 InceptionV3 系列模型(即,i3d_inceptionv3_kinetics400),请将图像调整为两个维度都大于 299(例如 340x450),并在转换函数中将输入大小从 224 更改为 299。最后,我们准备好视频片段并将其输入到模型中。
输出
The input video clip is classified to be
[abseiling], with probability 0.991.
[rock_climbing], with probability 0.009.
[ice_climbing], with probability 0.000.
[paragliding], with probability 0.000.
[skydiving], with probability 0.000.
我们可以看到,我们的预训练模型预测此视频片段是 速降 (abseiling)
动作,置信度很高。