FastSAM 图像分割实战:自动 Mask、框提示、点提示与文本提示

FastSAM 图像分割实战:自动 Mask、框提示、点提示与文本提示


这篇教程根据我复现 FastSAM 图像分割流程时整理,重点演示如何加载 FastSAM、对比 SAM、并用框提示、点提示和文本提示做交互式分割。

FastSAM 的优势是推理快、交互灵活。本文适合把图像分割当成一个可视化工具链来理解,也适合做分割效果对比。

本文会重点跑通以下流程:

  • 安装 FastSAM、CLIP、SAM 和可视化依赖
  • 下载模型权重并准备示例图片
  • 用自动 mask 做整图分割
  • 使用框提示、点提示和文本提示细化目标
  • 把 FastSAM 与 SAM 结果做对比并检查差异

如果你正在系统学习目标检测、实例分割、OCR、多目标跟踪或视觉大模型,建议收藏本文;配套 notebook、示例图片和运行环境说明后续会继续整理。如果环境配置卡住,可以在评论区说明具体报错。

📚 文章目录

  • FastSAM 图像分割实战:自动 Mask、框提示、点提示与文本提示
    • ⚙️ 环境准备
    • ⬇️ 下载权重
    • 🖼️ 准备示例图片
    • 🧠 加载 FastSAM 模型
    • 🎯 自动 Mask 生成
    • 📦 框提示分割
    • 📍 点提示分割
    • 📝 文本提示分割
    • 🆚 与 SAM 对比
    • 📊 真实数据集效果
    • 📌 小结
    • 📚 同系列教程汇总

⚙️ 环境准备

先检查运行环境并安装依赖。建议优先使用带 NVIDIA GPU 的环境,避免推理和训练阶段显存不足。

!nvidia-smi
importos HOME=os.getcwd()print("HOME:",HOME)
%cd{HOME}# 安装 FastSAM!git clone https://github.com/CASIA-IVA-Lab/FastSAM.git !pip-q install-r FastSAM/requirements.txt# 安装 CLIP!pip-q install git+https://github.com/openai/CLIP.git# 安装 SAM!pip-q install git+https://github.com/facebookresearch/segment-anything.git# 安装其他依赖!pip-q install supervision jupyter_bbox_widget

⬇️ 下载权重

权重和 checkpoint 下载后,后面的自动 mask、提示分割和对比实验才跑得起来。

!mkdir-p{HOME}/weights !wget-P{HOME}/weights-q https://huggingface.co/spaces/An-619/FastSAM/resolve/main/weights/FastSAM.pt !wget-P{HOME}/weights-q https://dl.fbaipublicfiles.com/segment_anything/sam_vit_h_4b8939.pth !ls-lh{HOME}/weights
FAST_SAM_CHECKPOINT_PATH=f"{HOME}/weights/FastSAM.pt"SAM_SAM_CHECKPOINT_PATH=f"{HOME}/weights/sam_vit_h_4b8939.pth"

🖼️ 准备示例图片

示例图片可以直接从数据集后台准备好,文件名保持和代码一致即可。

!mkdir-p{HOME}/data# 请从数据集后台下载示例图片,并放到 {HOME}/data 目录。# 默认使用 dog.jpeg、robot.jpeg 两张示例图。
%cd{HOME}/FastSAMimportosimportcv2importtorchimportbase64importsupervisionassvimportnumpyasnpfromfastsamimportFastSAM,FastSAMPromptfromsegment_anythingimportsam_model_registry,SamAutomaticMaskGenerator,SamPredictor

🧠 加载 FastSAM 模型

先加载 FastSAM 模型,再用 prompt 方式做交互式分割。

DEVICE=torch.device('cuda:0'iftorch.cuda.is_available()else'cpu')print(f"DEVICE ={DEVICE}")fast_sam=FastSAM(FAST_SAM_CHECKPOINT_PATH)
IMAGE_PATH=f"{HOME}/data/dog.jpeg"

🎯 自动 Mask 生成

自动生成整图 mask,适合快速浏览分割候选。

os.makedirs(f"{HOME}/output",exist_ok=True)
results=fast_sam(source=IMAGE_PATH,device=DEVICE,retina_masks=True,imgsz=1024,conf=0.4,iou=0.9)prompt_process=FastSAMPrompt(IMAGE_PATH,results,device=DEVICE)masks=prompt_process.everything_prompt()prompt_process.plot(annotations=masks,output=f"{HOME}/output")
# Convert masks to boolean (True/False)defmasks_to_bool(masks):iftype(masks)==np.ndarray:returnmasks.astype(bool)returnmasks.cpu().numpy().astype(bool)
defannotate_image(image_path:str,masks:np.ndarray)->np.ndarray:image=cv2.imread(image_path)xyxy=sv.mask_to_xyxy(masks=masks)detections=sv.Detections(xyxy=xyxy,mask=masks)mask_annotator=sv.MaskAnnotator(color_lookup=sv.ColorLookup.INDEX)returnmask_annotator.annotate(scene=image.copy(),detections=detections)
masks=masks_to_bool(masks)annotated_image=annotate_image(image_path=IMAGE_PATH,masks=masks)sv.plot_image(image=annotated_image,size=(8,8))

results=fast_sam(source=IMAGE_PATH,device=DEVICE,retina_masks=True,imgsz=1024,conf=0.5,iou=0.6)prompt_process=FastSAMPrompt(IMAGE_PATH,results,device=DEVICE)masks=prompt_process.everything_prompt()
masks=masks_to_bool(masks)annotated_image=annotate_image(image_path=IMAGE_PATH,masks=masks)sv.plot_image(image=annotated_image,size=(8,8))

📦 框提示分割

框提示适合把模型的注意力锁定到某个对象上。

# helper function that loads an image before adding it to the widgetdefencode_image(filepath):withopen(filepath,'rb')asf:image_bytes=f.read()encoded=str(base64.b64encode(image_bytes),'utf-8')return"data:image/jpg;base64,"+encoded
IS_COLAB=TrueifIS_COLAB:fromgoogle.colabimportoutput output.enable_custom_widget_manager()fromjupyter_bbox_widgetimportBBoxWidget widget=BBoxWidget()widget.image=encode_image(IMAGE_PATH)widget
widget.bboxes
# default_box is going to be used if you will not draw any box on image abovedefault_box={'x':68,'y':247,'width':555,'height':678,'label':''}box=widget.bboxes[0]ifwidget.bboxeselsedefault_box box=[box['x'],box['y'],box['x']+box['width'],box['y']+box['height']]
results=fast_sam(source=IMAGE_PATH,device=DEVICE,retina_masks=True,imgsz=1024,conf=0.5,iou=0.6)prompt_process=FastSAMPrompt(IMAGE_PATH,results,device=DEVICE)masks=prompt_process.box_prompt(bbox=box)
masks=masks_to_bool(masks)annotated_image=annotate_image(image_path=IMAGE_PATH,masks=masks)sv.plot_image(image=annotated_image,size=(8,8))

📍 点提示分割

点提示能进一步缩小分割范围。

point=[405,505]
results=fast_sam(source=IMAGE_PATH,device=DEVICE,retina_masks=True,imgsz=1024,conf=0.5,iou=0.6)prompt_process=FastSAMPrompt(IMAGE_PATH,results,device=DEVICE)masks=prompt_process.point_prompt(points=[point],pointlabel=[1])
masks=masks_to_bool(masks)annotated_image=annotate_image(image_path=IMAGE_PATH,masks=masks)sv.plot_image(image=annotated_image,size=(8,8))

📝 文本提示分割

文本提示可以直接用语言筛选目标,方便做开放式分割。

results=fast_sam(source=IMAGE_PATH,device=DEVICE,retina_masks=True,imgsz=1024,conf=0.5,iou=0.6)prompt_process=FastSAMPrompt(IMAGE_PATH,results,device=DEVICE)masks=prompt_process.text_prompt(text='cap')
masks=masks_to_bool(masks)annotated_image=annotate_image(image_path=IMAGE_PATH,masks=masks)sv.plot_image(image=annotated_image,size=(8,8))

🆚 与 SAM 对比

这一部分把 FastSAM 和 SAM 放在一起比较,看看输出差异。

IMAGE_PATH=f"{HOME}/data/robot.jpeg"
MODEL_TYPE="vit_h"sam=sam_model_registry[MODEL_TYPE](checkpoint=SAM_SAM_CHECKPOINT_PATH).to(device=DEVICE)mask_generator=SamAutomaticMaskGenerator(sam)
image_bgr=cv2.imread(IMAGE_PATH)image_rgb=cv2.cvtColor(image_bgr,cv2.COLOR_BGR2RGB)sam_result=mask_generator.generate(image_rgb)sam_detections=sv.Detections.from_sam(sam_result=sam_result)
results=fast_sam(source=IMAGE_PATH,device=DEVICE,retina_masks=True,imgsz=1024,conf=0.5,iou=0.6)prompt_process=FastSAMPrompt(IMAGE_PATH,results,device=DEVICE)masks=prompt_process.everything_prompt()masks=masks_to_bool(masks)xyxy=sv.mask_to_xyxy(masks=masks)fast_sam_detections=sv.Detections(xyxy=xyxy,mask=masks)
mask_annotator=sv.MaskAnnotator(color_lookup=sv.ColorLookup.INDEX)sam_result=mask_annotator.annotate(scene=image_bgr.copy(),detections=sam_detections)fast_sam_result=mask_annotator.annotate(scene=image_bgr.copy(),detections=fast_sam_detections)sv.plot_images_grid(images=[sam_result,fast_sam_result],grid_size=(1,2),titles=['SAM','FastSAM'])

mask_annotator=sv.MaskAnnotator(color_lookup=sv.ColorLookup.INDEX)sam_result=mask_annotator.annotate(scene=np.zeros_like(image_bgr),detections=sam_detections)fast_sam_result=mask_annotator.annotate(scene=np.zeros_like(image_bgr),detections=fast_sam_detections)sv.plot_images_grid(images=[sam_result,fast_sam_result],grid_size=(1,2),titles=['SAM','FastSAM'])

defcompute_iou(mask1,mask2):intersection=np.logical_and(mask1,mask2)union=np.logical_or(mask1,mask2)returnnp.sum(intersection)/np.sum(union)deffilter_masks(mask_array1,mask_array2,threshold):returnnp.array([mask1formask1inmask_array1ifmax(compute_iou(mask1,mask2)formask2inmask_array2)<threshold])
diff_masks=filter_masks(sam_detections.mask,fast_sam_detections.mask,0.5)diff_xyxy=sv.mask_to_xyxy(masks=diff_masks)diff_detections=sv.Detections(xyxy=diff_xyxy,mask=diff_masks)mask_annotator=sv.MaskAnnotator(color_lookup=sv.ColorLookup.INDEX)diff_result=mask_annotator.annotate(scene=np.zeros_like(image_bgr),detections=diff_detections)sv.plot_image(image=diff_result,size=(8,8))

📊 真实数据集效果

最后在真实数据集样本上再做一次文本提示分割,检查泛化表现。

%cd{HOME}# 如需在真实数据集上测试,请先准备好对应数据目录和标注文件。DATASET_DIR="/content/dataset"# 修改为数据集后台导出的数据集目录IMAGE_PATH=os.path.join(DATASET_DIR,"train","images","example.jpg")
IMAGE_PATH=os.path.join(dataset.location,'train','images','IMG_2311_jpeg_jpg.rf.09ae6820eaff21dc838b1f9b6b20342b.jpg')
results=fast_sam(source=IMAGE_PATH,device=DEVICE,retina_masks=True,imgsz=1024,conf=0.5,iou=0.6)prompt_process=FastSAMPrompt(IMAGE_PATH,results,device=DEVICE)masks=prompt_process.text_prompt(text='Penguin')
masks=masks_to_bool(masks)annotated_image=annotate_image(image_path=IMAGE_PATH,masks=masks)sv.plot_image(image=annotated_image,size=(8,8))


📌 小结

FastSAM 的交互式分割流程很适合做样例探索。真正落地时,建议先用自动 mask 找候选对象,再用框、点和文本提示做二次筛选。

这一类 notebook 建议按“先环境、再数据、再单样例、最后批量推理”的顺序复现。遇到报错时,优先检查 GPU、依赖版本、数据集目录和模型权重路径。

后续我会继续按源项目顺序整理同系列中的目标检测、实例分割、OCR、多目标跟踪和视觉大模型教程。

📚 同系列教程汇总

  • Google Gemini 3.5 Flash 零样本目标检测教程:从提示词到可视化结果

  • GLM-OCR 文档识别实战教程:从验证码、公式到车牌 OCR

  • RF-DETR + ByteTrack 多目标跟踪实战教程:从命令行到 Python 视频轨迹可视化

  • SAM 3 图像分割实战教程:文本、框和点提示的多种分割方式

  • FastSAM 图像分割实战:自动 Mask、框提示、点提示与文本提示