图像分割模型 SAM:Segment Anything 完整指南,三步装好、点一下出掩码
【免费下载链接】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(简称 SAM)解决的正是这类图像分割痛点:你在图上点一下对象,它几秒钟内输出一张高质量掩码;你不想点,它也能自动把整张图的对象全部分出来。这篇指南带你从安装图像分割模型,到拿到第一个掩码,再到选对模型档位。
读完你可以做到:
- 三行代码装好 SAM 并跑通点提示分割
- 用自动掩码生成(AMG)一次处理整批图片
- 按显存和速度在 ViT-H / ViT-L / ViT-B 之间做选型
📐 SAM 架构速览:三个组件各干什么
SAM 是 Meta AI 推出的图像分割基础模型,在 1100 万张图像、11 亿个掩码的 SA-1B 数据集上训练,输入是点或框等提示,输出是对象掩码,零样本能力在多种分割任务上表现稳定。
整条链路只有三个组件,职责分工很清晰:
- 图像编码器:把输入图像压缩成一张图像嵌入,是三个组件里最重的部分
- 提示编码器:把点、框等提示统一编码成模型可消费的向量
- 掩码解码器:一次生成 3 个候选掩码,并给出每个掩码的预测 IoU 分数供你挑选
📦 三步装好 SAM,点一下出掩码
前置要求:python>=3.8、pytorch>=1.7、torchvision>=0.8,强烈建议装带 CUDA 支持的版本。
第 1 步:克隆仓库并安装
git clone https://gitcode.com/GitHub_Trending/se/segment-anything cd segment-anything pip install -e . pip install opencv-python pycocotools matplotlib # 可选:后处理与 notebook 需要第 2 步:加载模型。模型通过 模型注册表 按名称实例化,三档都叫sam_model_registry["<model_type>"],记得按 README 里的 Model Checkpoints 一节下载对应权重的.pth文件。
第 3 步:设图 + 点提示,拿到掩码
from segment_anything import SamPredictor, sam_model_registry sam = sam_model_registry"vit_h" predictor = SamPredictor(sam) predictor.set_image(image) # (H, W, 3) 的 BGR 数组 masks, scores, logits = predictor.predict( point_coords=[[x, y]], # SAM 点提示坐标 point_labels=[1], # 1=前景, 0=背景 )masks是布尔数组,scores是每个掩码的置信度,直接挑最高的那个用即可。更多 SAM 点提示用法可以跑 点提示示例 notebook。
⚙️ SAM 的三种用法
点提示:点得准,掩码才准
一句话结论:掩码质量高度依赖提示坐标的位置——点落在对象内部偏中心处效果最好,点在两个对象交界或细窄部位时结果会漂移。
- 支持单点、多点(正样本 1 / 负样本 0 可混用)以及框提示
- 点不准时加一个负样本点,或改用
box参数把区域框死,通常就能救回来 - 每次 predict 返回 3 个候选掩码,配合
scores挑质量最高的
自动掩码生成:一次调用分完全图
一句话结论:不想逐对象点提示时,AMG 会自动为图中所有对象生成候选掩码,适合批量抠图和预标注。
from segment_anything import SamAutomaticMaskGenerator, sam_model_registry sam = sam_model_registry"vit_b" generator = SamAutomaticMaskGenerator(sam) masks = generator.generate(image) # 返回掩码列表- 不想写代码时可直接走命令行:
python scripts/amg.py --checkpoint ... --input <图片文件夹> --output <输出目录> - 每个掩码自带
predicted_iou和stability_score两个质量分,按分数过滤即可去掉碎掩码 - 掩码支持保存为 COCO 格式,方便后续接检测/标注流程
密集复杂场景:实际表现如何
一句话结论:对象数量多、边界清晰的密集场景是 SAM 的舒适区,图中多个语义区域能被区分开;但对象很小、被严重遮挡或颜色高度相似时,掩码会出现粘连或漏检。
🧭 三档模型怎么选:ViT-H / ViT-L / ViT-B 对比
三档的区别只在图像编码器(ViT backbone)的大小,提示编码器和掩码解码器完全相同:
| 模型 | 参数量 | 权重体积 | 分割质量 | 推理速度 | 适合场景 |
|---|---|---|---|---|---|
vit_h(默认) | 约 6.4 亿 | 约 2.4 GB | 最好 | 最慢 | 离线批处理、质量优先 |
vit_l | 约 3.4 亿 | 约 1.2 GB | 中等 | 中等 | 质量与速度的折中 |
vit_b | 约 0.9 亿 | 约 375 MB | 可用 | 最快 | 实时交互、端侧、大批量 |
默认怎么选:显存够用就先跑vit_h看效果基线;确定要批量上生产或部署到资源受限设备时,再换vit_b,三档代码完全一样,只改注册表名字和权重路径。
边界与适用性:这些场景别直接上 SAM
- 像素级精度任务:医学影像、显微分析等要求亚像素一致性的场景,零样本质量不够,通常需要再微调
- 视频逐帧分割:本仓库是纯静态图像模型,视频任务要另找 SAM 2
- 提示坐标质量:点在对象边缘、极小背景或两个对象交界处时掩码会跑偏,用框提示或补负样本兜底
- 超高分辨率图像:输入会被缩放到 1024×1024 再进模型,原图非常大时细部信息会丢,需要自己切片再拼回
- 它给的是区域,不是类别:SAM 分割的是"你指的这块",不告诉你"这是什么",语义识别要另接分类模型
接下来可以做什么
- 先试自动掩码:拿一张密集图或整个文件夹跑一遍 AMG,感受零标注预标注的效率
- 接上浏览器演示:用
scripts/export_onnx_model.py把轻量的掩码解码器导出为 ONNX,再配合 demo/README.md 里的 React 单页应用,在浏览器里多线程实时出掩码 - 往端侧迁移:换
vit_b+ ONNX 解码器组合,把交互分割跑到低显存甚至移动设备上
【免费下载链接】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),仅供参考