通用分割模型(SAM)#
欢迎来到图像分割的前沿领域,体验通用分割模型(SAM)。这一革命性模型引入了具备实时性能的可提示图像分割,改变了行业格局,并树立了该领域的新标准。
SAM 简介:通用分割模型#
通用分割模型(SAM)是一种先进的图像分割模型,支持可提示分割,为图像分析任务提供了无与伦比的灵活性。SAM 是 Segment Anything 项目的核心,该项目引入了一种用于图像分割的新型模型、任务和数据集,具有开创性意义。
SAM 的先进设计使其无需先验知识即可适应新的图像分布和任务,这种能力称为零样本迁移。SAM 在规模庞大的 SA-1B 数据集上训练,该数据集包含分布于 1,100 万张精心筛选图像中的超过 10 亿个掩码。SAM 展现了令人印象深刻的零样本性能,在许多情况下超过了此前的全监督结果。
SA-1B 示例图像。 数据集图像叠加了新推出的 SA-1B 数据集中的掩码。SA-1B 包含 1,100 万张多样化、高分辨率、获得许可且保护隐私的图像,以及 11 亿个高质量分割掩码。这些掩码完全由 SAM 自动标注,并经人工评分和大量实验验证,具有较高的质量和多样性。图像按每张图像的掩码数量分组以便可视化(平均每张图像约有 ∼100 个掩码)。
通用分割模型(SAM)的主要特性#
- 可提示分割任务: SAM 专为可提示分割任务设计,可以根据任意给定提示生成有效的分割掩码,例如用于识别对象的空间线索或文本线索。
- 先进架构: 通用分割模型采用强大的图像编码器、提示编码器和轻量级掩码解码器。这种独特架构支持灵活提示、实时掩码计算以及分割任务中的歧义感知。
- SA-1B 数据集: SA-1B 数据集由 Segment Anything 项目推出,包含 1,100 万张图像中的超过 10 亿个掩码。作为目前最大的分割数据集,它为 SAM 提供了多样且大规模的训练数据来源。
- 零样本性能: SAM 在各种分割任务中展现出出色的零样本性能,只需极少的提示工程即可用于多种应用。
如需深入了解通用分割模型和 SA-1B 数据集,请访问 Segment Anything GitHub,并阅读研究论文 Segment Anything。
SAM 为 Ultralytics Platform 上的智能标注功能提供支持,实现基于点击的智能掩码生成,从而快速标注数据集。详情请参阅标注指南。
可用模型、支持的任务和运行模式#
此表列出了可用模型及其特定的预训练权重、支持的任务,以及与不同运行模式的兼容性,例如推理、验证、训练和导出。支持的模式以 ✅ 表示,不支持的模式以 ❌ 表示。
如何使用 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/点/掩码),就分割整张图像。
这样,你可以只设置一次图像,然后多次运行提示推理,而无需多次运行图像编码器。
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 模型与 Ultralytics 的分割模型进行比较,其中包括 YOLO26n-seg:
| 模型 | 大小 (MB) | 参数量 (M) | 速度(CPU) (毫秒/图像) |
|---|---|---|---|
| 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 测量。测试在配备 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
# 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 | 用于非极大值抑制以过滤重叠框的 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 的 Segment Anything Model (SAM) 是一种专为可提示分割任务设计的革命性图像分割模型。它利用先进的架构(包括图像和提示编码器以及轻量级掩码解码器),从空间或文本提示等各种提示中生成高质量的分割掩码。SAM 在庞大的 SA-1B dataset 上进行训练,在零样本性能方面表现出色,能够在没有先验知识的情况下适应新的图像分布和任务。
你可以通过边界框或点等各种提示运行推理,使用通用分割模型(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 变体通常更大、更慢,但具备独特的零样本分割能力。例如,在 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 分割模型的可选参数,同时还可指定设备和输出目录。完整指南请参阅自动标注。