SAM 2.1
我们刚刚增加了对更准确的 SAM2.1 模型支持。请尝试一下!
SAM 2:Segment Anything Model 2
SAM 2 是 Meta Segment Anything Model (SAM) 的继任者,是一款先进的工具,专为图像和视频中的全面对象分割而设计。它通过统一的、可提示的模型架构,擅长处理复杂的视觉数据,支持实时处理和零样本泛化。
主要功能
观看: 如何使用 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 可以生成多个掩码预测。此功能对于准确表示复杂场景至关重要,因为单个掩码可能无法充分描述场景的细微之处。
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 模型,而无需额外的训练。
主要功能
它有三个重大改进:
- 动态互动:在视频处理过程中,随时在后续帧中添加合并/未跟踪新实例的新提示
- 持续学习:为现有实例添加新的提示,逐步提高模型性能
- 独立多图像支持:利用内存共享和跨图像对象跟踪功能处理多个独立图像(不一定来自一个视频序列
核心能力
- 提示灵活性:接受边界框、点和遮罩作为提示
- 内存库管理:维护动态存储库,以跨帧存储对象状态
- 多对象跟踪支持使用单个对象 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.0
和 ultralytics==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 针对速度、效率和实时应用进行了优化,使其更适合在资源受限的环境中部署。