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

📅 2026/7/13 1:33:06
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 HOMEos.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_typecuda,dtypetorch.bfloat16).__enter__()iftorch.cuda.get_device_properties(0).major8:torch.backends.cuda.matmul.allow_tf32Truetorch.backends.cudnn.allow_tf32True 加载 SAM 2 图像模型下载 checkpoint 后通过配置文件和权重加载 SAM 2 图像模型。DEVICEtorch.device(cudaiftorch.cuda.is_available()elsecpu)CHECKPOINTf{HOME}/checkpoints/sam2_hiera_large.ptCONFIGsam2_hiera_l.yamlsam2_modelbuild_sam2(CONFIG,CHECKPOINT,deviceDEVICE,apply_postprocessingFalse) 自动 Mask 生成自动 mask 生成器会对整张图进行候选区域分割适合快速探索图像中的可分割对象。mask_generatorSAM2AutomaticMaskGenerator(sam2_model)IMAGE_PATHf{HOME}/data/dog.jpegimage_bgrcv2.imread(IMAGE_PATH)image_rgbcv2.cvtColor(image_bgr,cv2.COLOR_BGR2RGB)sam2_resultmask_generator.generate(image_rgb)mask_annotatorsv.MaskAnnotator(color_lookupsv.ColorLookup.INDEX)detectionssv.Detections.from_sam(sam_resultsam2_result)annotated_imagemask_annotator.annotate(sceneimage_bgr.copy(),detectionsdetections)sv.plot_images_grid(images[image_bgr,annotated_image],grid_size(1,2),titles[source image,segmented image])masks[mask[segmentation]formaskinsorted(sam2_result,keylambdax:x[area],reverseTrue)]sv.plot_images_grid(imagesmasks[:16],grid_size(4,4),size(12,12))mask_generator_2SAM2AutomaticMaskGenerator(modelsam2_model,points_per_side64,points_per_batch128,pred_iou_thresh0.7,stability_score_thresh0.92,stability_score_offset0.7,crop_n_layers1,box_nms_thresh0.7,)sam2_result_2mask_generator_2.generate(image_rgb)mask_annotatorsv.MaskAnnotator(color_lookupsv.ColorLookup.INDEX)detectionssv.Detections.from_sam(sam_resultsam2_result_2)annotated_imagemask_annotator.annotate(sceneimage_bgr.copy(),detectionsdetections)sv.plot_images_grid(images[image_bgr,annotated_image],grid_size(1,2),titles[source image,segmented image]) 使用框提示分割框提示适合把分割范围限制在指定目标区域内减少无关区域干扰。predictorSAM2ImagePredictor(sam2_model)IMAGE_PATHf{HOME}/data/dog-2.jpegimage_bgrcv2.imread(IMAGE_PATH)image_rgbcv2.cvtColor(image_bgr,cv2.COLOR_BGR2RGB)defencode_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.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:}]boxeswidget.bboxesifwidget.bboxeselsedefault_box boxesnp.array([[box[x],box[y],box[x]box[width],box[y]box[height]]forboxinboxes])predictor.set_image(image_rgb)masks,scores,logitspredictor.predict(boxboxes,multimask_outputFalse)# 单个 box 输入时predictor 返回的 masks 形状为 (1, H, W)# 多个 box 输入时返回形状为 (N, 1, H, W)。ifboxes.shape[0]!1:masksnp.squeeze(masks)box_annotatorsv.BoxAnnotator(color_lookupsv.ColorLookup.INDEX)mask_annotatorsv.MaskAnnotator(color_lookupsv.ColorLookup.INDEX)detectionssv.Detections(xyxysv.mask_to_xyxy(masksmasks),maskmasks.astype(bool))source_imagebox_annotator.annotate(sceneimage_bgr.copy(),detectionsdetections)segmented_imagemask_annotator.annotate(sceneimage_bgr.copy(),detectionsdetections)sv.plot_images_grid(images[source_image,segmented_image],grid_size(1,2),titles[source image,segmented image]) 使用点提示分割点提示适合交互式选择目标。多 mask 输出可以帮助比较不同候选分割。IS_COLABTrueifIS_COLAB:fromgoogle.colabimportoutput output.enable_custom_widget_manager()fromjupyter_bbox_widgetimportBBoxWidget widgetBBoxWidget()widget.imageencode_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:}]boxeswidget.bboxesifwidget.bboxeselsedefault_box input_pointnp.array([[box[x],box[y]]forboxinboxes])input_labelnp.ones(input_point.shape[0])masks,scores,logitspredictor.predict(point_coordsinput_point,point_labelsinput_label,multimask_outputTrue,)sv.plot_images_grid(imagesmasks,titles[fscore:{score:.2f}forscoreinscores],grid_size(1,3),size(12,12)) 小结SAM 2 图像分割可以分成两类用法自动生成整图 mask或者通过框、点等提示让模型聚焦到指定目标。实际项目中可以先用自动 mask 做探索再用提示方式做精修。这一类 notebook 建议按“先环境、再数据、再单样例、最后批量推理”的顺序复现。遇到报错时优先检查 GPU、依赖版本、数据集目录和模型权重路径。后续我会继续按源项目顺序整理同系列中的目标检测、实例分割、OCR、多目标跟踪和视觉大模型教程。 同系列教程汇总Google Gemini 3.5 Flash 零样本目标检测教程从提示词到可视化结果GLM-OCR 文档识别实战教程从验证码、公式到车牌 OCRRF-DETR ByteTrack 多目标跟踪实战教程从命令行到 Python 视频轨迹可视化SAM 3 图像分割实战教程文本、框和点提示的多种分割方式SAM 3 视频分割实战教程用文本提示分割并跟踪视频中的目标SAM 2 图像分割实战自动 Mask、框提示和点提示完整演示-本文