深度精读:Segment Anything(SAM)
深度精读:Segment Anything(SAM)
论文:Segment Anything
作者:Alexander Kirillov, Eric Mintun, Nikhila Ravi 等(Meta AI Research)
arXiv:2304.02643
发表:ICCV 2023
一、核心动机与问题定义
SAM 的出发点是一个宏大的类比:NLP 领域用大规模预训练(GPT、BERT)构建了"基础模型",能通过 prompt 泛化到各种下游任务。计算机视觉的分割领域能否做同样的事?
作者提出三个相互耦合的核心问题:
- Task:什么样的分割任务足够通用,能作为预训练目标?
- Model:什么样的模型架构能支持灵活的 prompt 输入并实时响应?
- Data:如何获得足够大规模、足够多样的分割数据?
这三个问题的答案共同构成了 SAM 的设计哲学。
二、任务设计:Promptable Segmentation
2.1 核心定义
SAM 的任务是promptable segmentation:给定任意 prompt(点、框、文本、mask),返回一个合理的分割 mask。
关键设计原则:当 prompt 存在歧义时,返回多个合理的 mask,而不是强行给出一个"错误"的答案。
例如,用户点击一件衬衫上的一个点,合理的 mask 可以是:
- 整件衬衫
- 上半身
- 整个人
SAM 会同时输出这三个候选,并给出置信度分数。
2.2 与交互式分割的区别
传统交互式分割(如 GrabCut、DIOS)的目标是通过多轮交互逼近"正确"的 mask。SAM 的目标不同——它是一个零样本泛化的基础模型,单次 prompt
就要给出合理结果,而不是依赖多轮修正。
三、模型架构
SAM 由三个模块组成,设计上刻意解耦以支持实时交互:
Image → [Image Encoder] → Image Embedding Prompt → [Prompt Encoder] → Prompt Embedding Image Embedding + Prompt Embedding → [Mask Decoder] → Masks + Scores3.1 Image Encoder:MAE 预训练的 ViT
- 使用ViT-H(huge)作为骨干,经过 MAE(Masked Autoencoders)预训练
- 输入图像 resize 到 1024×1024,输出 64×64 的 image embedding
- 关键设计:Image Encoder 只运行一次,embedding 可以被多个 prompt 复用
- 这是计算瓶颈所在(~0.15s on GPU),但只需算一次
3.2 Prompt Encoder:轻量级多模态编码
支持两类 prompt:
稀疏 prompt(Sparse):
- 点(point):位置坐标 + 前景/背景标签 → positional encoding + learned embedding
- 框(box):两个角点,各自编码后拼接
- 文本(text):直接用 CLIP 的文本编码器
密集 prompt(Dense):
- Mask:通过卷积下采样到 256×64×64,与 image embedding 逐元素相加
3.3 Mask Decoder:两层 Transformer + 上采样
这是 SAM 最精妙的设计之一:
tokens = [IoU token, mask tokens × 4, prompt tokens] image_embedding + dense prompt embedding → 2× Transformer decoder layers(双向 cross-attention) → MLP → IoU scores → Upsampling head (2× transposed conv × 2) → 256×256 masks双向 cross-attention:
- token-to-image attention:让 mask token 关注图像特征
- image-to-token attention:让图像特征关注 prompt token
多 mask 输出:同时预测 4 个 mask(3 个有效 + 1 个备用),训练时取 loss 最小的那个反传梯度(ambiguity-aware training)。
速度:Mask Decoder 极轻量,在 CPU 上 ~50ms,GPU 上 <1ms。
四、数据引擎:SA-1B 数据集
这是 SAM 工作中最重要的工程贡献之一。
4.1 三阶段数据收集
阶段一:辅助手动标注(Assisted-manual)
- 标注员使用 SAM 的早期版本辅助标注(类似 Photoshop 的魔棒工具)
- 收集了约 120K 张图像,4.3M 个 mask
- 模型在此数据上迭代训练
阶段二:半自动标注(Semi-automatic)
- 先用模型自动检测"置信度高"的 mask,标注员只需补充遗漏的部分
- 鼓励标注员标注"不那么显眼"的物体,提升多样性
- 收集了约 180K 张图像,5.9M 个 mask
阶段三:全自动标注(Fully automatic)
- 在 32×32 的网格点上自动生成 prompt,每张图生成大量候选 mask
- 用 NMS 过滤重叠,用置信度和稳定性过滤低质量 mask
- 最终在 11M 张图像上生成了1.1B 个 mask
4.2 SA-1B 数据集特性
| 指标 | SA-1B | COCO | ADE20K |
|---|---|---|---|
| 图像数 | 11M | 118K | 20K |
| Mask 数 | 1.1B | 1.2M | 150K |
| 每图 mask 数 | ~100 | ~7 | ~20 |
- 图像来自授权的摄影图库,已做人脸和车牌模糊处理
- Mask 质量评估:与专业标注员的 IoU 达到94%,与 COCO 标注质量相当
五、训练细节
5.1 训练策略
- 模拟交互式标注:每次训练迭代随机采样 prompt 序列(1~11 轮)
- 第一轮:随机点或框
- 后续轮:根据上一轮预测的误差区域采样新点(前景/背景)
- 最后一轮有 1/4 概率输入 ground truth mask 作为 dense prompt
5.2 Loss 函数
L = λ_focal × L_focal + λ_dice × L_dice + λ_iou × L_iou- Focal Loss + Dice Loss 用于 mask 预测
- IoU Loss 用于监督 IoU 预测头(让模型知道自己预测得有多准)
- 多 mask 训练:只对 loss 最小的 mask 反传
5.3 数据增强
- 大规模随机裁剪(Large-scale jitter)
- 水平翻转
六、零样本泛化实验
SAM 在多个下游任务上做了零样本评估,不做任何微调:
6.1 零样本单点分割
在 23 个数据集上评估,与专门训练的 RITM 对比:
- SAM 在大多数数据集上持平或超越 RITM
- 在部分医学图像、遥感图像上略弱(domain gap)
6.2 边缘检测
- 用自动 mask 生成的边界做边缘检测
- 在 BSDS500 上接近专门训练的模型
6.3 目标候选区域生成(Object Proposals)
- 在 LVIS 上评估 AR(Average Recall)
- 中等和大目标上超越 ViTDet,小目标略弱
6.4 实例分割
- 用 ViTDet 的 box 作为 prompt 输入 SAM
- 在 COCO 和 LVIS 上与专门训练的 Mask R-CNN 相当
6.5 文本到 Mask
- 用 CLIP 提取文本特征作为 prompt
- 定性结果良好,但作者承认这是探索性实验
七、局限性与批判性分析
7.1 论文自述的局限
- 细粒度结构:对毛发、细网格等精细结构的分割不够精确
- 文本 prompt:文本理解能力有限,不如专门的视觉语言模型
- 实时性:Image Encoder 较慢,不适合视频实时处理
- 3D/医学图像:未针对非自然图像优化
7.2 深层问题
数据偏差:SA-1B 的图像来自摄影图库,存在明显的摄影风格偏差,对医学图像、卫星图像、工业图像的泛化能力有限。
"分割什么"的歧义:SAM 的多 mask 输出虽然优雅,但在实际应用中用户往往需要明确指定语义层级,这需要额外的后处理或更丰富的 prompt。
评估指标的局限:IoU 作为主要指标无法捕捉边界质量,而边界质量在很多应用(如图像编辑)中至关重要。
八、影响与后续工作
SAM 发布后迅速成为计算机视觉领域的基础设施,催生了大量后续工作:
- SAM 2(2024):扩展到视频分割,引入 memory bank 机制
- MedSAM:医学图像分割微调版本
- SAM-Track:结合目标跟踪
- Grounded-SAM:结合 Grounding DINO,实现文本驱动的开放词汇分割
- EfficientSAM / MobileSAM:轻量化版本,适合边缘部署
九、核心贡献总结
| 维度 | 贡献 |
|---|---|
| 任务范式 | 定义了 promptable segmentation,统一了分割任务的接口 |
| 模型设计 | 解耦的三模块架构,支持实时交互 |
| 数据工程 | SA-1B:11M 图像、1.1B mask,最大的分割数据集 |
| 泛化能力 | 零样本迁移到 23+ 数据集,无需微调 |
| 开源影响 | 模型权重和数据集完全开放,推动了整个领域 |
十、一句话本质
SAM 的本质是:用数据飞轮(data flywheel)+ 基础模型范式,把"分割"这个视觉基本操作做成了一个可 prompt 的通用接口——就像 CLIP 对"识别"做的事情一样,但 SAM
走得更远,因为它同时解决了数据规模问题。
