如果你维护过一套生产环境的检测系统,大概率经历过这种场景:模型上线跑了三个月,一切正常。某天老板指着一件你从未标注过的新物料说——这个也得检测。传统检测器的回答是:抱歉,这个类别不在训练集里。你得重新攒数据、重新训练、重新部署,周期按周算。

Grounding DINO 的回答是另一句话:给我一句描述,我现在就去找。这个回答背后不是 demo 话术,而是两类检测器的根本分界:闭集检测与开放集检测。2023 年 3 月,IDEA 研究院放出 Grounding DINO 的开源模型,一句 a car 就能在任意图片里把车框出来。它让“加一个检测类别”这件事,从几周变成了几秒。
你的检测器为什么只能认识 80 类
先别急着看 Grounding DINO,得先理解传统检测器被什么卡住了。YOLO、Faster R-CNN 这类检测器,最后的分类头是一个线性层。假设你训练了 80 类,这个线性层的输出维度就是 80。模型在训练里学到的是:这个特征向量对应编号 5 的概率要高。至于编号 5 代表“猫”,那是数据集标注者脑内的映射,模型并不知道。
我最早以为,解决办法是把这个分类头做宽一点,比如训练的时候设一万个类别,测试的时候总能碰上?后来才想明白这行不通。一万类的输出,意味着每个类别都要有大量样本撑起区分度,标注成本先爆炸。而且类别之间长得像怎么办?“猫”和“豹猫”的边界谁来定?开放集的本质不是“更多的闭集”,而是换一种定义类别的方式。
| 维度 | 传统检测器 | Grounding DINO |
|---|---|---|
| 类别定义 | 固定编号,softmax 选一 | 任意文本描述,现场指定 |
| 加新类别成本 | 重新标注加重新训练,按周算 | 改一行 prompt,按秒算 |
| 输出 | 类别编号加置信度 | 检测框加匹配到的文本片段 |
| 训练范式 | 图像加固定标签 | 图像加文本句子,跨模态对齐 |
把“选类别”换成“对描述”
Grounding DINO 的核心切换,是把检测从“这个框属于 80 类中的哪一类”,改成了“这个区域和这段文本描述是否对齐”。
这个思路不是它发明的。它的直接前身是微软的 GLIP,GLIP 把检测重新定义为 region-word alignment:给定一句话,在图中找出与之匹配的区域。Grounding DINO 沿着这个路子走,但把底下的检测器换成了自家 2022 年发布的 DINO 检测器,并且在跨模态交互上做了多处改动。
顺便破个案:Grounding DINO 里的 DINO,不是 Facebook 那个自监督模型 DINO。它是 IDEA 研究院自己的检测器,全名 DEtection TRansformer with Improved DeNoising anchor boxes。名字撞了,代码里裸用 DINO 这个词的时候经常有人踩坑。
它长什么样:一次推理的完整旅程
Grounding DINO 的骨架是双编码器加单解码器。用最粗糙的话说:一个编码器负责“看”,一个编码器负责“听”,后半段让两者互相掺着把框框出来。
把一张图和一句 a dog on a couch 喂进去,会发生这些事:
- 图像进入 Swin Transformer,抽出四种分辨率的特征图,相当于对画面做了四个层级的观察。
- 文本进入 BERT,每个单词变成一个固定维度的语义向量。
- 跨模态特征增强:图像特征与文本特征互相做注意力。图像侧混进文本信息(画面上哪里有 dog 的线索?),文本侧混进图像信息(dog 这个词跟画面哪里呼应?)。它们被压进同一个语义空间。
- 语言引导的查询选择:用文本特征跟图像每个空间位置算相似度,得到一张相关度热力图,选出响应最强的 top-K 个位置,作为解码器的初始查询。
- 跨模态解码器:每一个解码层里,查询既跟图像特征做交叉注意力,也跟文本特征做交叉注意力。文本不是开头用一次就完了,而是每层都提醒模型一遍:你在找 dog。
第 4 步是决定性差异。传统 DETR 的 object queries 是一组固定的可学习向量,对每张图都一样,是“盲”的。Grounding DINO 用文本相似度从图像里挑出初始查询位置,先听你说要找什么,再决定往哪里集中火力。这一步直接影响了小目标和模糊目标的检出率。
开放集能力是从训练里长出来的
传统检测训练喂给模型的是图像加标签编号。Grounding DINO 喂给模型的是图像加完整句子。连 COCO 这种检测数据集,它也会把标签 dog、car 转成文本输入。
训练数据是拼起来的:论文中报告,检测数据(COCO、Objects365 等)负责提供“区域和名词”的对齐,带指代表达的图文数据(Flickr30K Entities、GQA 等)负责提供“复杂描述和区域”的对齐。
所以模型学到的不再是“编号 5 分数要高”,而是一个可迁移的规则:文本里出现的名词性短语,对应图像里某个区域;这个区域的特征与文本向量的距离应该最小。
到了推理阶段,哪怕你给一个训练集里从没整体出现过的描述,比如 red panda eating bamboo,只要 red、panda、eating、bamboo 这些词元在训练分布里出现过,模型就能把它们组合起来用。这是它泛化的全部秘密。论文报告的零样本指标:COCO 上零样本 AP 52.5,LVIS 上 34.5,已经能跟不少闭集训练模型掰手腕。
上手:三行代码,一个框
官方仓库的推理接口短得不像一个 CV 模型:
from groundingdino.util.inference import load_model, load_image, predict
model = load_model("GroundingDINO_SwinT_OGC.py", "groundingdino_swint_ogc.pth")
image, _ = load_image("cat.jpg")
boxes, logits, phrases = predict(model, image, "a cat on a couch", text_threshold=0.3, box_threshold=0.4)
输出的 boxes 是框坐标,phrases 是每个框匹配到的文本片段。想找别的物体?改第三个参数就行。这就是开放集的实际体感。
跟 CLIP、SAM 站一起看,才能看清它的位置
我第一次看到 Grounding DINO 的 demo,脱口而出:这不就是 CLIP 加了个框吗?后来读论文才意识到这个想法错了。CLIP 是给“一张图加一句话”打一个整体相似度,Grounding DINO 是给图像里每个候选区域和这句话打分,还要在空间上挑出精确的边界。从“像不像”到“在哪里”,问题难度不在一个量级。
| 模型 | 输入 | 输出 | 回答的问题 |
|---|---|---|---|
| CLIP | 图像 + 文本 | 相似度分数 | 这张图像像不像这句话? |
| GLIP | 图像 + 文本 | 区域提议 + 匹配分数 | 这句话在图像里的响应区域在哪? |
| Grounding DINO | 图像 + 文本 | 精确检测框 + 匹配文本 | 这句话描述的物体,框在哪里? |
| SAM | 图像 + 点或框提示 | 分割掩膜 | 提示所指物体的像素边界在哪? |
Grounding DINO 和 SAM 形成了一种有趣的互补:一个提供语义标签和位置,一个提供像素级边界。这就是后来 Grounded-SAM 项目做的事——Grounding DINO 出框,SAM 在框内出 mask,合起来就是“输入一句话,输出物体的精确轮廓”。
该泼冷水了:它在哪些地方翻车
把话说透,开放集不是万能的。以下是我实际使用和读论文中体会到的四个边界。
- 复杂组合语义容易失效。对“左边红色毛衣的男人”这种堆叠了位置、属性、类别的描述,它常常只认到“男人”或“红色”。它对组合理解是浅层的,不是真正的逻辑推理。
- 没法说“我不知道”。你给它一句现实中不存在的描述,比如
a flying elephant,它也会尽量给个框。模型没有“这个物体我不确定存在所以拒绝输出”的机制,false positive 必须靠阈值卡,而阈值调起来非常敏感。box_threshold低了 false positive 暴涨,高了漏检。 - 长尾视觉概念不稳定。看图说话类预训练数据(Flickr30K Entities、GQA 等)有个先天缺陷:里面多是显著物体、常见名词。罕见物体、抽象材质、非常规视角下的物体,它的表现会明显退化。
- 对措辞高度敏感。同一个物体,
dog很好找;换成a four-legged furry pet这种训练分布外的说法,效果立刻打折。它对齐的是统计相关性,不是语义理解。
它对“检测”这个词做了什么
Grounding DINO 最有意思的贡献,不是又多了一个检测器,而是把“认识一个物体”这件事的定义改了。原来认识是网络结构里的一个编号,现在认识是语义空间里的一次匹配。类别不再被写死在代码里,而是被塞进推理时的输入。
但必须承认,它还不是终点。生产环境里的开放集检测仍然需要人的复核,因为模型在“我不确定”这件事上的表达力几乎为零。研究上更长远的方向,是把这种 grounding 能力整体搬进多模态大模型——后来的许多工作正是这么干的。Grounding DINO 是这条路线上的界碑:往前看,它不如后来的大模型全能;往后看,它把“加一个类别”的成本从几周降到了一句话。
下次你要检测一个从没见过的新物体,不用重新训练了。给它一句话就好。但这句话,最好足够具体、足够常见——它替你省掉的,是在图海里重新标注几千个框的力气。
原创文章,作者:guanweilu,如若转载,请注明出处:https://guanweilu.cn/article/2328.html