Segment Anything Model (SAM)
Segment Anything Model、略して SAM による画像セグメンテーションの最前線へようこそ。この革新的なモデルは、リアルタイムパフォーマンスでプロンプト可能な画像セグメンテーションを導入し、この分野に新たな基準を打ち立てることで、ゲームを変えました。
SAM(Segment Anything Model)入門
Segment Anything Model(SAM)は、プロンプト可能なセグメンテーションを可能にする最先端の画像セグメンテーションモデルであり、画像分析タスクにおいて比類のない汎用性を提供します。SAMは、画像セグメンテーションのための新しいモデル、タスク、およびデータセットを紹介する画期的なプロジェクトであるSegment Anythingイニシアチブの中核をなしています。
SAMの高度な設計により、事前の知識なしに新しい画像分布やタスクに適応できます。これはゼロショット転移として知られる機能です。1100万枚の厳選された画像に10億を超えるマスクを含む広範なSA-1BデータセットでトレーニングされたSAMは、多くの場合、以前の完全教師ありの結果を上回る、印象的なゼロショット性能を示しています。
SA-1Bのサンプル画像。 新しく導入されたSA-1Bデータセットからオーバーレイされたマスクのデータセット画像。SA-1Bには、1100万の多様な高解像度、ライセンス供与された、プライバシー保護された画像と、11億の高品質セグメンテーションマスクが含まれています。これらのマスクはSAMによって完全に自動的にアノテーションされ、人間の評価と多数の実験によって検証されているように、高品質で多様性があります。画像は、視覚化のために画像あたりのマスク数でグループ化されています(平均して画像あたり約100個のマスクがあります)。
Segment Anything Model (SAM) の主な特徴
- プロンプト可能なセグメンテーションタスク: SAMは、プロンプト可能なセグメンテーションタスクを念頭に置いて設計されており、オブジェクトを識別する空間的またはテキストの手がかりなど、与えられたプロンプトから有効なセグメンテーションマスクを生成できます。
- 高度なアーキテクチャ: Segment Anything Modelは、強力な画像エンコーダ、プロンプトエンコーダ、および軽量マスクデコーダを採用しています。この独自のアーキテクチャにより、柔軟なプロンプト、リアルタイムのマスク計算、およびセグメンテーションタスクにおける曖昧さの認識が可能になります。
- The SA-1B Dataset: Segment Anythingプロジェクトによって導入されたSA-1Bデータセットは、1100万枚の画像に10億を超えるマスクを備えています。現在最大のセグメンテーションデータセットとして、SAMに多様で大規模なトレーニングデータソースを提供します。
- ゼロショット性能: SAMは、さまざまなセグメンテーションタスクにおいて、優れたゼロショット性能を発揮し、プロンプトエンジニアリングの必要性を最小限に抑え、多様なアプリケーションに対応できるすぐに使えるツールとなっています。
Segment Anything ModelとSA-1Bデータセットの詳細については、Segment Anythingのウェブサイトにアクセスし、研究論文Segment Anythingをご覧ください。
利用可能なモデル、サポートされているタスク、および動作モード
この表は、利用可能なモデルと、特定の事前学習済みウェイト、サポートするタスク、および推論、検証、トレーニング、エクスポートなどのさまざまな動作モードとの互換性を示しています。サポートされているモードは✅の絵文字で、サポートされていないモードは❌の絵文字で示されています。
モデルの種類 | 事前学習済み重み | サポートされているタスク | 推論 | 検証 | 学習 | エクスポート |
---|---|---|---|---|---|---|
SAMベース | sam_b.pt | インスタンスセグメンテーション | ✅ | ❌ | ❌ | ❌ |
SAM large | sam_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")
# Run inference with a SAM model
yolo predict model=sam_b.pt source=path/to/image.jpg
- ここでのロジックは、プロンプト(bboxes/points/masks)を渡さない場合、画像全体をセグメント化することです。
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)
注
返されたすべて results
上記の例では 結果 予測されたマスクとソース画像に簡単にアクセスできるオブジェクト。
- その他の追加引数:
Segment everything
参照Predictor/generate
リファレンス.
SAMとYOLOの比較
ここでは、MetaのSAM-bモデルと、Ultralyticsの最小セグメンテーションモデルであるYOLO11n-segを比較します。
モデル | サイズ (MB) |
パラメータ (M) |
速度 (CPU) (ms/im) |
---|---|---|---|
Meta SAM-b | 375 | 93.7 | 49401 |
MobileSAM | 40.7 | 10.1 | 25381 |
YOLOv8 バックボーンを備えたFastSAM-s | 23.7 | 11.8 | 55.9 |
Ultralytics YOLOv8n-seg | 6.7 (11.7分の1) | 3.4 (11.4分の1) | 24.5 (1061倍高速) |
Ultralytics YOLO11n-seg | 5.9 (13.2倍小さい) | 2.9 (13.4倍少ない) | 30.1 (864倍高速) |
この比較は、SAMバリアントとYOLOセグメンテーションモデル間のモデルサイズと速度の大きな違いを示しています。SAMは独自の自動セグメンテーション機能を提供しますが、YOLOモデル、特にYOLOv8n-segとYOLO11n-segは、大幅に小型、高速、かつ計算効率が高くなっています。
24GBのRAMを搭載した2025 Apple M4 Proで実行されたテスト。使用 torch==2.6.0
および ultralytics==8.3.90
。このテストを再現するには:
例
from ultralytics import ASSETS, SAM, YOLO, FastSAM
# Profile SAM2-t, SAM2-b, SAM-b, MobileSAM
for file in ["sam_b.pt", "sam2_b.pt", "sam2_t.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
for file_name in ["yolov8n-seg.pt", "yolo11n-seg.pt"]:
model = YOLO(file_name)
model.info()
model(ASSETS)
自動アノテーション:セグメンテーションデータセットへの迅速な道
自動アノテーションはSAMの重要な機能であり、ユーザーは事前トレーニング済みの検出モデルを使用してセグメンテーションデータセットを生成できます。この機能により、時間のかかる手動ラベリングの必要がなくなり、多数の画像を迅速かつ正確にアノテーションできます。
検出モデルを使用してセグメンテーションデータセットを生成する
Ultralyticsフレームワークでデータセットを自動アノテーションするには、以下を使用します。 auto_annotate
以下に示すように機能します:
例
from ultralytics.data.annotator import auto_annotate
auto_annotate(data="path/to/images", det_model="yolo11x.pt", sam_model="sam_b.pt")
引数 | 種類 | デフォルト | 説明 |
---|---|---|---|
data |
str |
必須 | アノテーションまたはセグメンテーションの対象となる画像を含むディレクトリへのパス。 |
det_model |
str |
'yolo11x.pt' |
初期オブジェクト検出のための YOLO 検出モデルのパス。 |
sam_model |
str |
'sam_b.pt' |
セグメンテーション用のSAMモデルパス(SAM、SAM2バリアント、およびmobile_samモデルをサポート)。 |
device |
str |
'' |
計算デバイス(例:'cuda:0'、'cpu'、または自動デバイス検出の場合は'')。 |
conf |
float |
0.25 |
YOLO 検出における、弱い検出を除外するための信頼度閾値。 |
iou |
float |
0.45 |
重複するボックスをフィルタリングするためのNon-Maximum SuppressionのIoU閾値。 |
imgsz |
int |
640 |
画像リサイズ時の入力サイズ(32の倍数にする必要があります)。 |
max_det |
int |
300 |
メモリ効率のための画像あたりの最大検出数。 |
classes |
list[int] |
None |
検出するクラスインデックスのリスト(例: [0, 1] 人および自転車用)。 |
output_dir |
str |
None |
アノテーションの保存先ディレクトリ(デフォルトはデータパスに対する相対パスで'./labels')。 |
The 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 に感謝いたします。
よくある質問
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、SAM2-t、MobileSAM、FastSAM-sなどのSAMバリアントは通常、サイズが大きく、速度が遅いですが、独自のゼロショットセグメンテーション機能を提供します。たとえば、Ultralytics YOLOv8n-segは、MetaのオリジナルのSAM-bモデルよりも11.7倍小さく、1069倍高速であり、YOLOの速度と効率における大きな利点を強調しています。同様に、新しいYOLO11n-segは、さらに小型で、優れた推論速度を維持します。これにより、YOLOモデルは、高速、軽量、計算効率の高いセグメンテーションを必要とするアプリケーションに最適になり、SAMモデルは、柔軟性、プロンプト性、ゼロショットセグメンテーションタスクに優れています。
SAMを使用してデータセットを自動アノテーションするにはどうすればよいですか?
UltralyticsのSAMは、事前学習済みの検出モデルを使用してセグメンテーションデータセットを生成できる自動アノテーション機能を提供します。以下はpythonでの例です:
from ultralytics.data.annotator import auto_annotate
auto_annotate(data="path/to/images", det_model="yolov8x.pt", sam_model="sam_b.pt")
この関数は、画像へのパスと、事前学習済みの検出およびSAMセグメンテーションモデルのオプション引数、デバイスと出力ディレクトリの指定を受け取ります。完全なガイドについては、自動アノテーションを参照してください。
Segment Anything Model(SAM)のトレーニングには、どのようなデータセットが使用されますか?
SAMは、1100万枚の画像にわたる10億以上のマスクで構成される大規模なSA-1Bデータセットでトレーニングされています。SA-1Bは、現在までに最大のセグメンテーションデータセットであり、高品質で多様なトレーニングデータを提供し、さまざまなセグメンテーションタスクで優れたゼロショットパフォーマンスを保証します。詳細については、データセットセクションをご覧ください。