# 快速运行 本章将介绍 MMAction2 的基本功能。我们假设你已经[源码安装 MMAction2](installation.md#best-practices)。 - [快速运行](#快速运行) - [推理](#推理) - [准备数据集](#准备数据集) - [修改配置](#修改配置) - [修改数据集](#修改数据集) - [修改运行配置](#修改运行配置) - [修改模型配置](#修改模型配置) - [浏览数据集](#浏览数据集) - [训练](#训练) - [测试](#测试) ## 推理 在 MMAction2 的根目录下执行如下命令: ```shell python demo/demo_inferencer.py demo/demo.mp4 \ --rec tsn --print-result \ --label-file tools/data/kinetics/label_map_k400.txt ``` 您应该能够看到弹出的视频窗口,和在控制台中打印的推断结果。

```bash # 推理结果 {'predictions': [{'rec_labels': [[6]], 'rec_scores': [[...]]}]} ``` ```{note} 如果您在没有 GUI 的服务器上运行 MMAction2,或者通过禁用 X11 转发的 SSH 隧道运行 MMAction2,则可能不会看到弹出窗口。 ``` 关于 MMAction2 推理接口的详细描述可以在[这里](/demo/README.md#inferencer)找到. 除了使用我们提供的预训练模型,您还可以在自己的数据集上训练模型。在下一节中,我们将通过在精简版 [Kinetics](https://download.openmmlab.com/mmaction/kinetics400_tiny.zip) 数据集上训练 TSN 为例,带您了解 MMAction2 的基本功能。 ## 准备数据集 由于视频数据集格式的多样性不利于数据集的切换,MMAction2 提出了统一的[数据格式](../user_guides/prepare_dataset.md) ,并为常用的视频数据集提供了[数据集准备指南](../user_guides/data_prepare/dataset_prepare.md)。通常,要在 MMAction2 中使用这些数据集,你只需要按照步骤进行准备。 ```{笔记} 但在这里,效率意味着一切。 ``` 首先,请下载我们预先准备好的 [kinetics400_tiny.zip](https://download.openmmlab.com/mmaction/kinetics400_tiny.zip) ,并将其解压到 MMAction2 根目录下的 `data/` 目录。这将为您提供必要的视频和注释文件。 ```Bash 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` ,按如下替换关键字: ```Python 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` 中对应的关键字,如下所示生效。 ```python # 设置训练批大小为 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` 中。 ```python 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 `) 机制重写了基本配置中的相应参数。原始字段分布在 `configs/_base_/models/tsn_r50.py`、`configs/_base_/schedules/sgd_100e.py` 和 `configs/_base_/default_runtime.py`中。 ```{note} 关于配置的更详细的描述,请参考[这里](../user_guides/config.md)。 ``` ## 浏览数据集 在开始训练之前,我们还可以将训练时数据转换处理的帧可视化。这很简单:传递我们需要可视化的配置文件到 [browse_dataset.py](/tools/analysis_tools/browse_dataset.py)脚本中。 ```Bash 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} 有关该脚本的参数和使用方法的详细信息,请参考[这里](../user_guides/useful_tools.md)。 ``` ```{tip} 除了满足我们的好奇心,可视化还可以帮助我们在训练前检查可能影响模型性能的部分,例如配置、数据集和数据转换中的问题。 ``` 我们可以通过以下脚本进一步可视化学习率调度,以确保配置符合预期: ```Bash python tools/visualizations/vis_scheduler.py configs/recognition/tsn/tsn_imagenet-pretrained-r50_8xb32-1x1x3-100e_kinetics400-rgb.py ``` 训练学习率时间表将显示在弹出窗口中。
```{note} 学习率根据实际批数据大小自动缩放。 ``` ## 训练 运行如下命令启动训练: ```Bash python tools/train.py configs/recognition/tsn/tsn_imagenet-pretrained-r50_8xb32-1x1x3-100e_kinetics400-rgb.py ``` 根据系统环境,MMAction2 将自动使用最佳设备进行训练。如果有GPU,则默认启动单个GPU训练。当你开始看到 loss 的输出时,就说明你已经成功启动了训练。 ```Bash 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](../user_guides/train_test.md) ``` ## 测试 经过 10 个 epoch 后,我们观察到 TSN 在第 6 个 epoch 表现最好,`acc/top1` 达到1.0000: ```Bash 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 数据集上的验证性能,而测试结果通常更高,因为在测试数据流水线中增加了更多的数据增强。 开始测试: ```Bash 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 ``` 并得到如下输出: ```Bash 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](../user_guides/train_test.md) ```