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-smiimportos 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_generatorimportSAM2AutomaticMaskGeneratortorch.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,"+encodedIS_COLAB=TrueifIS_COLAB:fromgoogle.colabimportoutput output.enable_custom_widget_manager()fromjupyter_bbox_widgetimportBBoxWidget widget=BBoxWidget()widget.image=encode_image(IMAGE_PATH)widgetwidget.bboxesdefault_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)widgetwidget.bboxesdefault_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、框提示和点提示完整演示-本文