Grounding DINO:怎么把目标检测和文本描述结合起来——开放集检测的突破

我最早以为目标检测就是“认东西”:训练集里有什么,模型就能框出什么。直到有人问我:“那你能让它找一只站在滑板上的狗吗?”我愣住了——训练集里根本没有“滑板上的狗”这一类别。对方追问:“那如果我把它写成一个文字描述,告诉它呢?”

AI technology illustration

这个问题后来在模型里有了答案。2023年3月,IDEA-Research 放出一个名为 Grounding DINO 的模型。它把目标检测从“在固定类别里挑一个”改成了“听你描述,然后到图里去找”。这篇文章不聊新闻,只讲机制:它是怎么把文本和检测绑在一起的。

封闭世界的枷锁:为什么传统检测器只认固定几类东西

YOLO、Faster R-CNN 这类经典检测器,本质是“分类+定位”。你在 COCO 上训练,模型就用 80 个类别的 one-hot 标签做监督。它学到的类别概念被锁死在训练数据里。有个很少人注意的细节:模型并不“认识”汽车,它只是把汽车的特征映射到“car”这个编号上。你让它找“路边废弃的自行车”,它做不到,因为“废弃”这种属性从未进入过它的分类空间。

开放集检测(open-set detection)想干掉的就是这堵墙:只要你对物体的描述能形成文字,模型就应该尝试把它框出来。注意“能形成文字”这个前提——正是它决定了 Grounding DINO 走的是图文联合路线,而不是单纯的视觉异常检测。

把检测变成匹配:一句话就是查询条件

Grounding DINO 的论文标题其实已经把方案说完了:Grounding DINO: Marrying DINO with Grounded Pre-Training for Open-Set Object Detection。DINO 是当时很能打的 Transformer 检测器,负责找到物体在哪儿;grounded pre-training 负责理解文本说的是什么。两者结合,等于把一个“会定位的检测器”和一个“会读语言的预训练模型”焊接成同一个网络。

关键在设计哲学:它不是先做常规检测,再拿文本结果去匹配。而是从一开始就让文本参与“怎么看图”。图像编码器和文本编码器各自提取特征后,特征之间的融合发生在网络内部,最后直接用文本里的短语作为输出类别。

论文里有句话我印象很深:开放集检测的目标,是检测任何由自然语言可表达的对象。这意味着换一个文本描述,模型就迁移到一个新任务上,不需要新增任何标注。

举个例子。传统检测器遇到“一只在滑板上的狗”这种描述时,它不知道“滑板”和“狗”两种视觉概念该如何组合。Grounding DINO 的做法是,让文本中的“滑板”和“狗”分别去和图像特征做匹配,然后约束两个匹配区域之间的空间关系。即使训练数据里没有一张图同时包含狗和滑板,只要模型分别理解这两个概念,它就能把组合后的结果找出来。

关键部件:文本是怎么给检测领航的

Grounding DINO 的改进可以被拆成三个组件,每个都对应一个“文本介入”的时机。

Feature Enhancer(特征增强器)
图像特征和文本特征先各自提出来,然后做双向注意力融合。文字去“看”图里的细节,图也去“看”文字强调的是哪几个词,互相校正。这一步是为了消除两种模态之间的表达鸿沟。
Language-Guided Query Selection(语言引导的查询选择)
DINO 原本用一组随机初始化的 object queries 去图上扫描候选框。Grounding DINO 把这个随机初始化换成了“文本参与筛选”:先用文本特征在图像特征图上找相关性最高的位置,把这些位置的响应作为初始查询。相当于以前是闭着眼睛满屋找,现在是先听你说“一个红色的球”再去找。
Cross-Modality Decoder(跨模态解码器)
解码器每一层都会拿当前查询向量同时和图像特征、文本特征做交互,再逐步修正框坐标。文本不是只在最后打分用一次,而是每一层的框回归都在“看”文本。这是它和许多早期开放集检测方案最大的差异。

推理流程可以拆成四步:

  1. 图像经 Swin Transformer 编码,输出多尺度特征;
  2. 文本经 BERT 编码,输出每个 token 的特征;
  3. 特征增强器让两种特征双向融合;
  4. 语言引导的查询选择产生初始框,跨模态解码器迭代精修,最后输出框、置信度和文本短语。

你可能会问:这和把文本向量拼到图像特征后面有什么区别?区别在交互的深度。拼接是一次性线性混合,双向注意力是动态的、逐层对齐的。模型在图里看到车,会专门去文本里找“车”这个词,同时反向加强图像特征的响应。这个互相强化的循环,才是开放词汇能力的来源。

训练的秘密:对比损失把词和区域拉在一起

训练用的损失函数并不神秘:对比损失+框回归损失。对比损失在这里做的事可以叫“拉郎配”:把图中某个区域的视觉特征和文本描述里对应的词向量拉近,把不匹配的特征推远。关键区别是,它是区域和词级别的对齐,不是整图和整句的匹配。

为什么用对比损失而不是常见的 softmax 分类损失?因为分类损失要求输出类别数目固定,而开放集场景的文本短语是无限的。对比损失不关心词表,只关心“当前这个区域和当前这句话对不对得上”,因此天然可以适配任意输入文本。

我原来有个错误印象,以为 Grounding DINO 是“CLIP 加了个检测头”。后来发现完全不是。CLIP 做的是“这张图和这句话整体对不对得上”,它不关心图的哪个区域对应哪个词。Grounding DINO 在训练时就有显式监督:某个词精确对应图中的某个框。所以它输出的是“猫在椅子上”“狗在桌上”这种带位置、带短语的检测结果,而不是一个分数。

它和 CLIP 不是一回事:一张表说清楚

模型 输出 利用文本的方式 能直接画框吗
YOLO 框+固定类别 不用文本 能,但只限训练集类别
CLIP 图文相似度 全局匹配 不能
GLIP 框+文本短语 文本参与训练,做区域-词对齐 能,开放词汇
Grounding DINO 框+文本短语 文本从查询初始化贯穿到解码 能,开放词汇,定位更强

GLIP 是把检测当作“区域-文本对比”的先行者,Grounding DINO 则把 Transformer 解码器的迭代精修能力移植进来,所以它在定位精度上的提升是实打实的。这也是为什么后来很多人做开放集分割时,首选的前置检测器是它,而不是直接在 GLIP 上继续改。

我踩过的坑:open-set 不是“见过”,是“理解”

说一个我自己纠正过的理解偏差。我一度以为 open-set 的意思是“模型已经见过所有物体类别,只是没有打标签”。直到我自己跑了一段描述,才明白完全不是。模型能识别“戴墨镜穿蓝衣服的人”,不是因为它记忆了这个组合的图片,而是它组合了“墨镜”的视觉特征和“蓝色”的像素规律。它靠的是语义理解,不是记忆。

这个理解也解释了一个反直觉现象:为什么 Grounding DINO 有时会对极其简单的词汇失效。不是它看不到特征,而是它没理解你说的话。比如“左边第二个窗户里的绿瓶子”,模型可以找到“窗户”和“绿瓶子”,但“左边第二个”这种相对空间指代,对跨模态解码器来说仍然是硬骨头。

能力边界和下一步:它能做什么,做不了什么

  • 文本理解的上限受限于 BERT 这类编码器:复杂语序、否定句、多重指代会掉链子;
  • 描述模糊时会出现误检:你说“远处的小狗”,它可能把远处的一块石头也画进来;
  • 计算开销远高于封闭集检测器:双编码器、交叉注意力、迭代解码,实时性很难保证;
  • 对训练数据分布敏感:极端的遮挡、罕见视角、特殊光照都会明显掉点。

这些不是论文里的理论推演,而是我在实际调试中遇到过的。用来检测“桌子上的一杯咖啡”很稳,换成“会议室白板左侧的绿色便利贴”就开始漏检。不过也要说句公道话:这种错误很多时候不是定位能力的问题,而是语言理解的问题。换成人工标注,很多人也会为“左边第二个”这种描述停下来数一遍。所以与其说这是 Grounding DINO 的不足,不如说整个视觉-语言模型在处理空间语言时都有同样的天花板。

但把它放进更大的坐标系里看,这个方向是对的。后来出现的 Grounded-SAM 把 Grounding DINO 和分割模型串联起来,实现了开放集分割;也有人把大语言模型接进来,让长句描述先被解析成多个 grounding 目标,再逐个检测。Grounding DINO 证明了“理解语言”和“检测物体”可以是一件连续的事。下次你看到检测模型能输出“戴着帽子的男人”这种带语义的结果时,可以想一想:支撑它的不是更大的标注集,而是把文本当作第一等公民的架构选择。

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

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

相关推荐