Segment Anything 零样本图像分割实操指南:5 行代码拿到第一张掩码 Segment Anything 零样本图像分割实操指南5 行代码拿到第一张掩码【免费下载链接】segment-anythingThe repository provides code for running inference with the SegmentAnything Model (SAM), links for downloading the trained model checkpoints, and example notebooks that show how to use the model.项目地址: https://gitcode.com/GitHub_Trending/se/segment-anything给一批电商商品图抠背景最省事的做法是逐张标框一天也标不完几百张。而 Segment Anything ModelSAM是 Meta 开源的零样本图像分割模型你点一个点或画一个框它直接吐出对应的物体掩码不想逐个人工提示时它还能自动铺满整张图生成所有候选分割。这篇文章带你从装环境到跑通批处理一条路走完。按下面的步骤做完你能得到三样东西一个能按点提示输出掩码的推理脚本、一个按框提示的单掩码调用以及一份对整图自动生成的掩码清单。适合有基本 Python 经验、想在自己的业务数据上验证 SAM 分割效果的开发者。图SAM 对整张街景图自动生成的掩码覆盖效果来自仓库 自动掩码生成示例。一次拍照片之后随便点把 SAM 想成一个厨艺极稳的厨房图像编码器先花几十秒把整道菜完整看一遍之后你再指哪道菜、哪个盘子提示编码器只负责把你的指认翻译成模型能懂的信号出菜速度取决于解码器而解码器非常轻。对应到代码里set_image算一次图像编码并缓存之后每次predict只跑轻量的掩码解码所以在同一张图上反复点不同提示几乎不额外花时间。️ 1. 最小可运行环境怎么搭克隆仓库与安装在仓库根目录本地安装 SAM 包。仓库只读不要往里加文件版本前提Python ≥ 3.8、PyTorch ≥ 1.7。git clone https://gitcode.com/GitHub_Trending/se/segment-anything cd segment-anything pip install -e . # 以可编辑模式安装装好 torch/torchvision 即可 pip install opencv-python matplotlib # 示例 notebook 与可视化需要你会看到什么pip结束后打印Successfully installed segment_anything-1.0。验证一下import segment_anything # 无 ImportError 即安装成功 print(segment_anything.__all__)卡住了怎么办报setuptools或wheel相关错误先pip install -U pip setuptools wheel再重试torch 没装 CUDA 版本也能跑只是慢一个量级后面第 5 步会量化。环境只是壳模型权重不在仓库里下一步把它接上。2. 加载 SAM checkpoint 并实例化预测器下面这段代码负责把权重挂到 ViT-B 骨干上并包装成可反复调用的预测器checkpoint 文件名为 SAM 官方发布的sam_vit_b_01ec64.pth请先从项目官方发布页下载并放到仓库根目录三个版本里 ViT-B 最小约 380MBCPU 或 4GB 显存就能跑适合先验证流程。import torch from segment_anything import sam_model_registry, SamPredictor checkpoint sam_vit_b_01ec64.pth # 先下载到仓库根目录 model_type vit_b # vit_b / vit_l / vit_h越大越准也越吃显存 device cuda if torch.cuda.is_available() else cpu sam sam_model_registrymodel_type # 加载权重并进入 eval sam.to(devicedevice) predictor SamPredictor(sam) # 之后所有预测都通过它发起你会看到什么加载完成时没有任何额外打印进程内存增加约 400~600MB权重本身 运行时开销即可认为成功。卡住了怎么办FileNotFoundError就是权重路径没对上确认 checkpoint 与脚本的工作目录一致KeyError: model_type说明写成了vit-b之外的名字注册表里只有default、vit_h、vit_l、vit_b四个键定义在 核心源码。权重就位后还得告诉模型分割哪张图这一步同时是最容易出细节问题的地方。3. 准备输入图像尺寸、通道与坐标系的坑set_image会把图像按长边 1024 缩放、缓存图像编码并把后续所有提示坐标换算回原图坐标系——所以你必须按原图像素给点。注意它的image_format默认是RGB而 OpenCV 读出来是 BGR这里显式声明否则掩码会整体偏色错位。import cv2 image cv2.imread(notebooks/images/truck.jpg) # HWC uint8BGR predictor.set_image(image, image_formatBGR) # 内部换算通道并缩放一次即可 print(predictor.original_size, predictor.input_size) # (1200, 1800) (1024, 1536)你会看到什么最后一行打印原图尺寸(1200, 1800)与送入模型的尺寸(1024, 1536)长边 1024、宽高比保持不变。卡住了怎么办如果后面predict报An image must be set with .set_image(...)说明两次调用之间又构造了新的 predictor缓存存在实例里同一张图只调一次set_image换图才重新调用。图像缓存好了现在用第一个提示验证整条链路。4. 用点提示跑第一次分割点提示约定point_coords是 (x, y) 的 Nx2 数组point_labels里 1 表示点在目标内、0 表示点在背景里。下面对卡车车轮打一个前景点import numpy as np point_coords np.array([[500, 375]]) # 原图坐标系下的 (x, y) point_labels np.array([1]) # 1前景 masks, scores, low_res predictor.predict( point_coordspoint_coords, point_labelspoint_labels, multimask_outputTrue, # 歧义提示单点建议开多掩码 ) print(masks.shape, np.round(scores, 3))你会看到什么输出(3, 1200, 1800) (0.98x 0.96x 0.8x)一类的形状——三个二值掩码已缩放回原图尺寸scores是模型对每个掩码的质量自评0~1按分数从高到低排序masks[0]通常最准。卡住了怎么办ValueError且涉及 shape九成是把point_coords传成了 (x, y) 而不是 Nx2 的二维数组想加背景点排除杂色时追加一行坐标并把 label 设为 0 即可。点提示之外框提示同样走predict的box参数XYXY 格式对轮廓清晰的目标更稳。单目标验证通过剩下的问题就变成整张图一次性全部分出来。5. 整图自动分割批处理生成全部掩码AMG 内部会按网格撒点默认每边 32 个点共 1024 个提示、分批推理再经质量过滤、NMS 去重、小区域清理最后输出去重后的掩码清单from segment_anything import SamAutomaticMaskGenerator generator SamAutomaticMaskGenerator( sam, points_per_side32, # 提示密度越大越细也越慢 points_per_batch64, # 每批点数显存吃紧就调小 min_mask_region_area500, # 丢弃面积小于 500 像素的碎块 output_modebinary_mask, ) all_masks generator.generate(image) # image 为 BGR ndarray 也行内部按 RGB 处理 print(len(all_masks)) # 掩码数量街景图常见 10~60 个 print(all_masks[0].keys()) # segmentation / bbox / area / stability_score 等你会看到什么all_masks是一个列表每个元素含segmentation与原图等大的二值数组、bboxXYWH、area、stability_score等字段。仓库的 批处理脚本 就是这套逻辑的命令行版本支持整个文件夹输入可以直接复用。卡住了怎么办整图生成慢是正常的——ViT-B 在 GPU 上一般 10~30 秒出结果CPU 上以分钟计耐心等完一批掩码数量偏少时把points_per_side提到 64或把pred_iou_thresh从默认 0.88 放宽到 0.8。跑通批处理后最后一步是学会判断结果到底靠不靠谱。怎么判断结果好不好三个信号加一张对照表第一个信号是scores单掩码或每条记录的stability_scoreAMG0.9 以上基本可放心直接用0.85~0.9 建议人工抽查低于 0.8 大概率要补提示。第二个信号是掩码形状本身边界是否贴着目标轮廓、有没有明显出血到背景或漏掉目标一角——把掩码以 0.5 透明度叠回原图看一眼几秒就能发现问题。第三个信号是bbox与area掩码应落在包围盒内area与 bbox 面积的比值若极端偏小或偏大说明切到了不该切的东西。调用方式返回掩码数质量分适合场景点提示 multimask_outputTrue3 个候选有scores单击、目标有歧义点提示 multimask_outputFalse1 个有scores提示已足够明确框提示 multimask_outputFalse1 个有scores轮廓清晰的目标AMG 自动模式每图若干stability_score无人值守批量生产multimask_outputFalse时模型不再返回 3 个候选predictor.predict的文档注释明确建议提示不歧义时关闭多掩码效果更好。分数和形状都看过了剩下的就是把调参和报错集中到一张表里。⚠️ 调优与排坑一张表覆盖常见现象先说一句AMG 的pred_iou_thresh0.88、stability_score_thresh0.95是按 ViT-H 校准的默认值换到 ViT-B 上分数分布略保守想多留掩码就各放宽 0.02~0.05。现象原因处理RuntimeError: An image must be set未调set_image或 predictor 被重新构造每次换图前调用一次set_image别中途重建实例掩码整体错位、颜色发灰OpenCV 读图是 BGR没声明通道set_image(image, image_formatBGR)点提示掩码飘到别处坐标用了缩放后尺寸或写成了 (y, x)按原图像素给 (x, y)见第 3 步CUDA out of memoryViT-H 权重 AMG 批量过大换vit_bpoints_per_batch降到 32CPU 上单图推理要 30 秒以上ViT-B 在 CPU 上编码本身就慢上 GPU或只导出轻量解码器做 ONNX见 ONNX 脚本AMG 掩码太少默认阈值对 ViT-B 偏严pred_iou_thresh降到 0.8points_per_side提至 64从装环境、接权重到点/框提示和整图批处理整条链路你已经完整走过一遍。下一步建议把min_mask_region_area接到你的业务规则上先在自己的数据上统计stability_score分布再定属于你自己的过滤阈值——比直接沿用 0.88 更靠谱。【免费下载链接】segment-anythingThe repository provides code for running inference with the SegmentAnything Model (SAM), links for downloading the trained model checkpoints, and example notebooks that show how to use the model.项目地址: https://gitcode.com/GitHub_Trending/se/segment-anything创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考