当前位置: 首页 > news >正文

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、框提示、点提示与文本提示

http://www.jsqmd.com/news/1190334/

相关文章:

  • OpenHarmony 关系型数据库 RDB 完整封装(API Version23 本地持久化数据库)
  • 莲籽甘,籽心苦,不剥玉壳不知我。龟求毛,兔觅角,几回一池秋水浪过。乱!乱!乱!春风红,秋光短,莲籽无须甘苦果山河碎,今昨何,俯弄星月,卧沐汉河,吃,了,睡!
  • 收藏了!1个让零基础小白也能看懂AI的GitHub开源课程,太全了
  • 工业洗地机靠谱厂家判定指南 资质与实绩双维度解析 - 奔跑123
  • 芝柏中国官方售后服务中心|网点地址和官方热线权威信息公告(2027年7月最新) - 亨得利官方服务中心
  • 抖音小店标题主图详情怎么优化?AI 自动整改方法 抖店微信小店批量商品优化软件工具 - 电商分享
  • 生产变更准入与回滚 SOP:从上线前检查到故障回滚的通用实践
  • ArkCompiler 5.0:方舟编译器新一代编译优化技术解析(160)
  • 河南冷库厂家综合实力排行:全维度实测对比解析 - 奔跑123
  • 权威评测:上海活动跟拍机构TOP10精选|2026年度最新测评结果全流程服务标准与价格透明说明及选型参考完整指南 - 全国影像制作行业测评
  • 【1979-2026】全国GDP栅格数据|1km分辨率
  • 2026面向跨境从业者的欧洲超大件物流服务推荐 - 奔跑123
  • OpenCV工业视觉实战04|形态学操作(腐蚀/膨胀/开运算/闭运算)去除毛刺、孔洞、碎点,YOLO目标轮廓修复神器
  • ChatGPT技术文档编写:为什么Top 1%团队坚持“3轮人机协同”?——基于GitHub上2,147份PR文档的A/B测试数据揭秘
  • YOLO-NAS 自定义目标检测训练实战:SuperGradients 训练与测试
  • 2026年7月最新厦门翔安区大嶝街道亨得利官方名表服务中心电话公示 - 亨得利官方博客
  • 2026年济南鑫舜捷化工水处理药剂厂家业务线全面梳理 - 奔跑123
  • 商丘市区虞城县性价比高且材料靠谱的装修公司整理 - 奔跑123
  • 国内专业不锈钢锻造厂排行:实力与资质双维度解析 - 奔跑123
  • ArkUI 5.0渲染管线:从代码到像素的极致渲染路径(161)
  • 重庆大学城租房评测:全维度对比与实用选择指南 - 奔跑123
  • 2026美国双清专线公司推荐实用选择标准汇总参考 - 奔跑123
  • 2026济南寻找工业级硫酸氢钠的日常经历分享 - 奔跑123
  • 2026年长沙市二手房全屋定制相关服务商名录 - 奔跑123
  • 亲身到店探访杭州亨得利官方名表服务中心|详细地址与官方售后热线(2026年7月更新) - 亨得利官方
  • OpenCV工业视觉实战05|轮廓检测+面积筛选+外接矩形,过滤干扰目标,实现CV精准目标筛选(YOLO后处理核心)
  • 为什么 AI 总是“一本正经地胡说八道”?大模型幻觉终于讲明白了
  • 2026年海安油烟机维修选哪家 本地靠谱服务商榜单参考 - 热点品牌推荐
  • 【1980-2025】中科院30m土地利用/覆盖数据|全国|TIFF
  • 深度评测:福州商业摄影机构TOP10精选|2026年度最新测评结果全流程服务标准与价格透明说明及选型参考完整指南 - 全国影像制作行业测评