Re Reference AI

モデル

SAMとは

Segment Anything Model / Segment Anything

点やボックスの指示だけで画像内の任意の物体を切り出せる、Metaのセグメンテーション基盤モデル

画像認識Meta

ひとことで言うと

画像の中の「これ」と指した物体を、輪郭に沿ってきれいに切り出してくれるMetaのAIモデル。初めて見る物体でも切り出せる。

概要

SAM(Segment Anything Model)とは、Metaが公開した、画像内の任意の物体の領域を切り出すセグメンテーションの基盤モデルを指す。 点やボックスなどの簡単な指示(プロンプト)を与えるだけで、学習時に見ていない物体でもゼロショットで領域を切り出せる。 約11億のマスクを含む大規模データセットSA-1Bとともに公開され、画像セグメンテーションの汎用基盤として研究・産業の双方で広く使われている。後継のSAM 2では動画への対応が加わった。

歴史

2023年4月にMetaが論文とともに公開した。2024年7月には動画に対応したSAM 2が公開された。

アーキテクチャ

画像エンコーダ(MAEで事前学習したViT-Hがベース)が画像全体を1度だけ処理して特徴マップを計算する。プロンプトエンコーダが点・ボックス・粗いマスクなどの指示を埋め込みへ変換し、軽量なマスクデコーダが画像特徴とプロンプト埋め込みを組み合わせて複数のマスク候補とその信頼度スコアを出力する。画像エンコーダの計算結果を使い回せるため、同じ画像への複数回のプロンプトにも高速に応答できる。

ワークフロー

画像をエンコーダに通し特徴マップを計算(1回のみ) → 点やボックスなどのプロンプトプロンプトエンコーダ埋め込みへ変換 → マスクデコーダが画像特徴とプロンプト埋め込みからマスク候補を生成 → 信頼度スコアが最も高いマスクを採用する。

コード例

SAMで点プロンプトからマスクを生成する

from segment_anything import sam_model_registry, SamPredictor
import numpy as np

sam = sam_model_registry["vit_h"](checkpoint="sam_vit_h_4b8939.pth")
predictor = SamPredictor(sam)
predictor.set_image(image)

masks, scores, logits = predictor.predict(
    point_coords=np.array([[500, 375]]),
    point_labels=np.array([1]),
    multimask_output=True,
)

利点

  • 学習時に見ていない物体やドメインでもゼロショットでセグメンテーションできる汎化性能
  • 点・ボックス・マスクなど多様な形式のプロンプトで対話的に領域を指定できる
  • 画像エンコーダの計算を1度で済ませられるため、同一画像への複数プロンプトに高速応答できる

欠点

  • 切り出した領域が何であるかというクラス名(ラベル)自体は出力せず、領域の切り出しに特化している
  • 細く入り組んだ境界や、密集し重なり合う物体の分離では精度が落ちやすい
  • SAM自体は静止画向けであり、動画中の物体追跡にはSAM 2など専用の拡張が必要

関連用語

基盤モデルYOLOCLIPZero-shot

よくある質問

SAMは物体を認識できる?

SAMは領域を切り出すのみで、その物体が何かというクラス分類は行わない。クラス分類が必要な場合はCLIP等の分類モデルと組み合わせて使う。

SAM 2との違いは?

SAM 2は動画に対応し、フレーム間で対象物体を追跡するメモリ機構を追加した後継モデル。

参考文献

関連Zenn記事