Grounding SAM:Grounding DINO + SAM = 自动检测 + 自动分割的完整方案

两个月前,我接到一个任务:从几千张商品图里自动把每个商品抠出来,背景去掉。试了 SAM,效果惊艳,但问题来了——SAM 需要提示。你可以给它一个点,也可以给它一个框。没有提示,它不知道你到底要分割哪个物体。于是我写了脚本自动生成提示,结果一团糟。直到我发现了 Grounding SAM:输入一句“产品”,它自动识别图中所有产品并分割成掩码。这救了我的命。

AI technology illustration

你可能会问,SAM 不是已经有自动模式了吗?它有“everything”模式,会分割图中所有东西。但那是无差别分割,一堆碎片,你还要自己过滤哪些是你想要的。Grounding SAM 的关键在于:它能根据文字描述,只分割你关心的物体。它的名字已经说明了一切——Grounding DINO + SAM = 自动检测 + 自动分割。

一个会说话,一个会动手

Grounding DINO 是开放集目标检测器。什么叫开放集?就是它不限于训练时见过的类别。你给它一个句子“穿红色衣服的人”,它能在一张图里找出所有对应的人的位置,画上边界框。这是怎么做到的呢?它用文本编码器把句子转成向量,用图像编码器把图片转成特征,然后通过交叉注意力让文本中的词和图像中的区域一一对应。说白了,它一边看字,一边看图,把两者对上号。

SAM(Segment Anything Model)则是分割模型。它的强项在于:只要给一个提示——哪怕是一个点、一个粗略的框——它都能给出一个高质量的物体掩码。它在超过10亿个掩码上训练过,所以对物体的形状理解非常深刻。但它的弱点是:它不理解“人”或“猫”这种语义概念,你给它一个框,它就分割框里的东西,不管那个东西是猫还是狗。

到这里你就明白了:Grounding DINO 负责“看文字、找位置”,SAM 负责“看框、抠形状”。两者天生互补。

流水线:从文字到掩码的四步走

  1. 输入文本提示,比如“汽车”。
  2. Grounding DINO 在图像中检测所有“汽车”,输出一组边界框。
  3. 每个边界框作为 SAM 的提示输入。
  4. SAM 对每个框生成精细的物体掩码,合并后输出。

整个过程不需要任何训练,开箱即用。官方代码里用几行就能串起来,支持批量处理图片。你可以直接克隆 Grounding-SAM 仓库 跑通 demo。

它和传统分割有什么本质区别?

方案 需要标注数据 能理解文本? 输出
传统检测+分割 每个类别都要标注 类别标签+框+掩码
SAM 不需要(但需要几何提示) 掩码
Grounding DINO 不需要
Grounding SAM 不需要 掩码

传统方法要针对每个新类别重新标注、重新训练。Grounding SAM 是零样本(zero-shot)的:你换一个文本描述,它就处理新的目标,完全不需要重新训练。这就是开放集(open-set)的魅力。

Grounding DINO 凭什么“认识”没见过的词?

这就要说到它的训练方式了。它把检测任务改写成一个匹配问题:输入的句子是一组 token,图片是一组 patch,通过对比学习让“猫”这个词和图片中猫的区域在特征空间里靠得很近。训练时用了大量图像-文本对,所以它学会的不是某个固定类别,而是语言和视觉之间的对齐关系。

SAM 的训练则完全不同。它的目标是“可提示分割”——不管提示是什么,都要给出一致的掩码。作者用了数据引擎,先用自动生成的掩码训练一个模型,再人工修正,如此循环,最终拿到 1100 万张图像和 10 亿掩码。所以 SAM 对形状的泛化能力极强,即使是一只卡通猫或一只奇怪的玩偶,它都能分割得像模像样。

我踩过的一个坑

我最开始以为 SAM 本身就能理解文本。直到看了论文才知道,SAM 根本没有文本编码器,它只接受点、框、掩码这类几何提示。你就算把“猫”这个字打给它,它也只会当成一个奇怪的坐标。所以 Grounding SAM 这个组合,相当于是给 SAM 装上了一双“听懂人话的眼睛”。

这个发现让我意识到:很多强大的模型其实很“偏科”。SAM 是形状专家,但不是语义专家。Grounding DINO 是语义专家,但不是像素级专家。把它们拼起来,互补的能力发挥到极致。

它也有翻车的时候

这个流水线不是万能的。最大的短板在 Grounding DINO 上:如果它漏检了,后面 SAM 连表现的机会都没有。比如图片中的物体太暗、太小、或者语义模糊,检测不到就没有。

另一个问题是速度。两个大模型串行,每张图要跑两次推理。在 GPU 上可以做到每秒几张,但在 CPU 上可能要几秒一张。要处理上万张图,时间和资源成本都不小。

还有一个细节:SAM 是“指哪打哪”,但如果 Grounding DINO 给出的框太紧,SAM 可能会把物体的一部分切掉;框太松,又可能把背景包含进来。好在官方做了一些后处理,比如用 SAM 的掩码质量分数过滤低置信度的结果。

from groundingdino.util.inference import predict
from segment_anything import SamPredictor, sam_model_registry
# text prompt
text = "red car"
# detect boxes with Grounding DINO
boxes, logits, _ = grounding_dino_predictor.predict(image, text)
# segment each box with SAM
masks = [sam_predictor.predict(box=box) for box in boxes]

你可能想问的两个问题

Q:我输入“桌子”,但输出一堆“椅子”怎么办? 这说明 Grounding DINO 的语义对齐还不够精确,相近概念容易混淆。试一下更具体的描述,比如“房间里那张圆桌”,通常会好一些。

Q:它能在视频上用吗? 官方目前主要面向图片。视频可以逐帧跑,但速度慢而且会有闪烁,需要额外做时间平滑,实际项目中要谨慎。

想更深入?

Grounding DINO 的论文《Grounding DINO: Marrying DINO with Grounded Pre-Training for Open-Set Object Detection》解释了如何在 DETR 框架中引入文本分支。SAM 的论文《Segment Anything》则展示了数据引擎的威力。读完这两篇,你对整个流水线的理解会更深。

写在最后

Grounding SAM 不是深度学习理论上的一次革命,它更像是两个成熟模型的“合体技”。但这种组合非常有启发性——它告诉我们,不要总想着从头造一个大而全的模型,有时候把已有的专业模型接在一起,就能解决实际的问题。

最后说点实在的。我用它处理了两千张图,准确率相当能打,尤其是对于常见物体类别。但如果你要分割的是精密零件或者形状非常不规则的物体,可能需要人工介入。它的边界就在那里:检测的边界、分割的边界,以及质量评估的边界。知道边界在哪里,用起来才安心。

原创文章,作者:guanweilu,如若转载,请注明出处:https://guanweilu.cn/article/593.html

(0)
上一篇 1天前
下一篇 1天前

相关推荐