セグメント何でもモデル (SAM)
Segment Anything Model(セグメント・エニシング・モデル、SAM )により、画像セグメンテーションのフロンティアへようこそ。この画期的なモデルは、リアルタイム・パフォーマンスによるプロンプト可能な画像セグメンテーションを導入することでゲームを変え、この分野における新たな基準を打ち立てました。
SAM の紹介:セグメント何でもモデル
Segment Anything Model(セグメント・エニシング・モデル、SAM )は、画像解析タスクに比類のない多用途性を提供する、即時可能なセグメンテーションを可能にする最先端の画像セグメンテーションモデルである。SAM は、画像セグメンテーションのための新しいモデル、タスク、データセットを導入する画期的なプロジェクト、Segment Anything イニシアティブの中核をなすものである。
SAMの高度な設計は、予備知識なしに新しい画像分布やタスクに適応することを可能にし、これはゼロショット転送として知られる機能です。1,100万枚の入念に管理された画像に広がる10億枚以上のマスクを含む膨大なSA-1BデータセットでトレーニングされたSAM は、多くのケースで以前の完全教師ありの結果を上回る、印象的なゼロショット性能を示しました。
SA-1B 画像の一例。 新しく導入されたSA-1Bデータセットのマスクを重ねたデータセット画像。SA-1Bには、1,100万枚の多様で高解像度の、ライセンスされた、プライバシー保護された画像と、11億枚の高品質なセグメンテーション・マスクが含まれています。これらのマスクは、SAM によって完全自動で注釈が付けられ、人間の評価と多くの実験によって検証されたように、高品質で多様性に富んでいる。画像は可視化のため、画像あたりのマスク数でグループ化されている(画像あたりのマスク数は平均約100)。
セグメント何でもモデル(SAM)の主な特徴
- プロンプト可能なセグメンテーションタスク: SAM は、プロンプト可能なセグメンテーションタスクを念頭に置いて設計されており、オブジェクトを特定する空間やテキストの手がかりなど、任意のプロンプトから有効なセグメンテーションマスクを生成できる。
- 高度なアーキテクチャ:セグメント何でもモデルは、強力な画像エンコーダ、プロンプトエンコーダ、および軽量マスクデコーダを採用しています。このユニークなアーキテクチャにより、柔軟なプロンプト表示、リアルタイムのマスク計算、およびセグメンテーションタスクにおけるあいまいさの認識が可能になります。
- SA-1Bデータセット:Segment Anythingプロジェクトによって導入されたSA-1Bデータセットは、1,100万枚の画像上の10億以上のマスクを特徴としている。これまでで最大のセグメンテーションデータセットとして、SAM 、多様で大規模な学習データソースを提供します。
- ゼロショット性能: SAM は、様々なセグメンテーション作業において卓越したゼロショット性能を発揮し、迅速なエンジニアリングの必要性を最小限に抑え、様々なアプリケーションにすぐに使用できるツールとなっている。
セグメント・エニシング・モデルとSA-1Bデータセットの詳細については、セグメント・エニシングのウェブサイトをご覧ください。
利用可能なモデル、サポートされるタスク、および動作モード
この表は、利用可能なモデルを、特定の事前訓練された重み、サポートするタスク、および推論、検証、トレーニング、エクスポートなどのさまざまな操作モードとの互換性を示します。
モデルタイプ | 事前に訓練されたウェイト | 対応タスク | 推論 | バリデーション | トレーニング | 輸出 |
---|---|---|---|---|---|---|
SAM ベース | sam_b.pt | インスタンスのセグメンテーション | ✅ | ❌ | ❌ | ❌ |
SAM 大きい | 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モデルとUltralytics 最小セグメンテーションモデルであるYOLO11n-segを比較する:
モデル | サイズ (MB) |
パラメータ (M) |
スピード (CPU) (ms/im) |
---|---|---|---|
メタSAM-b | 375 | 93.7 | 49401 |
MobileSAM | 40.7 | 10.1 | 25381 |
YOLOv8 バックボーンのFastSAM | 23.7 | 11.8 | 55.9 |
Ultralytics YOLOv8n-セグ | 6.7(11.7倍小さい) | 3.4倍(11.4倍減) | 24.5(1061倍速) |
Ultralytics YOLO11n-seg | 5.9(13.2倍小さい) | 2.9(13.4倍減) | 30.1(864倍速) |
この比較は、SAM 亜種とYOLO セグメンテーションモデルとの間に、モデルのサイズと速度に大きな違いがあることを示している。SAM ユニークな自動セグメンテーション機能を提供するが、YOLO モデル、特にYOLOv8nYOLO11n-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 |
重複するボックスをフィルタリングするための非最大抑制のIoUしきい値。 |
imgsz |
int |
640 |
画像のサイズを変更するための入力サイズ(32の倍数でなければならない)。 |
max_det |
int |
300 |
メモリ効率のため、画像あたりの最大検出数。 |
classes |
list[int] |
None |
検出するクラス・インデックスのリスト(例. [0, 1] 人と自転車用)。 |
output_dir |
str |
None |
注釈を保存するディレクトリ(デフォルトはデータパスからの相対パス './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社に感謝の意を表したいと思います。
よくあるご質問
Ultralytics によるセグメント何でもモデル(SAM)とは何ですか?
Ultralytics Segment Anything ModelSAM)は、プロンプトによるセグメンテーションタスクのために設計された画期的な画像セグメンテーションモデルです。画像エンコーダーとプロンプトエンコーダーを軽量マスクデコーダーと組み合わせた高度なアーキテクチャを活用し、空間やテキストなどの様々なプロンプトから高品質のセグメンテーションマスクを生成する。膨大な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、SAM2、MobileSAM、FastSAMようなSAM 亜種は、通常、より大きく、より低速ですが、ユニークなゼロショットセグメンテーション機能を提供します。例えば、Ultralytics YOLOv8n、MetaのオリジナルのSAMモデルより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 は、1,100万枚の画像にわたる10億以上のマスクから構成される広範なSA-1Bデータセットで学習されます。SA-1Bは、これまでで最大のセグメンテーションデータセットであり、高品質で多様なトレーニングデータを提供することで、様々なセグメンテーションタスクにおいて印象的なゼロショット性能を保証します。詳細については、データセットのセクションをご覧ください。