Ultralytics YOLO27:
Get Started

Segment Anything 模型 (SAM)#

SAM 的演进

这是 Meta 推出的原始 SAM 模型。如需更强大的功能,请参阅 SAM 2 进行视频分割,或参阅 SAM 3,了解如何通过文本和图像示例提示进行可提示概念分割。

How to use Segment Anything In Colab

欢迎使用 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 数据集中的掩码。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。

Ultralytics Platform 上的 SAM

SAM 为 智能标注功能提供支持,该功能位于 Ultralytics Platform 上,可通过点击进行智能掩码标注,从而快速标注数据集。详情请参阅标注指南。

可用模型、支持的任务和运行模式#

此表列出了可用模型及其特定预训练权重、支持的任务,以及与不同运行模式的兼容性,例如推理、验证、训练和导出。✅ 表示支持的模式,❌ 表示不支持的模式。

模型类型预训练权重支持的任务训练验证推理导出
SAM 基础版sam_b.pt实例分割❌❌✅❌
SAM 大型版sam_l.pt实例分割❌❌✅❌

如何使用 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")
  • 这里的逻辑是:如果你没有传入任何提示(边界框/点/掩码),就分割整张图像。
SAMPredictor 示例

这样,你就可以只设置一次图像,然后多次运行提示推理,而无需多次运行图像编码器。

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 对象,便于访问预测掩码和源图像。

SAM 与 YOLO 对比#

这里将 Meta 的 SAM-b 模型与 Ultralytics 分割模型进行比较,包括 YOLO26n-seg:

模型大小
(MB)
参数
(M)
速度(CPU)
(毫秒/图像)
Meta SAM-b37593.741703
MobileSAM40.710.123802
FastSAM-s 搭配 YOLOv8 主干网络23.911.858.0
Ultralytics YOLOv8n-seg7.1(小 52.8 倍)3.4(少 27.6 倍)24.8(快 1682 倍)
Ultralytics YOLO11n-seg6.2(小 60.5 倍)2.9(少 32.3 倍)24.3(快 1716 倍)
Ultralytics YOLO26n-seg6.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")
参数类型默认值说明
datastr必需包含待标注或分割目标图像的目录路径。
det_modelstr'yolo26x.pt'用于初始对象检测的 YOLO 检测模型路径。
sam_modelstr'sam_b.pt'用于分割的 SAM 模型路径(支持 SAM、SAM 2、MobileSAM 和 SAM 3 权重)。
devicestr''计算设备(例如 'cuda:0'、'cpu',或 '' 表示自动检测设备)。
conffloat0.25用于过滤低置信度检测结果的 YOLO 检测置信度阈值。
ioufloat0.45用于通过非极大值抑制过滤重叠框的 IoU 阈值。
imgszint640图像缩放输入尺寸(如有需要,会向上取整为 32 的倍数)。
max_detint300为提高内存效率,每张图像的最大检测数。
classeslist[int]None要检测的类别索引列表(例如,[0, 1] 表示人和自行车)。
output_dirstrNone标注结果的保存目录(默认:同级目录中的 <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 分割模型,以及设备和输出目录。如需完整指南,请参阅自动标注。

  • SAM 使用规模庞大的 SA-1B 数据集进行训练,该数据集包含 1100 万张图像和超过 10 亿个掩码。SA-1B 是迄今规模最大的分割数据集,提供高质量且多样化的训练数据,确保 SAM 在各种分割任务中展现出出色的零样本性能。详情请参阅数据集章节。

评论