第九讲 · 图像分割与 SAM
分类只回答“图里有什么”,检测进一步回答“它大致在哪里”,分割则把答案细化到每一个像素:这个像素属于什么对象或类别?
一、三类分割任务
| 任务 | 输出 | 同类不同实例是否区分 |
|---|---|---|
| 语义分割 | 每个像素的语义类别 | 不区分 |
| 实例分割 | 每个对象各自的掩码 | 区分 |
| 全景分割 | 所有前景实例与背景区域 | 全部覆盖并区分实例 |
例如图中有两个人:语义分割把两个人都标成“人”,实例分割会分别给出 person 1 和 person 2,全景分割还会同时标出道路、天空等背景区域。
二、训练数据与输出为什么更难
图像分类只需为整张图准备一个标签,分割训练却需要为每个像素准备标签。输入和目标掩码必须空间对齐,网络输出也要恢复到与原图对应的分辨率。
因此典型分割网络采用编码器—解码器结构:
- 编码器不断降低分辨率,提取高级语义;
- 解码器逐步上采样,恢复像素级预测;
- 跳跃连接把浅层边缘和位置细节直接传给解码器。
三、课件给出的模型演进地图
课件用几项里程碑说明分割模型怎样发展:
- FCN:把全连接层改成卷积层,实现端到端像素预测;
- U-Net:U 形编码器—解码器配合跳跃连接,擅长小数据和医学图像;
- PSPNet / DeepLab:通过多尺度上下文、空洞卷积和 ASPP 扩大感受野;
- Mask R-CNN:在检测框基础上增加掩码分支,完成实例分割;
- SETR、Swin-UNet、Segmenter:将 Transformer 引入分割。
当前课件没有继续展开 FCN、U-Net、PSPNet 和 DeepLab 的具体网络细节,正式内容集中在 SAM。
四、SAM 把分割改造成可提示任务
传统模型往往针对固定类别训练。SAM 希望得到类似基础模型的能力:面对训练时没有专门见过的对象,也能根据提示完成分割。
其任务形式是:
提示可以是一个点、一个框、已有掩码,甚至文字。这样,同一个模型不必为每一种分割任务重新设计输出头。
五、SAM 的三个组件

1. Image Encoder
预训练 ViT 把图像编码成密集的逐像素特征。它是计算量最大的部分,但同一张图只需运行一次,之后可以反复输入不同提示。
2. Prompt Encoder
提示分为两类:
- 稀疏提示:点和框使用位置编码与提示类型嵌入;文字可以借助文本编码器表示;
- 稠密提示:掩码经过卷积后,与图像特征在空间上融合。
3. Mask Decoder
轻量解码器通过双向 cross-attention,让提示 token 与图像特征彼此交换信息,最后输出掩码及其质量分数。
六、为什么一次输出多个掩码
一个点可能具有歧义。例如点击衣服上的一点,用户可能想分割衣服、整个人,或包含人的更大区域。若强制模型只给一个答案,训练目标本身就不确定。
SAM 因而为一个有歧义的提示输出多个候选掩码,通常对应局部、对象和整体三个层次,再由质量分数排序。
七、SA-1B 数据引擎
大模型需要大数据,而像素级人工标注极其昂贵。SAM 用模型和标注者相互促进的数据引擎构造数据:
- 模型辅助手动阶段:标注者给提示,模型加速绘制掩码;
- 半自动阶段:模型先生成一部分掩码,标注者补充漏掉的对象;
- 全自动阶段:在规则前景点网格上自动产生候选掩码。
最终得到 SA-1B,包含约 1100 万张图像和 11 亿个掩码。它既是训练数据,也是 SAM 能够跨类别泛化的重要基础。
八、怎样理解 SAM 的“零样本”
这里的 zero-shot 不是“模型从未看过任何图像”,而是模型没有针对当前下游类别或任务单独训练。它已经从海量掩码中学会“什么像一个可分割对象”,用户再用提示指出当前关心哪一个。
本讲速记
- 分类是图级输出,检测是框级输出,分割是像素级输出。
- 语义分割不区分同类实例;实例分割区分;全景分割覆盖整张图。
- SAM 的三项贡献:可提示的零样本任务、开放模型、SA-1B 数据集。
- 三组件:ViT 图像编码器、提示编码器、轻量掩码解码器。
- 多掩码输出用于处理提示歧义。
- 数据引擎三阶段:模型辅助手动、半自动、全自动。