在上一篇文章中,我们精读了 CLIP。
CLIP 的核心思想是:使用大规模图文对训练图像编码器和文本编码器,让图像和文本进入同一个语义空间。它让 ViT 不再只是一个图像分类 backbone,而是成为多模态模型中的视觉编码器。
这一篇我们继续看另一个非常重要的视觉基础模型:SAM,Segment Anything Model。
如果说 CLIP 让 ViT 学会了"图像和语言如何对齐",那么 SAM 则让 ViT 进入了另一个更加基础的视觉任务:图像分割。
SAM 对应的论文是 Segment Anything,由 Alexander Kirillov、Nikhila Ravi、Ross Girshick 等人提出,发表于 ICCV 2023。论文提出了一个新的分割任务、一个可提示的分割模型,以及一个超大规模分割数据集 SA-1B;SA-1B 包含约 1100 万张图像和超过 10 亿个 mask。
一、为什么需要 SAM?
在 SAM 之前,图像分割已经有很多成熟任务,例如语义分割、实例分割、全景分割和交互式分割。语义分割关注的是:
每个像素属于哪个类别?
例如:
person、car、road、sky、building
实例分割关注的是:
每个目标实例在哪里?
例如同一张图中有三个人,实例分割不仅要知道这些像素属于 person,还要区分 person 1、person 2、person 3。
交互式分割关注的是:用户给一个点或框,模型分割用户想要的目标。
这些任务都很重要,但传统分割模型通常存在一个问题:任务和数据集绑定得很紧。
例如,一个在 COCO 上训练的实例分割模型,通常只能识别 COCO 定义好的类别;一个医学图像分割模型,往往需要专门的医学标注数据;一个遥感图像分割模型,也通常需要专门针对遥感场景重新训练。
SAM 想解决的问题更大:
能不能训练一个通用分割模型,让它面对新图像、新类别、新场景时,也能根据用户提示分割目标?
这就是 SAM 名字中 Segment Anything 的含义:不是只分割固定类别,而是尽可能分割任意图像中的任意对象。
二、SAM 的核心思想:Promptable Segmentation
SAM 最关键的概念是:
Promptable Segmentation
也就是 可提示分割。
这里的 prompt 和 NLP 中的 prompt 思想类似。对于大语言模型,我们可以输入一段提示,让模型完成不同任务;对于 SAM,我们可以输入点、框、粗略 mask 等提示,让模型分割对应区域。
SAM 的任务可以抽象为一个函数:
其中:
I 表示输入图像;
P 表示用户提供的 prompt;
M 表示模型输出的分割 mask;
表示 SAM 模型。
也就是说,SAM 不是简单地做:
而是做:
这一点非常重要。传统分割模型通常只输入图像,然后输出预定义类别的分割结果。SAM 则把用户提示也作为输入,因此它可以根据不同 prompt 输出不同 mask。例如同一张图像中有一只狗和一辆车:
点在狗身上 → 输出狗的 mask
框住汽车 → 输出汽车的 mask
给一个粗略 mask → 输出更精细的 mask
因此,SAM 的核心不是"自动识别所有类别",而是:根据提示分割用户指定的区域。
论文明确指出,SAM 被设计并训练为 promptable 模型,因此可以 zero-shot 迁移到新的图像分布和任务。
未完待续..............................................................