セグメント・エニシング・モデル(SAM)#
セグメント・エニシング・モデル、すなわちSAMによる画像セグメンテーションの最前線へようこそ。この革新的なモデルは、リアルタイム性能を備えたプロンプタブルな画像セグメンテーションを実現し、この分野の新たな基準を確立しました。
SAMの紹介:セグメント・エニシング・モデル#
セグメント・エニシング・モデル、すなわちSAMは、プロンプタブルなセグメンテーションを可能にする最先端の画像セグメンテーションモデルであり、画像解析タスクで比類のない汎用性を発揮します。SAMはSegment Anythingイニシアチブの中核を担っています。この画期的なプロジェクトでは、画像セグメンテーション向けの新しいモデル、タスク、データセットが導入されています。
SAMの高度な設計により、事前知識がなくても新しい画像分布やタスクに適応できます。この機能はゼロショット転移として知られています。1,100万枚の厳選画像にわたる10億個を超えるマスクを含む大規模なSA-1Bデータセットで学習したSAMは、優れたゼロショット性能を示し、多くの場合、従来の完全教師あり学習の結果を上回っています。
SA-1Bのサンプル画像。 新たに導入されたSA-1Bデータセットの画像にマスクを重ねています。SA-1Bには、多様で高解像度かつライセンス取得済みの、プライバシーに配慮した画像が1,100万枚含まれ、さらに高品質なセグメンテーションマスクが11億個含まれています。これらのマスクはすべてSAMによって自動アノテーションされており、人による評価や多数の実験で確認されたとおり、高い品質と多様性を備えています。可視化のため、画像ごとのマスク数に応じて画像をグループ化しています(1画像あたりのマスク数は平均で約100個です)。
セグメント・エニシング・モデル(SAM)の主な特徴#
- プロンプタブルなセグメンテーションタスク: SAMは、プロンプタブルなセグメンテーションタスクを念頭に設計されています。オブジェクトを特定する空間的な手掛かりやテキストなど、任意のプロンプトから有効なセグメンテーションマスクを生成できます。
- 高度なアーキテクチャ: セグメント・エニシング・モデルは、高性能な画像エンコーダー、プロンプトエンコーダー、軽量なマスクデコーダーを採用しています。この独自のアーキテクチャにより、柔軟なプロンプト指定、リアルタイムのマスク計算、セグメンテーションタスクにおける曖昧さの認識が可能になります。
- SA-1Bデータセット: Segment Anythingプロジェクトによって導入されたSA-1Bデータセットには、1,100万枚の画像にわたる10億個を超えるマスクが含まれています。現在までで最大のセグメンテーションデータセットとして、多様で大規模な学習データをSAMに提供します。
- ゼロショット性能: SAMはさまざまなセグメンテーションタスクで優れたゼロショット性能を発揮するため、プロンプトエンジニアリングを最小限に抑えながら、多様な用途ですぐに利用できます。
セグメント・エニシング・モデルとSA-1Bデータセットの詳細については、Segment AnythingのGitHubをご覧いただき、研究論文Segment Anythingをご確認ください。
SAMはUltralytics Platformのスマートアノテーション機能を支え、クリック操作によるインテリジェントなマスキングで、データセットのラベリングを迅速に行えるようにします。詳細はアノテーションガイドをご覧ください。
利用可能なモデル、サポート対象タスク、動作モード#
この表では、利用可能なモデルとそれぞれの事前学習済み重み、サポート対象タスク、および推論、検証、学習、エクスポートなどの各動作モードとの互換性を示します。サポートされるモードには✅、サポートされないモードには❌の絵文字が付いています。
| モデルタイプ | 事前学習済み重み | サポートされるタスク | トレーニング | 検証 | 推論 | エクスポート |
|---|---|---|---|---|---|---|
| SAMベース | sam_b.pt | インスタンスセグメンテーション | ❌ | ❌ | ✅ | ❌ |
| SAMラージ | sam_l.pt | インスタンスセグメンテーション | ❌ | ❌ | ✅ | ❌ |
SAMの使い方:画像セグメンテーションにおける汎用性と性能#
セグメント・エニシング・モデルは、学習データを超えるさまざまな下流タスクに利用できます。これには、エッジ検出、オブジェクト候補の生成、インスタンスセグメンテーション、初期段階のテキストからマスクへの予測が含まれます。プロンプトエンジニアリングを活用すると、SAMはゼロショット方式で新しいタスクやデータ分布にすばやく適応できるため、あらゆる画像セグメンテーションのニーズに対応する汎用性と高い能力を備えたツールとなります。
SAMの推論例#
指定したプロンプトを使って画像をセグメント化します。
from ultralytics import SAM
# モデルを読み込む
model = SAM("sam_b.pt")
# モデル情報を表示(任意)
model.info()
# bboxesプロンプトを使用して推論を実行
results = model("ultralytics/assets/zidane.jpg", bboxes=[439, 437, 524, 709])
# 単一ポイントを使用して推論を実行
results = model(points=[900, 370], labels=[1])
# 複数のポイントを使用して推論を実行
results = model(points=[[400, 370], [900, 370]], labels=[1, 1])
# オブジェクトごとに複数のポイントプロンプトを使用して推論を実行
results = model(points=[[[400, 370], [900, 370]]], labels=[[1, 1]])
# ネガティブポイントプロンプトを使用して推論を実行
results = model(points=[[[400, 370], [900, 370]]], labels=[[1, 0]])画像全体をセグメント化します。
from ultralytics import SAM
# モデルを読み込む
model = SAM("sam_b.pt")
# モデル情報を表示(任意)
model.info()
# 推論を実行
model("path/to/image.jpg")- ここでは、プロンプト(bbox/点/マスク)を渡さない場合に画像全体をセグメント化する仕組みになっています。
この方法では、画像エンコーダーを繰り返し実行することなく、画像を一度設定して、複数のプロンプトで推論を実行できます。
import cv2
from ultralytics.models.sam import Predictor as SAMPredictor
# SAMPredictorを作成
overrides = {"conf": 0.25, "task": "segment", "mode": "predict", "imgsz": 1024, "model": "mobile_sam.pt"}
predictor = SAMPredictor(overrides=overrides)
# 画像を設定
predictor.set_image("ultralytics/assets/zidane.jpg") # 画像ファイルを設定
predictor.set_image(cv2.imread("ultralytics/assets/zidane.jpg")) # np.ndarrayを設定
results = predictor(bboxes=[439, 437, 524, 709])
# 単一点プロンプトで推論を実行
results = predictor(points=[900, 370], labels=[1])
# 複数の点プロンプトで推論を実行
results = predictor(points=[[400, 370], [900, 370]], labels=[1, 1])
# ネガティブポイントプロンプトを使用して推論を実行
results = predictor(points=[[[400, 370], [900, 370]]], labels=[[1, 0]])
# 画像をリセット
predictor.reset_image()追加の引数を指定してすべてをセグメント化します。
from ultralytics.models.sam import Predictor as SAMPredictor
# SAMPredictorを作成
overrides = {"conf": 0.25, "task": "segment", "mode": "predict", "imgsz": 1024, "model": "mobile_sam.pt"}
predictor = SAMPredictor(overrides=overrides)
# 追加の引数を指定してセグメント化
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 |
| FastSAM-sとYOLOv8のバックボーン | 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で測定しました。テストは16GBのRAMを搭載した2025年製Apple M4 Airで、torch==2.10.0、ultralytics==8.4.31、onnxruntime==1.24.4を使用して実施しました。このテストを再現するには、次の手順を実行してください。
from ultralytics import ASSETS, SAM, YOLO, FastSAM
# SAM-b、MobileSAMのプロファイルを取得
for file in ["sam_b.pt", "mobile_sam.pt"]:
model = SAM(file)
model.info()
model(ASSETS)
# FastSAM-sのプロファイルを取得
model = FastSAM("FastSAM-s.pt")
model.info()
model(ASSETS)
# YOLOモデル(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フリーヘッド。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 | 重複するボックスを除外するための非最大値抑制のIoUしきい値。 |
imgsz | int | 640 | 画像のリサイズに使用する入力サイズ(必要に応じて32の倍数に切り上げられます)。 |
max_det | int | 300 | メモリ効率を高めるための、画像ごとの検出数の最大値。 |
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に感謝申し上げます。
よくある質問#
Metaのセグメント・エニシング・モデル(SAM)は、プロンプタブルなセグメンテーションタスク向けに設計された革新的な画像セグメンテーションモデルです。画像エンコーダーとプロンプトエンコーダーを軽量なマスクデコーダーと組み合わせた高度なアーキテクチャを活用し、空間的な手掛かりやテキストなど、さまざまなプロンプトから高品質なセグメンテーションマスクを生成します。大規模なSA-1Bデータセットで学習したSAMは、事前知識がなくても新しい画像分布やタスクに適応し、優れたゼロショット性能を発揮します。
バウンディングボックスや点など、さまざまなプロンプトを使って推論を実行すると、セグメント・エニシング・モデル(SAM)を画像セグメンテーションに使用できます。Pythonを使った例を以下に示します。
from ultralytics import SAM # モデルを読み込む model = SAM("sam_b.pt") # バウンディングボックスのプロンプトでセグメント化 model("ultralytics/assets/zidane.jpg", bboxes=[439, 437, 524, 709]) # 点プロンプトを指定してセグメント化 model("ultralytics/assets/zidane.jpg", points=[900, 370], labels=[1]) # 複数の点プロンプトを指定してセグメント化 model("ultralytics/assets/zidane.jpg", points=[[400, 370], [900, 370]], labels=[1, 1]) # オブジェクトごとに複数の点プロンプトを指定してセグメント化 model("ultralytics/assets/zidane.jpg", points=[[[400, 370], [900, 370]]], labels=[[1, 1]]) # 負の点プロンプトを指定してセグメント化します。 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派生モデルは一般にサイズが大きく、速度も遅い一方、独自のゼロショットセグメンテーション機能を備えています。たとえば、CPU上ではYOLO26n-segは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は、1,100万枚の画像にわたる10億個を超えるマスクを含む大規模なSA-1Bデータセットで学習されています。SA-1Bは現在までで最大のセグメンテーションデータセットであり、高品質で多様な学習データを提供することで、さまざまなセグメンテーションタスクで優れたゼロショット性能を実現します。詳細については、データセットのセクションをご覧ください。