【画像解析】Segment Anything (SAM) の使い方|Pythonで画像を自動セグメントする手順まとめ【コード例あり】

こんにちは、ゆずかきです。

今回は、「Segment Anything(略称:SAM)」 と呼ばれる最新の画像セグメンテーション技術について、入門者向けにできるだけ噛み砕いて解説してみたいと思います。

「Segment Anything」は、Meta AI Research(旧FaceBook AI Research)によって2023年に発表された、大規模言語モデル(LLM)ならぬ「大規模視覚モデル」の草分け的存在です。

画像上で「なんでもセグメンテーションできる」ことを目指しており、なんと1100万枚の画像と11億(1.1B)ものマスク(白黒画像)からなる膨大なデータセットSA-1Bを使い、言葉で指示できるAI(Promptable Segmentation)という発想で学習されたモデルなんですね。

さらにこの度、「SAM 2」というアップデートが公開され、静止画だけでなく動画にも適用できる汎用的な拡張モデルが登場。
まさに画像・動画セグメンテーションの基盤となるAIモデル(Foundation Model)を目指しているわけです。

今回は、

  • 論文 "Segment Anything" (arXiv:2304.02643) で提唱されている内容をベースに、
  •  GitHubリポジトリ(公式のReadMe情報)を活用しながら、
  • 具体的な使い方・導入手順、コード例、応用範囲 を網羅的に解説

していきます。
前後編に分けてもいいくらいのボリュームですが、セグメンテーション技術に馴染みのない方も気軽に読み進めてみてください!
※中盤からコード書く人向けの実装フェーズに入ります!SAMの雰囲気をフワッと知りたいという方は、前半部分をご覧ください。

もしSegment Anythingの出力例をイメージしたい方は、下記写真群を参照してみてください。

👆入力画像に対してSAMが自動でマスキングする処理イメージ
👆色んなものを1発でセグメンテーションする様子
👆プロンプト次第でピンポイント指定も可能

どんな感じでマスクが生成されるかイメージできますでしょうか。
今回は、このようなすごいことが出来るSAMという技術について、詳細まで解説してみようかな、と思います。

※記事中では論文:「Segment Anything (arXiv:2304.02643)」から図や説明を引用しています。


§本記事の構成

  1. Segment Anythingとは?
  2. 論文の概要(arXiv:2304.02643)
  3. 従来手法との比較&画期的ポイント
  4. SAMのアーキテクチャ:画像セグメンテーションが"Promptable"に
  5. 1.1Bマスク&11M画像!世界最大級のSA-1Bデータセット
  6. SAM 2:動画対応への新アプローチ
  7. 実際に使ってみる:インストール~推論コード例
  8. 主要な実験結果と考察:Zero-Shot性能はどこまで通用?
  9. 応用範囲と今後の展望
  10. まとめ・参考文献

途中に写真を挟んでより分かりやすくしてみたいと思います。必要そうなところで差し込みますね。


§0. 画像セグメンテーションとは?

本題に入る前に、画像処理について専門家じゃない方に向けて、そもそもセグメンテーションとかマスクって何?という基礎を、直感的に説明しますね。

「画像セグメンテーション」という言葉を聞いても、ピンとこない人も多いかもしれません。
これは簡単に言えば 「画像の中の特定の部分を切り取る技術」 です。

たとえば、スマホの写真編集アプリで「背景をぼかす」機能を使ったことはありませんか?
あれは、人の部分を 「前景」、その他の部分を 「背景」 に分けることで実現されています。

もう少し具体的に見てみましょう。


画像セグメンテーションのイメージ

👇 下の画像を見てください。

左側 :元の写真(白い花が背景の前にある)
右側 :花の部分だけを白く、それ以外を黒くした「セグメンテーションマスク」

セグメンテーションマスクとは?

  • 白い部分 → 「切り取りたい対象」(この場合は花)
  • 黒い部分 → 「それ以外の背景」

こうすることで、たとえば「花だけを抜き出して背景を透明にする」といった画像編集ができるわけです。

マスクの役割とは?

  • Photoshopなどで「レイヤーマスク」を使ったことがある人は、それと同じイメージ。
  • マスク = どの部分を使うか / どの部分を無視するか を指定するフィルターのようなもの
  • 背景を削除する、特定の物体だけ色を変える、AIに「この部分を編集して!」と指示する… などに使える

セグメンテーションと物体検出の違い
よく「物体検出」と「セグメンテーション」は混同されがちですが、ざっくりいうとこんな違いがあります。

技術名 何をする? 出力例
物体検出 (Object Detection) 画像内の特定の物体に「四角い枠(バウンディングボックス)」をつける 🟥 物体が四角で囲まれる
セグメンテーション (Segmentation) 物体の形状にピッタリ沿ったマスクを作る 🌿 物体の輪郭が正確に切り取られる

 
たとえば、👆の猫の画像なら…
(左)物体検出 → 「この四角の中に猫がいるよ!」
(右)セグメンテーション → 「この猫の形にぴったり沿って切り取るよ!」

画像セグメンテーションは、物体検出よりも 「より細かく形状を捉えられる」 のがポイントです。


Segment Anything (SAM) が凄い理由

従来、セグメンテーションには「この物体は何?」というカテゴリ(例:犬、猫、車)を学習させる必要がありました。
でもSAMは違います。

「どんな画像でも、どんなオブジェクトでも、自動でマスクを作れる!」
つまり、事前に学習されていないモノ(たとえば「初めて見る変わった形の花」)でも、形状に沿ってセグメンテーションできる。
しかも、ワンクリックや矩形選択など「超簡単な指示」だけで動く!

これが、SAMが「Segment Anything(何でも切り取れる)」と言われる理由です。


このあとは、Segment Anything (SAM) がどのようにして 「あらゆる画像を簡単にセグメンテーションできるのか?」 を掘り下げていきます。

「セグメンテーションって何?」という疑問がスッキリしたところで、次のセクションへ進んでみましょう! 🌸


§1. Segment Anythingとは?

Segment Anythingは、「画像上のあらゆる物体や領域を、一つのモデルですべて『切り取る(セグメンテーションする)』」という壮大なビジョンで進められているプロジェクトです。
2023年4月に論文サイト:rXivへ登場し、大きな反響を呼びました。

特徴としては、

  • 大規模データセット SA-1B (Segment Anything 1-Billion Mask Dataset) を構築し、
  • Promptable Segmentation(ユーザが与える"Prompt"に応じて、任意のマスクをリアルタイム生成)を実現し、
  • "SAM" (Segment Anything Model) と呼ばれる統一モデルで、画像上のどんな物体でも分割可能にしよう

という点です。

従来の画像セグメンテーション手法との違いは、「少数のクリック(例:1点指定)やボックスの入力だけで、有効なセグメンテーションマスクが得られる」というところ。
さらに、マスクを後から refined(微修正)しながら再度Promptとして入力すれば、モデルがそれを反映してより精密なマスクを吐き出す「対話的」な仕組みまで備えています。

実際、下記のようなイメージがあると分かりやすいですね。

👆 画像上で1点をクリックしただけで、「こういうオブジェクトだよね?」というマスクが出力されている様子


§2. 論文の概要(arXiv:2304.02643)

論文タイトルは、

Segment Anything
Alexander Kirillov et al., Meta AI Research, FAIR, 2023

論文内容の骨子は以下のようになっています:

  1. タスク定義:Promptable Segmentation

    • 「1点クリック」や「バウンディングボックス」、「任意のマスクの一部を再提示」、あるいはテキスト入力("a wheel"など)といったプロンプトを与えると、それに対応する領域がセグメンテーションされる。
    • 不完全・曖昧な入力であっても「有効なマスク」を返す必要がある(例えば1点だけのクリックが、複数オブジェクトに跨るような曖昧さを含んでいたとしても、有効な1つの(または複数の)マスクを生成)。
  2. モデル構造(SAM)

    • 高価な「画像エンコーダ」は1枚の画像につき1回だけ処理し、あとは軽量な「プロンプトエンコーダ」&「マスクデコーダ」を高速に動かすことで、リアルタイム応答を目指している。
    • 実際、学習済みのSAMではViT-Hと呼ばれる巨大なビジョントランスフォーマーモデルを使い、生成されるマスクの品質を追求している。
    • 「マスクを複数同時に出力し、最も適合度の高いマスクをスコアリングする」アプローチで曖昧性に対処する。
  3. データ収集ループ(Data Engine)

    • 通常、セグメンテーションに必要なマスク教師データは膨大なアノテーション作業を要する。
      しかし本プロジェクトでは「モデルを使ってアノテーションを半自動 or 全自動化し、そのアノテーションをさらに学習に使ってモデルを強化する」というループを回した。
    • その結果、11M(1100万)枚の画像から1.1B(11億)マスクという前代未聞のデータセット SA-1B を構築し、それをモデル学習に活用した。
  4. 実験結果

    • 通常のセグメンテーションタスクや物体検出をゼロショット(追加学習なし)でこなせることを確認。
    • たとえばCOCOのインスタンスセグメンテーションに対し、Bounding Boxだけを外部検出器に任せる + SAMでマスク生成するだけでも、従来の学習済みモデルに迫る性能を達成。
    • 加えて、BSDS500のエッジ検出オブジェクトプロポーザル生成など、多様な下流タスクにも汎用的に転用可能。
  5. 結論と今後の展望

    • 「大規模データ × 大規模モデル × Promptableな設計」で、画像セグメンテーションの新しい潮流を生む。
    • 今後はさらなる大規模化やテキストや動画などへの応用が期待される。

こうした内容になっています。
特に「Data Engine」で1.1Bという膨大なマスクを自動収集してしまうスケールの大きさ、それを元にしたモデルがゼロショットで幅広いドメインに対応する汎用性を示したのが、この論文の面白いところです。


§3. 従来手法との比較&画期的ポイント

従来手法

これまでも「インタラクティブ セグメンテーション」などの研究はありましたが、ユーザは多くのクリックを行い、モデルをその都度アップデート(fine-tune)する、といった手間が必要でした。

また、物体検出+マスク生成の組み合わせ手法(Mask R-CNN等)も定番ですが、基本は対象のクラス(カテゴリ)を学習時に想定しておく必要があります。

例えば「犬」や「猫」は検出してくれるけど、「鍵」や「ペットボトルのラベル」などクラス外のものは扱えない場合が多いです。

SAMの画期的要素

  1. 事前学習のスケール

    • 11億ものマスクを使って学習したという規模は他に例を見ない。
    • しかも様々なオブジェクト・シーンが含まれ、オープンワールド的に「カテゴリを問わず切り取り可能」な汎用性を持つ。
  2. Promptable

    • 「ポイント1個」「ボックス1つ」「すでに生成済みのマスク」「テキストによるキーワード指定」など自由な手段で「こういう領域が欲しい」と指示すれば、モデルがマスクを出力。
    • 曖昧な指定であっても複数マスクを一度に出力し、その中からユーザが選んだり(または自動的にスコアで絞ったり)できる。
  3. リアルタイム応答を重視

    • 大きなViTで画像をエンコードしたら、あとは「軽量デコーダ」で素早くマスク生成可能(ブラウザ上でも動く実装例が公開されている)。

※ViT = Vision Transformerの略で、画像を言語のように処理できるやつ、のイメージです! chatGPTって画像も読めますよね?ざっくり言うとあんな感じですかね。


§4. SAMのアーキテクチャ:画像セグメンテーションが"Promptable"に

論文&GitHub情報を踏まえると、SAMの内部はざっくり以下の3つのコンポーネントで構成されています:

  1. Image Encoder

    • ViT-Hなど大規模Vision Transformerで画像を一回だけエンコードし、画像埋め込み(image embedding) を生成。
    • 解像度は 1024 x 1024 あたりを想定。
    • この処理は重いものの、1度実行すればOK(後のプロンプト変更時には再計算しない)。
  2. Prompt Encoder

    • ユーザからの入力(ポイント、ボックス、既存マスク、テキストなど)をベクトル表現に変換。
    • テキストはCLIPのtext encoderを利用するなど、モジュールごとに拡張可能。
  3. Mask Decoder

    • 画像埋め込みとプロンプト埋め込みを統合して、最終的にマスクを生成。
    • 数十ミリ秒程度で計算できるよう設計(これが対話的な使用を可能にしている)。
    • “曖昧性”に対応するため、複数マスクを一度に出力し、さらにそれらのマスクに対してモデルが「自信度(IoU予測スコア)」を付与している。

実際のフローチャートはこんな感じです:

👆SAMの構造図(Image Encoder, Prompt Encoder, Mask Decoder)が図解されているもの

「画像をEmbed化 → PromptをEmbed化 → Decoderで合体 → マスク出力」というパイプラインですね。
特に注目は「曖昧性対策として、3つのマスクを同時出力する」ところ。
論文や公式実装を見ても、このアイデアがシンプルかつ効いているようです。


§5. 1.1Bマスク&11M画像!世界最大級のSA-1Bデータセット

Segment Anythingの学習を支えるのが、SA-1B (Segment Anything 1-Billion mask) dataset です。その名の通り、11億個ものマスクが用意されています。

  • 画像数は約 11M(1100万)
  • マスク数は 1.1B(11億)
  • ライセンスおよびプライバシー保護が行き届いた画像を使用
  • マスクは「自動生成」段階が9割以上(人手アノテーション+モデル補助で多様性&品質を確保)

Mask品質 も大きなポイントで、ランダムに抽出したサンプルをさらに人間が最終確認したところ、75~90% IoUレベルの高品質が得られているそう。

👆 SA-1Bデータセットのサンプル画像に大量のマスクがオーバーレイされているイメージ

巨大言語モデルがWebテキストをかき集めるように、画像セグメンテーションにおいても「生データをとにかく集める」→「モデルがAnnotationを補助」→「さらにモデルが良くなる」というループを回す時代になったという印象です。


§6. SAM 2:動画対応への新アプローチ

2024年夏、Segment Anything Model 2 (SAM 2) がリリースされました。
これは、「画像は動画の1フレームに過ぎない」という視点で、従来の静止画セグメンテーションから動画へ拡張するモデルです。

SAM 2の詳細は以下を参照:

画像にも動画にも同じ文法で使える というのは非常に強力ですよね。
静止画をセグメンテーションできるなら、それをフレーム系列に適用すれば動画セグメンテーションもできるのでは…?という発想です。

このあたり、最近のトレンドである「マルチモーダルの大規模モデル」とも関連し、LLM + SAM 2 のような統合活用が期待されます。

yuzukaki-chemical.hateblo.jp

👆SAM 2についても解説記事を書きました!動画もセグメントしたい方はぜひご覧ください!


§7. 実際に使ってみる:インストール~推論コード例

さて、ここからは実運用でどう使うかを見ていきましょう。GitHub上のReadMe(facebookresearch/segment-anything)では具体的に以下のような案内がされています。

7.1 インストール

まずはPyTorch環境があるのが前提です(python>=3.8, pytorch>=1.7)。CUDA有効化推奨。
以下のコマンドで簡単にinstallできます:

pip install git+https://github.com/facebookresearch/segment-anything.git

またはクローンしてローカルインストール:

git clone git@github.com:facebookresearch/segment-anything.git
cd segment-anything
pip install -e .

オプションとして以下があると便利:

pip install opencv-python pycocotools matplotlib onnxruntime onnx

これにより、マスクの可視化やCOCO形式での保存などがスムーズになります。

7.2 モデルチェックポイントの入手

公式リポジトリには3種類のチェックポイントが公開されています:

  • default (or vit_h): ViT-H SAMモデル
  • vit_l: ViT-L SAMモデル
  • vit_b: ViT-B SAMモデル

サイズが大きいほど性能は高い傾向ですが、メモリ使用量などとのトレードオフがあるので用途に合わせて選びましょう。

ダウンロードが完了したら、以下のようにしてロードします(model_typeには"vit_h", "vit_l", "vit_b"などを指定):

from segment_anything import sam_model_registry
sam = sam_model_registry["vit_h"](checkpoint="<path/to/checkpoint>")

7.3 プロンプト付き推論の例

Pythonスクリプト上で"この画像を読み込んで、ここにポイントを打ったらマスクを生成" という流れを簡単に試せます。

from segment_anything import SamPredictor, sam_model_registry
import cv2

# モデルをロード
sam = sam_model_registry["vit_h"](checkpoint="sam_vit_h_4b8939.pth")
predictor = SamPredictor(sam)

# 画像の読み込み
image = cv2.imread("test_image.jpg")
predictor.set_image(image)

# 例: 前景ポイント(x,y)だけを与える
input_point = [[500, 300]]
input_label = [1]   # 1は"前景"を示すラベル

masks, scores, logits = predictor.predict(
    point_coords=input_point,
    point_labels=input_label,
    multimask_output=True  # Trueで複数マスク出力
)

print("生成されたマスク数:", len(masks))
for i, mask in enumerate(masks):
    print(f"マスク{i}のスコア:", scores[i])
    # maskは高さ×幅の2次元配列(True/False)

ここで masks は例えば3つのマスク(多層の曖昧性を含む)が得られるので、「scores のうち最も高いもの」を選ぶなどして使えます。

👆実行後のマスクを可視化した結果の例

7.4 画像全体のマスクを一括生成

さらに「画像に映っているすべての物体(または領域)をまとめてセグメンテーションしたい!」という場合には、SamAutomaticMaskGenerator を使います。

from segment_anything import SamAutomaticMaskGenerator, sam_model_registry
import cv2

sam = sam_model_registry["vit_h"](checkpoint="sam_vit_h_4b8939.pth")
mask_generator = SamAutomaticMaskGenerator(sam)

image = cv2.imread("test_image.jpg")
masks = mask_generator.generate(image)

print("生成されたマスク数:", len(masks))
# masksは各マスクのバウンディングボックスやスコアなどを持つ辞書のリスト
# "segmentation", "bbox", "area", "predicted_iou"などの情報を含む

これで、その画像に含まれる主要なマスクを片っ端から生成してくれます。
NMSの閾値点のサンプリング間隔など、パラメータを細かく設定すると、より細かく調整可能です。

7.5 コマンドラインでもOK

GUIなしでも、CLIで画像フォルダを渡して自動マスク生成も可能です:

python scripts/amg.py \
    --checkpoint sam_vit_h_4b8939.pth \
    --model-type vit_h \
    --input path/to/image_or_folder \
    --output path/to/output_folder

バックエンドで同じSamAutomaticMaskGeneratorを使っているため、一括処理に便利です。


§8. 主要な実験結果と考察:Zero-Shot性能はどこまで通用?

論文でも触れられている通り、Segment Anythingは下流タスクへゼロショット転用できるのが強みです。

  • 1点を打っただけのセグメンテーション
    従来のインタラクティブセグメンテーション手法(RITMなど)と比較しても高品質マスクを生成。

  • オブジェクトプロポーザル(AR@1000)
    LVISデータセットで、専用のオブジェクト検出器を利用した場合に匹敵する高リコール率。

  • Edge Detection (BSDS500)
    Sobelフィルタなど他の汎用ゼロショット手法より高い再現率を叩き出す。

  • テキスト→マスク
    テキストと画像エンコーダがCLIPで整合性がとれていれば、テキストプロンプトでもおおまかなマスクが得られる。

但し、細かい形状の再現や超高精度の輪郭抽出は、最先端の専用モデルにまだ及ばないケースもあるようです。
実際、私が手元で試したところ、細かいところはマスクできなかったり、変わった形状の物体は認識できないという弱点はありました。

また、データセット固有のアノテーションルール(例:COCOだと穴を持たないポリゴン形式、LVISだとアモーダル等)に合わせて学習したモデルに比べると、評価指標で差が出ることもあります。
ただし、その分バイアスに囚われず、より汎用的なマスクを生み出せるというメリットがあるわけですね。


§9. 応用範囲と今後の展望

  • 画像上の任意物体セグメンテーション:
    どんなクラスでもセグメンテーションできるので、写真整理やフォトレタッチ補助に応用。

  • 動画セグメンテーション (SAM 2):
    各フレームに対してSAMを適用、あるいは最新のストリーミング設計でリアルタイム解析。

  • アノテーション支援:
    データセット作成において下絵を自動生成し、人間が微修正して効率化するループを回せる。

  • ロボット視覚:
    ロボットが環境内のあらゆるオブジェクトを素早くマスク化できれば、把持(Grasping)や衝突回避などもより柔軟になる。

  • LLMとの統合:
    画像上のオブジェクト情報を自然言語で扱う(ChatGPT的な対話で「この画像のテーブルの上のコップの部分を切り取って」などを指示すると自動分割…)のも近未来に実現しそう。

今後、テキストや音声などと組み合わせた真の「マルチモーダル大規模モデル」化や、3D/点群データへの拡張、さらには産業界の具体的用途へ展開が進むと思われます。


§10. まとめ・参考文献

Segment Anythingは、「Promptable Segmentation」という新しい概念を提案し、1.1Bマスクに及ぶ大規模データセットを武器にして汎用セグメンテーションの可能性を切り拓きました。
SAM 2によって動画セグメンテーションを含むさらなる拡張が進んでおり、今後の発展が非常に楽しみです。

  • 大規模データによる「オープンワールド」なセグメンテーション
  • Prompt(ポイント、ボックス、マスク、テキスト等)を柔軟に受け付けるモデル設計
  • リアルタイム推論の可能性
  • 画像以外への波及(動画、3Dなど)

私自身も試しに、自前データセットで簡単にSAMを走らせてみましたが、ビックリするほど汎用的に切り取ってくれる印象でした。
ぜひみなさんもトライしてみてください!


🔑この記事のポイントまとめ

  • Segment Anything (SAM):Promptable Segmentationを1つのモデルで実現したMeta AIの研究プロジェクト
  • SA-1B:11億マスク規模の巨大データセットにより、カテゴリ非依存でのセグメンテーションが可能
  • 対話的操作に強い:1点やボックスを指定するだけでマスクが生成される。曖昧な場合は複数マスクを返す仕組み
  • SAM 2 で動画にも対応:より包括的な時空間セグメンテーションを目指す
  • 使い方:PyTorchでpip install後、Checkpointをダウンロード → SamPredictor or SamAutomaticMaskGeneratorで推論

§参考文献

以下より、写真や図、文章を引用

Note: SA-1Bのデータセットはライセンスやプライバシーに配慮されつつも非常に巨大です。ダウンロードや利用時は公式のライセンス文書をご確認ください。


おわりに

以上、Segment Anythingの論文&GitHubリポジトリをベースに、技術的背景から導入方法までを駆け足でご紹介しました。
個人的には「これだけ簡単にセグメンテーションできる時代が来たか!」と驚きを禁じ得ません。

特に実装は思いのほかシンプルで、モデル本体をロード→画像embedding計算→Point/Box/Text/etc.プロンプトを入力→マスク出力という流れが分かりやすくまとまっています。
近年のLLMのように、プロンプト次第で多彩なタスクを実現できる点は非常に面白いですよね。

みなさんも、ぜひ一度Segment Anythingをインストールして試してみてください。
意外なものもパッとマスクとして切り出してくれて、作業効率がグッと上がるかもしれません。

長文になりましたが、最後までお読みいただき、ありがとうございました!


ライセンス表記:
本記事におけるスクリーンショットはMetaの公開論文からの引用です。
Courtesy of Meta AI (CC-BY-4.0)