AI・機械学習
上級
SAM 2(サムツー)
Meta AIが2024年発表の画像・動画対応ユニバーサルセグメンテーションモデル。Memory Encoderによるストリーミング処理で動画リアルタイムセグメンテーションを実現。
0 回閲覧
0 いいね
2026/6/7 更新
関連タグ
セグメンテーション
動画理解
基盤モデル
Meta AI
インタラクティブ
SAM 2 とは
SAM 2(Segment Anything Model 2)は、Meta AIが2024年8月に公開したセグメンテーション基盤モデル。初代SAM(2023年4月)が静止画専用だったのに対し、動画にも対応した統合フレームワークとして設計されている。
初代SAMからの進化
| 特徴 | SAM(v1) | SAM 2 |
|---|---|---|
| 対応入力 | 静止画のみ | 静止画 + 動画 |
| フレームコンテキスト | なし | Memory Encoderで保持 |
| 処理速度 | N/A(単一フレーム) | 44fps(SAM 2 Large) |
| モデルサイズ | 93M/308M/636M | 39M/80M/224M |
| ライセンス | Apache 2.0 | Apache 2.0 |
アーキテクチャ
ストリーミングメモリ設計
SAM 2の核心はストリーミングメモリアーキテクチャ:
- Image Encoder: Hiera(階層型ViT)でフレーム特徴抽出
- Memory Encoder: 過去フレームのセグメントマスクと特徴を圧縮して記憶
- Memory Attention: 記憶情報を現在フレームの特徴にアテンション
- Prompt Encoder: クリック・ボックス・マスクプロンプトを処理
- Mask Decoder: セグメントマスク・オクルージョン予測を出力
オクルージョン対応
オブジェクトが遮蔽されてもオブジェクトIDを保持し、再出現後に自動追跡を再開。occlusion_scoreフラグで遮蔽状態を検知可能。
モデルバリアント
| モデル | パラメータ | Video FPS | SAVval J&F |
|---|---|---|---|
| SAM 2 Tiny | 39M | ~100fps | 75.0 |
| SAM 2 Small | 46M | ~86fps | 76.4 |
| SAM 2 Base+ | 80M | ~53fps | 78.2 |
| SAM 2 Large | 224M | ~44fps | 79.8 |
使用例
動画セグメンテーション
import torch
from sam2.build_sam import build_sam2_video_predictor
predictor = build_sam2_video_predictor(
"sam2_hiera_large.yaml",
"sam2_hiera_large.pt",
device="cuda"
)
with torch.inference_mode():
state = predictor.init_state(video_path="input.mp4")
# フレーム0のクリック点でオブジェクト指定
_, _, masks = predictor.add_new_points_or_box(
inference_state=state,
frame_idx=0,
obj_id=1,
points=[[500, 300]], # [x, y]
labels=[1], # 1=正, 0=負
)
# 全フレームを伝播
for frame_idx, obj_ids, mask_logits in predictor.propagate_in_video(state):
masks = (mask_logits > 0).cpu().numpy()
SA-V データセット
SAM 2のトレーニングに使用されたSA-V(Segment Anything Video)データセット:
- 51,000本の動画、600,000個のアノテーション済みマスクレット
- 既存動画セグメンテーションデータセットの53倍の規模
- 屋内・屋外・自然・都市など多様なシーン
活用分野
- 映像制作: 背景除去・オブジェクト分離の自動化
- 医療映像: 内視鏡・手術動画での組織追跡
- スポーツ分析: 選手・ボールのリアルタイム追跡
- 自動運転: 歩行者・車両の精密セグメント
- AR/VR: リアルタイムオブジェクトセグメンテーション
HuggingFace利用
from transformers import pipeline
# HF Transformers統合(v4.45+)
pipe = pipeline("image-segmentation", model="facebook/sam2-hiera-large")
result = pipe(image, points_input=[[x, y]], labels_input=[1])