FastSAM:实时分割一切模型的轻量化实现

FreeGuideOnline 最新 2026-06-20

FastSAM 快速分割:实时分割一切模型的轻量化实现

目录

什么是 FastSAM

FastSAM 是 SAM (Segment Anything Model) 的超轻量、实时变体,由南开大学、阿德莱德大学等机构于 2023 年提出。它在保持 SAM 式“点击生成掩膜、分割一切”能力的同时,将模型体积从 ViT-H 的 2.4GB 压缩到仅 40MB 左右,推理速度提升数十倍,可轻松运行在 CPU、边缘设备上,真正实现了实时交互式分割。

SAM 固然强大,但部署成本极高。FastSAM 通过解耦分割任务,用 YOLOv8-seg 单阶段检测模型替代 Transformer 编码器,在极低的计算开销下实现了可用的分割质量,特别适合需要快速分割、资源受限的场景。

为什么要用 FastSAM

  • 推理速度快:在 GPU 上可达 40ms/帧,CPU 上亚秒级,而原始 SAM 通常需要数秒。
  • 模型极小:默认模型仅 40MB,移动端友好,可嵌入到 App 或边缘设备。
  • 安装简单:依赖极少,一个 pip 命令即可安装,无需复杂的 Segment Anything 环境配置。
  • 支持多种提示:能够处理全图分割、点提示、框提示,覆盖多数分割需求。
  • 社区活跃:基于 Ultralytics YOLO 接口,代码风格统一,易于二次开发。

核心原理

FastSAM 并不是压缩 SAM 的参数,而是重新设计了一条高效路径。它的工作流程分为两阶段:

第一阶段:全实例分割(YOLOv8-seg 充当图像编码器 + 掩膜解码器)

输入图像经过 YOLOv8-seg 网络,直接输出图像中所有潜在物体的实例分割掩膜。这一步取代了 SAM 中计算昂贵的 ViT 编码器和庞大的掩膜解码器。YOLOv8 本身已经具备多尺度特征提取和掩膜预测能力,因此可以极快地生成大量候选掩膜。

第二阶段:提示引导的掩膜匹配

当用户输入一个点或一个矩形框作为提示时,FastSAM 不会重新推理,而是在第一阶段产出的所有掩膜中,通过匹配算法筛选出与提示区域重叠最大、置信度最高的掩膜。这种先分割、后匹配的策略,将交互操作的开销降到几乎为零(仅做一次矩阵运算),极大加速了实时交互。

这套设计巧妙地避开了重编码器,实现了“一次推理,多次交互”的效果。

环境准备

确保 Python >= 3.8,推荐使用虚拟环境。

# 安装 PyTorch(根据自己 CUDA 版本选择,CPU 也可以)
pip install torch torchvision

# 安装 FastSAM(包含 ultralytics 等依赖)
pip install fastsam

# 或直接拉取最新代码
pip install git+https://github.com/CASIA-IVA-Lab/FastSAM.git

验证安装:

from fastsam import FastSAM, FastSAMPrompt
print("安装成功!")

快速上手

1. 全图分割,自动提取所有物体

from fastsam import FastSAM, FastSAMPrompt
import cv2

# 加载模型(自动下载预训练权重)
model = FastSAM('./FastSAM-x.pt')
IMAGE_PATH = './images/cat.jpg'
DEVICE = 'cpu'  # 或 'cuda'

# 全图分割
everything_results = model(IMAGE_PATH, device=DEVICE, retina_masks=True, imgsz=1024, conf=0.4, iou=0.9)

# 提取提示
prompt_process = FastSAMPrompt(IMAGE_PATH, everything_results, device=DEVICE)

# 无提示时,可输出所有掩膜
ann = prompt_process.everything_prompt()
# 结果保存在 everything_results 中,也可直接渲染显示
prompt_process.plot(annotations=ann, output_path='./output.jpg')

2. 使用点提示分割指定物体

# points 格式:[[x1, y1, label1], ...],label=1 表示前景点,0 表示背景点
prompt_process = FastSAMPrompt(IMAGE_PATH, everything_results, device=DEVICE)
ann = prompt_process.point_prompt(points=[[200, 300, 1]], pointlabel=[1])   # 单点指示前景
prompt_process.plot(annotations=ann, output_path='./point_output.jpg', point=[200,300])

3. 使用矩形框提示

# bbox 格式:[x1, y1, x2, y2]
prompt_process = FastSAMPrompt(IMAGE_PATH, everything_results, device=DEVICE)
ann = prompt_process.box_prompt(bbox=[100, 100, 400, 400])
prompt_process.plot(annotations=ann, output_path='./box_output.jpg', bbox=[100,100,400,400])

4. 文本提示(需要 CLIP 模型)

FastSAM 本身不支持文本引导,但可以结合 CLIP 实现开放词汇分割:

# 先用 everything_prompt 拿到所有掩膜,再用 CLIP 按文本打分筛选
import clip
# ... 加载 CLIP 模型,对每个掩膜区域编码并与文本特征计算相似度

更简单的做法是直接使用 FastSAM 的命令行工具,详情见后文。

参数详解与调优

在调用 model() 时,关键参数如下:

参数 说明 建议值
imgsz 输入尺寸,越大细节越好但更慢 1024(平衡),640(更快)
conf 置信度阈值,低于该值的框/掩膜会被丢弃 0.2 ~ 0.4,追求更多目标可降到 0.1
iou NMS 时的 IoU 阈值,控制掩膜重叠程度 0.9 或 0.7(允许轻微重叠)
retina_masks 是否将掩膜缩放到原始图像尺寸 True,否则掩膜尺寸为网络输出分辨率

掩膜匹配阶段(Prompt 类)也可调整:

  • point_promptbox_prompt 本质是基于候选掩膜的 IoU 匹配,若匹配结果不理想,可降低第一阶段 conf 让更多候选进入匹配池。
  • 可以设置 text 参数,但需要额外配置 CLIP 环境,命令行模式已集成。

常见应用场景

1. 交互式标注工具

在标注软件中集成 FastSAM,标注员点击几下即可获得精确掩膜,效率提升数倍。

2. 视频目标快速分割

由于推理速度极快,可对视频逐帧做全图分割,再通过点或框提示锁定目标,搭建轻量级视频物体跟踪。

3. 移动端/网页集成

模型体积小,可导出为 ONNX 或 TensorRT,部署到手机端或浏览器(通过 ONNX Runtime Web)实现实时分割。

4. 数据清洗与预处理

在大量图像中快速提取前景物体,生成实例级掩膜数据集,供下游精细模型训练。

命令行使用

FastSAM 提供简洁的 CLI 接口,无需编写代码即可测试:

# 全图分割
fastsam everything --image_path ./cat.jpg --output ./output/

# 点提示
fastsam point --image_path ./cat.jpg --point 200 300 --output ./output/

# 框提示
fastsam box --image_path ./cat.jpg --bbox 100 100 400 400 --output ./output/

# 文本提示(需安装 CLIP)
fastsam text --image_path ./cat.jpg --text "a cat" --output ./output/

总结

FastSAM 以极低的代价实现了“分割一切”的核心体验,将分割从沉重的大模型拉回到轻量实时可部署的轨道。对于初学者和工程应用来说,它是一个绝佳的起点:无需高端 GPU,无需复杂配置,5 分钟内就能完成分割任务。虽然在一些精细化边缘、复杂场景下不如 SAM 精确,但其速度优势和便捷性使其成为实时图像分割的首选方案。

建议读者在实践中从默认参数出发,逐步调整 confimgsz 以满足自己的精度/速度平衡,并尝试结合 CLIP 实现真正的开放词汇分割。