VideoMambaPro の正式実装: ビデオ理解における Mamba の飛躍
私たちは自己注意とマンバの類似点と相違点を後者の観点から調査し、ビデオ理解タスクにおけるマンバの限界を明らかにします。私たちは、VideoMamba をバックボーンとして使用しながら、ビデオ理解タスクのパフォーマンスを大幅に向上させ、トランスフォーマーとのギャップを縮める VideoMambaPro を提案します。
必要なパッケージはファイルrequirements.txt
にあり、次のコマンドを実行して環境をインストールできます。
conda create -n videomambapro python=3.10
conda activate videomambapro
conda install cudatoolkit==11.8 -c nvidia
pip install torch==2.1.1 torchvision==0.16.1 torchaudio==2.1.1 --index-url https://download.pytorch.org/whl/cu118
conda install -c "nvidia/label/cuda-11.8.0" cuda-nvcc
conda install packaging
pip install causal_conv1d==1.4.0 (we recommend to install through .whl file)
pip install mamba-ssm
pip install -r requirements.txt
VideoMAE と同じ方法で読み取りと処理を行いますが、データ リスト ファイルの形式の規則が異なります。
ImageNet-1K データセットでモデルを事前トレーニングします。モデルは次の形式のデータ リスト ファイルを読み込みます。
Frame_folder_path total_frames ラベル
Finetune データセットVideoClsDataset
とRawFrameClsDataset
には 2 つの実装があり、それぞれビデオ データと rawframes データをサポートします。 SSV2 はデフォルトでRawFrameClsDataset
を使用し、残りのデータセットはVideoClsDataset
を使用します。
VideoClsDataset
次の形式でデータ リスト ファイルを読み込みます。
video_path ラベル
一方、 RawFrameClsDataset
次の形式でデータ リスト ファイルをロードします。
Frame_folder_path total_frames ラベル
たとえば、ビデオデータのリストと rawframes データのリストは次のとおりです。
# The path prefix 'your_path' can be specified by `--data_root ${PATH_PREFIX}` in scripts when training or inferencing.
# k400 video data validation list
your_path/k400/jf7RDuUTrsQ.mp4 325
your_path/k400/JTlatknwOrY.mp4 233
your_path/k400/NUG7kwJ-614.mp4 103
your_path/k400/y9r115bgfNk.mp4 320
your_path/k400/ZnIDviwA8CE.mp4 244
...
# ssv2 rawframes data validation list
your_path/SomethingV2/frames/74225 62 140
your_path/SomethingV2/frames/116154 51 127
your_path/SomethingV2/frames/198186 47 173
your_path/SomethingV2/frames/137878 29 99
your_path/SomethingV2/frames/151151 31 166
...
私たちのプロジェクトは、公平な比較のために VideoMamba に基づいています。この論文の制限 1 と 2 を解決するために、主に、後方 SSM 中に対角マスクを適用し、双方向 SSM に残留接続を適用することによって、Mamba のパイプラインを変更します。 Ab の残りの接続は、mamba/mamba_ssm/ops/selective_scan_interface.py の関数 selective_scan_ref で実現され、キー オプションは以下のとおりです。
x = u[:, :, 0].unsqueeze(-1).expand(-1, -1, dstate)
x = deltaA[:, :, i] * x + deltaB_u[:, :, i]
マスクの割り当ては、mamba/mamba_ssm/ops/selective_scan_interface.py で 2 つの選択関数、selective_scan_ref と selective_scan_ref_sub を設定することで実現されます。たとえば、mamba/mamba_ssm/ops/selective_scan_interface.py の bimamba_inner_ref で双方向 Mamba を計算する場合、キー コードは次のとおりです。
y = selective_scan_fn(x, delta, A, B, C, D, z=z, delta_bias=delta_bias, delta_softplus=True)
y_b = selective_scan_ref_sub(x.flip([-1]), delta.flip([-1]), A_b, B.flip([-1]), C.flip([-1]), D, z.flip([-1]), delta_bias, delta_softplus=True)
y = y + y_b.flip([-1])
链接: https://pan.baidu.com/s/1vJN_XTRct65cDA_0AB259g?pwd=ghqb 提取码:ghqb