跳转至内容

SAM 2.1

我们刚刚增加了对更准确的 SAM2.1 模型支持。请尝试一下!

SAM 2:Segment Anything Model 2

在 Colab 中使用 Segment Anything 2 进行推理

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

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 适应用户输入并定位场景中的特定对象。
  • 记忆机制: 包括记忆编码器、记忆库和记忆注意力模块。这些组件共同存储和利用来自过去帧的信息,使模型能够保持一致的对象跟踪
  • Mask Decoder: 基于编码的图像特征和提示生成最终的分割掩码。在视频中,它还使用记忆上下文来确保跨帧的准确跟踪。

SAM 2 架构图

内存机制和遮挡处理

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

多掩码歧义消除

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

SA-V 数据集

SA-V数据集是为 SAM 2 的训练而开发的,是目前最大且最多样化的视频分割数据集之一,它包括:

  • 51,000+ 视频: 在47个国家/地区拍摄,提供广泛的真实场景。
  • 600,000+ Mask 标注: 详细的时空 Mask 标注,称为“masklets”,覆盖整个对象和部分。
  • 数据集规模: 视频数量是之前最大数据集的 4.5 倍,注释数量是之前的 53 倍,提供了前所未有的多样性和复杂性。

基准测试

视频对象分割

SAM 2 在主要的视频分割基准测试中表现出卓越的性能:

数据集 J&F J F
DAVIS 2017 82.5 79.8 85.2
YouTube-VOS 81.2 78.9 83.5

交互式分割

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

数据集 NoC@90 AUC
DAVIS Interactive 1.54 0.872

安装

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

pip install ultralytics

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

下表详细列出了可用的 SAM 2 模型、它们的预训练权重、支持的任务以及与不同操作模式(如推理验证训练导出)的兼容性。

模型类型 预训练权重 支持的任务 推理 验证 训练 导出
SAM 2 tiny sam2_t.pt 实例分割
SAM 2 small sam2_s.pt 实例分割
SAM 2 基础 sam2_b.pt 实例分割
SAM 2 大型 sam2_l.pt 实例分割
SAM 2.1 tiny sam2.1_t.pt 实例分割
SAM 2.1 small sam2.1_s.pt 实例分割
SAM 2.1 base sam2.1_b.pt 实例分割
SAM 2.1 large sam2.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")
# Run inference with a SAM 2 model
yolo predict model=sam2.1_b.pt source=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]])
  • 此示例演示了如果未提供提示(bboxes/points/masks),如何使用 SAM 2 分割图像或视频的整个内容。

动态互动分段和跟踪

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

SAM 2 示例结果

主要功能

它有三个重大改进:

  1. 动态互动:在视频处理过程中,随时在后续帧中添加合并/未跟踪新实例的新提示
  2. 持续学习:为现有实例添加新的提示,逐步提高模型性能
  3. 独立多图像支持:利用内存共享和跨图像对象跟踪功能处理多个独立图像(不一定来自一个视频序列

核心能力

  • 提示灵活性:接受边界框、点和遮罩作为提示
  • 内存库管理:维护动态存储库,以跨帧存储对象状态
  • 多对象跟踪支持使用单个对象 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.inference(img="image1.jpg", bboxes=[[100, 100, 200, 200]], obj_ids=[1], 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=[2],  # New object ID
    update_memory=True,  # Add to memory
)
# Perform inference
results = predictor.inference(img="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=[2],  # Same object ID
    update_memory=True,  # Update memory with new information
)
# Perform inference on new image
results = predictor(source="image7.jpg")

注意

字段 SAM2DynamicInteractivePredictor 设计为与SAM2 模型一起使用,并支持通过所有 框/点/屏蔽提示 SAM2 原生支持的对象。它特别适用于对象随时间出现或变化的场景,如视频注释或交互式编辑任务。

参数

名称 默认值 数据类型 描述
max_obj_num 3 str 预设的最大类别数
update_memory False bool 是否用新提示更新内存
obj_ids None List[int] 与提示对应的对象 ID 列表

应用案例

SAM2DynamicInteractivePredictor 的理想选择:

  • 在序列中出现新对象的视频注释工作流程
  • 需要实时添加和完善对象的交互式视频编辑
  • 需要动态物体跟踪的监控应用
  • 用于跨时间序列跟踪解剖结构的医学成像技术
  • 需要自适应物体探测和跟踪的自主系统
  • 多图像数据集,实现独立图像间一致的物体分割
  • 需要在不同场景中跟踪物体的图像采集分析
  • 利用不同图像背景的记忆进行跨域分割
  • 半自动标注,以最少的人工干预高效创建数据集

SAM 2 与 YOLO 的比较

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

模型 大小
(MB)
参数
(M)
速度 (CPU)
(ms/im)
Meta SAM-b 375 93.7 49401
Meta SAM2-b 162 80.8 31901
Meta SAM2-t 78.1 38.9 25997
MobileSAM 40.7 10.1 25381
带有 YOLOv8 主干FastSAM-s 23.7 11.8 55.9
Ultralytics YOLOv8n-seg 6.7 (小11.7倍) 3.4 (低 11.4 倍) 24.5 (快 1061 倍)
Ultralytics YOLO11n-seg 5.9 (小13.2倍) 2.9 (低 13.4 倍) 30.1 (快 864 倍)

此比较演示了 SAM 变体和 YOLO 分割模型之间模型大小和速度的显着差异。虽然 SAM 提供了独特的自动分割功能,但 YOLO 模型,特别是 YOLOv8n-seg 和 YOLO11n-seg,明显更小、更快且计算效率更高。

测试在配备 24GB 内存的 2025 款 Apple M4 Pro 上运行,使用 torch==2.6.0ultralytics==8.3.90。要重现此测试:

示例

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
for file_name in ["yolov8n-seg.pt", "yolo11n-seg.pt"]:
    model = YOLO(file_name)
    model.info()
    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="yolo11x.pt", sam_model="sam2_b.pt")
参数 类型 默认值 描述
data str 必需 包含用于标注或分割的目标图像的目录路径。
det_model str 'yolo11x.pt' YOLO 检测模型路径,用于初始对象检测。
sam_model str 'sam_b.pt' 用于分割的 SAM 模型路径(支持 SAM、SAM2 变体和 mobile_sam 模型)。
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 用于保存标注的目录(默认为相对于数据路径的 '.\/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,它在原始的 Segment Anything Model (SAM) 基础上做了哪些改进?

SAM 2 是 Meta Segment Anything Model (SAM) 的继任者,是一款先进的工具,专为图像和视频中的全面对象分割而设计。它通过统一的、可提示的模型架构,擅长处理复杂的视觉数据,支持实时处理和零样本泛化。SAM 2 在原始 SAM 的基础上进行了多项改进,包括:

  • 统一模型架构: 在单个模型中结合了图像和视频分割功能。
  • 实时性能:大约每秒处理 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 数据集是现有的最大且最多样化的视频分割数据集之一。SA-V 数据集包括:

  • 51,000+ 视频: 在47个国家/地区拍摄,提供广泛的真实场景。
  • 600,000+ Mask 标注: 详细的时空 Mask 标注,称为“masklets”,覆盖整个对象和部分。
  • 数据集规模: 视频数量是之前最大数据集的 4.5 倍,注释数量是之前的 53 倍,提供了前所未有的多样性和复杂性。

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

SAM 2 如何处理视频分割中的遮挡和物体重现问题?

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

  • Memory Encoder and Memory Bank: 存储来自过去帧的特征。
  • Memory Attention Module: 利用存储的信息来保持随时间推移的一致对象跟踪。
  • 遮挡头: 专门处理对象不可见的情况,预测对象被遮挡的可能性。

此机制确保即使当物体暂时被遮挡或离开场景后又重新进入时,也能保持连续性。更多详情请参阅记忆机制和遮挡处理章节。

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

SAM 2 模型(如 Meta 的 SAM2-t 和 SAM2-b)提供强大的零样本分割功能,但与 YOLO11 模型相比,它们明显更大且更慢。例如,YOLO11n-seg 比 SAM2-b 小约 13 倍,速度快 860 多倍。虽然 SAM 2 在通用、基于提示和零样本分割场景中表现出色,但 YOLO11 针对速度、效率和实时应用进行了优化,使其更适合在资源受限的环境中部署。



📅 创建于 1 年前 ✏️ 更新于 4 天前

评论