🕺

MMAction2でRawFrameDatasetを扱う

2024/11/05に公開

はじめに

MMAction2は、OpenMMLabが開発する行動認識のためのツールです。
MMAction2の行動認識モデルでは、RawFrameDatasetVideoDataset が使用できます。
今回は、3DCNNモデルであるI3DのコンフィグファイルをVideoDatasetからRawFrameDataset に書き換えることを通して、RawFrameDataset の使い方を確認します。
コンフィグファイルは以下から確認できます。
https://github.com/open-mmlab/mmaction2/blob/465d7debd3ff6b1e59ae9602fd186dc2297702b3/configs/recognition/i3d/i3d_imagenet-pretrained-r50_8xb8-32x2x1-100e_kinetics400-rgb.py

なお、正確性には十分気をつけていますが、筆者はプロフェッショナルではないので間違いを含んでいる可能性があることをご了承ください。

VideoDatasetRawFrameDatasetの違い

MMAction2の行動認識モデルでは、データを以下の2つの形式で使用できます。

  • VideoDataset: 動画ファイルとしてデータを用意
  • RawFrameDataset: 各動画をフレームごとに分割し、連番画像として用意

データセットの用意

動画データ

MMAction2のドキュメントによると、連番画像ファイルは以下のように配置する必要があります。ディレクトリ名は任意で構いませんが、画像のファイル名はデフォルトではimg_00001.jpgの形式にする必要があります。

.
├── video1
│   ├── img_00001.jpg
│   ├── img_00002.jpg
│   ├── img_00003.jpg
│   └── ...
├── video2
│   ├── img_00001.jpg
│   ├── img_00002.jpg
│   ├── img_00003.jpg
│   └── ...
├── video3
│   ├── img_00001.jpg
│   ├── img_00002.jpg
│   ├── img_00003.jpg
│   └── ...
└── ...

次に、コンフィグファイルを以下のように書き換えます。

- dataset_type = 'VideoDataset'
- data_root = 'data/kinetics400/videos_train'
- data_root_val = 'data/kinetics400/videos_val'
+ dataset_type = 'RawframeDataset'
+ data_root = 'path/to/your/data'
+ data_root_val = 'path/to/your/data'

https://mmaction2.readthedocs.io/en/latest/user_guides/prepare_dataset.html#action-recognition

アノテーションファイル

Train/Val/Test用のラベル情報は、それぞれann_file_trainann_file_valann_file_test変数に指定します。
これらのファイルの内容は、<パス> <合計フレーム数> <クラス>の形式で記述してください。パスはdata_rootまたはdata_root_valからのパスを指定してください。

some/video1 163 1
some/video2 122 1
some/video3 258 2
some/video4 234 2
some/video5 295 3
some/video6 121 3

次に、コンフィグファイルのアノテーションファイルを更新します。ファイル名は任意の名前で構いません。

- ann_file_train = 'data/kinetics400/kinetics400_train_list_videos.txt'
- ann_file_val = 'data/kinetics400/kinetics400_val_list_videos.txt'
- ann_file_test = 'data/kinetics400/kinetics400_val_list_videos.txt'
+ ann_file_train = 'path/to/your/ann_train.txt'
+ ann_file_val = 'path/to/your/ann_val.txt'
+ ann_file_test = 'path/to/your/ann_test.txt'

pipelineの変更

データ拡張などを定義しているtrain_pipeline/val_pipeline/test_pipelineを変更します。
VideoDataset用のDecordInitDecordDecodeは不要です。DecordInitは削除し、DecordDecodeRawFrameDecodeに置き換えます。

train_pipeline = [
-   dict(type='DecordInit', **file_client_args),
    dict(type='SampleFrames', clip_len=32, frame_interval=2, num_clips=1),
-   dict(type='DecordDecode'),
+   dict(type="RawFrameDecode"),
    dict(type='Resize', scale=(-1, 256)),
    dict(
        type='MultiScaleCrop',
        input_size=224,
        scales=(1, 0.8),
        random_crop=False,
        max_wh_scale_gap=0),
    dict(type='Resize', scale=(224, 224), keep_ratio=False),
    dict(type='Flip', flip_ratio=0.5),
    dict(type='FormatShape', input_format='NCTHW'),
    dict(type='PackActionInputs')
]
# val_pipelineとtest_pipelineも同様に

dataloaderの変更

train_dataloader/val_dataloader/test_dataloaderにおける、dataset内のdata_prefixを以下のように変更します。

train_dataloader = dict(
    batch_size=8,
    num_workers=8,
    persistent_workers=True,
    sampler=dict(type='DefaultSampler', shuffle=True),
    dataset=dict(
        type=dataset_type,
        ann_file=ann_file_train,
-       data_prefix=dict(video=data_root),
+       data_prefix=dict(img=data_root),
        pipeline=train_pipeline))
# val_pipelineとtest_pipelineもvideoをimgに変更する

これを変更しないと、KeyError: 'img'エラーが発生します。

その他の変更

RawFrameDatasetに限った話ではありませんが、データセットが変わっているのでクラス数なども変更しなければなりません。
クラス数は、configs/_base_/models/i3d_r50.pyで定義されているので、コンフィグファイル内で上書きします。

+ model = dict(
+   type="Recognizer3D",
+   backbone=dict(
+        type="ResNet3d",
+        pretrained2d=True,
+        pretrained="torchvision://resnet50",
+        depth=50,
+        conv1_kernel=(5, 7, 7),
+        conv1_stride_t=2,
+        pool1_stride_t=2,
+        conv_cfg=dict(type="Conv3d"),
+        norm_eval=False,
+        inflate=((1, 1, 1), (1, 0, 1, 0), (1, 0, 1, 0, 1, 0), (0, 1, 0)),
+        zero_init_residual=False,
+    ),
+    cls_head=dict(
+        type="I3DHead",
+        num_classes=400, #ここを変更
+        in_channels=2048,
+        spatial_type="avg",
+        dropout_ratio=0.5,
+        init_std=0.01,
+        average_clips="prob",
+    ),
+    data_preprocessor=dict(
+        type="ActionDataPreprocessor",
+        mean=[123.675, 116.28, 103.53],
+        std=[58.395, 57.12, 57.375],
+        format_shape="NCTHW",
+    ),
+)

その他の設定(学習済みモデルのロードやバッチサイズなど)も、環境や目的に応じて適宜変更してください。

最後に

今回は、MMAction2のI3DモデルにおいてVideoDatasetからRawFrameDatasetへとコンフィグファイルを変更する手順を紹介しました。
本記事を通じて、設定の違いや各パラメータの変更方法に関する理解が深まり、今後のモデル実装やデータセット設定に役立てられることを願っています。
誤りや改善点があれば、お気軽にコメントいただけると嬉しいです。

参考

https://mmaction2.readthedocs.io/en/latest/user_guides/config.html
https://github.com/open-mmlab/mmaction2/issues/2713

GitHubで編集を提案

Discussion