SAM 2:Segment Anything Model 2

SAM 演进

SAM 2 在原始 SAM 的基础上增加了视频分割功能。关于支持文本和图像示例提示的“可提示概念分割”,请参阅 SAM 3

Inference with Segment Anything 2 In Colab

SAM 2 是 Meta 的 Segment Anything Model (SAM) 的继任者,是一款尖端工具,专为图像和视频中的全面对象分割而设计。它通过统一的、可提示的模型架构,能够出色地处理复杂的视觉数据,并支持实时处理和零样本泛化。

Ultralytics Platform 上的 SAM 2

SAM 2.1 models power the smart annotation feature on Ultralytics Platform, enabling click-based segmentation for fast dataset labeling. See the annotation guide for details.

SAM 2 Example Results

主要特性



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 Architecture Diagram

记忆机制与遮挡处理

记忆机制允许 SAM 2 处理视频数据中的时间依赖性和遮挡。随着对象的移动和交互,SAM 2 将其特征记录在记忆库中。当对象被遮挡时,模型可以依靠此记忆来预测其重现时的位置和外观。遮挡头专门处理对象不可见的场景,并预测对象被遮挡的可能性。

多掩码歧义解析

在存在歧义的情况下(例如重叠的对象),SAM 2 可以生成多个掩码预测。此功能对于准确表示复杂场景至关重要,因为在这些场景中,单一掩码可能不足以描述场景的细微差别。

SA-V 数据集

为 SAM 2 训练开发的 SA-V 数据集是目前可用规模最大、种类最丰富的视频分割数据集之一。它包括:

  • 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 = dict(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]])
  • 此示例演示了如果未提供提示(边界框/点/掩码),SAM 2 如何用于分割图像或视频的全部内容。

动态交互式分割与跟踪

SAM2DynamicInteractivePredictor 是 SAM2 的一种先进的无需训练扩展,支持与多帧进行动态交互及持续学习能力。该预测器支持实时提示更新和内存管理,从而提升跨图像序列的跟踪性能。与原始 SAM2 相比,SAM2DynamicInteractivePredictor 重构了推理流程,能够充分利用预训练的 SAM2 模型,而无需额外的训练。

SAM 2 示例结果

主要特性

它带来了三项重大改进:

  1. 动态交互:在视频处理过程中的任何时刻,添加新的提示以合并或跟踪后续帧中新出现的实例。
  2. 持续学习:为现有实例添加新提示,以随时间推移提高模型性能。
  3. 独立的图像支持:通过内存共享和跨图像对象跟踪,处理多个独立图像(不一定是视频序列中的图像)。

核心功能

  • 提示灵活性:接受 BBox、点和掩码作为提示。
  • 内存库管理:维护一个动态内存库,用于存储跨帧的对象状态。
  • 多目标跟踪:支持通过独立对象 ID 同时跟踪多个对象。
  • 实时更新:允许在推理期间添加新提示,而无需重新处理之前的帧。
  • 独立图像处理:处理具有共享内存上下文的独立图像,以实现跨图像的对象一致性。
动态对象添加
from ultralytics.models.sam import SAM2DynamicInteractivePredictor

# Create SAM2DynamicInteractivePredictor
overrides = dict(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 旨在与 SAM2 模型配合使用,并原生支持通过 SAM2 所支持的所有 box/point/mask 提示 来添加/细化类别。它特别适用于对象随时间出现或发生变化的场景,例如视频标注或交互式编辑任务。

参数

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

用例

SAM2DynamicInteractivePredictor 非常适合:

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

SAM 与 YOLO 的对比

在此,我们将 Meta 的 SAM 2 模型(包括最小的 SAM2-t 变体)与包括 YOLO26n-seg 在内的 Ultralytics 分割模型进行了比较:

模型大小
(MB)
参数
(M)
速度 (CPU)
(ms/im)
Meta SAM-b37593.741703
Meta SAM2-b16280.828867
Meta SAM2-t78.138.923430
MobileSAM40.710.123802
FastSAM-s 使用 YOLOv8 骨干网络23.911.858.0
Ultralytics YOLOv8n-seg7.1 (11.0x 更小)3.4 (11.4x 更少)24.8 (945x 更快)
Ultralytics YOLO11n-seg6.2 (12.6x 更小)2.9 (13.4x 更少)24.3 (964x 更快)
Ultralytics YOLO26n-seg6.7 (11.7x 更小)2.7 (14.4x 更少)25.2 (930x 更快)

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

SAM 速度使用 PyTorch 测量,YOLO 速度使用 ONNX Runtime 测量。测试在 2025 年的 Apple M4 Air(16GB 内存)上运行,使用 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)
    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、SAM2 变体和 MobileSAM 模型)。
devicestr''计算设备(例如 'cuda:0'、'cpu',或 '' 用于自动设备检测)。
conffloat0.25用于过滤弱检测的 YOLO 检测置信度阈值。
ioufloat0.45用于非极大值抑制(NMS)以过滤重叠框的 IoU 阈值。
imgszint640调整图像大小的输入尺寸(必须是 32 的倍数)。
max_detint300每张图像的最大检测数量,用于提高内存效率。
classeslist[int]None要检测的类索引列表(例如 [0, 1] 代表人和自行车)。
output_dirstrNone标注的保存目录(默认相对于数据路径为 './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 社区所做出的贡献。

常见问题 (FAQ)

什么是 SAM 2,它如何改进了原始的 Segment Anything Model (SAM)?

SAM 2 是 Meta Segment Anything Model (SAM) 的继任者,是一款专为图像和视频中的全面对象分割而设计的尖端工具。它通过支持实时处理和零样本泛化的统一可提示模型架构,在处理复杂视觉数据方面表现出色。与原始 SAM 相比,SAM 2 提供了多项改进,包括:

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

关于 SAM 2 架构和功能的更多详细信息,请浏览 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 使用了哪些数据集进行训练,它们如何增强了其性能?

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

  • 51,000+ 个视频:在 47 个国家/地区捕获,提供了广泛的现实世界场景。
  • 600,000+ 个掩码标注:详细的时空掩码标注(称为“masklets”),涵盖了整个对象及其部件。
  • 数据集规模:与此前最大的数据集相比,视频数量增加了 4.5 倍,标注数量增加了 53 倍,提供了前所未有的多样性和复杂性。

这一海量数据集使 SAM 2 能够在主要的视频分割基准测试中实现卓越的性能,并增强了其零样本泛化能力。更多信息,请参见 SA-V 数据集 部分。

SAM 2 如何处理视频分割中的遮挡和对象重现?

SAM 2 包含一个复杂的内存机制,用于管理视频数据中的时间依赖性和遮挡。内存机制包括:

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

即使对象暂时被遮挡或离开并重新进入场景,该机制也能确保连续性。有关更多详细信息,请参考 内存机制与遮挡处理 部分。

SAM 2 与 YOLO26 等其他分割模型相比如何?

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

评论