县城老街有一家“万能切割铺”。铺里的老师傅手艺神了:你拿一张全家福,指着外婆说“我要这个”,他咔嚓一刀,外婆就从照片里干干净净地走了出来;你再指窗台上那只打盹的橘猫,又是一声脆响,猫也完整落地。最绝的是,你随手从网上下载一张“深海透明水母”的照片问师傅能不能切——这东西他一辈子没见过——他也只是笑笑,随即一刀,轮廓分毫不差。 这位师傅其实是 Meta 在 2023 年发布的 AI 模型 SAM(Segment Anything Model,分割一切模型)。它“看一眼整张照片、听一句你的指示、切出你要的轮廓”,把过去只能“一器一用”的图像分割,变成了“你指哪里,它切哪里”。本文将借用“万能切割铺”这个故事,带你认识 SAM 为什么被称为计算机视觉的“GPT 时刻”、内部由哪三位“师傅”配合、支持哪几种下单方式、靠什么数据集练成神功,以及它的短板和未来。
学会 SAM,等于给 CV 工具箱配上一把“万能切割刀”:不必再为每个新任务采集标注、重新训练,直接用提示拿到掩码,这是计算机视觉工程师迈向基础模型时代的必修课。
目录
可视化演示
动态演示SAM分割一切模型的图像分割的核心机制,通过总览/传输/转换/输出四种模式展示关键概念与交互流程。
本节配有交互动效(进入视口后自动加载,约 3KB)。
SAM分割一切模型的图像分割:SAM分 SAM分割一切概述 SAM分割一切原理 核心机制可视化 SAM分割一切模型的图像分割整体架构与关键组件
SAM概念认知:视觉领域的GPT时刻
在万能切割铺出现之前,街上的裁剪师都是“一器一用”的:有人只切人像,有人只切汽车,有人只切细胞照片。你想切一只企鹅,就得专门订做一把“企鹅剪刀”;明天想切火烈鸟,之前的剪刀又得作废。而万能切割师傅的出现,让这一切彻底变了样。
这位师傅就是 SAM(Segment Anything Model,分割一切模型),Meta 在 2023 年发布的通用图像分割基础模型。所谓“图像分割”,就是给照片里的每个像素打上“属于这个目标还是背景”的记号,相当于把物体轮廓从背景里切出来。SAM 的秘诀是“提示驱动”:无论你给一个点、一个框还是一句话,它都能切出对应目标,而且不需要为每种新物体重新训练模型。
为什么大家都说这是计算机视觉的“GPT 时刻”?因为 GPT 把各类语言任务统一成了“预测下一个词”,SAM 则把各类分割任务统一成了“根据提示输出掩码”。掩码,就是切出来的那张像素级“轮廓纸样”。下游应用只需要变换提示方式,就能完成抠图、标注、检测辅助等不同任务,就像给大模型写提示词一样轻松。
要衡量师傅切得准不准,分割界最常用的尺子叫 IoU:
自从这位万能切割师傅开张,大家终于发现:原来“切东西”这件事本身可以成为一门通用手艺。剩下的问题,只是你愿意指着哪里下单而已。
- 分子 \(P \cap G\)预测掩码与真实掩码重叠区域的像素数量,也就是“切对的部分”。
- 分母 \(P \cup G\)两块区域的并集像素数,把“切到的、漏掉的、切错的”全部算进去。
- 比值 \(\text{IoU}\)重叠除以并集,结果在 0 到 1 之间,越接近 1 说明切得越精准。
模型架构:鹰眼、订单簿与巧手
走进切割铺,你会发现师傅干活有三步:先戴上那副特制鹰眼镜,把整张照片快速扫一遍,把所有东西的位置记进脑子里;再翻开你递来的订单纸条,看清你勾的是一个点、一个框还是一句话;最后才手起刀落,把目标从背景里剥出来。
对应到 SAM 内部,这三步就是它的三个核心组件。第一步由图像编码器完成:它用 Vision Transformer(ViT)把整张图片变成一组“图像特征”——可以理解为师傅脑中的“全景地图”,一次扫描就能反复使用。第二步由提示编码器完成:它把点、框、文本这些不同形态的指令,统一翻译成模型内部的“机器语言”。第三步由掩码解码器完成:它把全景地图与指令融合,逐像素输出目标掩码,还附赠一个“这刀切得准不准”的置信分。
这三个组件的配合方式可以用一个公式概括:掩码等于解码器把“图像编码的结果”和“提示编码的结果”融合起来。
就像切割铺里“一眼、一单、一刀”的默契配合,SAM 的三个组件各司其职,才让“你指哪、它切哪”从口号变成了现实。
- 输入 \(I\) 与 \(p\)\(I\) 是原始图像(那张照片),\(p\) 是用户提示(点、框或文本)。
- 图像编码器 \(\mathcal{E}_{I}\)把整张图片变成“全景地图”,即图像特征表示。
- 提示编码器 \(\mathcal{E}_{P}\)把用户的点、框、文本变成同一种“机器语言”特征。
- 解码器 \(\mathcal{D}_{\theta}\)用可学习参数 \(\theta\) 融合两类特征,输出像素级掩码 \(\mathcal{M}\)。
提示类型:四种下单方式
去万能切割铺下单,有四种说法:你可以伸手指头一戳(点),可以拿笔在照片上画个圈(框),可以用嘴描述“我要最左边那只”(文本),也可以让师傅把整张桌子上的物件全部切出来(自动)。
第一种是点提示:点选目标内部叫“正点”,告诉师傅“从这里下刀”;点选背景叫“负点”,告诉师傅“这片不要,绕着走”。正负点组合能很好地纠正边界。第二种是框提示:画一个矩形把目标框起来,师傅只在框内找目标。第三种是文本提示:输入“第二排靠窗的人”这类描述,模型借助文本编码器理解语义。第四种是自动分割:师傅在整张图上铺满均匀的点阵,批量切出所有可能存在目标的区域。
这里有个有意思的问题:同一个点,可能既指“整只企鹅”,也指“企鹅的白肚皮”。面对这种歧义,师傅不会随便猜,而是递上好几张候选纸样,让你自己挑。SAM 的做法是输出多个候选掩码,并用一个公式选出最靠谱的那个:
四种下单方式还可以自由组合:你既可以画个框,又补一句“只要框里中间那只”。这就像在切割铺里“圈一圈、指一指、说一嘴”,师傅都能听懂。
- 候选集合 \(\mathcal{S}\)同一个提示生成的多个有效候选掩码,对应歧义场景下的不同理解。
- 置信分 \(\hat{s}(M)\)模型预测的“该掩码与真实目标重合度”的置信分数,类似师傅目测自己下刀准不准。
- 取最大 \(\arg\max\)从所有候选中挑出信心最高的掩码作为最终输出结果。
SA-1B数据集:一亿道剪纸题
师傅的功夫不是天生的。掌柜的给师傅布置了整整 1100 万张“剪纸作业”,每一张都要反复切、反复练,最终练出了超过 10 亿块形状的“手感”。这就是 SAM 背后那个著名的 SA-1B 数据集。
SA-1B 的规模在当时是空前的:1100 万张图像、超过 10 亿个掩码,比此前最大的分割数据集大了约 400 倍。但更厉害的不是量大,而是数据是怎么来的。它靠一台“数据引擎”三阶段运转:第一阶段,专业标注员手工标注少量图像,教模型“什么是好掩码”;第二阶段,模型辅助标注员半自动标注,标注员只修不画;第三阶段,模型全自动标注海量新图,把注标注变成流水线。
这套“人先教、机器再自己练”的流程,形成了漂亮的闭环:模型越强,自动标注的质量越高;自动标注的质量越高,数据越多;数据越多,模型越强。数据规模可以用两个数字刻在招牌上:
一亿道剪纸题练出来的手感,靠的不仅是“量大管饱”,更是“人先教、机器再自己练”的聪明流程。数据的飞轮一旦转起来,就很难停下来。
- 图像总数 \(N_{\text{img}}\)SA-1B 包含约 1100 万张图像,是数据集的底座。
- 单图掩码数 \(m_i\)第 \(i\) 张图像经数据引擎生成的掩码数量,图像不同、数量不同。
- 掩码总量 \(\sum_i m_i\)把所有图像的掩码加起来超过 10 亿,规模是此前最大分割数据集的约 400 倍。
训练策略:三把尺子量手艺
师傅学艺时,师爷站在旁边亲自打分,手里拿着三把尺子:目标没切全,扣“焦点分”;切出来的形状跟标准纸样没对齐,扣“Dice 分”;边角毛糙、锯齿明显,扣“IoU 分”。三把尺子的成绩加在一起,才是师傅的最终得分。
对应的三个损失函数各有分工。Focal 损失负责解决“图里 99% 是背景、只有 1% 是目标”的极端不平衡,让模型把注意力放在最难分的那一小撮像素上,就像师傅苦练“刁钻边角”。Dice 损失直接衡量预测区域与真实区域的重叠程度,区域重合越少,扣分越多,逼着模型“整块切、别漏肉”。IoU 损失则进一步优化交并比,让切割边缘更贴合标准纸样。
三个损失加权相加,就是 SAM 训练时用的总损失:
三把尺子一起量,师傅的手艺才又全又稳;少一把,要么漏目标,要么切偏,要么边缘全是毛刺。
- \(\mathcal{L}_{\text{focal}}\)聚焦损失,让模型在难分类的像素上多下功夫,解决前后景比例失衡。
- \(\mathcal{L}_{\text{dice}}\)区域重叠损失,衡量预测掩码与真实掩码的“块状重合度”。
- 权重 \(\lambda_f, \lambda_d, \lambda_i\)三个损失的加权系数,训练时决定“哪个短板更要补”。
零样本泛化:没见过也能切
那位客人拿出“深海透明水母”照片时,在场的人都捏了把汗——这东西师傅绝对没见过。但师傅只扫了一眼,就切出了完整的水母轮廓。这就是零样本泛化:没有提前见过,也能一刀到位。
零样本(Zero-shot)在 SAM 这里的含义是:模型在训练阶段从未见过目标类别或目标领域,推理时也不需要在新数据上微调,直接给出可用的分割结果。它靠的是大规模预训练练出的通用“物体感”——师傅见过猫、车、花、水母之后,慢慢理解了“一个完整的东西”长什么样,于是看到陌生目标也能判断“哪里算一块”。
实验数据很能说明问题:SAM 在 23 个下游分割数据集上做了零样本迁移测试,其中 16 个数据集上,它不微调的表现就达到甚至超过了此前需要完整监督训练的方法。它的零样本能力可以用一个平均指标来刻画:
见多识广的师傅,靠的不是“认得每个东西的名字”,而是“一眼就能看出哪里是一个整体”。这正是大模型在视觉上最性感的特质。
- 真实掩码 \(M_i^{\text{gt}}\)第 \(i\) 张新类别图片上由人工标好的标准答案。
- 预测掩码 \(\hat{M}_i\)SAM 仅凭提示直接切出的结果,全程没有经过任何微调训练。
- 平均求和 \(\frac{1}{N}\sum\)对 \(N\) 张全新图片的 IoU 取平均,得到零样本迁移能力的整体指标。
应用与局限:从剪纸铺到千家万户
万能切割铺的名气传开后,分号一家家开起来:修图工作室请师傅抠商品,医院请师傅找病灶,自动驾驶车间请师傅先切出“所有可能是车的东西”。师傅成了整个视觉行业的“公共手艺”。
落地场景已经很多。图像编辑方面,抠图换背景从手工描边变成点一下的事;医学影像方面,医生不再从零描画病灶轮廓,而是先让 SAM 切个大概,自己只做修正;自动驾驶方面,SAM 被用来批量生成“人、车、路牌”的像素级真值,喂给下游检测模型;视频分割方面,只要在第一帧点一下目标,后续帧就能持续跟住切开。
但师傅不是神,短板也很明显:一是边缘粗糙,头发丝、羽毛尖这类细小结构经常被一刀带过;二是图像编码器计算开销大,处理高分辨率图需要不小的算力;三是文本提示不够稳定,复杂空间描述常常翻车。推理的时间构成能说明问题:
师傅再能干,也有刀够不着的地方。但铺子的生意已经开张,接下来是用轻量化模型、开放词汇检测和多模态融合,把这些短板一块块补齐的故事。
- 编码耗时 \(T_{\text{enc}}\)图像编码器前向一次的时间,是推理耗时的大头。
- 解码耗时 \(T_{\text{dec}}\)掩码解码器输出掩码的时间,非常轻量。
- 启示同一张图的特征可以缓存复用,后续每次新提示只重新解码,从而实现接近实时的交互。
AI 应用场景
场景一:电商海报“点一下抠商品”
阶段:图像编辑 / AIGC 内容生产
解决的问题:传统抠图依赖绿幕或专用人像分割模型,遇到玻璃杯、毛绒玩具等形状各异的商品就抓瞎。SAM 只需一个提示点,就能把任意产品从复杂背景中“切”出来,设计师不用再手动描边。
具体案例:电商设计师上传一张“木质桌面上的玻璃杯”照片,用 SAM 在杯身上点一下,几秒内得到透明背景图;再配合生成式填充换背景、调光影,一张主图从半小时缩短到五分钟。
场景二:医学影像“辅助标注员”
阶段:数据标注 / 模型训练准备
解决的问题:医生在 CT 或病理切片上逐层描画病灶区域,单张耗时数分钟且主观差异大。SAM 的零样本能力先切出大致轮廓,医生只做检查修正,把“从零画”变成“改一改”。
具体案例:某医疗 AI 团队把 SAM 接入标注平台,标注员在肺结节图上点一下病灶中心,SAM 立刻给出初始掩码,人工修正量下降约 60%,标注一致性也明显提升。
场景三:自动驾驶“真值数据工厂”
阶段:数据生产 / 训练数据构建
解决的问题:自动驾驶需要海量“人、车、路牌”逐像素掩码作为真值。传统方法要逐类训练检测分割模型,成本高、迭代慢。SAM 支持全图自动分割,先切出所有候选目标,再用低成本分类器筛选指定类别,快速构建真值集。
具体案例:一家数据服务商用 SAM 对 10 万张街景图做全自动分割,再用图像分类模型给掩码打标签,两周内完成了原本预计三个月的真值生产任务。
Python 演示
import numpy as np def prompt_segment(img, seed, tol=22): # 模拟提示驱动分割: 从提示点出发做颜色相似区域生长 h, w, _ = img.shape seed = (int(seed[0]), int(seed[1])) base = img[seed].astype(np.float32) mask = np.zeros((h, w), dtype=bool) stack = [seed] mask[seed] = True while stack: x, y = stack.pop() for nx, ny in ((x + 1, y), (x - 1, y), (x, y + 1), (x, y - 1)): if not (0 <= nx < h and 0 <= ny < w) or mask[nx, ny]: continue diff = np.abs(img[nx, ny].astype(np.float32) - base).mean() if diff < tol: mask[nx, ny] = True stack.append((nx, ny)) return mask def compute_iou(pred, gt): union = np.logical_or(pred, gt).sum() if union == 0: return 0.0 inter = np.logical_and(pred, gt).sum() return round(inter / union, 3) def dice_loss(pred, gt): total = pred.sum() + gt.sum() if total == 0: return 0.0 inter = np.logical_and(pred, gt).sum() * 2 return round(1 - inter / total, 3) def main(): img = np.zeros((64, 64, 3), dtype=np.uint8) img[20:46, 15:41] = (200, 80, 90) # 目标: 红色矩形 img[30:37, 48:58] = (90, 160, 80) # 背景干扰: 绿色矩形 gt = np.zeros((64, 64), dtype=bool) gt[21:45, 16:40] = True # 真实掩码 pred = prompt_segment(img, (32, 28), tol=22) print("提示点:", (32, 28)) print("预测掩码像素数:", int(pred.sum())) print("IoU:", compute_iou(pred, gt)) print("Dice loss:", dice_loss(pred, gt)) if __name__ == "__main__": main()
def prompt_segment(img, seed, tol=22):定义“提示驱动分割”函数:输入图片和一个提示点,返回该目标的像素掩码。base = img[seed].astype(np.float32)记录提示点颜色作为“切割标准”,转成浮点避免后续计算溢出。mask = np.zeros((h, w), dtype=bool)初始化一张全 False 的“空白纸样”,随后被判为目标的地方标记为 True。diff = np.abs(img[nx, ny].astype(np.float32) - base).mean()比较相邻像素与提示点颜色的平均差异,相当于师傅判断“这块料跟刚才那块是不是同一块”。if diff < tol:差异小于阈值就拉入目标区域,模拟师傅凭“眼力”判断边界。compute_iou(pred, gt)计算预测掩码与真实掩码的交并比,检验这刀切得准不准。dice_loss(pred, gt)演示训练阶段用到的 Dice 损失,衡量预测区域与真实区域的整体重合程度。
常见误区
误区SAM 名字叫“分割一切”,那它肯定知道图里是什么物体,应该能直接告诉我“这是猫还是狗”。
正解SAM 只做“切轮廓”(判形),不做“认名字”(分类)。它输出的是像素级掩码,并不输出语义类别。识别交给分类或检测模型完成,SAM 负责把轮廓切干净,两者是“先切出来、再认是什么”的分工关系。
为何常见:“Segment Anything“这个名字太有迷惑性,加上它输出的结果看起来”很懂图”,很容易让人误以为它内置了识别能力。
误区零样本泛化这么强,那我下载模型直接用于任何新场景,连提示都不用给就能切出一切。
正解零样本指的是“不需要针对新数据集重新训练或微调”,但推理时必须提供至少一个提示(点、框等);而且当数据与训练分布差异极大时(如特定显微图像),效果会明显下降,并不存在“万能无误差”。
为何常见:“零”字太容易让人联想到“零成本、零准备”,忽略了提示仍然是模型输入的必要组成部分。
误区既然能切任意目标,那头发丝、羽毛边缘肯定也一根根清清楚楚,像 PS 钢笔工具一样精致。
正解SAM 生成的高层语义掩码在细小结构上仍然粗糙,边缘常有锯齿,细枝末节容易丢失。官方论文也承认,针对精细边缘需要额外的细化(refinement)步骤或人工修正,不能拿来即用。
为何常见:演示图大多挑轮廓分明的大物体,容易让观者高估它的边缘精细度。
误区既然支持文本提示,我写“第三排戴帽子的人”这种复杂描述,它应该也能准确理解并切出来。
正解SAM 的文本理解来自现成的文本编码器,开放词汇的语义理解能力有限,复杂空间关系描述经常失败。实践中常用 Grounding DINO 等开放词汇检测模型先定位目标,再交给 SAM 做精细分割,两者配合才是稳妥方案。
为何常见:官方演示里“一只狗”这类简单文本提示的成功案例被过度放大,让人误以为自然语言随便说都能切。
面试题
Q1. SAM 中的"S"代表哪个英文单词?
- A.Segment← 正确答案
- B.Sample
- C.Search
- D.Select
答案:A。SAM 全称 Segment Anything Model,S 代表 Segment,即“分割”。整个名字的含义是“什么都能分割的模型”,就像万能切割师傅什么都能切。
Q2. SAM 与以往分割模型最大的不同是什么?
- A.只能分割预设类别
- B.靠提示驱动任意目标← 正确答案
- C.不需要任何训练数据
- D.只能处理人像照片
答案:B。SAM 的核心突破是“提示驱动”:给点、框或文本提示,就能分割任意目标,不需要为新类别重新训练。它并不是不需要训练数据,而是把训练阶段和推理阶段解耦了。
Q3. SAM 的图像编码器主要采用哪种骨干网络?
- A.循环网络 RNN
- B.变换器架构 ViT← 正确答案
- C.卷积网络 CNN
- D.图网络 GNN
答案:B。SAM 的图像编码器基于 Vision Transformer(ViT),属于变换器架构。它把整张图变成“全景地图”式的特征表示,可以一次编码、反复使用,这是它能接近实时交互的基础。
Q4. SAM 支持哪些提示方式?
- A.点选目标← 正确答案
- B.框选区域← 正确答案
- C.文字描述← 正确答案
- D.语音指令
答案:ABC。SAM 支持点提示、框提示、文本提示三种交互式提示,还支持全图网格的自动分割模式。语音指令不属于 SAM 原生支持的方式,它只加工视觉与文本信息。
Q5. 衡量分割精度最常用的指标是哪个?
- A.Accuracy 准确率
- B.IoU 交并比← 正确答案
- C.Recall 召回率
- D.均方误差 MSE
答案:B。分割任务最常用 IoU(交并比),即预测掩码与真实掩码重叠面积除以并集面积。它同时惩罚“切错”和“漏切”,是衡量“这刀切得准不准”的标准尺子。
Q6. SA-1B 数据集中掩码总数约为多少?
- A.10 亿个← 正确答案
- B.100 万个
- C.1100 万个
- D.1 万亿个
答案:A。SA-1B 包含 1100 万张图像和超过 10 亿个掩码,比此前最大的分割数据集大约 400 倍。1100 万对应的是图像数,不是掩码数,做题时别被数字带偏。
Q7. SAM 训练时组合了哪些损失函数?
- A.焦点损失 Focal← 正确答案
- B.Dice 损失← 正确答案
- C.IoU 损失← 正确答案
- D.交叉熵损失
答案:ABC。SAM 训练采用 Focal 损失抓难分像素、Dice 损失衡量区域重叠、IoU 损失优化交并比,三者加权求和。文章中“三把尺子”的比喻对应的就是这三种损失。
Q8. 关于 SAM 的零样本能力,下列说法正确的是?
- A.测试前必须在新数据上微调
- B.对未见目标可直接分割← 正确答案
- C.零样本等于结果无误差
- D.只能分割训练集类别
答案:B。SAM 零样本指对未见类别和未见领域直接推理、无需微调,但并非无误差。它靠大规模预训练学到通用“物体感”,对没见过的新目标也能判断“哪里是一个整体”。
Q9. 同一提示产生歧义时,SAM 如何应对?
- A.随机输出一个掩码
- B.输出多个候选掩码← 正确答案
- C.直接放弃本次分割
- D.要求用户重新给提示
答案:B。一个点可能既指“整只企鹅”又指“企鹅的白肚皮”。SAM 会输出多个候选掩码并附置信分,让用户挑选或用 argmax 自动选出最优。随机输出和直接放弃都不是它的策略。
Q10. SAM 的下游应用包括哪些?
- A.图像抠图编辑← 正确答案
- B.医学影像标注← 正确答案
- C.自动驾驶感知← 正确答案
- D.数值天气预报
答案:ABC。SAM 已广泛应用于抠图编辑、医学影像辅助标注、自动驾驶真值生产与视频目标分割。数值天气预报不属于图像分割的典型场景,气象数据多为网格场而非自然图像目标。