Ultralytics YOLO27:
Get Started

快速 Segment Anything 模型(FastSAM)#

快速 Segment Anything 模型(FastSAM)是一种新颖的实时 CNN 方案,基于 CNN 架构,用于解决 Segment Anything 任务。该任务旨在根据各种可能的用户交互提示,对图像中的任意对象进行分割。FastSAM 在保持竞争力的同时显著降低了计算需求,因此适用于多种视觉任务。



观看: 使用 Ultralytics 通过 FastSAM 进行目标跟踪

模型架构#

快速 Segment Anything 模型(FastSAM)架构概览

概述#

FastSAM 旨在解决 Segment Anything Model (SAM) 的局限性。SAM 是一种计算资源需求较高的大型 Transformer 模型。FastSAM 将 Segment Anything 任务拆分为两个连续阶段:全图实例分割和提示引导的选择。第一阶段使用 YOLOv8-seg生成图像中所有实例的分割掩码。第二阶段则输出与提示相对应的感兴趣区域。

主要功能#

  1. 实时方案:借助 CNN 的计算效率,FastSAM 为 Segment Anything 任务提供了实时方案,对于需要快速获得结果的工业应用尤为实用。

  2. 效率与性能:FastSAM 在不牺牲性能质量的前提下,大幅降低了计算和资源需求。它的性能与 SAM 相当,但所需计算资源显著减少,因此能够用于实时应用。

  3. 提示引导的分割:FastSAM 可以根据各种可能的用户交互提示,对图像中的任意对象进行分割,从而在不同场景中具备灵活性和适应性。

  4. 基于 YOLOv8-seg:FastSAM 基于 YOLOv8-seg,这是一种带有实例分割分支的目标检测器。因此,它能够有效生成图像中所有实例的分割掩码。

  5. 基准测试中的竞争力:在 MS COCO 的目标提议任务中,FastSAM 在单张 NVIDIA RTX 3090 上取得了较高分数,速度也显著快于 SAM,展现出良好的效率和能力。

  6. 实际应用:该方法为大量视觉任务提供了一种新颖、实用的解决方案,速度非常快,比现有方法快数十倍甚至数百倍。

  7. 模型压缩的可行性:FastSAM 展示了一条可行路径:通过为结构引入人工先验,大幅减少计算量,从而为通用视觉任务的大型模型架构开辟新的可能性。

可用模型、支持的任务和运行模式#

此表列出了可用模型及其特定预训练权重、支持的任务,以及与不同运行模式的兼容性,例如推理、验证、训练和导出。✅ 表示支持的模式,❌ 表示不支持的模式。

模型类型预训练权重支持的任务训练验证推理导出
FastSAM-sFastSAM-s.pt实例分割❌✅✅✅
FastSAM-xFastSAM-x.pt实例分割❌✅✅✅

FastSAM 与 YOLO 的对比#

这里我们将 FastSAM-s 与 Meta 的 SAM 各变体以及 Ultralytics 分割模型进行比较,其中包括 YOLO26n-seg:

模型大小
(MB)
参数
(M)
速度(CPU)
(毫秒/图像)
Meta SAM-b37593.741703
Meta SAM2-b16280.828867
Meta SAM2-t78.138.923430
MobileSAM40.710.123802
FastSAM-s 搭配 YOLOv8 主干网络23.911.858.0
Ultralytics YOLOv8n-seg7.1(小 11.0 倍)3.4(少 11.4 倍)24.8(快 945 倍)
Ultralytics YOLO11n-seg6.2(小 12.6 倍)2.9(少 13.4 倍)24.3(快 964 倍)
Ultralytics YOLO26n-seg6.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 RAM 的 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)

使用示例#

FastSAM 模型很容易集成到你的 Python 应用中。Ultralytics 提供易用的 Python API 和 CLI 命令,帮助简化开发流程。

预测用法#

要对图像进行分割,请按下方所示使用 predict 方法:

示例
from ultralytics import FastSAM

# 定义推理来源
source = "path/to/bus.jpg"

# 创建 FastSAM 模型
model = FastSAM("FastSAM-s.pt")  # 或 FastSAM-x.pt

# 对图像进行推理
everything_results = model(source, device="cpu", retina_masks=True, imgsz=1024, conf=0.4, iou=0.9)

# 使用边界框提示运行推理
results = model(source, bboxes=[439, 437, 524, 709])

# 使用点提示运行推理
results = model(source, points=[[200, 200]], labels=[1])

# 使用文本提示运行推理
results = model(source, texts="a photo of a dog")

# 同时使用边界框、点和文本提示运行推理
results = model(source, bboxes=[439, 437, 524, 709], points=[[200, 200]], labels=[1], texts="a photo of a dog")

此代码片段展示了如何轻松加载预训练模型并对图像进行预测。

FastSAMPredictor 示例

这样,你就可以对图像运行一次推理并获取所有分割结果 results,然后多次运行提示推理,而无需重复运行推理。

from ultralytics.models.fastsam import FastSAMPredictor

# 创建 FastSAMPredictor
overrides = {"conf": 0.25, "task": "segment", "mode": "predict", "model": "FastSAM-s.pt", "save": False, "imgsz": 1024}
predictor = FastSAMPredictor(overrides=overrides)

# 分割所有内容
everything_results = predictor("ultralytics/assets/bus.jpg")

# 提示推理
bbox_results = predictor.prompt(everything_results, bboxes=[[200, 200, 300, 300]])
point_results = predictor.prompt(everything_results, points=[200, 200])
text_results = predictor.prompt(everything_results, texts="a photo of a dog")
注意

上述示例中返回的所有 results 都是 Results 对象,便于访问预测掩码和源图像。

验证用法#

请注意,FastSAM 仅支持检测和分割单一类别的对象。这意味着它会将所有对象识别并分割为同一类别。因此,准备数据集时,你需要将所有对象类别 ID 转换为 0。

可以按如下方式在数据集上验证模型:

示例
from ultralytics import FastSAM

# 创建 FastSAM 模型
model = FastSAM("FastSAM-s.pt")  # 或 FastSAM-x.pt

# 验证模型
results = model.val(data="coco8-seg.yaml")

跟踪用法#

要在图像上执行目标跟踪,请使用 track 方法,如下所示:

示例
from ultralytics import FastSAM

# 创建 FastSAM 模型
model = FastSAM("FastSAM-s.pt")  # 或 FastSAM-x.pt

# 使用 FastSAM 模型在视频中跟踪
results = model.track(source="path/to/video.mp4", imgsz=640)

FastSAM 官方用法#

你也可以直接从 CASIA-LMC-Lab/FastSAM 仓库获取 FastSAM。下面简要介绍使用 FastSAM 时通常需要执行的步骤:

安装#

  1. 克隆 FastSAM 仓库:

    git clone https://github.com/CASIA-LMC-Lab/FastSAM.git
  2. 创建并激活包含 Python 3.9 的 Conda 环境:

    conda create -n FastSAM python=3.9
    conda activate FastSAM
  3. 进入克隆的仓库并安装所需软件包:

    cd FastSAM
    pip install -r requirements.txt
  4. 安装 CLIP 模型:

    pip install git+https://github.com/ultralytics/CLIP.git

用法示例#

  1. 下载模型检查点。

  2. 使用 FastSAM 进行推理。命令示例:

    • 分割图像中的所有对象:

      python Inference.py --model_path ./weights/FastSAM.pt --img_path ./images/dogs.jpg
    • 使用文本提示分割指定对象:

      python Inference.py --model_path ./weights/FastSAM.pt --img_path ./images/dogs.jpg --text_prompt "the yellow dog"
    • 分割边界框内的对象(以 xywh 格式提供框坐标):

      python Inference.py --model_path ./weights/FastSAM.pt --img_path ./images/dogs.jpg --box_prompt "[570,200,230,400]"
    • 分割特定点附近的对象:

      python Inference.py --model_path ./weights/FastSAM.pt --img_path ./images/dogs.jpg --point_prompt "[[520,360],[620,300]]" --point_label "[1,0]"

此外,你还可以通过 CASIA-LMC-Lab 的 Colab 演示试用 FastSAM。

引用与致谢#

我们感谢 FastSAM 作者在实时实例分割领域做出的重要贡献:

引用格式
@misc{zhao2023fast,
      title={Fast Segment Anything},
      author={Xu Zhao and Wenchao Ding and Yongqi An and Yinglong Du and Tao Yu and Min Li and Ming Tang and Jinqiao Wang},
      year={2023},
      eprint={2306.12156},
      archivePrefix={arXiv},
      primaryClass={cs.CV}
}

FastSAM 原论文可在 arXiv 上查看。作者已公开其研究成果,代码库可在 GitHub 上访问。我们感谢他们为推动该领域发展并让更广泛的社区能够访问其成果所付出的努力。

常见问题#

  • FastSAM 是 Fast Segment Anything Model(快速万物分割模型)的简称,是一种基于实时卷积神经网络(CNN)的解决方案,旨在降低计算需求,同时保持较高的目标分割性能。与采用更庞大的 Transformer 架构的 Segment Anything Model(SAM)不同,FastSAM 使用 Ultralytics YOLOv8-seg 分两个阶段高效执行实例分割:先分割所有实例,再通过提示进行选择。

  • FastSAM 将分割任务拆分为两个阶段,实现实时分割:使用 YOLOv8-seg 分割所有实例,然后通过提示进行选择。借助 CNN 的计算效率,FastSAM 在保持竞争力的同时,大幅降低了计算和资源需求。这种双阶段方法让 FastSAM 能够快速、高效地完成分割,适用于需要快速获得结果的应用场景。

  • FastSAM 适用于各种需要实时分割性能的计算机视觉任务。应用包括:

    • 用于质量控制和保证的工业自动化
    • 用于安全防护和监控的实时视频分析
    • 用于目标检测和分割的自动驾驶汽车
    • 用于精确、快速分割任务的医学影像

    FastSAM 能够处理各种用户交互提示,因此可以灵活适应不同场景。

  • 要在 Python 中使用 FastSAM 进行推理,可以参考以下示例:

    from ultralytics import FastSAM
    
    # 定义推理来源
    source = "path/to/bus.jpg"
    
    # 创建 FastSAM 模型
    model = FastSAM("FastSAM-s.pt")  # 或 FastSAM-x.pt
    
    # 对图像进行推理
    everything_results = model(source, device="cpu", retina_masks=True, imgsz=1024, conf=0.4, iou=0.9)
    
    # 使用边界框提示运行推理
    results = model(source, bboxes=[439, 437, 524, 709])
    
    # 使用点提示运行推理
    results = model(source, points=[[200, 200]], labels=[1])
    
    # 使用文本提示运行推理
    results = model(source, texts="a photo of a dog")
    
    # 同时使用边界框、点和文本提示运行推理
    results = model(source, bboxes=[439, 437, 524, 709], points=[[200, 200]], labels=[1], texts="a photo of a dog")

    有关推理方法的更多详情,请查看文档中的预测用法部分。

  • FastSAM 支持多种提示类型,用于引导分割任务:

    • 全量提示:为所有可见对象生成分割结果。
    • 边界框(BBox)提示:分割指定边界框内的对象。
    • 文本提示:使用描述性文本分割与描述相符的对象。
    • 点提示:分割用户指定点附近的对象。

    这种灵活性使 FastSAM 能够适应各种用户交互场景,提升其在不同应用中的实用性。有关如何使用这些提示的更多信息,请参阅主要功能部分。

评论