任何移动段 (MobileSAM)
MobileSAM 论文现已在arXiv 上发布。
可通过此演示链接观看MobileSAM 在CPU 上运行的演示。在 Mac i5CPU 上的运行时间约为 3 秒。在 Hugging Face演示中,界面和性能较低的 CPU 导致响应速度较慢,但仍能有效运行。
观看: 如何使用MobileSAM 运行推理Ultralytics | 分步指南 🎉
MobileSAM 在Grounding-SAM 、AnyLabeling 和Segment Anything in 3D 等多个项目中实施。
MobileSAM 在不到一天的时间内,就能在单个GPU 上使用 100k 数据集(原始图像的 1%)进行训练。训练代码将在未来公布。
可用型号、支持的任务和运行模式
本表介绍了可用模型及其特定的预训练权重、支持的任务以及与推理、验证、训练和导出等不同操作模式的兼容性,支持的模式用 ✅ 符号表示,不支持的模式用 ❌ 符号表示。
型号 | 预训练重量 | 支持的任务 | 推论 | 验证 | 培训 | 出口 |
---|---|---|---|---|---|---|
MobileSAM | mobile_sam.pt | 实例分割 | ✅ | ❌ | ❌ | ❌ |
MobileSAM 与YOLO的比较
在此,我们将 Meta 的SAM 变体(包括MobileSAM)与Ultralytics 的小型细分模型 YOLO11n-seg 进行比较:
模型 | 大小(MB) | 参数 (M) | 速度CPU)(毫秒/分钟) |
---|---|---|---|
MetaSAM-b | 375 | 93.7 | 49401 |
MetaSAM2-b | 162 | 80.8 | 31901 |
MetaSAM2-t | 78.1 | 38.9 | 25997 |
MobileSAM | 40.7 | 10.1 | 25381 |
配备YOLOv8 主干网的FastSAM | 23.7 | 11.8 | 55.9 |
Ultralytics YOLOv8n | 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 和 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 到MobileSAM
由于MobileSAM 保留了与原版SAM 相同的管道,因此我们纳入了原版的预处理、后处理和所有其他接口。因此,目前使用原版SAM 的用户只需花费很少的精力即可过渡到MobileSAM 。
MobileSAM 与最初的SAM 性能相当,并保留了相同的管道,只是在图像编码器上做了改动。具体来说,我们用较小的 Tiny-ViT 编码器(5M)取代了原来重量级的 ViT-H 编码器(632M)。在单个GPU 上,MobileSAM ,每幅图像的运行时间约为 12 毫秒:图像编码器为 8 毫秒,掩码解码器为 4 毫秒。
下表对基于 ViT 的图像编码器进行了比较:
图像编码器 | 原创SAM | MobileSAM |
---|---|---|
参数 | 611M | 5M |
速度 | 452ms | 8ms |
最初的SAM 和MobileSAM 都使用相同的提示引导掩码解码器:
掩码解码器 | 原创SAM | MobileSAM |
---|---|---|
参数 | 3.876M | 3.876M |
速度 | 4ms | 4ms |
以下是整个管道的比较:
整个管道( Enc+Dec) | 原创SAM | MobileSAM |
---|---|---|
参数 | 615M | 9.66M |
速度 | 456ms | 12ms |
MobileSAM 和最初的SAM 的性能都是以点和方框作为提示进行演示的。
MobileSAM 性能卓越,与目前的FastSAM 相比,体积小约 5 倍,速度快约 7 倍。更多详细信息,请访问MobileSAM 项目页面。
测试MobileSAM Ultralytics
与原版一样 SAM一样,我们在Ultralytics 中提供了一种简单明了的测试方法,包括点提示和盒提示两种模式。
模型下载
您可以在这里下载模型。
要点提示
示例
from ultralytics import SAM
# Load the model
model = SAM("mobile_sam.pt")
# Predict a segment based on a single point prompt
model.predict("ultralytics/assets/zidane.jpg", points=[900, 370], labels=[1])
# Predict multiple segments based on multiple points prompt
model.predict("ultralytics/assets/zidane.jpg", points=[[400, 370], [900, 370]], labels=[1, 1])
# Predict a segment based on multiple points prompt per object
model.predict("ultralytics/assets/zidane.jpg", points=[[[400, 370], [900, 370]]], labels=[[1, 1]])
# Predict a segment using both positive and negative prompts.
model.predict("ultralytics/assets/zidane.jpg", points=[[[400, 370], [900, 370]]], labels=[[1, 0]])
盒子提示
示例
from ultralytics import SAM
# Load the model
model = SAM("mobile_sam.pt")
# Predict a segment based on a single point prompt
model.predict("ultralytics/assets/zidane.jpg", points=[900, 370], labels=[1])
# Predict multiple segments based on multiple points prompt
model.predict("ultralytics/assets/zidane.jpg", points=[[400, 370], [900, 370]], labels=[1, 1])
# Predict a segment based on multiple points prompt per object
model.predict("ultralytics/assets/zidane.jpg", points=[[[400, 370], [900, 370]]], labels=[[1, 1]])
# Predict a segment using both positive and negative prompts.
model.predict("ultralytics/assets/zidane.jpg", points=[[[400, 370], [900, 370]]], labels=[[1, 0]])
我们已经实施了 MobileSAM
和 SAM
使用相同的应用程序接口。有关更多使用信息,请参阅 SAM 页码.
利用检测模型自动构建分割数据集
要使用Ultralytics 框架自动注释数据集,请使用 auto_annotate
功能,如下图所示:
示例
论据 | 类型 | 默认值 | 说明 |
---|---|---|---|
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")。 |
引用和致谢
如果MobileSAM 对您的研究或开发工作有用,请考虑引用我们的论文:
常见问题
什么是MobileSAM ,它与最初的SAM 模式有何不同?
MobileSAM 是专为移动应用设计的轻量级快速图像分割模型。它保留了与原始SAM 相同的管道,但用较小的 Tiny-ViT 编码器(5M 参数)取代了重量级的 ViT-H 编码器(632M 参数)。这一变化使MobileSAM 比原来的SAM 小约 5 倍,速度快约 7 倍。例如,与原始SAM 的 456 毫秒相比,MobileSAM 每幅图像的运行时间约为 12 毫秒。有关MobileSAM 在各种项目中的实现情况,请点击此处。
如何使用Ultralytics 测试MobileSAM ?
在Ultralytics 中测试MobileSAM 可以通过直接的方法完成。您可以使用点提示和方框提示来预测线段。下面是一个使用点提示的示例:
from ultralytics import SAM
# Load the model
model = SAM("mobile_sam.pt")
# Predict a segment based on a point prompt
model.predict("ultralytics/assets/zidane.jpg", points=[900, 370], labels=[1])
更多详情,请参阅测试MobileSAM部分。
为什么我的移动应用程序要使用MobileSAM ?
MobileSAM 由于其轻量级架构和快速推理速度,它是移动应用的理想选择。与最初的SAM 相比,MobileSAM 的体积小约 5 倍,速度快约 7 倍,因此适用于计算资源有限的环境。这种高效率确保了移动设备可以在没有明显延迟的情况下进行实时图像分割。此外,MobileSAM 的推理等模型也针对移动性能进行了优化。
MobileSAM 是如何培训的?培训代码是否可用?
MobileSAM 在不到一天的时间内,就在单个GPU 上用 10 万张数据集(占原始图片的 1%)进行了训练。虽然训练代码将在未来公布,但您目前可以在MobileSAM GitHub 存储库中探索MobileSAM 的其他方面。该资源库包括预训练的权重和各种应用的实现细节。
MobileSAM 的主要用途是什么?
MobileSAM 是专为移动环境中快速高效的图像分割而设计的。主要用途包括
- 移动应用的实时物体检测和分割。
- 在计算资源有限的设备中实现低延迟图像处理。
- 集成到人工智能驱动的移动应用程序中,用于增强现实(AR)和实时分析等任务。
有关更详细的使用案例和性能比较,请参阅 "从SAM 到MobileSAM"一节。