# 从 MMAction2 0.x 迁移 MMAction2 1.x 引入了一些重构和修改,包括一些向后不兼容的更改。我们提供这个教程,帮助您从 MMAction2 0.x 迁移您的项目。 ## 新的依赖项 MMAction2 1.x 依赖于以下库。建议您准备一个新的运行环境,并根据[安装教程](./get_started/installation.md)进行安装。 1. [MMEngine](https://github.com/open-mmlab/mmengine):MMEngine 是引入于 OpenMMLab 2.0 架构中的用于训练深度学习模型的基础库。 2. [MMCV](https://github.com/open-mmlab/mmcv):MMCV 是用于计算机视觉的基础库。MMAction2 1.x 需要 `mmcv>=2.0.0`,它比 `mmcv-full==2.0.0` 更紧凑和高效。 ## 配置文件 在 MMAction2 1.x 中,我们重构了配置文件的结构。旧风格的配置文件将不兼容。 在本节中,我们将介绍配置文件的所有更改。我们假设您已经熟悉[配置文件](./user_guides/config.md)。 ### 模型设置 `model.backbone` 和 `model.neck` 没有更改。对于 `model.cls_head`,我们将 `average_clips` 移到其中,原本设置在 `model.test_cfg` 中。 ### 数据设置 #### **`data`** 中的更改 - 原始的 `data` 字段被拆分为 `train_dataloader`、`val_dataloader` 和 `test_dataloader`。这样可以对它们进行细粒度的配置。例如,您可以在训练和测试过程中指定不同的采样器和批大小。 - `videos_per_gpu` 改名为 `batch_size`。 - `workers_per_gpu` 改名为 `num_workers`。
旧版本 | ```python data = dict( videos_per_gpu=32, workers_per_gpu=2, train=dict(...), val=dict(...), test=dict(...), ) ``` |
新版本 | ```python train_dataloader = dict( batch_size=32, num_workers=2, dataset=dict(...), sampler=dict(type='DefaultSampler', shuffle=True) # 必要 ) val_dataloader = dict( batch_size=32, num_workers=2, dataset=dict(...), sampler=dict(type='DefaultSampler', shuffle=False) # 必要 ) test_dataloader = val_dataloader ``` |
旧版本 | ```python train_pipeline = [ dict(type='DecordInit'), dict(type='SampleFrames', clip_len=1, frame_interval=1, num_clips=8), dict(type='DecordDecode'), dict(type='Resize', scale=(-1, 256)), dict( type='MultiScaleCrop', input_size=224, scales=(1, 0.875, 0.75, 0.66), random_crop=False, max_wh_scale_gap=1), dict(type='Resize', scale=(224, 224), keep_ratio=False), dict(type='Flip', flip_ratio=0.5), dict(type='Normalize', **img_norm_cfg), dict(type='FormatShape', input_format='NCHW'), dict(type='Collect', keys=['imgs', 'label'], meta_keys=[]), dict(type='ToTensor', keys=['imgs', 'label']) ] ``` |
新版本 | ```python model.data_preprocessor = dict( mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=False) train_pipeline = [ dict(type='DecordInit'), dict(type='SampleFrames', clip_len=1, frame_interval=1, num_clips=5), dict(type='DecordDecode'), dict(type='Resize', scale=(-1, 256)), dict( type='MultiScaleCrop', input_size=224, scales=(1, 0.875, 0.75, 0.66), random_crop=False, max_wh_scale_gap=1), dict(type='Resize', scale=(224, 224), keep_ratio=False), dict(type='Flip', flip_ratio=0.5), dict(type='FormatShape', input_format='NCHW'), dict(type='PackActionInputs') ] ``` |
旧版本 | ```python evaluation = dict( interval=5, metrics=['top_k_accuracy', 'mean_class_accuracy']) ``` |
新版本 | ```python val_evaluator = dict( type='AccMetric', metric_list=('top_k_accuracy', 'mean_class_accuracy')) test_evaluator = val_evaluator ``` |
旧版本 | ```python optimizer = dict( type='AdamW', lr=0.0015, weight_decay=0.3, paramwise_cfg = dict( norm_decay_mult=0.0, bias_decay_mult=0.0, )) optimizer_config = dict(grad_clip=dict(max_norm=1.0)) ``` |
新版本 | ```python optim_wrapper = dict( optimizer=dict(type='AdamW', lr=0.0015, weight_decay=0.3), paramwise_cfg = dict( norm_decay_mult=0.0, bias_decay_mult=0.0, ), clip_gard=dict(max_norm=1.0), ) ``` |
旧版本 | ```python lr_config = dict( policy='CosineAnnealing', min_lr=0, warmup='linear', warmup_iters=5, warmup_ratio=0.01, warmup_by_epoch=True) ``` |
新版本 | ```python param_scheduler = [ # 学习率预热 dict( type='LinearLR', start_factor=0.01, by_epoch=True, end=5, # 在每个迭代后更新学习率。 convert_to_iter_based=True), # 主要的学习率策略 dict(type='CosineAnnealingLR', by_epoch=True, begin=5), ] ``` |
旧版本 | ```python runner = dict(type='EpochBasedRunner', max_epochs=100) ``` |
新版本 | ```python # `val_interval` 是原 `evaluation.interval`。 train_cfg = dict(type='EpochBasedTrainLoop', max_epochs=100, val_begin=1, val_interval=1) val_cfg = dict(type='ValLoop') # 使用默认验证循环。 test_cfg = dict(type='TestLoop') # 使用默认测试循环。 ``` |
旧版本 | ```python log_config = dict( interval=100, hooks=[ dict(type='TextLoggerHook'), dict(type='TensorboardLoggerHook'), ]) ``` |
新版本 | ```python default_hooks = dict( ... logger=dict(type='LoggerHook', interval=100), ) visualizer = dict( type='ActionVisualizer', vis_backends=[dict(type='LocalVisBackend'), dict(type='TensorboardVisBackend')], ) ``` |