SAMURAI: SAMを活用したゼロショット物体追跡モデル（GoogleColab📒ノートブック付）

このノートブックでは、SAM (Segment Anything Model)を基盤とした最新の物体追跡モデル「SAMURAI」について解説します。

## 概要

SAMURAIは、Washington大学の研究チームによって開発された新しい物体追跡モデルです。
特徴として:
- SAM 2をベースとしたゼロショット学習による追跡
- Motion-Aware Memoryによる効率的な物体追跡
- 事前学習なしでの高精度な追跡性能


<blockquote class="twitter-tweet" data-media-max-width="800"><p lang="ja" dir="ltr">SAMURAI を Google Colabで動かしてみる⑥<br>やはり同一個体＋オクルージョンとかだと流石にスイッチングしますね、、、人間の目でもこれは厳しい、、、<br>＊動画はLaSOTのデータです！ <a href="https://t.co/SbG7owwoCV">https://t.co/SbG7owwoCV</a> <a href="https://t.co/WBIMmUv5aF">pic.twitter.com/WBIMmUv5aF</a></p>&mdash; Maki@Sunwood AI Labs. (@hAru_mAki_ch) <a href="https://twitter.com/hAru_mAki_ch/status/1860539533764493377?ref_src=twsrc%5Etfw">November 24, 2024</a></blockquote> 


<blockquote class="twitter-tweet" data-media-max-width="800"><p lang="ja" dir="ltr">SAMURAI を Google Colabで動かしてみる⑤<br>トラッキングの推論できた！！！<br>＊動画はLaSOTのデータです！ <a href="https://t.co/KpQPw4Z3bW">https://t.co/KpQPw4Z3bW</a> <a href="https://t.co/iYvdjcXZD4">pic.twitter.com/iYvdjcXZD4</a></p>&mdash; Maki@Sunwood AI Labs. (@hAru_mAki_ch) <a href="https://twitter.com/hAru_mAki_ch/status/1860538802626003320?ref_src=twsrc%5Etfw">November 24, 2024</a></blockquote> 

## 環境セットアップ

### 必要なPythonパッケージ

```python
# 基本的な依存関係のインストール
# !pip install torch>=2.3.1
# !pip install torchvision>=0.18.1

# SAMURAIの依存関係
!pip install matplotlib==3.7 tikzplotlib jpeg4py opencv-python lmdb pandas scipy loguru
```

```python
!git clone https://github.com/yangchris11/samurai.git
```

### SAM 2のインストール

```python

# SAM 2のインストール
%cd /content/samurai/sam2
!pip install -e .
!pip install -e ".[notebooks]"
```

## モデルのセットアップ

### チェックポイントのダウンロード

```python
%cd /content/samurai/sam2/checkpoints
!./download_ckpts.sh && \
%cd ..
```

## データ準備

SAMURAIで使用するデータセットは以下のような構造で準備します:

```
data/LaSOT
├── airplane/
│   ├── airplane-1/
│   │   ├── full_occlusion.txt
│   │   ├── groundtruth.txt
│   │   ├── img/
│   │   ├── nlp.txt
│   │   └── out_of_view.txt
...
```

## 推論の実行

### 基本的な推論

```python
%cd /content/samurai
```

```python
!pwd
```

```python
import os

# ディレクトリパスを設定
directory = '/content/samurai/data/LaSOT'

# ディレクトリが存在しない場合は作成
os.makedirs(directory, exist_ok=True)

# ファイルの内容
# content = '''basketball-1
# basketball-6
# basketball-7
# basketball-11'''

content = '''basketball-1
basketball-11'''

# ファイルパス
file_path = os.path.join(directory, 'testing_set.txt')

# ファイルを作成して内容を書き込む
with open(file_path, 'w') as f:
    f.write(content)

print(f'ファイルが作成されました: {file_path}')
```

```python
import os
from huggingface_hub import hf_hub_download
import zipfile
import shutil

def download_and_extract_lasot(base_dir="/content/samurai/data"):
    try:
        # LaSOTディレクトリとbasketballカテゴリディレクトリのパスを作成
        lasot_dir = os.path.join(base_dir, "LaSOT")
        basketball_dir = os.path.join(lasot_dir, "basketball")
        os.makedirs(basketball_dir, exist_ok=True)

        # ZIPファイルを保存するディレクトリを作成
        zip_dir = os.path.join(base_dir, "zips")
        os.makedirs(zip_dir, exist_ok=True)

        print("Downloading dataset...")
        zip_path = hf_hub_download(
            repo_id="l-lt/LaSOT",
            filename="basketball.zip",
            repo_type="dataset",
            local_dir=zip_dir
        )
        print(f"Downloaded to: {zip_path}")

        # 直接basketballディレクトリに解凍
        print("Extracting ZIP file to basketball directory...")
        with zipfile.ZipFile(zip_path, 'r') as zip_ref:
            zip_ref.extractall(basketball_dir)

        print("\nCreated directory structure:")
        print("LaSOT/")
        print("└── basketball/")
        # 最初の数個のbasketballフォルダのみ表示
        for item in sorted(os.listdir(basketball_dir))[:5]:
            print(f"    ├── {item}/")
        print("    └── ...")

        return lasot_dir

    except Exception as e:
        print(f"An error occurred: {str(e)}")
        return None

if __name__ == "__main__":
    extract_path = download_and_extract_lasot()
    if extract_path:
        print("\nDownload and extraction completed successfully!")
```

```python
# メインの推論スクリプトを実行
!python scripts/main_inference.py
```

### カスタム動画での実行

```python
# 動画ファイルを入力として使用する場合
# !python scripts/demo.py --video_path your_video.mp4 --txt_path first_frame_bbox.txt

# フレーム画像のディレクトリを入力として使用する場合
# !python scripts/demo.py --video_path your_frame_directory --txt_path first_frame_bbox.txt
```

注意: bbox.txtファイルには、最初のフレームのバウンディングボックス情報をxywh形式で1行で記述します。

## 技術的な詳細

SAMURAIの主な技術的特徴:

1. **Motion-Aware Memory**
   - 物体の動きを考慮したメモリメカニズム
   - 効率的な追跡を実現

2. **Zero-shot Learning**
   - 事前学習なしでの追跡が可能
   - SAM 2の強力なセグメンテーション能力を活用

3. **Adaptive Tracking**
   - 動的な環境での追跡に対応
   - リアルタイムでの追跡性能を実現

## 📒ノートブック

https://colab.research.google.com/drive/1L6RTnYV2CfnwAcBIBcxwmVSpO7Tjx3GC?usp=sharing




## 参考文献

```
@article{ravi2024sam2,
  title={SAM 2: Segment Anything in Images and Videos},
  author={Ravi, Nikhila and others},
  journal={arXiv preprint arXiv:2408.00714},
  year={2024}
}

@misc{yang2024samurai,
  title={SAMURAI: Adapting Segment Anything Model for Zero-Shot Visual Tracking with Motion-Aware Memory},
  author={Yang, Cheng-Yen and others},
  year={2024},
  eprint={2411.11922},
}
```

追加情報やアップデートについては、[公式リポジトリ](https://github.com/yangchris11/samurai)を参照してください。


<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>