Ultralytics YOLO27:

SAM 2:任意分割模型 2#

SAM 演进

SAM 2 在原始 SAM 的基础上增加了视频分割功能。有关使用文本和图像示例提示进行可提示概念分割的内容,请参阅 SAM 3

Inference with Segment Anything 2 In Colab

SAM 2 是 Meta 的 任意分割模型(SAM) 的后继版本,是一款用于对图像和视频中的对象进行全面分割的前沿工具。它采用统一的可提示模型架构,支持实时处理和零样本泛化,在处理复杂视觉数据方面表现出色。

Ultralytics Platform 上的 SAM 2

SAM 2.1 模型为 Ultralytics Platform 上的 智能标注功能 提供支持,可通过点击进行分割,从而快速标注数据集。详情请参阅 标注指南

SAM 2 示例结果

主要特性#



Watch: How to Run Inference with Meta's SAM2 using Ultralytics | Step-by-Step Guide 🎉

统一模型架构#

SAM 2 将图像分割和视频分割功能整合到单个模型中。这种统一方式简化了部署,并确保模型在不同媒体类型上保持一致的性能。它采用灵活的基于提示的接口,支持用户通过点、边界框或掩码等不同提示类型指定感兴趣的对象。

实时性能#

该模型可实现实时推理速度,每秒处理约 44 帧。因此,SAM 2 适用于需要即时反馈的应用,例如视频编辑和增强现实。

零样本泛化#

SAM 2 能够分割从未见过的对象,展现出强大的零样本泛化能力。这对于多样化或不断变化的视觉领域尤其有用,因为预定义类别可能无法涵盖所有可能的对象。

交互式优化#

用户可以通过提供其他提示来迭代优化分割结果,从而精确控制输出。在视频标注或医学成像等应用中,这种交互能力对于微调结果至关重要。

高级视觉挑战处理#

SAM 2 包含用于处理常见视频分割挑战的机制,例如对象遮挡和重新出现。它使用先进的记忆机制来跟踪跨帧对象,即使对象暂时被遮挡或离开并重新进入场景,也能确保连续性。

如需深入了解 SAM 2 的架构和功能,请阅读 SAM 2 研究论文

性能和技术细节#

SAM 2 在该领域树立了新的基准,在多项指标上超越了以往模型:

指标SAM 2此前的 SOTA
交互式视频分割最佳-
所需人工交互次数减少 3 倍基线
图像分割准确率提升SAM
推理速度快 6 倍SAM

模型架构#

核心组件#

  • 图像和视频编码器:采用基于 Transformer 的架构,从图像和视频帧中提取高级特征。该组件负责理解每个时间步的视觉内容。
  • 提示编码器:处理用户提供的提示(点、框、掩码)以引导分割任务。这使 SAM 2 能够适应用户输入,并定位场景中的特定对象。
  • 记忆机制:包含记忆编码器、记忆库和记忆注意力模块。这些组件共同存储并利用过去帧中的信息,使模型能够持续进行一致的 对象跟踪
  • 掩码解码器:根据编码后的图像特征和提示生成最终的分割掩码。在视频中,它还会利用记忆上下文来确保跨帧的准确跟踪。

SAM 2 架构图

记忆机制和遮挡处理#

记忆机制使 SAM 2 能够处理视频数据中的时间依赖关系和遮挡。当对象移动和交互时,SAM 2 会将其特征记录到记忆库中。当对象被遮挡时,模型可以依靠这些记忆,在对象重新出现时预测其位置和外观。遮挡头专门处理对象不可见的场景,并预测对象被遮挡的可能性。

多掩码歧义消解#

在存在歧义的情况下(例如对象重叠),SAM 2 可以生成多个掩码预测结果。对于准确表示复杂场景而言,此功能至关重要,因为单个掩码可能无法充分描述场景的细节。

SA-V 数据集#

SA-V 数据集专为 SAM 2 训练开发,是现有规模最大、最多样化的视频分割数据集之一。它包括:

  • 超过 51,000 个视频:采集自 47 个国家,涵盖广泛的真实世界场景。
  • 超过 600,000 个掩码标注:详细的时空掩码标注,称为“masklets”,覆盖完整对象及其部分区域。
  • 数据集规模:视频数量是此前最大数据集的 4.5 倍,标注数量是其 53 倍,带来了前所未有的多样性和复杂性。

基准测试#

视频对象分割#

SAM 2 在主要视频分割基准测试中展现出优异性能:

数据集J&FJF
DAVIS 201782.579.885.2
YouTube-VOS81.278.983.5

交互式分割#

在交互式分割任务中,SAM 2 展现出显著的效率和准确率:

数据集NoC@90AUC
DAVIS Interactive1.540.872

安装#

要安装 SAM 2,请使用以下命令。所有 SAM 2 模型将在首次使用时自动下载。

pip install ultralytics

如何使用 SAM 2:图像和视频分割的多功能性#

下表详细列出了可用的 SAM 2 模型、其预训练权重、支持的任务,以及与不同运行模式的兼容性,例如 推理验证训练导出

模型类型预训练权重支持的任务训练验证推理导出
SAM 2 tinysam2_t.pt实例分割
SAM 2 smallsam2_s.pt实例分割
SAM 2 basesam2_b.pt实例分割
SAM 2 largesam2_l.pt实例分割
SAM 2.1 tinysam2.1_t.pt实例分割
SAM 2.1 smallsam2.1_s.pt实例分割
SAM 2.1 basesam2.1_b.pt实例分割
SAM 2.1 largesam2.1_l.pt实例分割

SAM 2 预测示例#

SAM 2 可用于广泛的任务,包括实时视频编辑、医学成像和自主系统。它同时分割静态和动态视觉数据的能力,使其成为研究人员和开发者的多功能工具。

使用提示进行分割#

使用提示进行分割

使用提示分割图像或视频中的特定对象。

from ultralytics import SAM

# Load a model
model = SAM("sam2.1_b.pt")

# Display model information (optional)
model.info()

# Run inference with bboxes prompt
results = model("path/to/image.jpg", bboxes=[100, 100, 200, 200])

# 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("sam2.1_b.pt")

# Display model information (optional)
model.info()

# Run inference
model("path/to/video.mp4")

分割视频并跟踪对象#

分割视频

使用特定提示分割整个视频内容并跟踪对象。

from ultralytics.models.sam import SAM2VideoPredictor

# Create SAM2VideoPredictor
overrides = {"conf": 0.25, "task": "segment", "mode": "predict", "imgsz": 1024, "model": "sam2_b.pt"}
predictor = SAM2VideoPredictor(overrides=overrides)

# Run inference with single point
results = predictor(source="test.mp4", points=[920, 470], labels=[1])

# Run inference with multiple points
results = predictor(source="test.mp4", points=[[920, 470], [909, 138]], labels=[1, 1])

# Run inference with multiple points prompt per object
results = predictor(source="test.mp4", points=[[[920, 470], [909, 138]]], labels=[[1, 1]])

# Run inference with negative points prompt
results = predictor(source="test.mp4", points=[[[920, 470], [909, 138]]], labels=[[1, 0]])
  • 此示例演示了在未提供提示(bboxes/points/masks)的情况下,如何使用 SAM 2 分割图像或视频的全部内容。

动态交互式分割与跟踪#

SAM2DynamicInteractivePredictor 是 SAM 2 的一个高级免训练扩展,可实现与多帧的动态交互以及持续学习功能。这个预测器支持实时的提示词更新和内存管理,以提升图像序列的跟踪性能。与原始的 SAM 2 相比,SAM2DynamicInteractivePredictor 重构了推理流程,能够充分利用预训练的 SAM 2 模型,而无需进行额外的训练。

SAM 2 示例结果

主要特性#

它提供三项重要增强功能:

  1. 动态交互:在视频处理期间的任何时刻,为后续帧中的合并对象、新对象或未跟踪对象添加新提示
  2. 持续学习:为现有对象添加新提示,以持续提升模型性能
  3. 独立多图像支持:处理多个相互独立的图像(不一定来自同一视频序列),并实现记忆共享和跨图像对象跟踪

核心功能#

  • 提示灵活性:接受边界框、点和掩码作为提示
  • 记忆库管理:维护动态记忆库,以存储跨帧的对象状态
  • 多对象跟踪:支持同时跟踪多个对象,并为每个对象分配独立的对象 ID
  • 实时更新:允许在推理期间添加新提示,而无需重新处理之前的帧
  • 独立图像处理:使用共享内存上下文处理独立图像,以保持跨图像的对象一致性
动态添加对象
from ultralytics.models.sam import SAM2DynamicInteractivePredictor

# Create SAM2DynamicInteractivePredictor
overrides = {"conf": 0.01, "task": "segment", "mode": "predict", "imgsz": 1024, "model": "sam2_t.pt", "save": False}
predictor = SAM2DynamicInteractivePredictor(overrides=overrides, max_obj_num=10)

# Define a category by box prompt
predictor(source="image1.jpg", bboxes=[[100, 100, 200, 200]], obj_ids=[0], update_memory=True)

# Detect this particular object in a new image
results = predictor(source="image2.jpg")

# Add new category with a new object ID
results = predictor(
    source="image4.jpg",
    bboxes=[[300, 300, 400, 400]],  # New object
    obj_ids=[1],  # New object ID
    update_memory=True,  # Add to memory
)
# Perform inference
results = predictor(source="image5.jpg")

# Add refinement prompts to the same category to boost performance
# This helps when object appearance changes significantly
results = predictor(
    source="image6.jpg",
    points=[[150, 150]],  # Refinement point
    labels=[1],  # Positive point
    obj_ids=[1],  # Same object ID
    update_memory=True,  # Update memory with new information
)
# Perform inference on new image
results = predictor(source="image7.jpg")
注意

SAM2DynamicInteractivePredictor 旨在与 SAM 2 模型配合使用,并支持使用 SAM 2 原生支持的所有框、点和掩码提示词来添加和精细化类别。它对于对象随时间出现或发生变化的场景(例如视频标注或交互式编辑任务)特别有用。

参数#

名称默认值数据类型描述
max_obj_num3int预设的最大类别数
update_memoryFalsebool是否使用新提示更新内存
obj_idsNoneList[int]与提示对应的对象 ID 列表

使用场景#

SAM2DynamicInteractivePredictor 适用于:

  • 视频标注工作流:序列中会出现新对象
  • 交互式视频编辑:需要实时添加和细化对象
  • 监控应用:需要动态跟踪对象
  • 医学影像:跨时间序列跟踪解剖结构
  • 自主系统:需要自适应对象检测和跟踪
  • 多图像数据集:在独立图像中保持对象分割的一致性
  • 图像集合分析:需要跨不同场景跟踪对象
  • 跨域分割:利用来自不同图像上下文的记忆
  • 半自动标注:以最少的人工干预高效创建数据集

SAM 与 YOLO 的对比#

这里将 Meta 的 SAM 2 模型(包括最小的 SAM2-t 变体)与 Ultralytics 的分割模型进行比较,其中包括 YOLO26n-seg

模型大小
(MB)
参数量
(M)
速度(CPU)
(毫秒/图像)
Meta SAM-b37593.741703
Meta SAM2-b16280.828867
Meta SAM2-t78.138.923430
MobileSAM40.710.123802
使用 YOLOv8 主干网络FastSAM-s23.911.858.0
Ultralytics YOLOv8n-seg7.1 (体积缩小 11.0 倍)3.4 (参数减少 11.4 倍)24.8 (速度提升 945 倍)
Ultralytics YOLO11n-seg6.2(小 12.6 倍)2.9 (参数减少 13.4 倍)24.3(快 964 倍)
Ultralytics YOLO26n-seg6.7 (体积缩小 11.7 倍)2.7(少 14.4 倍)25.2 (速度提升 930 倍)

此比较展示了 SAM 各变体与 YOLO 分割模型在模型大小和速度方面的显著差异。SAM 虽然提供了独特的自动分割能力,但 YOLO 模型,尤其是 YOLOv8n-seg、YOLO11n-seg 和 YOLO26n-seg,明显更小、更快且计算效率更高。

SAM 的速度使用 PyTorch 测量,YOLO 的速度使用 ONNX Runtime 测量。测试在配备 16GB RAM 的 2025 款 Apple M4 Air 上运行,使用了 torch==2.10.0ultralytics==8.4.31onnxruntime==1.24.4。如需复现此测试:

示例
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 (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 2 的一项强大功能,能够利用预训练模型快速、准确地生成分割数据集。此功能对于创建大型、高质量数据集尤其有用,而且无需投入大量人工工作。

如何使用 SAM 2 进行自动标注#



Watch: Auto Annotation with Meta's Segment Anything 2 Model using Ultralytics | Data Labeling

要使用 SAM 2 对数据集进行自动标注,请参考以下示例:

自动标注示例
from ultralytics.data.annotator import auto_annotate

auto_annotate(data="path/to/images", det_model="yolo26x.pt", sam_model="sam2_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 所在目录的同级目录)。

此函数有助于快速创建高质量的分割数据集,适合希望加速项目进展的研究人员和开发者。

限制#

尽管具有诸多优势,SAM 2 仍存在一些局限性:

  • 跟踪稳定性:在较长序列或视角发生显著变化时,SAM 2 可能会丢失对象跟踪。
  • 对象混淆:模型有时会混淆外观相似的对象,尤其是在拥挤场景中。
  • 多对象处理效率:由于对象之间缺乏通信,同时处理多个对象时,分割效率会降低。
  • 细节准确性:可能会遗漏细节,尤其是对于快速移动的对象。额外提示可以部分解决此问题,但无法保证时间平滑性。

引用和致谢#

如果 SAM 2 是你的研究或开发工作中的关键部分,请使用以下参考文献引用它:

引用
@article{ravi2024sam2,
  title={SAM 2: Segment Anything in Images and Videos},
  author={Ravi, Nikhila and Gabeur, Valentin and Hu, Yuan-Ting and Hu, Ronghang and Ryali, Chaitanya and Ma, Tengyu and Khedr, Haitham and R{\"a}dle, Roman and Rolland, Chloe and Gustafson, Laura and Mintun, Eric and Pan, Junting and Alwala, Kalyan Vasudev and Carion, Nicolas and Wu, Chao-Yuan and Girshick, Ross and Doll{\'a}r, Piotr and Feichtenhofer, Christoph},
  journal={arXiv preprint},
  year={2024}
}

我们衷心感谢 Meta AI 通过这一开创性模型和数据集为 AI 社区作出的贡献。

常见问题#

  • SAM 2 是 Meta 的 Segment Anything Model (SAM) 的后继版本,是一款面向图像和视频全面对象分割的尖端工具。它通过统一的、可提示模型架构处理复杂视觉数据,支持实时处理和零样本泛化。SAM 2 相较于原始 SAM 提供了多项改进,包括:

    • 统一模型架构:在单个模型中结合图像和视频分割能力。
    • 实时性能:每秒处理约 44 帧,适用于需要即时反馈的应用。
    • 零样本泛化:能够分割从未见过的对象,适用于多样化的视觉领域。
    • 交互式细化:允许用户通过提供额外提示,迭代细化分割结果。
    • 高级视觉挑战处理:处理对象遮挡和重新出现等常见视频分割挑战。

    如需详细了解 SAM 2 的架构和功能,请阅读 SAM 2 研究论文

  • 借助其可提示接口和实时推理能力,可以使用 SAM 2 进行实时视频分割。以下是一个基本示例:

    使用提示进行分割

    使用提示分割图像或视频中的特定对象。

    from ultralytics import SAM
    
    # Load a model
    model = SAM("sam2_b.pt")
    
    # Display model information (optional)
    model.info()
    
    # Segment with bounding box prompt
    results = model("path/to/image.jpg", bboxes=[100, 100, 200, 200])
    
    # Segment with point prompt
    results = model("path/to/image.jpg", points=[150, 150], labels=[1])

    如需更全面的使用说明,请参阅如何使用 SAM 2部分。

  • SAM 2 使用 SA-V 数据集进行训练,该数据集是现有规模最大、最多样化的视频分割数据集之一。SA-V 数据集包括:

    • 超过 51,000 个视频:采集自 47 个国家,涵盖广泛的真实世界场景。
    • 超过 600,000 个掩码标注:详细的时空掩码标注,称为“masklets”,覆盖完整对象及其部分区域。
    • 数据集规模:视频数量是之前最大数据集的 4.5 倍,标注数量是其 53 倍,带来了前所未有的多样性和复杂性。

    这一庞大的数据集使 SAM 2 能够在主要视频分割基准测试中取得更优性能,并增强其零样本泛化能力。如需更多信息,请参阅 SA-V 数据集部分。

  • SAM 2 包含一种复杂的记忆机制,用于管理视频数据中的时间依赖关系和遮挡。该记忆机制包括:

    • 记忆编码器和记忆库:存储过去帧中的特征。
    • 记忆注意力模块:利用存储的信息,随着时间推移保持一致的对象跟踪。
    • 遮挡头:专门处理对象不可见的场景,预测对象被遮挡的可能性。

    即使对象暂时被遮挡,或离开并重新进入场景,该机制也能确保连续性。如需更多详情,请参阅记忆机制和遮挡处理部分。

  • SAM 2 模型(例如 Meta 的 SAM2-t 和 SAM2-b)提供了强大的零样本分割能力,但与 YOLO 模型相比明显更大、更慢。例如,在 CPU 上,YOLO26n-seg 的体积约小 24 倍,速度快 1145 倍以上。SAM 2 在通用、基于提示和零样本分割场景中表现出色,而 YOLO26 针对速度、效率和实时应用进行了优化,并支持无 NMS 的端到端推理,因此更适合部署在资源受限的环境中。

评论