SAM3について
MetaのSAM3(Segment Anything Model 3)は、画像と動画の「検出・セグメンテーション・追跡」を一つのモデルでこなす、Meta社のビジョンAIモデルです。
SAM3の基本概要
SAM3は、画像や動画の中から任意の物体や概念を切り出して追跡できる「統合セグメンテーションモデル」です。従来のSAM 1/2が主に「クリックなどの視覚プロンプト」によるマスク生成だったのに対し、SAM3はテキストや画像をプロンプトとして利用できる点が大きな進化です。
主な特徴
- テキストプロンプトに対応:例えば「Dog」「Blue car」「Woman in red」のような自然言語で指示すると、その概念に該当する領域を画像・動画内から検出・分割・追跡できます。
- 画像(例示)プロンプト:任意の参照画像を与え、その例に似た物体を他の画像・動画から探してセグメントすることも可能です。
- オープンボキャブラリ:固定ラベル(cat, dog, carなど)の枠に縛られず、細かな自然言語表現にも対応できる「オープン語彙」の設計になっています。
性能とデータセット
Metaは、400万以上の概念をカバーする大規模データセットと、新ベンチマーク「SA-Co」などを用いてSAM3を学習・評価しており、既存システムに対して約2倍の性能向上を報告しています。
画像・動画の両方で高いゼロショット性能(未見の概念にも対応する能力)を示し、他社の専門モデルを上回る指標が公表されています。(※2025/12/07現在)
想定されるユースケース
- クリエイティブ/動画編集:動画内の人物や物体だけを一括でマスクし、エフェクトや色調補正、背景差し替えなどを効率的に行えるとされています。
- AR/VR・プロダクト表示:Facebook Marketplaceの「部屋に置いて見る」機能などで、実写画像から商品を切り出して仮想配置する用途が想定されています。
- アノテーション支援・研究用途:ラベル付けツールとして使うことで、データセット作成や解析を大幅に効率化できるとされ、産業・研究分野での応用も見込まれています。
公開形態と関連技術
SAM3本体とあわせて、単一の2D画像から3D形状を推定する「SAM 3D」シリーズも発表されており、コードやモデルはMeta独自ライセンスのもとで公開されています。(※本記事で取り使うのはSAM3のみで、SAM 3Dに関しては取り扱いしません。)
開発者向けには、GitHubでのモデル公開や外部プラットフォームとの連携により、特定用途向けのファインチューニングやサービス組み込みが想定されています。
事前準備
SAM3のアクセス承認
- https://huggingface.co/facebook/sam3 にアクセスしアクセス承認をリクエストしてください。(※私が申請したときは数分で有効になりました。)
Hugging Faceアクセストークンを取得
- Hugging Faceにサインアップ/ログインします。公式サイトの右上にある 「Sign Up」 または「Sign In」をクリックします。
- 設定ページに移動します。ログイン後、右上のプロフィールアイコンをクリックし、「Settings」(設定)を選択します。
- 「Access Tokens」(アクセストークン)を選択します。左側のメニューまたはタブから「Access Tokens」ページに移動します。
- 新しいトークンを生成します。「New token」ボタンをクリックし、トークンの名前(例: sam3_token)と権限を設定して生成します。Repositories permissionsの設定では "facebook/sam3" を選択し以下にチェックを入れてください。
- 生成されたトークン(hf_...のような文字列)をコピーします。
Google Colabの設定
シークレットにトークンを設定
- google colabで画面左の「カギ」アイコンを選択し、「+新しいシークレットを追加」をクリックします。
- シークレットの名前(例: HF_TOKEN)を設定し、値にコピーしたHugging Faceトークンを貼り付けて「ノートブックからのアクセス」を有効にします。
ノートブックのランタイムを設定
- colabノートブックのメニューのランタイムから「ランタイムのタイプを変更」を選択し、ハードウェアアクセラレータで「T4 GPU」もしくは「L4 GPU」を選択し保存します。
ソースコード
以下のコードをコードブロックごとにgoogle colabのセルに貼り付けて実行してください。
SAM3のクローンとインストール
!git clone https://github.com/facebookresearch/sam3.git
%cd sam3
!pip install -e .
※起動時に再起動を求められたら再起動してもう一度実行してください。
ノートブック用の追加依存関係をインストール
!pip install -e ".[notebooks]"
Hugging Face CLI のインストール
!pip install huggingface_hub
Hugging Face にログイン
from huggingface_hub import login
from google.colab import userdata
login(token=userdata.get('HF_TOKEN'))
必要なライブラリをインストール
import torch
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
import requests
from io import BytesIO
from sam3.model_builder import build_sam3_image_model
from sam3.model.sam3_image_processor import Sam3Processor
# デバイスの設定
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(f"使用デバイス: {device}")
SAM3モデルのロード
print("モデルをロード中...")
model = build_sam3_image_model()
processor = Sam3Processor(model)
print("モデルのロードが完了しました!")
画像ファイルアップロード
from google.colab import files
uploaded = files.upload()
if uploaded:
image_path = list(uploaded.keys())[0]
image = Image.open(image_path).convert('RGB')
plt.figure(figsize=(10, 10))
plt.imshow(image)
plt.axis('off')
plt.title('image')
plt.show()
「ファイルを選択」ボタンから画像ファイルをアップロードして確認
※以下は私の使用した画像
- テキストプロンプトでセグメンテーション①
# 画像を処理用にセット
inference_state = processor.set_image(image)
# テキストプロンプトを指定してセグメンテーション実行
text_prompt = "player" # ここを変更して別のオブジェクトを検出できます
print(f"テキストプロンプト '{text_prompt}' でセグメンテーション実行中...")
output = processor.set_text_prompt(state=inference_state, prompt=text_prompt)
# 結果の取得
masks = output["masks"]
boxes = output["boxes"]
scores = output["scores"]
print(f"検出されたオブジェクト数: {len(masks)}")
print(f"信頼度スコア: {scores}")
出力
テキストプロンプト 'player' でセグメンテーション実行中...
検出されたオブジェクト数: 4
信頼度スコア: tensor([0.9074, 0.9235, 0.9178, 0.6596], device='cuda:0')
セグメンテーション結果の可視化
def show_masks_on_image(image, masks, boxes=None, scores=None):
"""
マスクとバウンディングボックスを画像上に表示
"""
plt.figure(figsize=(15, 10))
plt.imshow(image)
# カラーマップの準備
colors = plt.cm.rainbow(np.linspace(0, 1, len(masks)))
for i, (mask, color) in enumerate(zip(masks, colors)):
# マスクをnumpy配列に変換
if torch.is_tensor(mask):
# マスクのバッチ次元を削除 (例: (1, H, W) -> (H, W))
mask = mask.squeeze(0).cpu().numpy()
# マスクの表示
colored_mask = np.zeros((*mask.shape, 4))
colored_mask[:, :, :3] = color[:3]
colored_mask[:, :, 3] = mask * 0.5 # 透明度
plt.imshow(colored_mask)
# バウンディングボックスの表示
if boxes is not None and i < len(boxes):
box = boxes[i]
if torch.is_tensor(box):
box = box.cpu().numpy()
x1, y1, x2, y2 = box
plt.gca().add_patch(plt.Rectangle(
(x1, y1), x2 - x1, y2 - y1,
fill=False, edgecolor=color, linewidth=2
))
# スコアの表示
if scores is not None and i < len(scores):
score = scores[i]
if torch.is_tensor(score):
score = score.cpu().item()
plt.text(x1, y1 - 5, f'{score:.2f}',
bbox=dict(facecolor=color, alpha=0.5),
fontsize=10, color='white')
plt.axis('off')
plt.title(f'result: "{text_prompt}"')
plt.tight_layout()
plt.show()
# 結果の表示
show_masks_on_image(image, masks, boxes, scores)
まとめ
以上、SAM3をGoogle Colab上で試してみました。手軽にテキストプロンプトからセグメンテーション処理を実行できるのはいいですね。SAM 3Dに関しても時間があれば試してみたいと思ってます。

