Ultralytics YOLO27:
Get Started

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 示例结果

主要功能#



观看: 如何使用 Ultralytics 通过 Meta 的 SAM2 进行推理 | 分步指南 🎉

统一模型架构#

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 数据集#

为 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 交互式1.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

# 加载模型
model = SAM("sam2.1_b.pt")

# 显示模型信息(可选)
model.info()

# 使用边界框提示运行推理
results = model("path/to/image.jpg", bboxes=[100, 100, 200, 200])

# 使用单个点运行推理
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("sam2.1_b.pt")

# 显示模型信息(可选)
model.info()

# 运行推理
model("path/to/video.mp4")
  • 此示例展示了在未提供提示(边界框/点/掩码)的情况下,如何使用 SAM 2 分割图像或视频中的全部内容。

分割视频并跟踪对象#

分割视频

使用特定提示分割视频中的全部内容并跟踪对象。

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)

# 使用单个点运行推理
results = predictor(source="test.mp4", points=[920, 470], labels=[1])

# 使用多个点运行推理
results = predictor(source="test.mp4", points=[[920, 470], [909, 138]], labels=[1, 1])

# 为每个对象使用多个点提示运行推理
results = predictor(source="test.mp4", points=[[[920, 470], [909, 138]]], labels=[[1, 1]])

# 使用负点提示运行推理
results = predictor(source="test.mp4", points=[[[920, 470], [909, 138]]], labels=[[1, 0]])

动态交互式分割与跟踪#

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)

# 通过框提示定义类别
predictor(source="image1.jpg", bboxes=[[100, 100, 200, 200]], obj_ids=[0], update_memory=True)

# 在新图像中检测此特定对象
results = predictor(source="image2.jpg")

# 使用新的对象 ID 添加类别
results = predictor(
    source="image4.jpg",
    bboxes=[[300, 300, 400, 400]],  # 新对象
    obj_ids=[1],  # 新对象 ID
    update_memory=True,  # 添加到记忆中
)
# 执行推理
results = predictor(source="image5.jpg")

# 将细化提示添加到同一类别,以提升性能
# 当对象外观发生显著变化时,这会很有帮助
results = predictor(
    source="image6.jpg",
    points=[[150, 150]],  # 细化点
    labels=[1],  # 正向点
    obj_ids=[1],  # 相同的对象 ID
    update_memory=True,  # 使用新信息更新记忆
)
# 对新图像执行推理
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
FastSAM-s 搭配 YOLOv8 主干网络23.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.0、ultralytics==8.4.31 和 onnxruntime==1.24.4。复现此测试的方法:

示例
from ultralytics import ASSETS, SAM, YOLO, FastSAM

# 分析 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)

# 分析 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 2 的一项强大功能,用户可以借助预训练模型快速、准确地生成分割数据集。这项功能特别适合在无需大量人工投入的情况下创建大型、高质量的数据集。

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



观看: 如何使用 Ultralytics 和 Meta 的 Segment Anything 2 模型进行自动标注 | 数据标注

按照以下示例,使用 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 分割一切模型(SAM)的后续版本,是一款先进工具,旨在全面分割图像和视频中的对象。它采用统一且支持提示的模型架构,支持实时处理和零样本泛化,能够出色地处理复杂视觉数据。与原始 SAM 相比,SAM 2 有多项改进,包括:

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

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

  • 借助 SAM 2 支持提示的界面和实时推理能力,你可以使用 SAM 2 进行实时视频分割。以下是一个基本示例:

    使用提示进行分割

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

    from ultralytics import SAM
    
    # 加载模型
    model = SAM("sam2_b.pt")
    
    # 显示模型信息(可选)
    model.info()
    
    # 使用边界框提示进行分割
    results = model("path/to/image.jpg", bboxes=[100, 100, 200, 200])
    
    # 使用点提示进行分割
    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 包含一种复杂的记忆机制,用于处理视频数据中的时间依赖关系和遮挡。该记忆机制由以下部分组成:

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

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

  • Meta 的 SAM2-t 和 SAM2-b 等 SAM 2 模型具备强大的零样本分割能力,但与 YOLO 模型相比,它们的体积大得多、速度也慢得多。例如,在 CPU 上,YOLO26n-seg的体积约为 SAM2-b 的 1/24,速度则快 1145 倍以上。SAM 2 擅长多用途、基于提示和零样本分割场景,而 YOLO26 针对速度、效率和实时应用进行了优化,采用无需 NMS 的端到端推理,因此更适合部署在资源受限的环境中。

评论