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 HOMEos.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 githttps://github.com/openai/CLIP.git# 安装 SAM!pip-q install githttps://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_PATHf{HOME}/weights/FastSAM.ptSAM_SAM_CHECKPOINT_PATHf{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 方式做交互式分割。DEVICEtorch.device(cuda:0iftorch.cuda.is_available()elsecpu)print(fDEVICE {DEVICE})fast_samFastSAM(FAST_SAM_CHECKPOINT_PATH)IMAGE_PATHf{HOME}/data/dog.jpeg 自动 Mask 生成自动生成整图 mask适合快速浏览分割候选。os.makedirs(f{HOME}/output,exist_okTrue)resultsfast_sam(sourceIMAGE_PATH,deviceDEVICE,retina_masksTrue,imgsz1024,conf0.4,iou0.9)prompt_processFastSAMPrompt(IMAGE_PATH,results,deviceDEVICE)masksprompt_process.everything_prompt()prompt_process.plot(annotationsmasks,outputf{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:imagecv2.imread(image_path)xyxysv.mask_to_xyxy(masksmasks)detectionssv.Detections(xyxyxyxy,maskmasks)mask_annotatorsv.MaskAnnotator(color_lookupsv.ColorLookup.INDEX)returnmask_annotator.annotate(sceneimage.copy(),detectionsdetections)masksmasks_to_bool(masks)annotated_imageannotate_image(image_pathIMAGE_PATH,masksmasks)sv.plot_image(imageannotated_image,size(8,8))resultsfast_sam(sourceIMAGE_PATH,deviceDEVICE,retina_masksTrue,imgsz1024,conf0.5,iou0.6)prompt_processFastSAMPrompt(IMAGE_PATH,results,deviceDEVICE)masksprompt_process.everything_prompt()masksmasks_to_bool(masks)annotated_imageannotate_image(image_pathIMAGE_PATH,masksmasks)sv.plot_image(imageannotated_image,size(8,8)) 框提示分割框提示适合把模型的注意力锁定到某个对象上。# helper function that loads an image before adding it to the widgetdefencode_image(filepath):withopen(filepath,rb)asf:image_bytesf.read()encodedstr(base64.b64encode(image_bytes),utf-8)returndata:image/jpg;base64,encodedIS_COLABTrueifIS_COLAB:fromgoogle.colabimportoutput output.enable_custom_widget_manager()fromjupyter_bbox_widgetimportBBoxWidget widgetBBoxWidget()widget.imageencode_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:}boxwidget.bboxes[0]ifwidget.bboxeselsedefault_box box[box[x],box[y],box[x]box[width],box[y]box[height]]resultsfast_sam(sourceIMAGE_PATH,deviceDEVICE,retina_masksTrue,imgsz1024,conf0.5,iou0.6)prompt_processFastSAMPrompt(IMAGE_PATH,results,deviceDEVICE)masksprompt_process.box_prompt(bboxbox)masksmasks_to_bool(masks)annotated_imageannotate_image(image_pathIMAGE_PATH,masksmasks)sv.plot_image(imageannotated_image,size(8,8)) 点提示分割点提示能进一步缩小分割范围。point[405,505]resultsfast_sam(sourceIMAGE_PATH,deviceDEVICE,retina_masksTrue,imgsz1024,conf0.5,iou0.6)prompt_processFastSAMPrompt(IMAGE_PATH,results,deviceDEVICE)masksprompt_process.point_prompt(points[point],pointlabel[1])masksmasks_to_bool(masks)annotated_imageannotate_image(image_pathIMAGE_PATH,masksmasks)sv.plot_image(imageannotated_image,size(8,8)) 文本提示分割文本提示可以直接用语言筛选目标方便做开放式分割。resultsfast_sam(sourceIMAGE_PATH,deviceDEVICE,retina_masksTrue,imgsz1024,conf0.5,iou0.6)prompt_processFastSAMPrompt(IMAGE_PATH,results,deviceDEVICE)masksprompt_process.text_prompt(textcap)masksmasks_to_bool(masks)annotated_imageannotate_image(image_pathIMAGE_PATH,masksmasks)sv.plot_image(imageannotated_image,size(8,8)) 与 SAM 对比这一部分把 FastSAM 和 SAM 放在一起比较看看输出差异。IMAGE_PATHf{HOME}/data/robot.jpegMODEL_TYPEvit_hsamsam_model_registry[MODEL_TYPE](checkpointSAM_SAM_CHECKPOINT_PATH).to(deviceDEVICE)mask_generatorSamAutomaticMaskGenerator(sam)image_bgrcv2.imread(IMAGE_PATH)image_rgbcv2.cvtColor(image_bgr,cv2.COLOR_BGR2RGB)sam_resultmask_generator.generate(image_rgb)sam_detectionssv.Detections.from_sam(sam_resultsam_result)resultsfast_sam(sourceIMAGE_PATH,deviceDEVICE,retina_masksTrue,imgsz1024,conf0.5,iou0.6)prompt_processFastSAMPrompt(IMAGE_PATH,results,deviceDEVICE)masksprompt_process.everything_prompt()masksmasks_to_bool(masks)xyxysv.mask_to_xyxy(masksmasks)fast_sam_detectionssv.Detections(xyxyxyxy,maskmasks)mask_annotatorsv.MaskAnnotator(color_lookupsv.ColorLookup.INDEX)sam_resultmask_annotator.annotate(sceneimage_bgr.copy(),detectionssam_detections)fast_sam_resultmask_annotator.annotate(sceneimage_bgr.copy(),detectionsfast_sam_detections)sv.plot_images_grid(images[sam_result,fast_sam_result],grid_size(1,2),titles[SAM,FastSAM])mask_annotatorsv.MaskAnnotator(color_lookupsv.ColorLookup.INDEX)sam_resultmask_annotator.annotate(scenenp.zeros_like(image_bgr),detectionssam_detections)fast_sam_resultmask_annotator.annotate(scenenp.zeros_like(image_bgr),detectionsfast_sam_detections)sv.plot_images_grid(images[sam_result,fast_sam_result],grid_size(1,2),titles[SAM,FastSAM])defcompute_iou(mask1,mask2):intersectionnp.logical_and(mask1,mask2)unionnp.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_masksfilter_masks(sam_detections.mask,fast_sam_detections.mask,0.5)diff_xyxysv.mask_to_xyxy(masksdiff_masks)diff_detectionssv.Detections(xyxydiff_xyxy,maskdiff_masks)mask_annotatorsv.MaskAnnotator(color_lookupsv.ColorLookup.INDEX)diff_resultmask_annotator.annotate(scenenp.zeros_like(image_bgr),detectionsdiff_detections)sv.plot_image(imagediff_result,size(8,8)) 真实数据集效果最后在真实数据集样本上再做一次文本提示分割检查泛化表现。%cd{HOME}# 如需在真实数据集上测试请先准备好对应数据目录和标注文件。DATASET_DIR/content/dataset# 修改为数据集后台导出的数据集目录IMAGE_PATHos.path.join(DATASET_DIR,train,images,example.jpg)IMAGE_PATHos.path.join(dataset.location,train,images,IMG_2311_jpeg_jpg.rf.09ae6820eaff21dc838b1f9b6b20342b.jpg)resultsfast_sam(sourceIMAGE_PATH,deviceDEVICE,retina_masksTrue,imgsz1024,conf0.5,iou0.6)prompt_processFastSAMPrompt(IMAGE_PATH,results,deviceDEVICE)masksprompt_process.text_prompt(textPenguin)masksmasks_to_bool(masks)annotated_imageannotate_image(image_pathIMAGE_PATH,masksmasks)sv.plot_image(imageannotated_image,size(8,8)) 小结FastSAM 的交互式分割流程很适合做样例探索。真正落地时建议先用自动 mask 找候选对象再用框、点和文本提示做二次筛选。这一类 notebook 建议按“先环境、再数据、再单样例、最后批量推理”的顺序复现。遇到报错时优先检查 GPU、依赖版本、数据集目录和模型权重路径。后续我会继续按源项目顺序整理同系列中的目标检测、实例分割、OCR、多目标跟踪和视觉大模型教程。 同系列教程汇总Google Gemini 3.5 Flash 零样本目标检测教程从提示词到可视化结果GLM-OCR 文档识别实战教程从验证码、公式到车牌 OCRRF-DETR ByteTrack 多目标跟踪实战教程从命令行到 Python 视频轨迹可视化SAM 3 图像分割实战教程文本、框和点提示的多种分割方式FastSAM 图像分割实战自动 Mask、框提示、点提示与文本提示