Skip to content

Fast Segment Anything Model (FastSAM)

Fast Segment Anything Model (FastSAM) 是一种新颖的、基于实时CNN的解决方案,用于Segment Anything任务。该任务旨在根据各种可能的用户交互提示,分割图像中的任何对象。FastSAM显著降低了计算需求,同时保持了竞争性能,使其成为各种视觉任务的实用选择。



观看: 使用Ultralytics的FastSAM进行对象跟踪

模型架构

Fast Segment Anything Model (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-s FastSAM-s.pt 实例分割
FastSAM-x FastSAM-x.pt 实例分割

使用示例

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)

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

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

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

# 同时使用bboxes、points和texts提示运行推理
results = model(source, bboxes=[439, 437, 524, 709], points=[[200, 200]], labels=[1], texts="a photo of a dog")
# 加载一个FastSAM模型并对其进行分割
yolo segment predict model=FastSAM-s.pt source=path/to/bus.jpg imgsz=640

此代码片段展示了加载预训练模型并在图像上运行预测的简单性。

FastSAMPredictor示例

这种方式可以在图像上运行推理并一次性获取所有分割结果,然后多次运行提示推理而无需多次运行推理。

from ultralytics.models.fastsam import FastSAMPredictor

# 创建FastSAMPredictor
overrides = dict(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对象,便于轻松访问预测的掩码和源图像。

验证用法

可以在数据集上对模型进行验证,如下所示:

示例

from ultralytics import FastSAM

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

# 验证模型
results = model.val(data="coco8-seg.yaml")
# 加载一个FastSAM模型并在COCO8示例数据集上进行验证,图像大小为640
yolo segment val model=FastSAM-s.pt data=coco8.yaml imgsz=640

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

跟踪用法

要在图像上执行目标跟踪,请使用如下所示的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)
yolo segment track model=FastSAM-s.pt source="path/to/video/file.mp4" imgsz=640

FastSAM官方用法

FastSAM也可以直接从https://github.com/CASIA-IVA-Lab/FastSAM仓库中获取。以下是使用FastSAM时可能采取的典型步骤的简要概述:

安装

  1. 克隆FastSAM仓库:

    git clone https://github.com/CASIA-IVA-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进行推理。示例命令:

  3. 分割图像中的所有内容:

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

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

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

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

此外,您可以通过Colab演示或在HuggingFace网页演示上尝试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是什么,它与SAM有何不同?

FastSAM,即快速分割任何模型,是一种基于实时卷积神经网络(CNN)的解决方案,旨在减少计算需求的同时保持高性能的对象分割任务。与使用更重的基于Transformer架构的分割任何模型(SAM)不同,FastSAM利用Ultralytics YOLOv8-seg进行两阶段的有效实例分割:全实例分割后进行提示引导选择。

FastSAM如何实现实时分割性能?

FastSAM通过将分割任务解耦为YOLOv8-seg的全实例分割和提示引导选择阶段来实现实时分割。通过利用CNN的计算效率,FastSAM在保持竞争性能的同时显著减少了计算和资源需求。这种双阶段方法使FastSAM能够提供快速且高效的分割,适用于需要快速结果的应用。

FastSAM的实际应用有哪些?

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

  • 工业自动化中的质量控制和保证
  • 实时视频分析用于安全和监控
  • 自动驾驶车辆中的对象检测和分割
  • 医学成像中的精确和快速分割任务

其处理各种用户交互提示的能力使FastSAM适用于多样化的场景。

如何在Python中使用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支持哪些类型的提示用于分割任务?

FastSAM支持多种提示类型来指导分割任务: - Everything Prompt: 生成所有可见物体的分割。 - Bounding Box (BBox) Prompt: 分割指定边界框内的物体。 - Text Prompt: 使用描述性文本分割符合描述的物体。 - Point Prompt: 分割靠近用户定义点的物体。

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


📅 Created 11 months ago ✏️ Updated 20 days ago

Comments