あらゆるものをセグメンテーションするモデル (SAM)#
あらゆるものをセグメンテーションするモデル、SAMによる画像セグメンテーションの最前線へようこそ。この革新的なモデルは、リアルタイム性能を備えたプロンプト可能な画像セグメンテーションを導入し、この分野に新たな基準を打ち立てました。
SAMの概要:あらゆるものをセグメンテーションするモデル#
あらゆるものをセグメンテーションするモデル、SAMは、プロンプト可能なセグメンテーションを実現する最先端の画像セグメンテーションモデルであり、画像分析タスクにおいて非常に高い汎用性を提供します。SAMはSegment Anythingイニシアチブの中核を成しており、画像セグメンテーション向けに新しいモデル、タスク、データセットを導入する画期的なプロジェクトです。
SAMの高度な設計により、事前知識なしで新しい画像分布やタスクに適応できます。この機能はゼロショット転移として知られています。11百万枚の厳選された画像に11億個を超えるマスクを含む大規模なSA-1Bデータセットで学習されたSAMは、優れたゼロショット性能を示し、多くの場合で従来の完全教師あり学習の結果を上回っています。
**SA-1Bの例示画像。**新たに導入されたSA-1Bデータセットの画像にマスクを重ねて表示しています。SA-1Bには、11M枚の多様で高解像度、ライセンス済み、プライバシー保護に配慮した画像と、11億個の高品質なセグメンテーションマスクが含まれています。これらのマスクはSAMによって完全自動でアノテーションされ、人による評価と多数の実験によって、高品質かつ多様であることが確認されています。可視化のため、画像あたりのマスク数で画像をグループ化しています(平均で画像1枚あたり約100個のマスクがあります)。
あらゆるものをセグメンテーションするモデル (SAM) の主な特徴#
- **プロンプト可能なセグメンテーションタスク:**SAMはプロンプト可能なセグメンテーションタスクを想定して設計されており、オブジェクトを特定する空間的手がかりやテキストによる手がかりなど、任意のプロンプトから有効なセグメンテーションマスクを生成できます。
- **高度なアーキテクチャ:**あらゆるものをセグメンテーションするモデルは、高性能な画像エンコーダー、プロンプトエンコーダー、軽量なマスクデコーダーを採用しています。この独自のアーキテクチャにより、柔軟なプロンプト入力、リアルタイムのマスク計算、セグメンテーションタスクにおける曖昧性の認識が可能になります。
- **SA-1Bデータセット:**Segment Anythingプロジェクトによって導入されたSA-1Bデータセットは、11百万枚の画像に10億個を超えるマスクを備えています。現在最大のセグメンテーションデータセットとして、SAMに多様で大規模な学習データソースを提供します。
- **ゼロショット性能:**SAMはさまざまなセグメンテーションタスクで優れたゼロショット性能を示すため、プロンプトエンジニアリングをほとんど必要とせず、多様な用途ですぐに使用できるツールです。
あらゆるものをセグメンテーションするモデルとSA-1Bデータセットの詳細については、Segment AnythingのGitHubをご覧いただき、研究論文Segment Anythingをご確認ください。
SAMはUltralytics Platformのスマートアノテーション機能を支え、クリックベースのインテリジェントなマスク生成によって、データセットのラベリングを高速化します。詳細はアノテーションガイドをご覧ください。
利用可能なモデル、対応タスク、動作モード#
この表では、利用可能なモデルとそれぞれの事前学習済みウェイト、対応タスク、および推論、検証、学習、エクスポートなどの各動作モードとの互換性を示しています。対応モードには✅、非対応モードには❌の絵文字が表示されます。
| モデルタイプ | 事前学習済み重み | サポートされているタスク | トレーニング | 検証 | 推論 | エクスポート |
|---|---|---|---|---|---|---|
| SAM base | sam_b.pt | インスタンスセグメンテーション | ❌ | ❌ | ✅ | ❌ |
| SAM large | sam_l.pt | インスタンスセグメンテーション | ❌ | ❌ | ✅ | ❌ |
SAMの使用方法:画像セグメンテーションにおける汎用性と性能#
あらゆるものをセグメンテーションするモデルは、学習データを超えるさまざまな下流タスクに利用できます。これには、エッジ検出、オブジェクト候補の生成、インスタンスセグメンテーション、テキストからマスクへの初期予測が含まれます。プロンプトエンジニアリングにより、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")- ここでは、プロンプト(bboxes/points/masks)を渡さない場合に画像全体をセグメンテーションします。
この方法では、画像エンコーダーを複数回実行せずに、画像を一度設定してプロンプト推論を複数回実行できます。
import cv2
from ultralytics.models.sam import Predictor as SAMPredictor
# Create SAMPredictor
overrides = {"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 = {"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, min_mask_region_area=100)上記の例で返されるresultsはすべてResultsオブジェクトであり、予測されたマスクと元画像に簡単にアクセスできます。
Segment everythingの追加引数については、Predictor/generateリファレンスをご覧ください。
SAM と YOLO の比較#
ここでは、MetaのSAM-bモデルと、YOLO26n-segを含むUltralyticsのセグメンテーションモデルを比較します。
| モデル | サイズ (MB) | パラメーター数 (M) | 速度 (CPU) (ms/im) |
|---|---|---|---|
| Meta SAM-b | 375 | 93.7 | 41703 |
| MobileSAM | 40.7 | 10.1 | 23802 |
| YOLOv8 バックボーンを使用した FastSAM-s | 23.9 | 11.8 | 58.0 |
| Ultralytics YOLOv8n-seg | 7.1 (52.8倍小型化) | 3.4 (27.6倍削減) | 24.8 (1682倍高速化) |
| Ultralytics YOLO11n-seg | 6.2(60.5倍小型) | 2.9 (32.3倍削減) | 24.3(1716倍高速) |
| Ultralytics YOLO26n-seg | 6.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 で測定しました。テストは、torch==2.10.0、ultralytics==8.4.31、onnxruntime==1.24.4 を使用し、16GB の RAM を搭載した 2025 Apple M4 Air 上で実行しました。このテストを再現するには、次の手順を実行します:
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, nms=False) # YOLO26 NMS-free head; no-op for YOLOv8/YOLO11
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")| 引数 | 型 | デフォルト | 説明 |
|---|---|---|---|
data | str | 必須 | アノテーションまたはセグメンテーションの対象画像を含むディレクトリへのパスです。 |
det_model | str | 'yolo26x.pt' | 初期オブジェクト検出に使用する YOLO 検出モデルのパスです。 |
sam_model | str | 'sam_b.pt' | セグメンテーションに使用する SAM モデルのパスです(SAM、SAM 2、MobileSAM、SAM 3 の重みをサポートします)。 |
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 | 検出するクラスインデックスのリストです(例: person と bicycle の場合は [0, 1])。 |
output_dir | str | None | アノテーションの保存先ディレクトリです(デフォルト: <data>_auto_annotate_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#
Meta の Segment Anything Model (SAM) は、プロンプトベースのセグメンテーションタスク向けに設計された画期的な画像セグメンテーションモデルです。画像エンコーダーおよびプロンプトエンコーダーと軽量なマスクデコーダーを組み合わせた高度なアーキテクチャを活用し、空間的またはテキスト的な手がかりなどのさまざまなプロンプトから高品質なセグメンテーションマスクを生成します。大規模な SA-1B dataset で訓練された Segment Anything Model (SAM) は、事前の知識なしに新しい画像分布やタスクに適応するゼロショット性能に優れています。
あらゆるものをセグメンテーションするモデル (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より詳しい使用方法については、セグメンテーションのセクションをご覧ください。
YOLOモデルと比較すると、SAM-b、MobileSAM、FastSAM-sなどのSAMバリエーションは通常、より大型で低速ですが、独自のゼロショットセグメンテーション機能を備えています。たとえば、YOLO26n-segは、CPU上でMetaの初代SAM-bモデルより56倍小型で、1650倍以上高速です。そのため、YOLOモデルは高速、軽量、計算効率の高いセグメンテーションが必要な用途に適しており、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セグメンテーションモデル、デバイス、出力ディレクトリを指定するオプション引数を受け取ります。完全なガイドについては、自動アノテーションをご覧ください。
SAMは、11百万枚の画像に10億個を超えるマスクを含む大規模なSA-1Bデータセットで学習されています。SA-1Bは現在最大のセグメンテーションデータセットであり、高品質で多様な学習データを提供することで、さまざまなセグメンテーションタスクにおける優れたゼロショット性能を実現します。詳細については、データセットのセクションをご覧ください。