Segment Anything 模型 (SAM)#
欢迎使用 Segment Anything 模型,探索 图像分割 的前沿技术,也就是 SAM。这个革命性的模型通过引入具备实时性能的可提示图像分割,改变了这一领域,并树立了新的标准。
SAM 简介:Segment Anything 模型#
Segment Anything 模型(SAM)是一种先进的图像分割模型,支持可提示分割,在图像分析任务中提供无与伦比的灵活性。SAM 是 Segment Anything 项目的核心。这个开创性项目为图像分割带来了全新的模型、任务和数据集。
SAM 的先进设计使其无需先验知识,就能适应新的图像分布和任务,这一特性称为零样本迁移。SAM 使用庞大的 SA-1B 数据集进行训练,该数据集包含 1100 万张经过精心筛选的图像和超过 10 亿个掩码。SAM 展现出了出色的零样本性能,在许多情况下超过了此前的全监督结果。
SA-1B 示例图像。这些数据集图像叠加了全新 SA-1B 数据集中的掩码。SA-1B 包含 1100 万张多样化、高分辨率、经授权且注重隐私保护的图像,以及 11 亿个高质量分割掩码。这些掩码均由 SAM 全自动标注;经人工评分和大量实验验证,其质量和多样性都很出色。图像按每张图像的掩码数量分组,以便可视化(平均每张图像约有 100 个掩码)。
Segment Anything 模型 (SAM) 的主要特性#
- 可提示分割任务:SAM 专为可提示分割任务而设计,可以根据任意提示生成有效的分割掩码,例如用于识别对象的空间线索或文本线索。
- 先进架构:Segment Anything 模型采用强大的图像编码器、提示编码器和轻量级掩码解码器。这种独特的架构支持灵活的提示方式、实时掩码计算,以及分割任务中的歧义感知。
- SA-1B 数据集:SA-1B 数据集由 Segment Anything 项目推出,包含 1100 万张图像和超过 10 亿个掩码。作为迄今规模最大分割数据集,它为 SAM 提供了多样且大规模的训练数据来源。
- 零样本性能:SAM 在各种分割任务中展现出卓越的零样本性能,是适用于多种应用的即用型工具,几乎不需要进行提示工程。
如需深入了解 Segment Anything 模型和 SA-1B 数据集,请访问 Segment Anything GitHub,并阅读研究论文 Segment Anything。
SAM 为 智能标注功能提供支持,该功能位于 Ultralytics Platform 上,可通过点击进行智能掩码标注,从而快速标注数据集。详情请参阅标注指南。
可用模型、支持的任务和运行模式#
此表列出了可用模型及其特定预训练权重、支持的任务,以及与不同运行模式的兼容性,例如推理、验证、训练和导出。✅ 表示支持的模式,❌ 表示不支持的模式。
如何使用 SAM:图像分割的灵活性与强大功能#
Segment Anything 模型可用于各种超出其训练数据范围的下游任务,包括边缘检测、对象候选区域生成、实例分割以及初步的文本到掩码预测。借助提示工程,SAM 可以通过零样本方式快速适应新任务和数据分布,成为满足你所有图像分割需求的灵活而强大的工具。
SAM 预测示例#
使用给定的提示分割图像。
from ultralytics import SAM
# 加载模型
model = SAM("sam_b.pt")
# 显示模型信息(可选)
model.info()
# 使用边界框提示运行推理
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")- 这里的逻辑是:如果你没有传入任何提示(边界框/点/掩码),就分割整张图像。
这样,你就可以只设置一次图像,然后多次运行提示推理,而无需多次运行图像编码器。
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 模型与 Ultralytics 分割模型进行比较,包括 YOLO26n-seg:
| 模型 | 大小 (MB) | 参数 (M) | 速度(CPU) (毫秒/图像) |
|---|---|---|---|
| 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-free 头;对 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 模型(SAM)是一种革命性的图像分割模型,专为可提示分割任务而设计。它采用先进架构,结合图像编码器、提示编码器和轻量级掩码解码器,可根据空间线索或文本线索等各种提示生成高质量分割掩码。SAM 使用庞大的 SA-1B 数据集进行训练,具备出色的零样本性能,无需先验知识即可适应新的图像分布和任务。
你可以使用 Segment Anything 模型 (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 分割模型,以及设备和输出目录。如需完整指南,请参阅自动标注。