Link to this sectionSegment Anything Model (SAM)#
欢迎来到 图像分割 的前沿领域,这里使用的是 Segment Anything Model,即 SAM。这一革命性模型通过引入具有实时性能的提示式图像分割,改变了游戏规则,并在该领域设立了新标准。
Link to this sectionSAM 简介:Segment Anything Model#
Segment Anything Model(SAM)是一种尖端的图像分割模型,支持提示式分割,为图像分析任务提供了无与伦比的灵活性。SAM 是 Segment Anything 计划的核心,该开创性项目引入了一种用于图像分割的新颖模型、任务和数据集。
SAM 的先进设计使其无需先验知识即可适应新的图像分布和任务,这一特性被称为零样本迁移。SAM 在庞大的 SA-1B 数据集上进行了训练,该数据集包含超过 1100 万张精心策划的图像和超过 10 亿个掩码。SAM 展示了令人印象深刻的零样本性能,在许多情况下超过了之前的完全监督学习结果。
SA-1B 示例图像。 数据集图像上叠加了来自新推出的 SA-1B 数据集的掩码。SA-1B 包含 11M 张多样化、高分辨率、已授权且保护隐私的图像以及 1.1B 个高质量分割掩码。这些掩码由 SAM 完全自动注释,经人工评级和多次实验验证,具有极高的质量和多样性。为便于可视化,图像按每张图像的掩码数量分组(平均每张图像约 100 个掩码)。
Link to this sectionSegment Anything Model (SAM) 的主要特性#
- 提示式分割任务: SAM 在设计时就考虑了提示式分割任务,使其能够根据任何给定的提示生成有效的分割掩码,例如标识对象的空间或文本线索。
- 先进架构: Segment Anything Model 采用了强大的图像编码器、提示编码器和轻量级掩码解码器。这种独特的架构使得分割任务能够实现灵活的提示、实时掩码计算以及模糊性感知。
- SA-1B 数据集: SA-1B 数据集由 Segment Anything 项目引入,包含 1100 万张图像上的超过 10 亿个掩码。作为迄今为止最大的分割数据集,它为 SAM 提供了多样化且大规模的训练数据源。
- 零样本性能: SAM 在各种分割任务中表现出卓越的零样本性能,使其成为一种开箱即用的工具,能够以极低的 提示工程 需求应用于各种任务。
如需深入了解 Segment Anything Model 和 SA-1B 数据集,请访问 Segment Anything GitHub 并阅读研究论文 Segment Anything。
SAM powers the smart annotation feature on Ultralytics Platform, enabling click-based intelligent masking for fast dataset labeling. See the annotation guide for details.
Link to this section可用模型、支持的任务和操作模式#
下表列出了可用模型及其特定的预训练权重、它们支持的任务,以及它们与不同操作模式(如 推理、验证、训练 和 导出)的兼容性,支持的模式用 ✅ 表情符号表示,不支持的模式用 ❌ 表情符号表示。
Link to this section如何使用 SAM:图像分割中的多功能性与强大性能#
Segment Anything Model 可用于超出其训练数据的多种下游任务。这包括边缘检测、对象候选生成、实例分割 以及初步的文本到掩码预测。通过提示工程,SAM 可以以零样本方式快速适应新的任务和数据分布,成为满足你所有图像分割需求的多功能且强大的工具。
Link to this sectionSAM 预测示例#
使用给定提示分割图像。
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]])分割整张图像。
from ultralytics import SAM
# Load a model
model = SAM("sam_b.pt")
# Display model information (optional)
model.info()
# Run inference
model("path/to/image.jpg")- 这里的逻辑是,如果你不传递任何提示(bboxes/points/masks),则分割整张图像。
通过这种方式,你可以设置一次图像,然后运行多次提示推理,而无需多次运行图像编码器。
import cv2
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 都是 Results 对象,这使得访问预测的掩码和源图像变得非常容易。
- More additional args for
Segment everythingseePredictor/generateReference.
Link to this sectionSAM 与 YOLO 的对比#
在这里,我们将 Meta 的 SAM-b 模型与包含 YOLO26n-seg 在内的 Ultralytics 分割模型进行了对比:
| 模型 | 大小 (MB) | 参数 (M) | 速度 (CPU) (ms/im) |
|---|---|---|---|
| Meta SAM-b | 375 | 93.7 | 41703 |
| MobileSAM | 40.7 | 10.1 | 23802 |
| FastSAM-s 使用 YOLOv8 骨干网络 | 23.9 | 11.8 | 58.0 |
| Ultralytics YOLOv8n-seg | 7.1 (小 52.8 倍) | 3.4 (少 27.6 倍) | 24.8 (快 1682 倍) |
| Ultralytics YOLO11n-seg | 6.2 (小 60.5 倍) | 2.9 (少 32.3 倍) | 24.3 (快 1716 倍) |
| Ultralytics YOLO26n-seg | 6.7 (小 56.0 倍) | 2.7 (少 34.7 倍) | 25.2 (快 1655 倍) |
此对比展示了 SAM 变体与 YOLO 分割模型在模型大小和速度上的显著差异。虽然 SAM 提供了独特的自动分割能力,但 YOLO 模型(特别是 YOLOv8n-seg、YOLO11n-seg 和 YOLO26n-seg)在尺寸更小、速度更快且计算效率更高。
SAM 速度使用 PyTorch 测量,YOLO 速度使用 ONNX Runtime 测量。测试在配备 16GB 内存的 2025 Apple M4 Air 上运行,使用 torch==2.10.0、ultralytics==8.4.31 和 onnxruntime==1.24.4。如需重现此测试:
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 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)Link to this section自动标注:获取分割数据集的快速路径#
自动标注是 SAM 的一项关键功能,允许用户使用预训练的检测模型生成 分割数据集。此功能能够快速、准确地标注大量图像,无需费时的手动标注。
Link to this section使用检测模型生成你的分割数据集#
要使用 Ultralytics 框架自动标注你的数据集,请使用如下所示的 auto_annotate 函数:
from ultralytics.data.annotator import auto_annotate
auto_annotate(data="path/to/images", det_model="yolo26x.pt", sam_model="sam_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 同级目录)。 |
auto_annotate 函数接收图像路径,并包含用于指定预训练检测和 SAM 分割模型、运行模型的设备以及保存标注结果的输出目录的可选参数。
使用预训练模型进行自动标注可以显著减少创建高质量分割数据集所需的时间和工作量。此功能对于处理大量图像集合的研究人员和开发者尤其有益,因为它使他们能够专注于模型开发和评估,而非手动标注。
Link to this section引用与致谢#
如果你在研究或开发工作中觉得 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 创建并维护了这一对 computer vision 社区非常有价值的资源。
Link to this section常见问题解答#
Link to this section什么是 Ultralytics 的 Segment Anything Model (SAM)?#
Ultralytics 的 Segment Anything Model (SAM) 是一款革命性的图像分割模型,专为可提示分割任务设计。它利用先进的架构(包括图像和提示编码器以及轻量级掩码解码器),通过空间或文本提示等各种提示生成高质量的分割掩码。SAM 在庞大的 SA-1B 数据集上进行了训练,在零样本性能方面表现出色,能够适应新的图像分布和任务,而无需事先进行训练。
Link to this section我该如何使用 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 推理:
yolo predict model=sam_b.pt source=path/to/image.jpg有关更详细的使用说明,请访问 Segmentation 部分。
Link to this sectionSAM 和 YOLO 模型在性能方面有何区别?#
与 YOLO 模型相比,SAM 变体(如 SAM-b、MobileSAM 和 FastSAM-s)通常更大且运行速度较慢,但它们提供了独特的零样本分割能力。例如,YOLO26n-seg 在 CPU 上比 Meta 原生的 SAM-b 模型 体积缩小了 56 倍,且 速度快了 1650 倍以上。这使得 YOLO 模型非常适合需要快速、轻量级和计算效率高的分割应用,而 SAM 模型则在灵活、可提示和零样本分割任务中表现优异。
Link to this section我该如何使用 SAM 对我的数据集进行自动标注?#
Ultralytics 的 SAM 提供了一个自动标注功能,允许使用预训练的检测模型生成分割数据集。这是一个 Python 示例:
from ultralytics.data.annotator import auto_annotate
auto_annotate(data="path/to/images", det_model="yolo26x.pt", sam_model="sam_b.pt")此函数接收图像路径以及用于预训练检测和 SAM 分割模型的可选参数,并指定设备和输出目录。有关完整指南,请参阅 Auto-Annotation。
Link to this section哪些数据集被用于训练 Segment Anything Model (SAM)?#
SAM 是在庞大的 SA-1B 数据集上训练的,该数据集包含超过 1100 万张图像中的 10 亿多个掩码。SA-1B 是迄今为止最大的分割数据集,提供了高质量且多样的 training data,确保了在各种分割任务中令人印象深刻的零样本性能。更多详情,请访问 Dataset 部分。