Segment Anything Model (SAM)#
Segment Anything Model(SAM)で画像セグメンテーションの最先端へようこそ。この革新的なモデルは、リアルタイムパフォーマンスを備えたプロンプト可能な画像セグメンテーションを導入することでゲームのルールを変え、この分野における新たな基準を打ち立てました。
SAMの紹介:Segment Anything Model#
Segment Anything Model (SAM) は、プロンプトによるセグメンテーションを可能にし、画像解析タスクにおいて比類のない汎用性を提供する最先端の画像セグメンテーションモデルです。SAMは、画像セグメンテーションのための新しいモデル、タスク、およびデータセットを導入する画期的なプロジェクトであるSegment Anythingイニシアチブの中核を成しています。
SAMの高度な設計により、事前知識なしで新しい画像分布やタスクに適応することができます。この機能はゼロショット転移と呼ばれます。1,100万枚以上の慎重にキュレーションされた画像にわたる10億を超えるマスクを含む、広大なSA-1B datasetでトレーニングされたSAMは、印象的なゼロショットパフォーマンスを発揮し、多くの場合において従来の完全教師あり学習の結果を上回っています。
SA-1Bのサンプル画像。 新たに導入されたSA-1Bデータセットのマスクがオーバーレイされたデータセット画像です。SA-1Bには、1,100万枚の多様な高解像度かつライセンス取得済みのプライバシー保護画像と、11億個の高品質なセグメンテーションマスクが含まれています。これらのマスクはSAMによって完全自動でアノテーションされており、人間の評価や多数の実験によって検証された通り、高い品質と多様性を備えています。画像は、視覚化のために1画像あたりのマスク数でグループ化されています(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をご確認ください。
SAMはUltralytics Platform上のsmart annotation featureを駆動し、クリックベースのインテリジェントなマスキングを可能にして高速なデータセットのラベリングを実現します。詳細はannotation guideをご覧ください。
利用可能なモデル、サポートされているタスク、および動作モード#
この表では、利用可能なモデルとそれぞれの特定の事前学習済み重み、サポートするタスク、および推論、検証、トレーニング、エクスポートなどのさまざまな操作モードとの互換性を示しています。サポートされているモードは✅絵文字で、サポートされていないモードは❌絵文字で示されます。
| モデルタイプ | 事前学習済みウェイト | サポートされるタスク | トレーニング | バリデーション | 推論 | エクスポート |
|---|---|---|---|---|---|---|
| SAM base | sam_b.pt | Instance Segmentation | ❌ | ❌ | ✅ | ❌ |
| SAM large | sam_l.pt | Instance Segmentation | ❌ | ❌ | ✅ | ❌ |
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/ポイント/マスク)を渡さない場合に画像全体をセグメント化することです。
この方法を使用すると、画像を一度セットするだけで、画像エンコーダーを何度も実行することなく、プロンプト推論を複数回実行できます。
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)上記の例で返されるすべての 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 backboneを使用した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)
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(NMS)用IoU閾値です。 |
imgsz | int | 640 | 画像のリサイズに使用する入力サイズ(32の倍数である必要があります)。 |
max_det | int | 300 | メモリ効率のために、画像1枚あたりの最大検出数です。 |
classes | list[int] | None | 検出するクラスインデックスのリスト(例:人物と自転車の場合は [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)#
UltralyticsのSegment Anything Model (SAM)とは何ですか?#
UltralyticsによるSegment Anything Model(SAM)は、プロンプト可能なセグメンテーションタスク向けに設計された革新的な画像セグメンテーションモデルです。画像およびプロンプトエンコーダーと軽量なマスクデコーダーを組み合わせた高度なアーキテクチャを活用し、空間的またはテキストの手がかりなどのさまざまなプロンプトから高品質なセグメンテーションマスクを生成します。広範なSA-1B datasetでトレーニングされた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セグメンテーションモデル用のオプション引数、デバイスおよび出力ディレクトリの指定を受け取ります。完全なガイドについては、自動アノテーションをご覧ください。
Segment Anything Model (SAM)の学習にはどのデータセットが使用されていますか?#
SAMは、1,100万枚の画像にわたる10億を超えるマスクで構成される広範なSA-1B datasetでトレーニングされています。SA-1Bはこれまでにない最大のセグメンテーションデータセットであり、高品質で多様なトレーニングデータを提供し、さまざまなセグメンテーションタスクにおいて印象的なゼロショットパフォーマンスを保証します。詳細については、データセットセクションをご覧ください。