
移动版 Segment Anything (MobileSAM)#
MobileSAM 是一种紧凑、高效的图像分割模型,专为移动设备和边缘设备打造。它旨在将 Meta 的 Segment Anything 模型(SAM)的强大功能带到计算资源有限的环境中,在保持与原始 SAM 流程兼容的同时,实现近乎即时的分割。无论你是在开发实时应用还是轻量级部署,MobileSAM 都能以远低于前代模型的体积和速度要求,提供出色的分割效果。
观看: 如何使用 Ultralytics 通过 MobileSAM 进行推理 | 分步指南 🎉
MobileSAM 已应用于多个项目,包括 Grounding-SAM、AnyLabeling 和 Segment Anything in 3D。
MobileSAM 使用包含 10 万张图像(占原始图像的 1%)的数据集,在单块 GPU 上训练,耗时不到一天。
可用模型、支持的任务和运行模式#
下表概述了可用的 MobileSAM 模型、其预训练权重、支持的任务,以及与不同运行模式的兼容性,例如推理、验证、训练和导出。✅ 表示支持的模式,❌ 表示不支持的模式。
| 模型类型 | 预训练权重 | 支持的任务 | 训练 | 验证 | 推理 | 导出 |
|---|---|---|---|---|---|---|
| MobileSAM | mobile_sam.pt | 实例分割 | ❌ | ❌ | ✅ | ❌ |
MobileSAM 与 YOLO 的对比#
以下比较展示了 Meta 的 SAM 变体、MobileSAM 与 Ultralytics 分割模型之间的差异,包括 YOLO26n-seg:
| 模型 | 大小 (MB) | 参数 (M) | 速度(CPU) (毫秒/图像) |
|---|---|---|---|
| Meta SAM-b | 375 | 93.7 | 41703 |
| Meta SAM2-b | 162 | 80.8 | 28867 |
| Meta SAM2-t | 78.1 | 38.9 | 23430 |
| MobileSAM | 40.7 | 10.1 | 23802 |
| 使用 YOLOv8 主干网络的 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 内存的 2025 款 Apple M4 Air 上进行,使用了 torch==2.10.0、ultralytics==8.4.31 和 onnxruntime==1.24.4。要复现这些结果:
from ultralytics import ASSETS, SAM, YOLO, FastSAM
# 分析 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)
# 分析 FastSAM-s 的性能
model = FastSAM("FastSAM-s.pt")
model.info()
model(ASSETS)
# 分析 YOLO 模型的性能(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, nms=False) # YOLO26 的 NMS-free 头;对 YOLOv8/YOLO11 无操作
model = YOLO(onnx_path)
model(ASSETS)从 SAM 迁移到 MobileSAM#
MobileSAM 保留了原版 SAM 的相同流水线,包括预处理、后处理和所有接口。这意味着你只需对工作流进行最少的改动,就能从 SAM 切换到 MobileSAM。
主要区别在于图像编码器:MobileSAM 用小得多的 Tiny-ViT 编码器(5M 参数)替换了原来的 ViT-H 编码器(637M 参数)。在单个 GPU 上,MobileSAM 处理一张图像约需 12ms(编码器耗时 8ms,掩码解码器耗时 4ms)。
基于 ViT 的图像编码器对比#
| 图像编码器 | 原版 SAM | MobileSAM |
|---|---|---|
| 参数量 | 637M | 5M |
| 速度 | 452ms | 8ms |
提示引导的掩码解码器#
| 掩码解码器 | 原版 SAM | MobileSAM |
|---|---|---|
| 参数量 | 3.876M | 3.876M |
| 速度 | 4ms | 4ms |
完整流水线对比#
| 完整流水线(编码器+解码器) | 原版 SAM | MobileSAM |
|---|---|---|
| 参数量 | 641M | 9.66M |
| 速度 | 456ms | 12ms |
下图展示了使用点提示和框提示时,MobileSAM 与原版 SAM 的性能表现。


MobileSAM 的体积约为 FastSAM 的七分之一,速度约为 FastSAM 的五倍。更多详情请访问 MobileSAM 项目页面。
在 Ultralytics 中测试 MobileSAM#
与原版 SAM 一样,Ultralytics 提供了简单的接口来测试 MobileSAM,并支持点提示和框提示。
下载模型#
从 Ultralytics 资源下载 MobileSAM 预训练权重。
点提示#
from ultralytics import SAM
# 加载模型
model = SAM("mobile_sam.pt")
# 根据单个点提示预测一个分割结果
model.predict("ultralytics/assets/zidane.jpg", points=[900, 370], labels=[1])
# 根据多个点提示预测多个分割结果
model.predict("ultralytics/assets/zidane.jpg", points=[[400, 370], [900, 370]], labels=[1, 1])
# 根据每个对象的多个点提示预测一个分割结果
model.predict("ultralytics/assets/zidane.jpg", points=[[[400, 370], [900, 370]]], labels=[[1, 1]])
# 同时使用正向和负向提示预测一个分割结果。
model.predict("ultralytics/assets/zidane.jpg", points=[[[400, 370], [900, 370]]], labels=[[1, 0]])框提示#
from ultralytics import SAM
# 加载模型
model = SAM("mobile_sam.pt")
# 根据单个框提示预测一个分割结果
model.predict("ultralytics/assets/zidane.jpg", bboxes=[439, 437, 524, 709])
# 根据多个框提示预测多个分割结果
model.predict("ultralytics/assets/zidane.jpg", bboxes=[[439, 437, 524, 709], [114, 196, 313, 708]])MobileSAM 和 SAM 使用相同的 API。更多使用详情请参阅 SAM 文档。
使用检测模型自动构建分割数据集#
要使用 Ultralytics 框架自动标注你的数据集,请按下方所示使用 auto_annotate 函数:
from ultralytics.data.annotator import auto_annotate
auto_annotate(data="path/to/images", det_model="yolo26x.pt", sam_model="mobile_sam.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 | 用于通过非极大值抑制过滤重叠框的 IoU 阈值。 |
imgsz | int | 640 | 图像缩放输入尺寸(如有需要,会向上取整为 32 的倍数)。 |
max_det | int | 300 | 为提高内存效率,每张图像的最大检测数。 |
classes | list[int] | None | 要检测的类别索引列表(例如,[0, 1] 表示人和自行车)。 |
output_dir | str | None | 标注结果的保存目录(默认:同级目录中的 <data>_auto_annotate_labels)。 |
引用与致谢#
如果 MobileSAM 对你的研究或开发有帮助,请考虑引用以下论文:
@article{mobile_sam,
title={Faster Segment Anything: Towards Lightweight SAM for Mobile Applications},
author={Zhang, Chaoning and Han, Dongshen and Qiao, Yu and Kim, Jung Uk and Bae, Sung Ho and Lee, Seungkyu and Hong, Choong Seon},
journal={arXiv preprint arXiv:2306.14289},
year={2023}
}阅读 arXiv 上的完整 MobileSAM 论文。
常见问题#
MobileSAM 是一种轻量、快速的图像分割模型,专为移动端和边缘应用优化。它保留了原版 SAM 的相同流水线,但将庞大的 ViT-H 编码器(637M 参数)替换为紧凑的 Tiny-ViT 编码器(5M 参数)。因此,MobileSAM 的完整流水线比原版 SAM 小约 66 倍(9.66M 对比 641M 参数),速度快约 38 倍,每张图像耗时约 12 ms,而 SAM 为 456 ms。你可以在 MobileSAM GitHub 仓库中了解更多实现细节。
在 Ultralytics 中测试 MobileSAM 很简单。你可以使用点提示和框提示来预测分割结果。例如,使用点提示:
from ultralytics import SAM # 加载模型 model = SAM("mobile_sam.pt") # 根据点提示预测一个分割结果 model.predict("ultralytics/assets/zidane.jpg", points=[900, 370], labels=[1])更多详情请参阅在 Ultralytics 中测试 MobileSAM部分。
MobileSAM 使用包含 100k 张图像的数据集(原始 SA-1B 图像的 1%),在单个 GPU 上不到一天便完成训练,并将 SAM 的 ViT-H 图像编码器蒸馏为 Tiny-ViT 编码器。预训练权重和实现细节可在 MobileSAM GitHub 仓库中获取。
MobileSAM 专为移动端和边缘环境中的快速、高效图像分割而设计。主要应用场景包括:
- 面向移动应用的实时目标检测与分割
- 在计算资源有限的设备上进行低延迟图像处理
- 将其集成到 AI 驱动的移动应用中,用于增强现实 (AR)、分析等场景
有关应用场景和性能的更多详情,请参阅从 SAM 迁移到 MobileSAM以及 Ultralytics 关于 Segment Anything 应用的博客。