Segment Anything Model (SAM)
欢迎来到使用 Segment Anything Model (简称 SAM) 进行 图像分割 的前沿领域。这款革命性的模型通过引入具有实时性能的可提示图像分割,改变了游戏规则,为该领域树立了新的标准。
SAM 简介:万物分割模型
Segment Anything Model,简称 SAM,是一种先进的图像分割模型,它允许可提示分割,从而在图像分析任务中提供无与伦比的通用性。SAM 构成了 Segment Anything 计划的核心,该计划是一个开创性的项目,它为图像分割引入了一种新颖的模型、任务和数据集。
SAM 的先进设计使其能够适应新的图像分布和任务,而无需事先了解,这种特性被称为零样本迁移。SAM 在庞大的 SA-1B 数据集 上进行了训练,该数据集包含超过 10 亿个掩码,分布在 1100 万张精心策划的图像中,SAM 已经展示了令人印象深刻的零样本性能,在许多情况下超过了之前完全监督的结果。
SA-1B 示例图像。 来自新引入的 SA-1B 数据集的叠加掩码的数据集图像。SA-1B 包含 1100 万张多样化、高分辨率、已授权和隐私保护的图像以及 11 亿个高质量分割掩码。这些掩码由 SAM 全自动注释,并且经过人工评级和大量实验验证,具有高质量和多样性。图像按每个图像的掩码数量分组以进行可视化(平均每个图像有 ∼100 个掩码)。
Segment Anything Model (SAM) 的主要特性
- 可提示分割任务: SAM 的设计考虑到了可提示分割任务,允许它从任何给定的提示(例如识别对象的空间或文本线索)生成有效的分割掩码。
- 高级架构: Segment Anything Model 采用强大的图像编码器、提示编码器和轻量级掩码解码器。这种独特的架构支持灵活的提示、实时掩码计算和分割任务中的模糊感知。
- SA-1B 数据集: 由 Segment Anything 项目引入,SA-1B 数据集包含超过 10 亿个 mask,覆盖 1100 万张图像。作为迄今为止最大的分割数据集,它为 SAM 提供了多样化和大规模的训练数据来源。
- 零样本性能: SAM 在各种分割任务中表现出出色的零样本性能,使其成为一个即用型工具,适用于各种应用,且几乎不需要提示工程。
要深入了解 Segment Anything Model 和 SA-1B 数据集,请访问 Segment Anything 网站 并查看研究论文 Segment Anything。
可用模型、支持的任务和操作模式
此表显示了可用的模型及其特定的预训练权重、它们支持的任务以及它们与不同操作模式(如 推理、验证、训练和 导出)的兼容性,✅ 表情符号表示支持的模式,❌ 表情符号表示不支持的模式。
模型类型 | 预训练权重 | 支持的任务 | 推理 | 验证 | 训练 | 导出 |
---|---|---|---|---|---|---|
SAM base | 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倍) | 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 模型,特别是 YOLOv8n-seg 和 YOLO11n-seg,明显更小、更快且计算效率更高。
测试在配备 24GB 内存的 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
function 如下所示:
示例
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
function 接受图像的路径,以及用于指定预训练检测和 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) 是一种革命性的图像分割模型,专为可提示分割任务而设计。它利用先进的架构,包括图像和提示编码器以及轻量级掩码解码器,从各种提示(如空间或文本提示)生成高质量的分割掩码。SAM 在广阔的 SA-1B 数据集上进行训练,擅长零样本性能,无需先验知识即可适应新的图像分布和任务。
如何使用 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 变体(如 SAM-b、SAM2-t、MobileSAM 和 FastSAM-s)通常更大更慢,但提供独特的零样本分割能力。例如,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 分割模型的可选参数,以及设备和输出目录规范。有关完整指南,请参见Auto-Annotation。
哪些数据集用于训练 Segment Anything Model (SAM)?
SAM 在广泛的 SA-1B 数据集 上进行训练,该数据集包含超过 10 亿个掩码,涵盖 1100 万张图像。SA-1B 是迄今为止最大的分割数据集,提供高质量和多样化的训练数据,确保在各种分割任务中实现令人印象深刻的零样本性能。有关更多详细信息,请访问数据集部分。