1. Kinetcis400上预训练I3D模型入门

Kinetics400 是一个包含真实行为视频的行为识别数据集,从YouTube收集而来。该数据集包含来自400个行为类别的306,245个短裁剪视频,是研究界用于评估最先进视频行为识别模型的最大且最广泛使用的数据集之一。

I3D (膨胀的3D网络)是一个广泛采用的3D视频分类网络。它使用3D卷积直接从视频中学习时空信息。提出I3D是为了通过从2D模型膨胀而来,从而改进C3D (卷积3D网络)。我们不仅可以重用2D模型的架构(例如,ResNet,Inception),还可以从2D预训练模型引导模型权重。通过这种方式,训练用于视频分类的3D网络变得可行,并且能够获得更好的结果。

在本教程中,我们将演示如何从 gluoncv-model-zoo 加载预训练的I3D模型,并将来自互联网或本地磁盘的视频片段分类到400个行为类别之一。

循序渐进

我们将在单个视频片段上尝试预训练的I3D模型。

首先,请遵循安装指南 安装 PyTorchGluonCV 如果你还没有安装的话。

import numpy as np
import decord
import torch

from gluoncv.torch.utils.model_utils import download
from gluoncv.torch.data.transforms.videotransforms import video_transforms, volume_transforms
from gluoncv.torch.engine.config import get_cfg_defaults
from gluoncv.torch.model_zoo import get_model

然后,我们下载一个视频并从中提取一个32帧的片段。

url = 'https://github.com/bryanyzhu/tiny-ucf101/raw/master/abseiling_k400.mp4'
video_fname = download(url)
vr = decord.VideoReader(video_fname)
frame_id_list = range(0, 64, 2)
video_data = vr.get_batch(frame_id_list).asnumpy()

输出

Downloading abseiling_k400.mp4 from https://github.com/bryanyzhu/tiny-ucf101/raw/master/abseiling_k400.mp4...

  0%|          | 0/782 [00:00<?, ?KB/s]
100%|##########| 782/782 [00:00<00:00, 71165.48KB/s]

现在我们定义视频片段的变换。这个变换函数执行四项操作:(1) 将视频片段较短的一边缩放到 short_side_size,(2) 将视频片段中心裁剪到 crop_size x crop_size,(3) 将视频片段转置为 num_channels*num_frames*height*width,以及 (4) 使用在所有ImageNet图像上计算得到的均值和标准差进行归一化。

crop_size = 224
short_side_size = 256
transform_fn = video_transforms.Compose([video_transforms.Resize(short_side_size, interpolation='bilinear'),
                                         video_transforms.CenterCrop(size=(crop_size, crop_size)),
                                         volume_transforms.ClipToTensor(),
                                         video_transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])])


clip_input = transform_fn(video_data)
print('Video data is downloaded and preprocessed.')

输出

Video data is downloaded and preprocessed.

接下来,我们加载一个预训练的I3D模型。请确保将配置中的 pretrained 在配置文件中更改为 True。

config_file = '../../../scripts/action-recognition/configuration/i3d_resnet50_v1_kinetics400.yaml'
cfg = get_cfg_defaults()
cfg.merge_from_file(config_file)
model = get_model(cfg)
model.eval()
print('%s model is successfully loaded.' % cfg.CONFIG.MODEL.NAME)

输出

Downloading /root/.torch/models/i3d_resnet50_v1_kinetics400-18545497.pth from https://apache-mxnet.s3-accelerate.dualstack.amazonaws.com/torch/models/i3d_resnet50_v1_kinetics400-18545497.pth...

  0%|          | 0/109861 [00:00<?, ?KB/s]
  0%|          | 100/109861 [00:00<02:12, 827.08KB/s]
  0%|          | 514/109861 [00:00<00:46, 2342.01KB/s]
  2%|1         | 2186/109861 [00:00<00:14, 7515.11KB/s]
  7%|6         | 7145/109861 [00:00<00:04, 22159.51KB/s]
 14%|#3        | 15332/109861 [00:00<00:02, 41988.64KB/s]
 22%|##1       | 23738/109861 [00:00<00:01, 55123.61KB/s]
 29%|##9       | 32130/109861 [00:00<00:01, 64143.80KB/s]
 37%|###6      | 40311/109861 [00:00<00:00, 69604.32KB/s]
 43%|####3     | 47428/109861 [00:01<00:01, 59725.99KB/s]
 51%|#####     | 55626/109861 [00:01<00:01, 50064.20KB/s]
 56%|#####5    | 61165/109861 [00:01<00:01, 48168.13KB/s]
 60%|######    | 66330/109861 [00:01<00:00, 45263.23KB/s]
 67%|######7   | 73714/109861 [00:01<00:00, 50162.35KB/s]
 75%|#######4  | 81905/109861 [00:01<00:00, 57233.82KB/s]
 80%|########  | 88400/109861 [00:01<00:00, 47284.46KB/s]
 85%|########5 | 93592/109861 [00:02<00:00, 46318.31KB/s]
 90%|########9 | 98533/109861 [00:02<00:00, 38239.91KB/s]
 95%|#########5| 104792/109861 [00:02<00:00, 43493.32KB/s]
100%|#########9| 109617/109861 [00:02<00:00, 35356.92KB/s]
100%|##########| 109861/109861 [00:02<00:00, 43007.25KB/s]
i3d_resnet50_v1_kinetics400 model is successfully loaded.

最后,我们准备好视频片段并将其输入到模型中。

with torch.no_grad():
    pred = model(torch.unsqueeze(clip_input, dim=0)).numpy()
print('The input video clip is classified to be class %d' % (np.argmax(pred)))

输出

The input video clip is classified to be class 0

我们可以看到,我们的预训练模型以高置信度预测该视频片段是 abseiling 行为。

下一步

如果你想深入了解如何在自己的数据集上微调SOTA视频模型,请随时阅读下一篇关于微调的教程

脚本总运行时间: ( 0 分钟 6.021 秒)

由 Sphinx-Gallery 生成的图库