Segment Anything Model (SAM)

SAMの進化

これはMeta社によるオリジナルのSAMモデルです。機能を向上させるには、ビデオセグメンテーション用のSAM 2や、テキストおよび画像例示プロンプトを使用したPromptable Concept Segmentation用のSAM 3をご覧ください。

How to use Segment Anything In Colab

Segment Anything Model(SAM)を用いた画像セグメンテーションの最前線へようこそ。この革新的なモデルは、リアルタイムパフォーマンスを備えたプロンプト可能な画像セグメンテーションを導入することで、この分野の新たな基準を確立し、ゲームチェンジをもたらしました。

SAMの紹介:Segment Anything Model

Segment Anything Model(SAM)は、プロンプトベースのセグメンテーションを可能にする最先端の画像セグメンテーションモデルであり、画像解析タスクにおいて比類のない汎用性を提供します。SAMは、画像セグメンテーションのための新しいモデル、タスク、およびデータセットを導入する画期的なプロジェクトである「Segment Anything」イニシアチブの中核をなしています。

SAMの高度な設計により、事前の知識なしに新しい画像分布やタスクに適応することが可能であり、これはゼロショット転移として知られる機能です。1,100万枚以上の厳選された画像にわたる10億以上のマスクを含む膨大なSA-1BデータセットでトレーニングされたSAMは、印象的なゼロショットパフォーマンスを示し、多くの場合において、これまでの完全教師あり学習の結果を上回っています。

SA-1B dataset sample with automatic segmentation masks SA-1Bサンプル画像。 新たに導入されたSA-1Bデータセットからのマスクがオーバーレイされたデータセット画像です。SA-1Bには、多様で高解像度、ライセンス供与済みかつプライバシー保護された1,100万枚の画像と、11億個の高品質なセグメンテーションマスクが含まれています。これらのマスクはSAMによって完全に自動でアノテーションされており、人間による評価や数多くの実験によって、高品質で多様であることが検証されています。画像は可視化のために、画像あたりのマスク数でグループ化されています(平均して1画像あたり約100個のマスクがあります)。

Segment Anything Model(SAM)の主な特徴

  • プロンプト可能なセグメンテーションタスク: SAMはプロンプト可能なセグメンテーションタスクを念頭に置いて設計されており、オブジェクトを特定する空間的な手がかりやテキストの手がかりなど、あらゆるプロンプトから有効なセグメンテーションマスクを生成できます。
  • 高度なアーキテクチャ: Segment Anything Modelは、強力な画像エンコーダー、プロンプトエンコーダー、および軽量なマスクデコーダーを採用しています。この独自のアーキテクチャにより、柔軟なプロンプト入力、リアルタイムのマスク計算、およびセグメンテーションタスクにおける曖昧さの認識が可能になります。
  • SA-1Bデータセット: Segment Anythingプロジェクトによって導入されたSA-1Bデータセットは、1,100万枚の画像に対して10億個以上のマスクを備えています。これまでで最大のセグメンテーションデータセットとして、SAMに多様かつ大規模なトレーニングデータソースを提供しています。
  • ゼロショットパフォーマンス: SAMは様々なセグメンテーションタスクにおいて優れたゼロショットパフォーマンスを発揮し、プロンプトエンジニアリングをほとんど必要とせずに、多様なアプリケーションですぐに使用できるツールとなっています。

Segment Anything ModelとSA-1Bデータセットの詳細については、Segment Anything GitHubにアクセスし、研究論文Segment Anythingをご覧ください。

Ultralyticsプラットフォーム上のSAM

SAM powers the smart annotation feature on Ultralytics Platform, enabling click-based intelligent masking for fast dataset labeling. See the annotation guide for details.

利用可能なモデル、サポートされているタスク、および動作モード

この表は、利用可能なモデルとその特定の事前学習済み重み、サポートされているタスク、および推論検証トレーニングエクスポートなどの異なる動作モードとの互換性を示しています。サポートされているモードは✅絵文字で、サポートされていないモードは❌絵文字で示されています。

モデルタイプ事前学習済み重みサポートタスク推論 (Inference)検証学習Export
SAM basesam_b.ptインスタンスセグメンテーション
SAM largesam_l.ptインスタンスセグメンテーション

SAMの使用方法:画像セグメンテーションにおける汎用性とパワー

Segment Anything Modelは、トレーニングデータを超えた多数の下流タスクに使用できます。これには、エッジ検出、オブジェクトプロポーザル生成、インスタンスセグメンテーション、および予備的なテキストからマスクへの予測が含まれます。プロンプトエンジニアリングにより、SAMはゼロショットで新しいタスクやデータ分布に迅速に適応でき、あらゆる画像セグメンテーションのニーズに対応する汎用性と強力なツールとして確立されています。

SAM予測の例

プロンプトによるセグメンテーション

指定されたプロンプトで画像をセグメント化します。

from ultralytics import SAM

# Load a model
model = SAM("sam_b.pt")

# Display model information (optional)
model.info()

# Run inference with bboxes prompt
results = model("ultralytics/assets/zidane.jpg", bboxes=[439, 437, 524, 709])

# Run inference with single point
results = model(points=[900, 370], labels=[1])

# Run inference with multiple points
results = model(points=[[400, 370], [900, 370]], labels=[1, 1])

# Run inference with multiple points prompt per object
results = model(points=[[[400, 370], [900, 370]]], labels=[[1, 1]])

# Run inference with negative points prompt
results = model(points=[[[400, 370], [900, 370]]], labels=[[1, 0]])
すべてをセグメント化

画像全体をセグメント化します。

from ultralytics import SAM

# Load a model
model = SAM("sam_b.pt")

# Display model information (optional)
model.info()

# Run inference
model("path/to/image.jpg")
  • ここでのロジックは、プロンプト(bbox/ポイント/マスク)を渡さない場合に画像全体をセグメント化するというものです。
SAMPredictorの例

このようにすると、一度画像をセットすれば、画像エンコーダーを何度も実行することなく、プロンプト推論を複数回実行できます。

from ultralytics.models.sam import Predictor as SAMPredictor

# Create SAMPredictor
overrides = dict(conf=0.25, task="segment", mode="predict", imgsz=1024, model="mobile_sam.pt")
predictor = SAMPredictor(overrides=overrides)

# Set image
predictor.set_image("ultralytics/assets/zidane.jpg")  # set with image file
predictor.set_image(cv2.imread("ultralytics/assets/zidane.jpg"))  # set with np.ndarray
results = predictor(bboxes=[439, 437, 524, 709])

# Run inference with single point prompt
results = predictor(points=[900, 370], labels=[1])

# Run inference with multiple points prompt
results = predictor(points=[[400, 370], [900, 370]], labels=[1, 1])

# Run inference with negative points prompt
results = predictor(points=[[[400, 370], [900, 370]]], labels=[[1, 0]])

# Reset image
predictor.reset_image()

追加の引数を使用してすべてをセグメント化します。

from ultralytics.models.sam import Predictor as SAMPredictor

# Create SAMPredictor
overrides = dict(conf=0.25, task="segment", mode="predict", imgsz=1024, model="mobile_sam.pt")
predictor = SAMPredictor(overrides=overrides)

# Segment with additional args
results = predictor(source="ultralytics/assets/zidane.jpg", crop_n_layers=1, points_stride=64)
注意

上記の例で返されるすべてのresultsResultsオブジェクトであり、予測されたマスクやソース画像に簡単にアクセスできます。

SAMとYOLOの比較

ここでは、Meta社のSAM-bモデルと、YOLO26n-segを含むUltralyticsセグメンテーションモデルを比較します:

モデルサイズ
(MB)
パラメータ
(M)
速度 (CPU)
(ms/im)
Meta SAM-b37593.741703
MobileSAM40.710.123802
FastSAM-s with YOLOv8 backbone23.911.858.0
Ultralytics YOLOv8n-seg7.1 (52.8倍小さい)3.4 (27.6倍少ない)24.8 (1682倍速い)
Ultralytics YOLO11n-seg6.2 (60.5倍小さい)2.9 (32.3倍少ない)24.3 (1716倍速い)
Ultralytics YOLO26n-seg6.7 (56.0倍小さい)2.7 (34.7倍少ない)25.2 (1655倍速い)

この比較は、SAMバリアントとYOLOセグメンテーションモデル間のモデルサイズと速度の大きな違いを示しています。SAMは独自の自動セグメンテーション機能を提供しますが、YOLOモデル、特にYOLOv8n-seg、YOLO11n-seg、およびYOLO26n-segは、大幅に小さく、高速で、計算効率に優れています。

SAMの速度はPyTorchで、YOLOの速度はONNX Runtimeで測定されました。テストは、2025年版Apple M4 Air(RAM 16GB)を使用し、torch==2.10.0ultralytics==8.4.31onnxruntime==1.24.4環境で実行されました。このテストを再現するには:

from ultralytics import ASSETS, SAM, YOLO, FastSAM

# Profile SAM-b, MobileSAM
for file in ["sam_b.pt", "mobile_sam.pt"]:
    model = SAM(file)
    model.info()
    model(ASSETS)

# Profile FastSAM-s
model = FastSAM("FastSAM-s.pt")
model.info()
model(ASSETS)

# Profile YOLO models (ONNX)
for file_name in ["yolov8n-seg.pt", "yolo11n-seg.pt", "yolo26n-seg.pt"]:
    model = YOLO(file_name)
    model.info()
    onnx_path = model.export(format="onnx", dynamic=True)
    model = YOLO(onnx_path)
    model(ASSETS)

自動アノテーション:セグメンテーションデータセットへの近道

自動アノテーションはSAMの主要な機能であり、ユーザーは事前学習済みの検出モデルを使用してセグメンテーションデータセットを生成できます。この機能により、多数の画像の迅速かつ正確なアノテーションが可能になり、時間のかかる手動ラベリングが不要になります。

検出モデルを使用してセグメンテーションデータセットを生成

Ultralyticsフレームワークでデータセットを自動アノテーションするには、以下のようにauto_annotate関数を使用します:

from ultralytics.data.annotator import auto_annotate

auto_annotate(data="path/to/images", det_model="yolo26x.pt", sam_model="sam_b.pt")
引数タイプデフォルト説明
datastr必須アノテーションまたはセグメンテーションの対象となる画像を含むディレクトリへのパス。
det_modelstr'yolo26x.pt'最初のオブジェクト検出のためのYOLO検出モデルのパス。
sam_modelstr'sam_b.pt'セグメンテーションのためのSAMモデルのパス(SAM、SAM2バリアント、およびMobileSAMモデルをサポート)。
devicestr''計算デバイス(例:'cuda:0'、'cpu'、または自動デバイス検出の場合は空文字列)。
conffloat0.25弱い検出をフィルタリングするためのYOLO検出信頼度しきい値。
ioufloat0.45重なり合うボックスをフィルタリングするためのNon-Maximum SuppressionのIoUしきい値。
imgszint640画像のサイズ変更のための入力サイズ(32の倍数である必要があります)。
max_detint300メモリ効率のための画像あたりの最大検出数。
classeslist[int]None検出するクラスインデックスのリスト(例:人&自転車の場合は[0, 1])。
output_dirstrNoneアノテーションの保存ディレクトリ(データパスからの相対でデフォルトは'./labels')。

auto_annotate関数は画像へのパスを受け取り、オプションの引数として、事前学習済みの検出モデルやSAMセグメンテーションモデル、モデルを実行するデバイス、およびアノテーション結果を保存する出力ディレクトリを指定できます。

事前学習済みモデルを使用した自動アノテーションにより、高品質なセグメンテーションデータセットを作成するために必要な時間と労力を大幅に削減できます。この機能は、大規模な画像コレクションを扱う研究者や開発者にとって特に有益であり、手動アノテーションではなくモデルの開発と評価に集中できるようになります。

引用と謝辞

SAMが研究や開発の役に立った場合は、私たちの論文を引用することを検討してください:

引用
@misc{kirillov2023segment,
      title={Segment Anything},
      author={Alexander Kirillov and Eric Mintun and Nikhila Ravi and Hanzi Mao and Chloe Rolland and Laura Gustafson and Tete Xiao and Spencer Whitehead and Alexander C. Berg and Wan-Yen Lo and Piotr Dollár and Ross Girshick},
      year={2023},
      eprint={2304.02643},
      archivePrefix={arXiv},
      primaryClass={cs.CV}
}

コンピュータビジョンコミュニティにとって価値のあるこのリソースを作成・維持してくれたMeta AIに感謝の意を表します。

FAQ

UltralyticsのSegment Anything Model (SAM) とは何ですか?

UltralyticsのSegment Anything Model (SAM) は、プロンプト可能なセグメンテーションタスク用に設計された革新的な画像セグメンテーションモデルです。画像エンコーダーとプロンプトエンコーダーに加え、軽量なマスクデコーダーを組み合わせた高度なアーキテクチャを活用し、空間的またはテキストの手がかりなど、さまざまなプロンプトから高品質なセグメンテーションマスクを生成します。膨大なSA-1BデータセットでトレーニングされたSAMは、ゼロショットパフォーマンスに優れ、事前の知識なしに新しい画像分布やタスクに適応します。

Segment Anything Model (SAM) を画像セグメンテーションにどのように使用できますか?

Segment Anything Model (SAM) を画像セグメンテーションに使用するには、バウンディングボックスやポイントなどのさまざまなプロンプトで推論を実行します。Pythonを使用した例を以下に示します:

from ultralytics import SAM

# Load a model
model = SAM("sam_b.pt")

# Segment with bounding box prompt
model("ultralytics/assets/zidane.jpg", bboxes=[439, 437, 524, 709])

# Segment with points prompt
model("ultralytics/assets/zidane.jpg", points=[900, 370], labels=[1])

# Segment with multiple points prompt
model("ultralytics/assets/zidane.jpg", points=[[400, 370], [900, 370]], labels=[[1, 1]])

# Segment with multiple points prompt per object
model("ultralytics/assets/zidane.jpg", points=[[[400, 370], [900, 370]]], labels=[[1, 1]])

# Segment with negative points prompt.
model("ultralytics/assets/zidane.jpg", points=[[[400, 370], [900, 370]]], labels=[[1, 0]])

あるいは、コマンドラインインターフェース (CLI) でSAMの推論を実行することもできます:

yolo predict model=sam_b.pt source=path/to/image.jpg

より詳細な使用手順については、セグメンテーションセクションをご覧ください。

SAMとYOLOモデルはパフォーマンスの面でどのように比較されますか?

YOLOモデルと比較して、SAM-b、MobileSAM、FastSAM-sなどのSAMバリアントは一般的に大きく低速ですが、独自のゼロショットセグメンテーション機能を提供します。例えば、YOLO26n-segは、CPU上でMetaのオリジナルのSAM-bモデルよりも56倍小さく1650倍以上高速です。これにより、YOLOモデルは迅速で軽量、かつ計算効率の高いセグメンテーションを必要とするアプリケーションに最適であり、SAMモデルは柔軟でプロンプト可能なゼロショットセグメンテーションタスクに優れています。

SAMを使用してデータセットを自動アノテーションするにはどうすればよいですか?

UltralyticsのSAMは、事前学習済みの検出モデルを使用してセグメンテーションデータセットを生成できる自動アノテーション機能を提供しています。Pythonでの例を以下に示します:

from ultralytics.data.annotator import auto_annotate

auto_annotate(data="path/to/images", det_model="yolo26x.pt", sam_model="sam_b.pt")

この関数は、画像へのパスと、学習済み検出モデルおよびSAMセグメンテーションモデルのオプション引数、さらにデバイスや出力ディレクトリの指定を受け取ります。完全なガイドについては、Auto-Annotationをご覧ください。

Segment Anything Model (SAM) の学習にはどのデータセットが使用されていますか?

SAMは、1,100万枚の画像にわたる10億以上のマスクで構成される大規模な SA-1B dataset で学習されています。SA-1Bは現在最大のセグメンテーションデータセットであり、高品質で多様な training data を提供することで、さまざまなセグメンテーションタスクにおいて驚異的なゼロショット性能を保証します。詳細については、Dataset section をご覧ください。

コメント