ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

SAM

SAM 一句话理解整篇论文建立一个统一的 segmentation interface让其他模型、用户以及不同任务都能够调用SAM 的目标是给模型任意一种 prompt模型都尽可能输出一个合理的分割 mask再依靠海量数据和这种promptable训练方式让一个模型能够零样本迁移到很多不同分割任务。论文围绕三个彼此关联的东西展开Task、Model、Data。全文的三个核心问题什么任务能支持 zero-shot generalization、模型应该如何设计、以及数据从哪里来。1. 论文想解决什么问题传统 segmentation 通常是Image → 特定任务的 segmentation比如semantic segmentation、instance segmentation、interactive segmentation用户点击一个点模型把对应物体分出来。这些模型通常都是针对固定任务训练的。SAM 希望把 segmentation 变成Image Prompt → Maskprompt 可以是foreground/background pointbounding box一个粗糙 masktext更广义地说任何能表达“我要分割什么”的信息。论文把这个任务叫做Promptable Segmentation也就是“可提示分割”。2. 为什么要专门定义一个 Promptable Segmentation Task思路其实是从 NLP foundation model 来的。LLM 有一个非常统一的任务next-token prediction模型通过一个统一的训练目标学会了很多能力然后推理时只需要改变 prompt就能完成翻译、问答、摘要、分类、写代码……SAM 想找一个 segmentation 对应的“统一任务”。于是提出给我任意 segmentation prompt我都输出一个valid mask。这里的valid mask和以往不同。这个 prompt 本身是 ambiguous 的SAM 并不要求必须猜中用户唯一真正想要的东西。而是要求至少输出一个合理的 segmentation。比如你在一个人的衣服上点一个点这个点可能表示shirt也可能表示person甚至可能表示更小的衣服局部。如果 prompt 有歧义输出只要对应其中一个合理对象就算 valid。3. SAM 模型结构SAM 本身的核心就三个模块Image Encoder Prompt Encoder Mask Decoder整体流程可以理解为然后最后3.1 Image Encoder图像首先经过一个大型 ViT 得到 image embeddingImage EncoderMAE-pretrained ViT主要版本最终用了 ViT-H 是 SAM 中最重的部分。重要设计一张图片只需要跑一次 Image Encoder。论文明确强调image encoder 每张图只运行一次得到 image embedding 后缓存下来。随后不同 prompts 都可以复用 image embedding。这就是为什么 SAM 能用于交互式分割。3.2 Prompt EncoderSAM 把 prompt 分成两类Sparse Prompt包括point / box / text少量token / vectorpoint 和 box 主要用Positional Encoding Learned Prompt Embedding 来编码。如(x,y)先告诉模型点在哪里再通过 learned embedding 告诉模型这是 foreground point 还是 background point。Dense Prompt主要就是mask空间feature mapmask 通过 convolution 得到一个 dense embedding然后和 image embedding 相加。3.3 Mask Decoderprompt 真正和 image 发生交互的地方。Mask Decoder 的输入有image embedding、prompt embedding以及几个特殊的 output tokens然后通过一个很轻量的 Transformer decoder。其中有prompt → image的cross-attention同时还有image → prompt 的cross-attention也就是一种双向信息交互。经过两个 decoder blocks 后对 image embedding 上采样然后通过 output token 动态生成一个线性 classifier然后对每个位置计算得到每个像素属于 foreground 的概率。其实和之前看的很多的 segmentation-VLM 工作已经有一点思想上的联系了。4. SAM 怎么解决 prompt ambiguity刚才那个例子一个点落在人衣服上。可能是shirt也可能是person如果模型只输出一个 mask很容易把几个可能的 mask“平均”起来。所以 SAM 直接一个 prompt 输出多个 masks默认输出3个候选 mask。为什么是 3作者认为很多歧义大致对应例如三个 mask 往往已经足够覆盖常见层级。同时每个 mask 会预测一个estimated IoU score用它进行排序。所以 SAM 实际输出的是而不只是单个 mask。5. SAM 的训练方式SAM 的训练不是简单 Image GT Mask → Mask而是模拟用户不断交互。针对一个 ground-truth mask先随机生成一个 prompt例如一个 foreground point。模型预测然后根据错误区域再产生继续预测。不断模拟论文训练时对一个 mask 会模拟11 rounds的 prompting。Loss 则主要是所以从训练角度看SAM 学的是面对各种不同形式、不同精确程度的 prompt我都应该能够恢复一个合理 mask。6. 为什么 SAM 能叫“Segment Anything”其实最关键的不完全是 architecture。真正让它产生强泛化能力的是Data ScaleLLM 的训练数据网上到处都是 textCLIP 的训练数据也可以从网页获得(image, text)但是网上不存在(image, pixel-level mask) 这种 web-scale 数据。所以 Meta 自己设计了一个 Data Engine7. Data Engine论文真正重要的另一部分data engine 有三个阶段Manual → Semi-Automatic → Fully Automatic第一阶段Assisted-manual一开始 SAM 还比较弱。标注员点击 foreground/background pointHuman Prompt → SAM → Mask人再修正。然后new masks → retrain SAMSAM 变强以后标注速度也越来越快。最后第一阶段获得约4.3M masks来自约120K images。第二阶段Semi-automatic这时候SAM已经不错了先自动把容易的物体分出来。例如person、car、large object这些比较显著的物体自动产生 mask。然后标注员主要负责找模型没分出来的东西。这样做的目的不是单纯提高数量而是增加 mask diversity尤其是小目标、不显眼目标、unusual objects。这一阶段最终累计到10.2M masks。第三阶段Fully Automatic到这里 SAM 已经足够强所以作者开始完全自动生成 mask在图片上均匀打的 point grid1024个point prompts。每个点然后做几层过滤① predicted IoU留下 confidence 高的 mask。② stability稍微改变 mask threshold和如果两个 mask 差别很小③ NMS去掉大量重复 mask。④ multi-scale crop为了发现小目标对 image crop 放大以后再跑 SAM。这个流程最后在11M images 上产生1.1B masks。于是得到SA-1B8. SA-1B 有多大论文最终的数据集11M images、1.1B masks平均而且最终 SA-1B 中99.1% 的 masks 是自动生成的。作者还人工检查了一部分自动 mask随机抽取约 50K masks 然后让专业标注员修正。结果94% 的自动 mask 与人工修正 mask IoU 90%。所以作者认为自动 annotation 的质量已经足够高。9. 为什么它能做到 zero-shotSAM 没有固定 category taxonomy它不需要预测dog, cat, car, person只学 这个 prompt 对应哪些 pixels学到的是一种非常通用的映射。因此测试时遇到没见过的数据分布也可能继续工作。作者在 23 个非常不同的 segmentation datasets 上进行 zero-shot single-point 测试包括普通场景、ego-centric、underwater 等分布。单点测试中SAM 在 23 个数据集中的 16 个上 mIoU 高于强基线 RITM如果从 SAM 输出的三个候选 mask 中 oracle 地选择最符合 GT 的一个所有数据集上都超过 RITM。10. 一个非常容易误解的问题SAM 的 zero-shot 是什么SAM 的 zero-shot 和 LLM zero-shot QA 并不完全一样。比如 object detector 输出 cat bounding box把这个 box 给 SAM那么原本 SAM 从来没有专门训练 cat instance segmentation 这个任务。但通过 prompt composition 可以完成这个任务。所以作者所谓 zero-shot 很大程度是Promptable model Prompt engineering 实现 downstream task transfer。利用大规模训练中学到的通用视觉分割先验再结合当前 prompt对图像中的边界、纹理、形状、区域一致性等视觉信息进行分割。SAM 本身并不主要负责“cat 是什么”这种高层语义判断。如先由一个 cat detector 找到猫的 bounding box再把这个 box 作为 prompt 给 SAMSAM 负责把这个 box 对应的区域精细分割出来。论文明确把这种方式称为通过 prompt engineering 将一个 promptable segmentation model 组合到更大的系统里从而完成新的 downstream task。所以这里可以把两个模块分工成detector负责语义——“这里是猫”SAM负责像素级定位——“这只猫具体覆盖哪些像素”作者所说的zero-shot是指如果已经有一个 cat bounding-box detector那么可以把它输出的 box 作为 SAM 的 prompt从而把cat detection转换成cat instance segmentation。11. SAM 的 text prompt 能力其实没有后来大家想象得那么强原始 SAM 论文里确实做了text-to-mask但只是 proof-of-concept。作者没有大量 text-mask annotation。而是利用 CLIP 的对齐。训练时作为 prompt。推理时则再给 SAM。因为 CLIP image/text embedding 已经在一个共同 embedding space 中因此可以这样“偷梁换柱”。所以原始 SAM 的 text understanding 能力其实比较有限。这也是后面很多 Grounded SAM、Grounding DINO SAM、LISA、ReasonSeg、SAM2、segmentation VLM工作继续发展的原因。12. SAM 的 limitation很细的结构可能漏掉偶尔产生小的 disconnected artifactboundary 不一定像专门做高精度 segmentation 的方法那么锐利输入很多 interactive points 时专门的 interactive segmentation 方法可能比 SAM 更好ViT-H image encoder 很重所以完整 image encoding 并不是真正实时text-to-mask 还只是探索性的semantic segmentation / panoptic segmentation 不容易简单通过 prompt 直接实现。所以它优化的目标不是最高 segmentation IoU而是13. 从研究角度看这篇论文最重要的贡献是什么如果站在做 VLM segmentation 的角度我认为这篇论文最值得注意的其实不是 ViT prompt encoder decoder 本身。而是它把 segmentation 的研究范式改了一次。以前比如SAM 变成推理阶段也就是说它把研究问题从“怎么把某一个 segmentation benchmark 再提高 1 个点”转成“能不能建立一个统一的 segmentation interface让其他模型、用户以及不同任务都能够调用”论文最后自己也是把贡献总结成三件事Task: Promptable Segmentation、Model: SAM、Data: SA-1B14. 那为什么这和 CONVERSEG-NET 特别相关SAM 原本支持的 prompt 本质上比较“低层”point、box、mask甚至 text 也是比较初步的 proof-of-concept。但是 CONVERSEG 想处理的是“the object that can be used to cut something”或者“the object that would be dangerous to touch”这种语言。这时候问题变成SAM 本身已经是非常强的prompt-to-mask interface问题是怎么把 VLM 对复杂语言的理解变成 SAM decoder 能利用的 prompt representation15.之前看到的 CONVERSEG-NET 可以这样映射之前看的结构里Qwen 得到然后而再送入 SAM2 mask decoder。这里实际上就是在重新实现 SAM 的 prompt interface。原始 SAMCONVERSEG原始 SAMCONVERSEG也就是说而这就是二者最核心的关系。16. 读 SAM 时真正要掌握到什么程度如果是为了继续看 CONVERSEG把下面这条链彻底搞懂就够了然后接着最后然后再看 CONVERSEG就会发现它真正做的事情可以压缩成一句话用 VLM hidden states 替代传统的几何 prompt encoder 输入 再继续复用 SAM/SAM2 的 dense segmentation 能力。如果把整篇论文压缩成一张逻辑图大概就是对现在的CONVERSEG / VLM segmentation / reasoning segmentation这些工作来说SAM 可以看成非常重要的“前一代基础设施”SAM 解决的是“如何根据一个相对明确的 prompt 得到 pixels”而后面的 VLM segmentation 工作开始研究“如何先理解复杂语言、语义、关系甚至推理再把这个理解转成 SAM 能够执行的 pixel grounding”。
返回列表