第九讲 · 图像分割与 SAM

Views: --

分类只回答“图里有什么”,检测进一步回答“它大致在哪里”,分割则把答案细化到每一个像素:这个像素属于什么对象或类别?

一、三类分割任务

任务输出同类不同实例是否区分
语义分割每个像素的语义类别不区分
实例分割每个对象各自的掩码区分
全景分割所有前景实例与背景区域全部覆盖并区分实例

例如图中有两个人:语义分割把两个人都标成“人”,实例分割会分别给出 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 希望得到类似基础模型的能力:面对训练时没有专门见过的对象,也能根据提示完成分割。

其任务形式是:

(图像,提示)与提示对应的掩码.(\text{图像},\text{提示})\longrightarrow\text{与提示对应的掩码}.

提示可以是一个点、一个框、已有掩码,甚至文字。这样,同一个模型不必为每一种分割任务重新设计输出头。

五、SAM 的三个组件

SAM 由图像编码器、提示编码器与掩码解码器组成

1. Image Encoder

预训练 ViT 把图像编码成密集的逐像素特征。它是计算量最大的部分,但同一张图只需运行一次,之后可以反复输入不同提示。

2. Prompt Encoder

提示分为两类:

  • 稀疏提示:点和框使用位置编码与提示类型嵌入;文字可以借助文本编码器表示;
  • 稠密提示:掩码经过卷积后,与图像特征在空间上融合。

3. Mask Decoder

轻量解码器通过双向 cross-attention,让提示 token 与图像特征彼此交换信息,最后输出掩码及其质量分数。

六、为什么一次输出多个掩码

一个点可能具有歧义。例如点击衣服上的一点,用户可能想分割衣服、整个人,或包含人的更大区域。若强制模型只给一个答案,训练目标本身就不确定。

SAM 因而为一个有歧义的提示输出多个候选掩码,通常对应局部、对象和整体三个层次,再由质量分数排序。

七、SA-1B 数据引擎

大模型需要大数据,而像素级人工标注极其昂贵。SAM 用模型和标注者相互促进的数据引擎构造数据:

  1. 模型辅助手动阶段:标注者给提示,模型加速绘制掩码;
  2. 半自动阶段:模型先生成一部分掩码,标注者补充漏掉的对象;
  3. 全自动阶段:在规则前景点网格上自动产生候选掩码。

最终得到 SA-1B,包含约 1100 万张图像和 11 亿个掩码。它既是训练数据,也是 SAM 能够跨类别泛化的重要基础。

八、怎样理解 SAM 的“零样本”

这里的 zero-shot 不是“模型从未看过任何图像”,而是模型没有针对当前下游类别或任务单独训练。它已经从海量掩码中学会“什么像一个可分割对象”,用户再用提示指出当前关心哪一个。

本讲速记

  • 分类是图级输出,检测是框级输出,分割是像素级输出。
  • 语义分割不区分同类实例;实例分割区分;全景分割覆盖整张图。
  • SAM 的三项贡献:可提示的零样本任务、开放模型、SA-1B 数据集。
  • 三组件:ViT 图像编码器、提示编码器、轻量掩码解码器。
  • 多掩码输出用于处理提示歧义。
  • 数据引擎三阶段:模型辅助手动、半自动、全自动。

评论