SAM 2:Segment Anything Model 2#
SAM 2 是 Meta Segment Anything Model (SAM) 的后继版本,是一款尖端工具,专为图像和视频中的全面对象分割而设计。它通过统一的可提示模型架构处理复杂的视觉数据,表现卓越,并支持实时处理和零样本泛化。
SAM 2.1 模型为 Ultralytics Platform 上的智能标注功能提供支持,实现基于点击的分割,以便快速进行数据集标注。详情请参见标注指南。

主要特性#
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 research paper。
性能与技术详情#
SAM 2 在该领域树立了新基准,在各项指标上均优于以前的模型:
| 指标 | SAM 2 | 先前 SOTA |
|---|---|---|
| 交互式视频分割 | 最佳 | - |
| 所需人工交互 | 减少 3 倍 | 基准 |
| Image Segmentation 准确率 | 有显著提升 | SAM |
| 推理速度 | 提速 6 倍 | SAM |
模型架构#
核心组件#
- 图像和视频编码器:利用基于 transformer 的架构从图像和视频帧中提取高级特征。该组件负责理解每个时间步的视觉内容。
- 提示编码器:处理用户提供的提示(点、框、掩码)以指导分割任务。这使得 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&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 交互式 | 1.54 | 0.872 |
安装#
要安装 SAM 2,请使用以下命令。所有 SAM 2 模型将在首次使用时自动下载。
pip install ultralytics如何使用 SAM 2:图像和视频分割的多功能性#
下表详细介绍了可用的 SAM 2 模型、其预训练权重、支持的任务以及与不同操作模式的兼容性,例如推理 (Inference)、验证 (Validation)、训练 (Training)和导出 (Export)。
| 模型类型 | 预训练权重 | 支持的任务 | 训练 | 验证 | 推理 | 导出 |
|---|---|---|---|---|---|---|
| SAM 2 tiny | sam2_t.pt | 实例分割 | ❌ | ❌ | ✅ | ❌ |
| SAM 2 small | sam2_s.pt | 实例分割 | ❌ | ❌ | ✅ | ❌ |
| SAM 2 base | sam2_b.pt | 实例分割 | ❌ | ❌ | ✅ | ❌ |
| SAM 2 large | 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")分割视频并跟踪对象#
使用特定提示分割整个视频内容并跟踪对象。
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]])- 此示例演示了如果未提供提示(边界框/点/掩码),如何使用 SAM 2 分割图像或视频的全部内容。
动态交互式分割与跟踪#
SAM2DynamicInteractivePredictor 是 SAM2 的高级免训练扩展,支持多帧动态交互和持续学习功能。该预测器支持实时提示更新和记忆管理,以提升一系列图像中的跟踪性能。与原版 SAM2 相比,SAM2DynamicInteractivePredictor 重构了推理流程,无需额外训练即可充分利用预训练的 SAM2 模型。

主要特性#
它提供了三项重大改进:
- 动态交互:在视频处理过程中的任何时候,都可以添加新提示来合并或跟踪后续帧中的新实例
- 持续学习:为现有实例添加新提示,随着时间的推移不断提升模型性能
- 独立多图像支持:通过记忆共享和跨图像对象跟踪,处理多个独立的图像(不一定来自视频序列)
核心功能#
- 提示灵活性:接受边界框、点和掩码作为提示
- 记忆库管理:维护一个动态记忆库以跨帧存储对象状态
- 多对象跟踪:支持使用各自的对象 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 旨在与 SAM2 模型配合使用,并原生支持通过 SAM2 支持的所有框/点/掩码提示来添加/精炼类别。它对于对象随时间出现或变化的场景特别有用,例如在视频标注或交互式编辑任务中。
参数#
| 名称 | 默认值 | 数据类型 | 描述 |
|---|---|---|---|
max_obj_num | 3 | int | 预设的最大类别数 |
update_memory | False | bool | 是否使用新提示更新内存 |
obj_ids | None | List[int] | 与提示对应的目标 ID 列表 |
用例#
SAM2DynamicInteractivePredictor 非常适合:
- 视频标注工作流:在此工作流中,新目标会在序列期间出现
- 交互式视频编辑:需要实时添加和精细化目标
- 监控应用:具有动态目标跟踪需求
- 医学影像:用于在时间序列中跟踪解剖结构
- 自主系统:需要自适应的目标检测和跟踪
- 多图像数据集:用于在独立图像之间实现一致的目标分割
- 图像集分析:需要在不同场景中跟踪目标
- 跨域分割:利用来自不同图像上下文的内存
- 半自动标注:以最少的手动干预高效创建数据集
SAM 与 YOLO 的对比#
在此,我们将 Meta 的 SAM 2 模型(包括最小的 SAM2-t 变体)与包括 YOLO26n-seg 在内的 Ultralytics 分割模型进行比较:
| 模型 | 大小 (MB) | 参数量 (M) | 速度 (CPU) (ms/im) |
|---|---|---|---|
| Meta SAM-b | 375 | 93.7 | 41703 |
| Meta SAM2-b | 162 | 80.8 | 28867 |
| Meta SAM2-t | 78.1 | 38.9 | 23430 |
| MobileSAM | MobileSAM | 10.1 | 23802 |
| 带有 YOLOv8 backbone 的 FastSAM-s | 23.9 | 11.8 | 58.0 |
| Ultralytics YOLOv8n-seg | 7.1 (小 11.0 倍) | 3.4 (少 11.4 倍) | 24.8 (快 945 倍) |
| Ultralytics YOLO11n-seg | 6.2 (小 12.6 倍) | 2.9 (少 13.4 倍) | 24.3 (快 964 倍) |
| Ultralytics YOLO26n-seg | 6.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
# 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")| 参数 | 类型 | 默认值 | 描述 |
|---|---|---|---|
data | str | 必填 | 包含目标图像的目录路径,用于标注或分割。 |
det_model | str | 'yolo26x.pt' | 用于初始目标检测的 YOLO 检测模型路径。 |
sam_model | str | 'sam_b.pt' | 用于分割的 SAM 模型路径(支持 SAM、SAM 2、MobileSAM 和 SAM 3 权重)。 |
device | str | '' | 计算设备(例如 'cuda:0'、'cpu' 或 '' 表示自动设备检测)。 |
conf | float | 0.25 | 用于过滤弱检测的 YOLO 检测置信度阈值。 |
iou | float | 0.45 | 用于非极大值抑制(Non-Maximum Suppression)以过滤重叠边界框的 IoU 阈值。 |
imgsz | int | 640 | 用于调整图像大小的输入尺寸(必须是 32 的倍数)。 |
max_det | int | 300 | 为了内存效率,每张图像的最大检测数。 |
classes | list[int] | None | 要检测的类索引列表(例如,[0, 1] 用于人和自行车)。 |
output_dir | str | None | 标注的保存目录(默认值:<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,它对原始 Segment Anything Model (SAM) 做了哪些改进?#
SAM 2 是 Meta Segment Anything Model (SAM) 的后继版本,是一款尖端工具,专为图像和视频中的全面对象分割而设计。它通过统一的可提示模型架构处理复杂的视觉数据,表现卓越,并支持实时处理和零样本泛化。与原版 SAM 相比,SAM 2 提供了多项改进,包括:
- 统一模型架构:在单个模型中结合了图像和视频分割功能。
- 实时性能:每秒处理约 44 帧,使其适用于需要即时反馈的应用。
- 零样本泛化:分割从未遇到过的新目标,在各种视觉领域中都很有用。
- 交互式精细化:允许用户通过提供额外的提示来迭代精细化分割结果。
- 高级视觉挑战处理:管理常见的视频分割挑战,例如目标遮挡和重新出现。
有关 SAM 2 架构和功能的更多详细信息,请探索 SAM 2 research paper。
如何使用 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 Dataset 部分。
SAM 2 如何处理视频分割中的遮挡和目标重新出现?#
SAM 2 包含一个复杂的内存机制来管理视频数据中的时间依赖关系和遮挡。该内存机制包括:
- 内存编码器和内存库:存储来自过去帧的特征。
- 内存注意力模块:利用存储的信息随着时间的推移保持一致的目标跟踪。
- 遮挡头:专门处理目标不可见的场景,预测目标被遮挡的可能性。
该机制确保了即使对象暂时被遮挡或离开并重新进入场景时也能保持连续性。有关更多详细信息,请参考记忆机制和遮挡处理部分。
SAM 2 与 YOLO26 等其他分割模型相比如何?#
SAM 2 模型(例如 Meta 的 SAM2-t 和 SAM2-b)提供了强大的零样本分割功能,但与 YOLO 模型相比,它们的体积明显更大,速度也更慢。例如,在 CPU 上,YOLO26n-seg 的体积大约小 24 倍,速度比 SAM2-b 快 1145 倍以上。虽然 SAM 2 在多功能、基于提示和零样本分割场景中表现出色,但 YOLO26 针对速度、效率和具有无 NMS 端到端推理的实时应用进行了优化,使其更适合在资源受限的环境中部署。