VideoMambaPro의 공식 구현: 비디오 이해 분야에서 Mamba의 도약
Self-Attention과 Mamba의 유사점과 차이점을 후자의 관점에서 살펴보고, 영상 이해 작업에서 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 라벨
미세 조정 데이터 세트 VideoClsDataset
및 RawFrameClsDataset
에는 각각 비디오 데이터와 원시 프레임 데이터를 지원하는 두 가지 구현이 있습니다. 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의 selected_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에서 selected_scan_ref 및 selected_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