注意
点击此处下载完整的示例代码
5. 在 Kinetics400 数据集上使用预训练的 SlowFast 模型入门¶
Kinetics400 是一个包含真实动作视频的动作识别数据集,收集自 YouTube。它包含 306,245 个来自 400 个动作类别的短时剪辑视频,是研究界用于评估最先进视频动作识别模型的最大且最广泛使用的数据集之一。
SlowFast 是一个新型 3D 视频分类模型,旨在实现精度和效率之间的最佳权衡。它提出了两个分支,快分支和慢分支,以处理视频中的不同方面。快分支使用大量但小的视频帧来捕捉运动动态。慢分支使用少量但大的视频帧来捕捉精细的外观细节。来自两个分支的特征通过横向连接进行组合。
在本教程中,我们将演示如何从 gluoncv 模型库加载预训练的 SlowFast 模型,并将来自互联网或本地磁盘的视频剪辑分类到 400 个动作类别之一。
分步指南¶
我们将在一个视频剪辑上试用一个预训练的 SlowFast 模型。
首先,如果您尚未安装,请按照安装指南安装 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
然后,我们下载视频并从中提取一个 64 帧的视频剪辑。请注意,SlowFast 有两个分支,需要不同的输入。快分支需要更多的帧,我们每隔一帧采样一次(步长=2)。慢分支需要更少的帧,我们每隔 16 帧采样一次(步长=16)。最后,快分支的输入是 32 帧,慢分支的输入是 4 帧。因此,整个网络的最终输入是一个 36 帧的视频剪辑。
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)
fast_frame_id_list = range(0, 64, 2)
slow_frame_id_list = range(0, 64, 16)
frame_id_list = list(fast_frame_id_list) + list(slow_frame_id_list)
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,) + (36, 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.
接下来,我们加载一个以 ResNet50 作为骨干网络的预训练 SlowFast 模型。
model_name = 'slowfast_4x16_resnet50_kinetics400'
net = get_model(model_name, nclass=400, pretrained=True)
print('%s model is successfully loaded.' % model_name)
输出
Downloading /root/.mxnet/models/slowfast_4x16_resnet50_kinetics400-9d650f51.zip from https://apache-mxnet.s3-accelerate.dualstack.amazonaws.com/gluon/models/slowfast_4x16_resnet50_kinetics400-9d650f51.zip...
0%| | 0/134964 [00:00<?, ?KB/s]
0%| | 516/134964 [00:00<00:31, 4224.75KB/s]
2%|1 | 2642/134964 [00:00<00:11, 11909.85KB/s]
7%|6 | 8925/134964 [00:00<00:03, 32593.00KB/s]
11%|#1 | 15257/134964 [00:00<00:02, 43873.92KB/s]
18%|#7 | 23955/134964 [00:00<00:01, 57067.54KB/s]
24%|##4 | 32558/134964 [00:00<00:01, 66421.52KB/s]
30%|##9 | 40075/134964 [00:00<00:01, 69180.99KB/s]
36%|###6 | 48637/134964 [00:00<00:01, 72337.45KB/s]
42%|####2 | 57333/134964 [00:00<00:01, 76751.65KB/s]
48%|####8 | 65067/134964 [00:01<00:00, 76691.76KB/s]
55%|#####4 | 73792/134964 [00:01<00:00, 78045.95KB/s]
61%|######1 | 82392/134964 [00:01<00:00, 80394.71KB/s]
67%|######7 | 90455/134964 [00:01<00:00, 79960.65KB/s]
74%|#######3 | 99272/134964 [00:01<00:00, 80833.20KB/s]
80%|#######9 | 107365/134964 [00:01<00:00, 78291.93KB/s]
85%|########5 | 115213/134964 [00:01<00:00, 78102.91KB/s]
92%|#########1| 123950/134964 [00:01<00:00, 80802.51KB/s]
98%|#########7| 132048/134964 [00:02<00:00, 55392.90KB/s]
100%|##########| 134964/134964 [00:02<00:00, 64937.51KB/s]
slowfast_4x16_resnet50_kinetics400 model is successfully loaded.
最后,我们准备视频剪辑并将其输入到模型中。
输出
The input video clip is classified to be
[abseiling], with probability 0.996.
[rock_climbing], with probability 0.004.
[ice_climbing], with probability 0.000.
[paragliding], with probability 0.000.
[climbing_a_rope], with probability 0.000.
我们可以看到,我们的预训练模型以高置信度预测此视频剪辑为 abseiling
(速降)动作。