去年四月,Meta 放出一篇论文,我看到标题的时候愣了一下——Segment Anything。不是“分割某类物体”,不是“在COCO上达到SOTA”,是“任意东西”。

我当时脑子里冒出来的第一个念头是:这跟 GPT-3 对 NLP 的冲击,是不是一个性质?
后来我花了两个晚上把论文和代码啃完,又跑了几个 demo,确认了一个判断:这确实是计算机视觉的 GPT-3 时刻。但不是因为模型参数多,也不是因为数据集大,而是因为它重新定义了“任务”本身。
在这之前,图像分割一直是个“命题作文”。你告诉模型要分割“猫”,它给你猫的 mask;你告诉它要分割“行人”,它给你行人的 mask。但 SAM 不一样——它把分割变成了一个交互式任务:你随便给一个点、一个框、甚至一段文字,它就能把对应的物体“抠”出来。甚至,它可以自动把整张图里所有可能被你关心的物体都分割出来,一次性全给你。
这就是“分割一切”的底气来源。它不是“能分割所有类别”,而是“能响应任意提示”。
下面我把这件事拆开讲清楚,包括我最初理解错的地方,以及后来怎么想通的。
不是“识别一切”,是“响应一切”
很多人(包括最早的我)看到“Segment Anything”会下意识以为:SAM 训练了一个超大的模型,覆盖了宇宙中所有物体类别,所以看到什么都能分割。这完全是错的。
真相是:SAM 不知道它在分割什么。它没有内置“猫”这个概念,也没有“椅子”这个概念。它只做一件事:给定一个提示(prompt),输出一个二值掩码(mask),把“提示所指的物体”跟背景分开。
这跟 GPT 的底层逻辑简直一模一样。GPT 在训练的时候也不知道“翻译”是什么,它只会做“根据上文预测下一个词”。但当你给它的提示是“将以下英文翻译成中文:”,它输出的就成了翻译。S A M 的底层逻辑是“根据提示分割物体”,你给一个点,它猜你要哪个物体;你给一个框,它把框内最显著的那个物体抠出来;你给一段文字(比如“the left dog”),它通过 CLIP 之类的模型把文字变成视觉语义,然后找出对应的物体。
它学会的不是“物体是什么”,而是“你指的是什么”。这种能力,学术界叫它 promptable segmentation,也就是“可提示分割”。
我最早以为 SAM 是用大量标注数据硬训练出来的超级分类器,后来读了论文 Segment Anything 才发现,他们连训练的时候都没有让模型预测“类别”。所有 mask 都是无类别的(class-agnostic)。这意味着模型在训练时只关心一个问题:把这个东西从背景里挖出来,不管它叫什么。这彻底解耦了“分割”和“识别”,让模型可以无限泛化——你甚至可以分割一个你叫不出名字的物体。
猜词游戏是怎么骗过你的?
要理解 SAM 为什么厉害,得先理解传统分割的死穴。以前做分割,基本是两步走:
- 定义要分割的类别(比如猫、狗、人、车)
- 收集这些类别的标注数据,训练一个模型
这导致了一个根本性的问题:你永远只能分割训练集里有的类别。哪怕你训练了 1000 个类别,第 1001 个你没见过的,模型就抓瞎。而且标注成本极高,一个像素一个像素地画 mask,一张图可能花几分钟。
SAM 用了一个完全不同的范式。它搞了一个数据引擎,分三个阶段自动生产海量标注数据:
- 人工标注阶段:找标注员在图上点一下,SAM 生成一个 mask,如果不好就再点一下修正,直到满意。这个阶段产生了 430 万张 mask。
- 半自动阶段:让模型自动找那些“可能有物体但模型还不确定”的区域,标注员确认一下就行。这个阶段又加了 590 万张 mask。
- 全自动阶段:在 32×32 的规则网格上每个点都作为提示,让模型自动生成 mask,然后通过一个过滤流程去掉低质量的。这个阶段狂产了 1100 万张 mask,整张图里所有看得见的物体几乎都被分割了一遍。
最终他们得到了 SA-1B 数据集:1100 万张图,超过 10 亿个 mask——比之前最大的分割数据集大了 400 多倍。这个数据量本身就值得用 大数据 这个词,但更关键的是,这些 mask 没有类别标签,只有“物体 vs 背景”的区分。所以模型被迫学会了“物体性”(objectness)这个概念,而不是“猫性”或“狗性”。
这让我想起 GPT-3 的训练数据:网页文本没有结构化的标签,但模型硬生生学会了语法、常识、推理。SAM 的数据引擎起到了类似的作用——用足够多、足够多样的无类别 mask,把“物体”这个概念从数据里蒸馏出来。
一张表说清 SAM 和传统分割的区别
| 传统分割模型 | SAM | |
|---|---|---|
| 任务定义 | 固定类别分割 | 提示驱动的交互式分割 |
| 输出 | 每个像素的类别标签 | 无类别的二值掩码 |
| 泛化方式 | 需要针对新类别重新训练 | zero-shot 泛化,一次训练永久使用 |
| 数据需求 | 昂贵的人工标注(类别+mask) | 自动生成的无类别 mask |
| 边界 | 受限于训练时见过的类别 | 理论上可以分割任意物体 |
| 用户交互 | 无,直接输出结果 | 提供点、框、文字等提示 |
这张表的核心是:传统分割模型是闭集的,SAM 是开集的。这个差距,跟 GPT 让 NLP 从“做一个翻译模型”变成“做一个能听懂人话的通用语言模型”是同一个性质的飞跃。
架构拆开看,其实很朴素
很多人以为 SAM 的内部结构一定极其复杂,毕竟效果这么震撼。但我第一次看到论文里的架构图时,反而觉得它有点过于简单了——而且这正是它聪明的地方。
SAM 由三个模块组成:
- 图像编码器
- 一个基于 MAE 预训练的 ViT(Vision Transformer),把输入图像变成一个稠密的特征图。这个编码器非常重,推理一次要花不少时间,但好处是每张图只需要编码一次。
- 提示编码器
- 把用户给的提示(点、框、mask)编码成向量。点就是位置坐标,框就是两个角点,mask 用卷积处理一下。这个模块非常轻量。
- 掩码解码器
- 把图像特征和提示特征融合,输出一个二值掩码。它用了一个轻量级的 Transformer 模块,几次交叉注意力之后就出结果。整个过程很快,因为图像特征已经提取好了。
这个设计有一个关键后果:图像编码器负责“理解图像”,掩码解码器负责“理解提示”。两者解耦,所以你可以对同一张图反复给不同的提示,而不用重新跑那个昂贵的编码器。这就是为什么 SAM 可以在浏览器里流畅地交互——你点一下,它瞬间出 mask。
我最早以为 SAM 是单次推理出全图所有物体的,后来才发现那是“全自动模式”做的:在图片上均匀撒点,每个点都当提示跑一遍,然后把结果合并去重。本质上还是“提示驱动”,只不过提示是自动生成的。这个事实让我对“分割一切”的理解更准确了:它不是魔法,而是一个暴力但优雅的工程方案。
这个“GPT 时刻”到底意味着什么?
我之所以说它是 GPT 时刻,有三个理由:
- 任务定义的范式转移:从“分割猫”变成“分割我指的东西”。就跟 GPT 把“翻译”变成“根据提示翻译”一样,任务本身被抽象了一层。
- zero-shot 泛化能力:SAM 在处理从未见过的物体、场景、甚至绘画风格时,都能给出合理的分割结果。这得益于它学到的“物体性”而不是“类别”。
- 成为视觉任务的基础设施:GPT-3 出来之后,大量 NLP 任务变成了“prompt engineering”。SAM 出现之后,大量视觉任务开始变成“先分割,再识别”。比如目标检测,你可以先用 SAM 抠出所有可能的物体,再用一个轻量分类器判断每个物体是什么——这比直接训练一个检测器要灵活得多。
我自己试过的一个场景是:用 SAM 把一张街景图里所有物体自动分割出来,然后对每个 mask 跑 CLIP 做识别。整个过程没超过 100 行代码,效果却比训练一个专门的语义分割模型要好,而且不需要任何标注数据。这就是基础设施的威力。
教会 SAM“听话”的代价
当然,SAM 不是完美的。它的能力边界同样清晰:
- 依赖提示质量:如果你给的提示点刚好落在物体边缘,或者框选范围太模糊,结果可能很糟糕。它需要你“指得准”。
- 细粒度分割受限:对于头发丝、电线、细小文字等结构,SAM 经常出现粘连或断裂。这是因为它训练的 mask 分辨率有限,而且 ViT 的 patch 大小限制了细节保留。
- 计算开销大:图像编码器是一个 ViT-Huge,推理一张图在 GPU 上也要几百毫秒,手机端根本跑不动(后续 TinySAM 等优化模型改善了一些)。
- 没有世界知识:SAM 不知道哪个 mask 是“安全的”,哪个是“危险的”。它可能把一把刀和一个人分开,但不知道刀指着人意味着什么。这需要更高层的语义理解。
但这些问题并没有削弱它的“时刻”性质。就像 GPT-3 也会胡说八道,但它的出现改变了 NLP 的游戏规则。SAM 真正的价值是把分割从“分类”的附属品,变成了一个独立的、可交互的原子能力。以后所有的视觉应用,都可以直接调用这个能力,而不用从零开始训练分割模型。
常见误解澄清
SAM 能分割所有物体,所以它能识别所有物体?
不能。SAM 输出的是无类别 mask,它不知道那个物体叫什么。你需要额外接一个分类器或 CLIP 才能识别。它只是把“定位”和“认名”分开了。
SAM 是自动分割一切,不需要人工干预?
全自动模式需要在图像上均匀撒点,这个过程需要人为设定网格密度,而且结果可能包含很多你不关心的物体(比如墙上的污渍)。它更像是一个“候选物体生成器”,最终选哪个还是由你决定。
SAM 用了那么多数据,是不是靠大力出奇迹?
是也不是。数据量确实大,但关键还是数据引擎的设计——用模型辅助标注,从初级到高级的循环,才让数据质量和多样性双双达标。没有这个引擎,光靠人工标注,10 亿个 mask 的成本根本不可想象。
为什么说它是 GPT 时刻,而不是 BERT 时刻?
BERT 是预训练+微调范式,Fine-tune 到下游任务仍然需要标注数据。GPT-3 是 in-context learning,一个模型零样本做很多事。SAM 像 GPT-3,因为它训练好之后,通过提示(点、框)直接做分割,不需要为每个新类别微调。这正是“基础模型”的特征。
最后
我写这篇文章的时候,SAM 已经发布一年多了,衍生出了一大堆工作(FastSAM、TinySAM、SAM 2.0 等),但它的核心思想——把分割任务重定义为“可提示分割”——依然是这个领域最根本的突破。这种范式转变比任何单个技术指标都重要。
如果你正在做计算机视觉相关的项目,现在最该做的事不是去复现 SOTA,而是重新审视你的任务定义:能不能把“识别”和“分割”解耦?能不能用 SAM 作为前端,把视觉问题变成后端的分类或检索问题?因为一旦解耦,你的数据标注成本、模型泛化能力、迭代速度,都会发生质变。这就是 GPT 时刻的真实含义:不是模型本身,是它打开的接口。
原创文章,作者:guanweilu,如若转载,请注明出处:https://guanweilu.cn/article/162.html