Segment Anything Model (SAM)
欢迎来到Segment Anything Model(SAM)的图像分割前沿。这一革命性模型通过引入具有实时性能的可提示图像分割,为该领域设定了新的标准。
SAM简介:Segment Anything Model
Segment Anything Model(SAM)是一种先进的图像分割模型,允许进行可提示的分割,为图像分析任务提供了无与伦比的灵活性。SAM构成了Segment Anything计划的核心,这是一个开创性的项目,引入了新的模型、任务和数据集用于图像分割。
SAM的高级设计使其能够适应新的图像分布和任务,而无需先验知识,这一特性称为零样本迁移。在包含超过10亿个掩码的广泛SA-1B数据集上进行训练,该数据集包含超过1100万张精心策划的图像,SAM展示了令人印象深刻的零样本性能,在许多情况下超过了之前的完全监督结果。
SA-1B示例图像。 数据集图像覆盖了新引入的SA-1B数据集中的掩码。SA-1B包含1100万张多样、高分辨率、获得许可且保护隐私的图像和11亿个高质量分割掩码。这些掩码由SAM完全自动标注,并通过人工评级和多次实验验证,具有高质量和多样性。图像按每张图像的掩码数量分组以供可视化(平均每张图像约有100个掩码)。
Segment Anything Model (SAM)的关键特性
- 可提示分割任务: SAM设计时考虑了可提示的分割任务,使其能够从任何给定的提示(如空间或文本线索识别对象)生成有效的分割掩码。
- 高级架构: Segment Anything Model采用了一个强大的图像编码器、一个提示编码器和一个轻量级掩码解码器。这种独特的架构实现了灵活的提示、实时的掩码计算以及分割任务中的模糊性意识。
- SA-1B数据集: 由Segment Anything项目引入的SA-1B数据集在1100万张图像上包含超过10亿个掩码。作为迄今为止最大的分割数据集,它为SAM提供了多样且大规模的训练数据源。
- 零样本性能: SAM在各种分割任务中展示了出色的零样本性能,使其成为适用于多样应用的即用型工具,几乎不需要提示工程。
如需深入了解Segment Anything Model和SA-1B数据集,请访问Segment Anything网站并查看研究论文Segment Anything。
可用模型、支持的任务和操作模式
此表展示了可用模型及其特定的预训练权重、支持的任务以及与不同操作模式的兼容性,如推理、验证、训练和导出,支持的模式用✅表情符号表示,不支持的模式用❌表情符号表示。
模型类型 | 预训练权重 | 支持的任务 | 推理 | 验证 | 训练 | 导出 |
---|---|---|---|---|---|---|
SAM base | sam_b.pt | 实例分割 | ✅ | ❌ | ❌ | ❌ |
SAM large | sam_l.pt | 实例分割 | ✅ | ❌ | ❌ | ❌ |
如何使用SAM:图像分割中的多功能性和强大性能
Segment Anything Model 可以用于多种下游任务,这些任务超出了其训练数据的范围。这包括边缘检测、对象提议生成、实例分割,以及初步的文本到掩码预测。通过提示工程,SAM 可以快速适应新的任务和数据分布,以零样本方式进行,使其成为满足您所有图像分割需求的通用且强大的工具。
SAM 预测示例
使用提示进行分割
使用给定的提示分割图像。
from ultralytics import SAM
# 加载模型
model = SAM("sam_b.pt")
# 显示模型信息(可选)
model.info()
# 使用边界框提示进行推理
results = model("ultralytics/assets/zidane.jpg", bboxes=[439, 437, 524, 709])
# 使用单点进行推理
results = predictor(points=[900, 370], labels=[1])
# 使用多点进行推理
results = predictor(points=[[400, 370], [900, 370]], labels=[1, 1])
# 每个对象使用多点提示进行推理
results = predictor(points=[[[400, 370], [900, 370]]], labels=[[1, 1]])
# 使用负点提示进行推理
results = predictor(points=[[[400, 370], [900, 370]]], labels=[[1, 0]])
分割整个图像
分割整个图像。
- 这里的逻辑是,如果您不传递任何提示(边界框/点/掩码),则分割整个图像。
SAMPredictor 示例
这种方式允许您设置图像一次,并在不多次运行图像编码器的情况下多次运行提示推理。
from ultralytics.models.sam import Predictor as SAMPredictor
# 创建 SAMPredictor
overrides = dict(conf=0.25, task="segment", mode="predict", imgsz=1024, model="mobile_sam.pt")
predictor = SAMPredictor(overrides=overrides)
# 设置图像
predictor.set_image("ultralytics/assets/zidane.jpg") # 使用图像文件设置
predictor.set_image(cv2.imread("ultralytics/assets/zidane.jpg")) # 使用 np.ndarray 设置
results = predictor(bboxes=[439, 437, 524, 709])
# 使用单点提示进行推理
results = predictor(points=[900, 370], labels=[1])
# 使用多点提示进行推理
results = predictor(points=[[400, 370], [900, 370]], labels=[[1, 1]])
# 使用负点提示进行推理
results = predictor(points=[[[400, 370], [900, 370]]], labels=[[1, 0]])
# 重置图像
predictor.reset_image()
使用附加参数分割整个图像。
from ultralytics.models.sam import Predictor as SAMPredictor
# 创建 SAMPredictor
overrides = dict(conf=0.25, task="segment", mode="predict", imgsz=1024, model="mobile_sam.pt")
predictor = SAMPredictor(overrides=overrides)
# 使用附加参数进行分割
results = predictor(source="ultralytics/assets/zidane.jpg", crop_n_layers=1, points_stride=64)
Note
上述示例中所有返回的 results
都是 Results 对象,便于轻松访问预测的掩码和源图像。
- 更多关于“分割整个图像”的附加参数,请参见
Predictor/generate
参考。
SAM 与 YOLOv8 的比较
在这里,我们将 Meta 最小的 SAM 模型 SAM-b 与 Ultralytics 最小的分割模型 YOLOv8n-seg 进行比较:
模型 | 大小 (MB) |
参数 (M) |
速度 (CPU) (ms/im) |
---|---|---|---|
Meta SAM-b | 358 | 94.7 | 51096 |
MobileSAM | 40.7 | 10.1 | 46122 |
FastSAM-s with YOLOv8 backbone | 23.7 | 11.8 | 115 |
Ultralytics YOLOv8n-seg | 6.7 (53.4倍更小) | 3.4 (27.9倍更少) | 59 (866倍更快) |
此比较展示了模型大小和速度之间的数量级差异。虽然SAM提供了自动分割的独特能力,但它并不是YOLOv8分割模型的直接竞争对手,后者更小、更快、更高效。
测试在2023年配备16GB内存的Apple M2 Macbook上运行。要复现此测试:
Example
from ultralytics import ASSETS, SAM, YOLO, FastSAM
# 分析SAM-b, MobileSAM
for file in ["sam_b.pt", "mobile_sam.pt"]:
model = SAM(file)
model.info()
model(ASSETS)
# 分析FastSAM-s
model = FastSAM("FastSAM-s.pt")
model.info()
model(ASSETS)
# 分析YOLOv8n-seg
model = YOLO("yolov8n-seg.pt")
model.info()
model(ASSETS)
自动标注:快速创建分割数据集的途径
自动标注是SAM的一个关键功能,允许用户使用预训练的检测模型生成分割数据集。此功能能够快速准确地标注大量图像,避免了耗时的手动标注。
使用检测模型生成您的分割数据集
要使用Ultralytics框架自动标注您的数据集,请使用如下所示的auto_annotate
函数:
Example
参数 | 类型 | 描述 | 默认值 |
---|---|---|---|
data |
str |
包含待标注图像的文件夹路径。 | |
det_model |
str , 可选 |
预训练的YOLO检测模型。默认为'yolov8x.pt'。 | 'yolov8x.pt' |
sam_model |
str , 可选 |
预训练的SAM分割模型。默认为'sam_b.pt'。 | 'sam_b.pt' |
device |
str , 可选 |
运行模型的设备。默认为空字符串(CPU或GPU,如果可用)。 | |
output_dir |
str , None, 可选 |
保存标注结果的目录。默认为与'data'同目录下的'labels'文件夹。 | None |
auto_annotate
函数接受图像路径,可选参数用于指定预训练的检测和SAM分割模型、运行模型的设备以及保存标注结果的输出目录。
使用预训练模型进行自动标注可以大幅减少创建高质量分割数据集所需的时间和精力。此功能对于处理大量图像集合的研究人员和开发者尤其有益,因为它使他们能够专注于模型开发和评估,而不是手动标注。
引用和致谢
如果您在研究或开发工作中发现SAM有用,请考虑引用我们的论文:
@misc{kirillov2023segment,
title={Segment Anything},
author={Alexander Kirillov and Eric Mintun and Nikhila Ravi and Hanzi Mao and Chloe Rolland and Laura Gustafson and Tete Xiao and Spencer Whitehead and Alexander C. Berg and Wan-Yen Lo and Piotr Dollár and Ross Girshick},
year={2023},
eprint={2304.02643},
archivePrefix={arXiv},
primaryClass={cs.CV}
}
我们要感谢Meta AI为计算机视觉社区创建和维护这一宝贵资源。
常见问题
Ultralytics的Segment Anything Model (SAM) 是什么?
Ultralytics 的 Segment Anything Model (SAM) 是一种革命性的图像分割模型,专为可提示的分割任务设计。它利用先进的架构,包括图像和提示编码器与轻量级掩码解码器的结合,从各种提示(如空间或文本线索)生成高质量的分割掩码。在庞大的 SA-1B 数据集上训练,SAM 在零样本性能方面表现出色,能够适应新的图像分布和任务,无需先验知识。了解更多 这里。
如何使用 Segment Anything Model (SAM) 进行图像分割?
您可以通过使用各种提示(如边界框或点)运行推理来使用 Segment Anything Model (SAM) 进行图像分割。以下是使用 Python 的示例:
from ultralytics import SAM
# 加载模型
model = SAM("sam_b.pt")
# 使用边界框提示进行分割
model("ultralytics/assets/zidane.jpg", bboxes=[439, 437, 524, 709])
# 使用点提示进行分割
model("ultralytics/assets/zidane.jpg", points=[900, 370], labels=[1])
# 使用多个点提示进行分割
model("ultralytics/assets/zidane.jpg", points=[[400, 370], [900, 370]], labels=[[1, 1]])
# 每个对象使用多个点提示进行分割
model("ultralytics/assets/zidane.jpg", points=[[[400, 370], [900, 370]]], labels=[[1, 1]])
# 使用负点提示进行分割
model("ultralytics/assets/zidane.jpg", points=[[[400, 370], [900, 370]]], labels=[[1, 0]])
或者,您可以在命令行界面 (CLI) 中使用 SAM 运行推理:
有关更详细的用法说明,请访问 分割部分。
SAM 和 YOLOv8 在性能方面如何比较?
与 YOLOv8 相比,SAM 模型如 SAM-b 和 FastSAM-s 更大且更慢,但提供了自动分割的独特能力。例如,Ultralytics YOLOv8n-seg 比 SAM-b 小 53.4 倍,快 866 倍。然而,SAM 的零样本性能使其在多样化的、未训练的任务中非常灵活和高效。了解更多关于 SAM 和 YOLOv8 的性能比较 这里。
如何使用 SAM 自动标注我的数据集?
Ultralytics 的 SAM 提供了自动标注功能,允许使用预训练的检测模型生成分割数据集。以下是 Python 中的示例:
from ultralytics.data.annotator import auto_annotate
auto_annotate(data="path/to/images", det_model="yolov8x.pt", sam_model="sam_b.pt")
此函数接受图像路径以及预训练检测和 SAM 分割模型的可选参数,以及设备和输出目录的指定。有关完整指南,请参阅 自动标注。
用于训练 Segment Anything Model (SAM) 的数据集是什么?
SAM 在广泛的 SA-1B 数据集上进行训练,该数据集包含超过 1100 万张图像中的 10 亿个掩码。SA-1B 是迄今为止最大的分割数据集,提供了高质量和多样化的 训练数据,确保在各种分割任务中具有出色的零样本性能。有关更多详细信息,请访问 数据集部分。