快速运行¶
本章将介绍 MMAction2 的基本功能。我们假设你已经源码安装 MMAction2。
推理¶
在 MMAction2 的根目录下执行如下命令:
python demo/demo_inferencer.py demo/demo.mp4 \
--rec tsn --print-result \
--label-file tools/data/kinetics/label_map_k400.txt
您应该能够看到弹出的视频窗口,和在控制台中打印的推断结果。

# 推理结果
{'predictions': [{'rec_labels': [[6]], 'rec_scores': [[...]]}]}
Note
如果您在没有 GUI 的服务器上运行 MMAction2,或者通过禁用 X11 转发的 SSH 隧道运行 MMAction2,则可能不会看到弹出窗口。
关于 MMAction2 推理接口的详细描述可以在这里找到.
除了使用我们提供的预训练模型,您还可以在自己的数据集上训练模型。在下一节中,我们将通过在精简版 Kinetics 数据集上训练 TSN 为例,带您了解 MMAction2 的基本功能。
准备数据集¶
由于视频数据集格式的多样性不利于数据集的切换,MMAction2 提出了统一的数据格式 ,并为常用的视频数据集提供了数据集准备指南。通常,要在 MMAction2 中使用这些数据集,你只需要按照步骤进行准备。
首先,请下载我们预先准备好的 kinetics400_tiny.zip ,并将其解压到 MMAction2 根目录下的 data/
目录。这将为您提供必要的视频和注释文件。
wget https://download.openmmlab.com/mmaction/kinetics400_tiny.zip
mkdir -p data/
unzip kinetics400_tiny.zip -d data/
修改配置¶
准备好数据集之后,下一步是修改配置文件,以指定训练集和训练参数的位置。
在本例中,我们将使用 resnet50 作为主干网络来训练 TSN。由于 MMAction2 已经有了完整的 Kinetics400 数据集的配置文件 (configs/recognition/tsn/tsn_imagenet-pretrained-r50_8xb32-1x1x3-100e_kinetics400-rgb.py
),我们只需要在其基础上进行一些修改。
修改数据集¶
我们首先需要修改数据集的路径。打开 configs/recognition/tsn/tsn_imagenet-pretrained-r50_8xb32-1x1x3-100e_kinetics400-rgb.py
,按如下替换关键字:
data_root = 'data/kinetics400_tiny/train'
data_root_val = 'data/kinetics400_tiny/val'
ann_file_train = 'data/kinetics400_tiny/kinetics_tiny_train_video.txt'
ann_file_val = 'data/kinetics400_tiny/kinetics_tiny_val_video.txt'
修改运行配置¶
此外,由于数据集的大小减少,我们建议将训练批大小减少到4个,训练epoch的数量相应减少到10个。此外,我们建议将验证和权值存储间隔缩短为1轮,并修改学习率衰减策略。修改 configs/recognition/tsn/tsn_imagenet-pretrained-r50_8xb32-1x1x3-100e_kinetics400-rgb.py
中对应的关键字,如下所示生效。
# 设置训练批大小为 4
train_dataloader['batch_size'] = 4
# 每轮都保存权重,并且只保留最新的权重
default_hooks = dict(
checkpoint=dict(type='CheckpointHook', interval=1, max_keep_ckpts=1))
# 将最大 epoch 数设置为 10,并每 1 个 epoch验证模型
train_cfg = dict(type='EpochBasedTrainLoop', max_epochs=10, val_interval=1)
#根据 10 个 epoch调整学习率调度
param_scheduler = [
dict(
type='MultiStepLR',
begin=0,
end=10,
by_epoch=True,
milestones=[4, 8],
gamma=0.1)
]
修改模型配置¶
此外,由于精简版 Kinetics 数据集规模较小,建议加载原始 Kinetics 数据集上的预训练模型。此外,模型需要根据实际类别数进行修改。请直接将以下代码添加到 configs/recognition/tsn/tsn_imagenet-pretrained-r50_8xb32-1x1x3-100e_kinetics400-rgb.py
中。
model = dict(
cls_head=dict(num_classes=2))
load_from = 'https://download.openmmlab.com/mmaction/v1.0/recognition/tsn/tsn_imagenet-pretrained-r50_8xb32-1x1x3-100e_kinetics400-rgb/tsn_imagenet-pretrained-r50_8xb32-1x1x3-100e_kinetics400-rgb_20220906-cd10898e.pth'
在这里,我们直接通过继承 ({external+mmengine:doc} MMEngine: Config <advanced_tutorials/ Config>
) 机制重写了基本配置中的相应参数。原始字段分布在 configs/_base_/models/tsn_r50.py
、configs/_base_/schedules/sgd_100e.py
和 configs/_base_/default_runtime.py
中。
Note
关于配置的更详细的描述,请参考这里。
浏览数据集¶
在开始训练之前,我们还可以将训练时数据转换处理的帧可视化。这很简单:传递我们需要可视化的配置文件到 browse_dataset.py脚本中。
python tools/visualizations/browse_dataset.py \
configs/recognition/tsn/tsn_imagenet-pretrained-r50_8xb32-1x1x3-100e_kinetics400-rgb.py \
browse_out --mode pipeline
转换后的视频将被保存到 browse_out
文件夹中。

Note
有关该脚本的参数和使用方法的详细信息,请参考这里。
Tip
除了满足我们的好奇心,可视化还可以帮助我们在训练前检查可能影响模型性能的部分,例如配置、数据集和数据转换中的问题。
我们可以通过以下脚本进一步可视化学习率调度,以确保配置符合预期:
python tools/visualizations/vis_scheduler.py configs/recognition/tsn/tsn_imagenet-pretrained-r50_8xb32-1x1x3-100e_kinetics400-rgb.py
训练学习率时间表将显示在弹出窗口中。

Note
学习率根据实际批数据大小自动缩放。
训练¶
运行如下命令启动训练:
python tools/train.py configs/recognition/tsn/tsn_imagenet-pretrained-r50_8xb32-1x1x3-100e_kinetics400-rgb.py
根据系统环境,MMAction2 将自动使用最佳设备进行训练。如果有GPU,则默认启动单个GPU训练。当你开始看到 loss 的输出时,就说明你已经成功启动了训练。
03/24 16:36:15 - mmengine - INFO - Exp name: tsn_imagenet-pretrained-r50_8xb32-1x1x3-100e_kinetics400-rgb_20230324_163608
03/24 16:36:15 - mmengine - INFO - Epoch(train) [1][8/8] lr: 1.5625e-04 eta: 0:00:15 time: 0.2151 data_time: 0.0845 memory: 1314 grad_norm: 8.5647 loss: 0.7267 top1_acc: 0.0000 top5_acc: 1.0000 loss_cls: 0.7267
03/24 16:36:16 - mmengine - INFO - Exp name: tsn_imagenet-pretrained-r50_8xb32-1x1x3-100e_kinetics400-rgb_20230324_163608
03/24 16:36:16 - mmengine - INFO - Epoch(train) [2][8/8] lr: 1.5625e-04 eta: 0:00:12 time: 0.1979 data_time: 0.0717 memory: 1314 grad_norm: 8.4709 loss: 0.7130 top1_acc: 0.0000 top5_acc: 1.0000 loss_cls: 0.7130
03/24 16:36:18 - mmengine - INFO - Exp name: tsn_imagenet-pretrained-r50_8xb32-1x1x3-100e_kinetics400-rgb_20230324_163608
03/24 16:36:18 - mmengine - INFO - Epoch(train) [3][8/8] lr: 1.5625e-04 eta: 0:00:10 time: 0.1691 data_time: 0.0478 memory: 1314 grad_norm: 8.2910 loss: 0.6900 top1_acc: 0.5000 top5_acc: 1.0000 loss_cls: 0.6900
03/24 16:36:18 - mmengine - INFO - Saving checkpoint at 3 epochs
03/24 16:36:19 - mmengine - INFO - Epoch(val) [3][1/1] acc/top1: 0.9000 acc/top5: 1.0000 acc/mean1: 0.9000data_time: 1.2716 time: 1.3658
03/24 16:36:20 - mmengine - INFO - The best checkpoint with 0.9000 acc/top1 at 3 epoch is saved to best_acc/top1_epoch_3.pth.
在没有额外配置的情况下,模型权重将被保存到 work_dirs/tsn_imagenet-pretrained-r50_8xb32-1x1x3-100e_kinetics400-rgb/
,而日志将被存储到 work_dirs/tsn_imagenet-pretrained-r50_8xb32-1x1x3-100e_kinetics400-rgb/
。接下来,我们只需要耐心等待训练完成。
Note
训练的高级用法,如 CPU 训练、多卡训练及集群训练,请参考training and Testing
测试¶
经过 10 个 epoch 后,我们观察到 TSN 在第 6 个 epoch 表现最好,acc/top1
达到1.0000:
03/24 16:36:25 - mmengine - INFO - Epoch(val) [6][1/1] acc/top1: 1.0000 acc/top5: 1.0000 acc/mean1: 1.0000data_time: 1.0210 time: 1.1091
Note
由于在原始 Kinetics400 上进行了预训练,结果非常高,您可能会看到不同的结果
然而,该值仅反映了 TSN 在精简版 Kinetics 数据集上的验证性能,而测试结果通常更高,因为在测试数据流水线中增加了更多的数据增强。
开始测试:
python tools/test.py configs/recognition/tsn/tsn_imagenet-pretrained-r50_8xb32-1x1x3-100e_kinetics400-rgb.py \
work_dirs/tsn_imagenet-pretrained-r50_8xb32-1x1x3-100e_kinetics400-rgb/best_acc/top1_epoch_6.pth
并得到如下输出:
03/24 17:00:59 - mmengine - INFO - Epoch(test) [10/10] acc/top1: 1.0000 acc/top5: 1.0000 acc/mean1: 0.9000data_time: 0.0420 time: 1.0795
该模型在该数据集上实现了 1.000 的 top1 准确率。
Note
测试的高级用法,如CPU测试、多gpu测试、集群测试,请参考Training and testing