分段任何模式 (SAM)
欢迎使用 Segment Anything Model(即SAM )进入图像分割的前沿领域。这一革命性的模型改变了游戏规则,它引入了具有实时性能的可提示图像分割技术,为该领域设立了新的标准。
SAM 简介:分段模式
SAM SAM 是 Segment Anything 计划的核心,该计划是一个开创性的项目,它为图像分割引入了一个新颖的模型、任务和数据集。
SAM其先进的设计使其能够适应新的图像分布和任务,而无需事先了解相关知识,这一特性被称为零镜头传输。SAM 在庞大的SA-1B 数据集上进行了训练,该数据集包含超过 10 亿个掩码,分布在 1100 万张精心策划的图像上,显示出令人印象深刻的零镜头性能,在许多情况下超过了以前的完全监督结果。
SA-1B 示例图像。 数据集图像叠加了新推出的 SA-1B 数据集的掩码。SA-1B 包含 1,100 万张不同的高分辨率授权隐私保护图像和 11B 个高质量分割掩码。这些掩码由SAM 全自动注释,并经过人工评分和大量实验验证,具有很高的质量和多样性。为便于可视化,图像按每张图像的掩码数量分组(平均每张图像有 100 个掩码)。
分段 Anything 模型的主要特点 (SAM)
- 可提示的分割任务: SAM 在设计时考虑到了可提示的分割任务,使其能够根据任何给定的提示(如识别物体的空间或文本线索)生成有效的分割掩码。
- 先进的架构:Segment Anything Model 采用功能强大的图像编码器、提示编码器和轻量级掩码解码器。这种独特的架构可在分割任务中实现灵活的提示、实时掩码计算和模糊感知。
- SA-1B 数据集SA-1B 数据集由 Segment Anything 项目推出,在 1100 万张图像上使用了超过 10 亿个遮罩。作为迄今为止最大的分割数据集,它为SAM 提供了多样化的大规模训练数据源。
- 零镜头性能: SAM 在执行各种分割任务时都能显示出出色的零镜头性能,使其成为一种可立即投入使用的工具,适用于各种应用,而无需进行及时的工程设计。
如需深入了解 Segment Anything 模型和 SA-1B 数据集,请访问Segment Anything 网站并查看研究论文Segment Anything。
可用型号、支持的任务和运行模式
本表介绍了可用模型及其特定的预训练权重、支持的任务以及与推理、验证、训练和导出等不同操作模式的兼容性,支持的模式用 ✅ 符号表示,不支持的模式用 ❌ 符号表示。
型号 | 预训练重量 | 支持的任务 | 推论 | 验证 | 培训 | 出口 |
---|---|---|---|---|---|---|
SAM 基础 | sam_b.pt | 实例分割 | ✅ | ❌ | ❌ | ❌ |
SAM 大 | sam_l.pt | 实例分割 | ✅ | ❌ | ❌ | ❌ |
如何使用SAM :图像分割的多功能性和强大功能
Segment Anything Model 可用于其训练数据之外的大量下游任务。这包括边缘检测、对象建议生成、实例分割和初步文本到掩码预测。通过及时的工程设计,SAM 可以快速适应新的任务和数据分布,成为满足所有图像分割需求的多功能强大工具。
SAM 预测示例
带提示的分段
根据提示分割图像。
from ultralytics import SAM
# Load a model
model = SAM("sam_b.pt")
# Display model information (optional)
model.info()
# Run inference with bboxes prompt
results = model("ultralytics/assets/zidane.jpg", bboxes=[439, 437, 524, 709])
# 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]])
分割一切
分割整个图像
- 这里的逻辑是,如果不传递任何提示(bboxes/points/masks),就对整个图像进行分割。
SAMPredictor 示例
这样,您就可以一次设置图像,多次运行提示推理,而无需多次运行图像编码器。
from ultralytics.models.sam import Predictor as SAMPredictor
# Create SAMPredictor
overrides = dict(conf=0.25, task="segment", mode="predict", imgsz=1024, model="mobile_sam.pt")
predictor = SAMPredictor(overrides=overrides)
# Set image
predictor.set_image("ultralytics/assets/zidane.jpg") # set with image file
predictor.set_image(cv2.imread("ultralytics/assets/zidane.jpg")) # set with np.ndarray
results = predictor(bboxes=[439, 437, 524, 709])
# Run inference with single point prompt
results = predictor(points=[900, 370], labels=[1])
# Run inference with multiple points prompt
results = predictor(points=[[400, 370], [900, 370]], labels=[[1, 1]])
# Run inference with negative points prompt
results = predictor(points=[[[400, 370], [900, 370]]], labels=[[1, 0]])
# Reset image
predictor.reset_image()
用附加参数分割所有内容。
from ultralytics.models.sam import Predictor as SAMPredictor
# Create SAMPredictor
overrides = dict(conf=0.25, task="segment", mode="predict", imgsz=1024, model="mobile_sam.pt")
predictor = SAMPredictor(overrides=overrides)
# Segment with additional args
results = predictor(source="ultralytics/assets/zidane.jpg", crop_n_layers=1, points_stride=64)
备注
所有返回的 results
上述示例中的 成果 对象,可以轻松访问预测遮罩和源图像。
- 的更多附加参数
Segment everything
看看Predictor/generate
参考资料.
SAM 对比YOLOv8
在此,我们将 Meta 的最小SAM 模型SAM-b 与Ultralytics 的最小分割模型YOLOv8n-seg 进行比较:
模型 | 大小 (MB) |
参数 (M) |
速度 (CPU) (ms/im) |
---|---|---|---|
MetaSAM-b | 358 | 94.7 | 51096 |
MobileSAM | 40.7 | 10.1 | 46122 |
FastSAM-s,YOLOv8 主干网 | 23.7 | 11.8 | 115 |
Ultralytics YOLOv8n-seg | 6.7(小 53.4 倍) | 3.4(少 27.9 倍) | 59(快 866 倍) |
这种比较显示了不同模型在尺寸和速度上的数量级差异。虽然SAM 在自动分段方面具有独特的功能,但它并不是YOLOv8 分段模型的直接竞争对手,后者更小、更快、更高效。
测试在配备 16GB 内存的 2023 Apple M2 Macbook 上进行。重现此测试
示例
from ultralytics import ASSETS, SAM, YOLO, FastSAM
# Profile SAM-b, MobileSAM
for file in ["sam_b.pt", "mobile_sam.pt"]:
model = SAM(file)
model.info()
model(ASSETS)
# Profile FastSAM-s
model = FastSAM("FastSAM-s.pt")
model.info()
model(ASSETS)
# Profile YOLOv8n-seg
model = YOLO("yolov8n-seg.pt")
model.info()
model(ASSETS)
自动注释:获取分割数据集的快速通道
自动标注是SAM 的一项重要功能,允许用户使用预先训练好的检测模型生成分割数据集。这一功能可以快速、准确地标注大量图像,避免了耗时的人工标注。
使用检测模型生成分割数据集
要使用Ultralytics 框架自动标注数据集,请使用 auto_annotate
功能,如下图所示:
示例
论据 | 类型 | 说明 | 默认值 |
---|---|---|---|
data |
str |
包含要注释的图像的文件夹路径。 | |
det_model |
str 可选 |
预训练的YOLO 检测模型。默认为 "yolo11x.pt"。 | 'yolo11x.pt' |
sam_model |
str 可选 |
预先训练的SAM 分割模型。默认为 "sam_b.pt"。 | 'sam_b.pt' |
device |
str 可选 |
运行模型的设备。默认为空字符串(CPU 或GPU ,如果可用)。 | |
conf |
float 可选 |
检测模型的置信度阈值;默认为 0.25。 | 0.25 |
iou |
float 可选 |
用于过滤检测结果中重叠方框的 IoU 阈值;默认值为 0.45。 | 0.45 |
imgsz |
int 可选 |
输入图像调整尺寸;默认为 640。 | 640 |
max_det |
int 可选 |
限制每幅图像的检测次数,以控制密集场景中的输出。 | 300 |
classes |
list 可选 |
根据指定的类 ID 过滤预测结果,只返回相关的检测结果。 | None |
output_dir |
str 无,可选 |
保存注释结果的目录。默认为 "数据 "同一目录下的 "标签 "文件夹。 | 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) 是一个革命性的图像分割模型,专为可提示的分割任务而设计。它利用先进的架构,包括图像和提示编码器以及轻量级掩码解码器,从空间或文本提示等各种提示中生成高质量的分割掩码。SAM 在广泛的SA-1B 数据集上进行了训练,在零镜头性能方面表现出色,无需事先了解即可适应新的图像分布和任务。点击此处了解更多信息。
如何使用 Segment Anything Model (SAM) 进行图像分割?
您可以使用 Segment Anything Model (SAM) 进行图像分割,通过边界框或点等各种提示进行推理。下面是一个使用Python 的示例:
from ultralytics import SAM
# Load a model
model = SAM("sam_b.pt")
# Segment with bounding box prompt
model("ultralytics/assets/zidane.jpg", bboxes=[439, 437, 524, 709])
# Segment with points prompt
model("ultralytics/assets/zidane.jpg", points=[900, 370], labels=[1])
# Segment with multiple points prompt
model("ultralytics/assets/zidane.jpg", points=[[400, 370], [900, 370]], labels=[[1, 1]])
# Segment with multiple points prompt per object
model("ultralytics/assets/zidane.jpg", points=[[[400, 370], [900, 370]]], labels=[[1, 1]])
# Segment with negative points prompt.
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 分割模型的可选参数,以及设备和输出目录规格。有关完整指南,请参阅自动标注。
有哪些数据集可用于训练 "任意分段模型"(SAM )?
SAM 是在广泛的SA-1B 数据集上进行训练的,该数据集包含 1100 万张图像中的 10 亿多个遮罩。SA-1B 是迄今为止最大的分割数据集,提供了高质量和多样化的训练数据,确保了在各种分割任务中令人印象深刻的零镜头性能。更多详情,请访问数据集部分。