FastSAM 图像分割实战:自动 Mask、框提示、点提示与文本提示
FastSAM 图像分割实战:自动 Mask、框提示、点提示与文本提示
这篇教程根据我复现 FastSAM 图像分割流程时整理,重点演示如何加载 FastSAM、对比 SAM、并用框提示、点提示和文本提示做交互式分割。
FastSAM 的优势是推理快、交互灵活。本文适合把图像分割当成一个可视化工具链来理解,也适合做分割效果对比。
本文会重点跑通以下流程:
- 安装 FastSAM、CLIP、SAM 和可视化依赖
- 下载模型权重并准备示例图片
- 用自动 mask 做整图分割
- 使用框提示、点提示和文本提示细化目标
- 把 FastSAM 与 SAM 结果做对比并检查差异
如果你正在系统学习目标检测、实例分割、OCR、多目标跟踪或视觉大模型,建议收藏本文;配套 notebook、示例图片和运行环境说明后续会继续整理。如果环境配置卡住,可以在评论区说明具体报错。
📚 文章目录
- FastSAM 图像分割实战:自动 Mask、框提示、点提示与文本提示
- ⚙️ 环境准备
- ⬇️ 下载权重
- 🖼️ 准备示例图片
- 🧠 加载 FastSAM 模型
- 🎯 自动 Mask 生成
- 📦 框提示分割
- 📍 点提示分割
- 📝 文本提示分割
- 🆚 与 SAM 对比
- 📊 真实数据集效果
- 📌 小结
- 📚 同系列教程汇总
⚙️ 环境准备
先检查运行环境并安装依赖。建议优先使用带 NVIDIA GPU 的环境,避免推理和训练阶段显存不足。
!nvidia-smiimportos 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}/weightsFAST_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,"+encodedIS_COLAB=TrueifIS_COLAB:fromgoogle.colabimportoutput output.enable_custom_widget_manager()fromjupyter_bbox_widgetimportBBoxWidget widget=BBoxWidget()widget.image=encode_image(IMAGE_PATH)widgetwidget.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、框提示、点提示与文本提示