SAM 2 图像分割实战:自动 Mask、框提示和点提示完整演示

SAM 2 图像分割实战:自动 Mask、框提示和点提示完整演示


这篇教程根据我复现 SAM 2 图像分割流程时整理,重点演示模型安装、checkpoint 下载、自动 mask 生成、框提示分割和点提示分割。

SAM 2 非常适合做交互式分割和数据预标注。本文保留 notebook 的核心代码结构,方便你把示例图片替换成自己的业务图片进行实验。

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

  • 安装 SAM 2 官方仓库和可视化依赖
  • 下载 SAM 2 checkpoint
  • 准备本地示例图片
  • 使用自动 mask 生成器分割整张图
  • 使用框提示和点提示完成交互式分割

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

📚 文章目录

  • SAM 2 图像分割实战:自动 Mask、框提示和点提示完整演示
    • ⚙️ 环境准备
    • 🧠 加载 SAM 2 图像模型
    • 🎯 自动 Mask 生成
    • 📦 使用框提示分割
    • 📍 使用点提示分割
    • 📌 小结
    • 📚 同系列教程汇总

⚙️ 环境准备

先检查运行环境并安装依赖。建议在 Colab 或带 NVIDIA GPU 的环境中运行,避免训练或视频推理阶段显存不足。

!nvidia-smi
importos HOME=os.getcwd()print("HOME:",HOME)
!git clone https://github.com/facebookresearch/segment-anything-2.git%cd{HOME}/segment-anything-2!pip install-e.-q
!pip install-q supervision jupyter_bbox_widget
!mkdir-p{HOME}/checkpoints !wget-q https://dl.fbaipublicfiles.com/segment_anything_2/072824/sam2_hiera_tiny.pt-P{HOME}/checkpoints !wget-q https://dl.fbaipublicfiles.com/segment_anything_2/072824/sam2_hiera_small.pt-P{HOME}/checkpoints !wget-q https://dl.fbaipublicfiles.com/segment_anything_2/072824/sam2_hiera_base_plus.pt-P{HOME}/checkpoints !wget-q https://dl.fbaipublicfiles.com/segment_anything_2/072824/sam2_hiera_large.pt-P{HOME}/checkpoints
!mkdir-p{HOME}/data# 请从数据集后台下载示例图片,并放到 {HOME}/data 目录。# 本教程默认使用 dog.jpeg、dog-2.jpeg、dog-3.jpeg、dog-4.jpeg 四张图片。
importcv2importtorchimportbase64importnumpyasnpimportsupervisionassvfromsam2.build_samimportbuild_sam2fromsam2.sam2_image_predictorimportSAM2ImagePredictorfromsam2.automatic_mask_generatorimportSAM2AutomaticMaskGenerator
torch.autocast(device_type="cuda",dtype=torch.bfloat16).__enter__()iftorch.cuda.get_device_properties(0).major>=8:torch.backends.cuda.matmul.allow_tf32=Truetorch.backends.cudnn.allow_tf32=True

🧠 加载 SAM 2 图像模型

下载 checkpoint 后,通过配置文件和权重加载 SAM 2 图像模型。

DEVICE=torch.device('cuda'iftorch.cuda.is_available()else'cpu')CHECKPOINT=f"{HOME}/checkpoints/sam2_hiera_large.pt"CONFIG="sam2_hiera_l.yaml"sam2_model=build_sam2(CONFIG,CHECKPOINT,device=DEVICE,apply_postprocessing=False)

🎯 自动 Mask 生成

自动 mask 生成器会对整张图进行候选区域分割,适合快速探索图像中的可分割对象。

mask_generator=SAM2AutomaticMaskGenerator(sam2_model)
IMAGE_PATH=f"{HOME}/data/dog.jpeg"image_bgr=cv2.imread(IMAGE_PATH)image_rgb=cv2.cvtColor(image_bgr,cv2.COLOR_BGR2RGB)sam2_result=mask_generator.generate(image_rgb)
mask_annotator=sv.MaskAnnotator(color_lookup=sv.ColorLookup.INDEX)detections=sv.Detections.from_sam(sam_result=sam2_result)annotated_image=mask_annotator.annotate(scene=image_bgr.copy(),detections=detections)sv.plot_images_grid(images=[image_bgr,annotated_image],grid_size=(1,2),titles=['source image','segmented image'])

masks=[mask['segmentation']formaskinsorted(sam2_result,key=lambdax:x['area'],reverse=True)]sv.plot_images_grid(images=masks[:16],grid_size=(4,4),size=(12,12))

mask_generator_2=SAM2AutomaticMaskGenerator(model=sam2_model,points_per_side=64,points_per_batch=128,pred_iou_thresh=0.7,stability_score_thresh=0.92,stability_score_offset=0.7,crop_n_layers=1,box_nms_thresh=0.7,)
sam2_result_2=mask_generator_2.generate(image_rgb)
mask_annotator=sv.MaskAnnotator(color_lookup=sv.ColorLookup.INDEX)detections=sv.Detections.from_sam(sam_result=sam2_result_2)annotated_image=mask_annotator.annotate(scene=image_bgr.copy(),detections=detections)sv.plot_images_grid(images=[image_bgr,annotated_image],grid_size=(1,2),titles=['source image','segmented image'])

📦 使用框提示分割

框提示适合把分割范围限制在指定目标区域内,减少无关区域干扰。

predictor=SAM2ImagePredictor(sam2_model)
IMAGE_PATH=f"{HOME}/data/dog-2.jpeg"image_bgr=cv2.imread(IMAGE_PATH)image_rgb=cv2.cvtColor(image_bgr,cv2.COLOR_BGR2RGB)
defencode_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=[{'x':166,'y':835,'width':99,'height':175,'label':''},{'x':472,'y':885,'width':168,'height':249,'label':''},{'x':359,'y':727,'width':27,'height':155,'label':''},{'x':164,'y':1044,'width':279,'height':163,'label':''}]boxes=widget.bboxesifwidget.bboxeselsedefault_box boxes=np.array([[box['x'],box['y'],box['x']+box['width'],box['y']+box['height']]forboxinboxes])
predictor.set_image(image_rgb)masks,scores,logits=predictor.predict(box=boxes,multimask_output=False)# 单个 box 输入时,predictor 返回的 masks 形状为 (1, H, W);# 多个 box 输入时,返回形状为 (N, 1, H, W)。ifboxes.shape[0]!=1:masks=np.squeeze(masks)
box_annotator=sv.BoxAnnotator(color_lookup=sv.ColorLookup.INDEX)mask_annotator=sv.MaskAnnotator(color_lookup=sv.ColorLookup.INDEX)detections=sv.Detections(xyxy=sv.mask_to_xyxy(masks=masks),mask=masks.astype(bool))source_image=box_annotator.annotate(scene=image_bgr.copy(),detections=detections)segmented_image=mask_annotator.annotate(scene=image_bgr.copy(),detections=detections)sv.plot_images_grid(images=[source_image,segmented_image],grid_size=(1,2),titles=['source image','segmented image'])

📍 使用点提示分割

点提示适合交互式选择目标。多 mask 输出可以帮助比较不同候选分割。

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=[{'x':330,'y':450,'width':0,'height':0,'label':''},{'x':191,'y':665,'width':0,'height':0,'label':''},{'x':86,'y':879,'width':0,'height':0,'label':''},{'x':425,'y':727,'width':0,'height':0,'label':''}]boxes=widget.bboxesifwidget.bboxeselsedefault_box input_point=np.array([[box['x'],box['y']]forboxinboxes])input_label=np.ones(input_point.shape[0])
masks,scores,logits=predictor.predict(point_coords=input_point,point_labels=input_label,multimask_output=True,)
sv.plot_images_grid(images=masks,titles=[f"score:{score:.2f}"forscoreinscores],grid_size=(1,3),size=(12,12))


📌 小结

SAM 2 图像分割可以分成两类用法:自动生成整图 mask,或者通过框、点等提示让模型聚焦到指定目标。实际项目中可以先用自动 mask 做探索,再用提示方式做精修。

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

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

📚 同系列教程汇总

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

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

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

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

  • SAM 3 视频分割实战教程:用文本提示分割并跟踪视频中的目标

  • SAM 2 图像分割实战:自动 Mask、框提示和点提示完整演示-本文