常规目标检测器本质上是一台"只会背单词的翻译机"。你在COCO上训一个Faster R-CNN,让它找giraffe没问题,可你要让它找"长颈鹿",或者让它找训练集里从未出现过的"塑料瓶盖",它基本就罢工了。这不是某一个模型的缺陷,而是整套范式决定的:传统检测器的分类头输出维度是固定的,有多少训练类别就输出多少维,词表之外的类别根本没有承载空间。
过去四年里,业内对这件事的容忍度越来越低,因为真实场景里的物体种类是开放的,而人工标注集永远是封闭的。开放词汇目标检测(Open-Vocabulary Object Detection,OVOD)正是在这个矛盾中长出来的研究方向:训练时只见过有限类别,推理时却能响应任意文本描述的类别。这篇文章我打算把OVOD这条线从动机、经典工作、技术骨架到评估协议完整梳理一遍,也会穿插一些我实际跑模型、调阈值、踩数据坑的经验,适合刚入门这个方向的学生,也适合想评估OVOD技术能不能用到自己业务里的工程师参考。
1. 从"封闭词汇"到"开放词汇":目标检测的一次范式转移
1.1 传统检测器为什么"看不见"未知类别
传统目标检测的流程可以压缩成两句话:先找区域,再分区域。区域由RPN、selective search或者DETR里的query给出,分类则交给一个全连接层。这个全连接层的权重矩阵是[输入维度, C+1],C是训练时见过的类别数,1是背景。到了推理阶段,模型只能在已经训练好的C个类别里做softmax,未知类别在数学上就没有出口。
我经常用一个翻译词典的类比来解释这件事。传统检测器等于随身带了一本收录了80个词的小词典,这80个词它翻译得滚瓜烂熟,但遇到词表外的单词,它连"翻译入口"都没有,而不是"翻译不准"的问题。CLIP这类视觉语言模型出现之前,业内解决未知类别的手段基本是"多标数据"——把C从80扩到365、扩到1000,但技术思路没变:还是一个更大的封闭词表。
这里有个关键点容易被新手忽略:模型可能在特征层面已经具备区分未知类别的能力,毕竟视觉特征是有泛化性的,但分类头的固定维度把这条路堵死了。所以OVOD的真正突破不是"让模型更聪明",而是"换掉最后一层分类器"。
1.2 开放词汇检测的本质:把"分类"换成"对齐"
OVOD的做法可以概括为:不再训练一个固定分类器,而是训练一个视觉表征与文本表征共享的对齐空间。推理时,把要查的类别名通过文本编码器变成一个向量(或者一组向量),这个向量就充当动态分类器,和检测器提出的每个区域特征做相似度匹配,相似度超过阈值就输出这个类别。
这套思路能成立,前提是有一个高质量的图文预训练模型提供语义空间底座,CLIP及其后续的OpenCLIP、SigLIP最早把这个底座铺好。检测器要做的事情,是把自己学到的区域特征"强行拽"进CLIP已经搭好的这个空间,这样区域特征和文本特征才有可比性。
所以严格说,OVOD模型本身并不包含"识别新类别"的知识,它只是在训练时见过有限类别,推理时借助文本端编码器把新类别映射到已有空间。这也是为什么这类模型经常也叫zero-shot detection,两者在推理逻辑上是等价的。在这个转变里,检测任务从"学习视觉模式"变成了"学习视觉-语言对应关系",数据、损失函数、评估方式全部随之改变。
2. 两条技术路线:蒸馏派与视觉-语言模型派
2.1 蒸馏派:把CLIP的语义"搬运"进检测器
最早吃螃蟹的是OVR-CNN,2021年发表在ICCV上。它的思路很直接:用CLIP当老师,把图像-文本对齐知识蒸馏进一个检测器里。为了让检测器的分类权重和CLIP的文本嵌入空间对齐,训练时特意让文本编码器参与分类权重的生成,让区域特征与文本嵌入在共享空间里计算相似度。这个工作证明了一件事:即使检测器训练时只见过COCO的几十个类别,只要分类器权重换成文本编码器生成的向量,就能检测训练时完全没见过的类别,尽管mAP很低,背景抑制也很弱。
真正把蒸馏派发扬光大的是ViLD,谷歌2022年的工作。它的设计比OVR-CNN优雅很多:检测器提出的proposal region特征,一方面和CLIP在相同区域上提取的teacher特征做蒸馏对齐,另一方面在训练中直接学习与文本嵌入的相似度分布。最关键的是,ViLD推理时彻底扔掉了训练时学出来的分类器,直接用CLIP文本编码器按类别生成分类权重。论文里的ViLD-ensemble变体还会把CLIP老师生成的区域表征与检测器自身的表征做综合,进一步提升新类别响应的稳定性。这个"推理时动态生成分类器"的策略,让模型对新类别的响应能力大幅提升,在LVIS的novel类AP上比当时已有方法高出一截。
蒸馏派里还有一个不能漏掉的工作是Detic。它的思路比较"省钱":不做区域级对齐,而是用ImageNet-21K上预训练的图像分类器权重直接替换并监督检测器分类头,同时用一个masking classification loss,把那些没有检测框的区域也拉进来做分类监督。因为只依赖图像级标注,Detic可以把词表扩展到两万多个类,是当时能把"开放"做得最宽的模型之一。它给后来者的启示是:区域级标注稀缺的问题,可以通过"图像级监督 + 外部分类器权重"部分绕过。
2.2 统一派:检测与定位共用一套"对齐"目标
另一条线干脆不沿用"区域proposal + 分类"的老框架,而是把检测直接定义成一个跨模态对齐任务。GLIP是这条线的奠基作。GLIP把目标检测和短语定位(phrase grounding)统一起来:图像侧进visual backbone,文本侧(类别名组成一句prompt)进language encoder,然后两者通过跨模态encoder做深度融合,检测头预测每个region与文本中每个单词的对齐分数。因为任务统一了,GLIP可以直接用海量"图像-文本对"做自训练,不需要框级别的标注,这是它数据规模能远超之前方法的原因。
OWL-ViT是另一条路。它从CLIP初始化,在视觉端加了几层跨模态注意力,让文本特征参与视觉特征的修正,同时加了一个轻量的box回归头。因为是基于ViT的patch embedding,它不需要显式的region proposal,整个推理非常端到端。相比GLIP,OWL-ViT更轻量,HuggingFace上直接可以load,社区里用的人很多。
Grounding DINO在2023年把DETR家族拉进这条线。它用Deformable DETR和DINO的query机制,文本特征在encoder和decoder的早期就注入,让跨模态query同时承担分类和box回归。它最大的工程优势是把效果和易用性平衡得不错,开箱即用的权重在各类open-vocabulary评测上都能打。从GLIP到Grounding DINO,统一派的核心命题一直是:文本不应该只在最后分类时出现,而应该从头到尾参与视觉特征的计算。
2.3 两条路线的核心差异与取舍
用一张表快速对比这两条路线的差异:
| 特性 | 蒸馏派 | 统一派 |
|---|---|---|
| 代表工作 | OVR-CNN、ViLD、Detic | GLIP、OWL-ViT、Grounding DINO |
| 是否依赖proposal | 依赖区域proposal | 不强制依赖,可端到端 |
| 文本融合位置 | 主要在分类头或投影层 | encoder/decoder内部深度融合 |
| 所需数据 | 检测标注 + 图文对 | 大规模图文对 / 伪标签 |
| 推理分类器 | 文本编码器动态生成 | 跨模态对齐分数 |
| 定位能力 | 依赖原有proposal质量 | 端到端联合优化 |
两条线这两年明显在趋同:蒸馏派开始引入更大规模的图文数据做自训练,统一派也普遍用CLIP等模型做初始化。更准确的说法是,当初的分歧主要是工程路径差异,底层逻辑都是一样的——把检测器的表征空间和文本语义空间弄到同一个坐标系里。
3. 拆解一个OVOD模型的"骨架":四个关键设计点
不管哪条路线,一个能跑的OVOD模型都躲不开四个设计问题。我把它们拆开讲,这部分是读论文时最容易囫囵吞枣的地方。
3.1 区域表征怎么抽:anchor/query/proposal
检测器最终要对图像中的某个区域给出一个向量,这个向量代表"这个box里有什么物体"。传统方法用ROI pooling抽proposal特征;GLIP用dense prediction的pixel/region embedding;Grounding DINO用可学习的object query经过decoder后得到的一组向量。无论哪种方式,核心要求是一致的:这个向量要能代表一个语义单元,而不是整张图的全局特征,因为之后要拿它去和文本做逐区域匹配。
这里有个容易被忽略的细节:区域表征和文本表征是在什么分辨率、什么粒度上对齐的。如果proposal抽取的向量是全局池化后的,新类别的细粒度差异很容易被池化磨平;如果保留空间细节(比如多尺度特征加空间注意力),对"带纹理的透明玻璃杯""残缺的塑料瓶"这类难例的匹配会更稳。很多蒸馏派的模型性能上不去,不是CLIP不行,而是proposal特征抽得太糙。
3.2 文本侧怎么处理:类别名的上下文与细节
文本端的输入不是简单地把"dog"扔给编码器。实践中最常见的做法是把类别名放进一个prompt模板里,比如"a photo of a {class}",因为CLIP训练时见过的图像描述基本都是完整句子,裸词输入反而会拉低效果。类别名的复数形式、同义词、粒度层级都会影响推理,比如"cat"和"cats"在CLIP的文本空间里位置很近但不等价,"capybara"和"rodent"则是完全不同的粒度。
我自己跑Grounding DINO时遇到过一个问题:同时输入30个类别,其中语义相近的两个类别(比如"mouse"和"rat")会互相抢分数,导致两个框重叠度很高,NMS之后只能保留一个,恰好留下了置信度高的错误那个。后来我们把prompt改成带上下文描述的句子,比如"a small pet mouse"和"a wild rat in sewer",冲突明显减少。所以做实际项目时,文本prompt不是随便填的,它跟模型参数一样需要调试。
3.3 对齐空间怎么选:对比学习、蒸馏还是交叉注意力
这是OVOD方法之间差异最大的地方,也是论文标题里的"核心创新点"通常所在。
对比学习(如CLIP)对齐的是全局图与文本的关系,区域级对齐要在它的基础上另做设计;蒸馏方法(如ViLD)是让检测器学习teacher在区域上的输出分布,知识是间接传递的;交叉注意力方法(如GLIP、Grounding DINO)则是让文本特征直接参与视觉特征的加权求和,更像"带着文字描述去理解图像",对齐发生在每一层特征计算过程中,效果通常更好,代价是计算量上升、训练数据要求更高。
一个值得注意的现象:只做分类头对齐的模型,对"语义相近但外观差异大"的类别往往表现不稳;做了交叉注意力融合的模型,因为文本信息参与了底层特征计算,对这种歧义更有抵抗力。这解释了为什么统一派近两年的涨点明显更快。
3.4 训练数据从哪来:人工标注与"伪标签"混合
开放词汇要覆盖的类别空间很大,不可能每个类都人工标注bounding box。所以主流方案是混合数据:一部分用人工标注的检测数据做精调(比如COCO、LVIS),另外用海量图文对数据生成"伪标签"扩大类别覆盖。GLIP的关键贡献之一就是把这类自训练流程跑通了——用基础检测器在图文对上生成初步框,过滤后再当监督信号训练新模型,然后再用新模型生成更准的伪标签,迭代下去。
在数据工程上,我的经验是:伪标签的质量控制比数量重要得多。阈值定太低,噪声会把模型带偏;阈值定太高,类别覆盖又不够。比较实用的做法是分两档过滤——高阈值框直接进训练集,中阈值框只参与对比损失,不参与回归损失。这套做法在不少开源流程里能看到影子,实测下来对最终模型稳定性的帮助比单纯堆数据量大得多。
4. 如何科学评判"开放"程度:评估协议与基准盘点
4.1 从COCO到LVIS:不同基准的"坑"在哪
OVOD论文早期常用COCO的类别划分成base和novel来做模拟评测,但COCO类别太少、且类别分布相对均衡,测出来的数字说服力有限。现在领域内更认可的是LVIS。LVIS有1200多个类,按训练图像中出现频率分成了frequent、common、rare三类,OVOD通常把rare类当作novel来测,因为它们在训练集中天然就数量稀少,恰好模拟了"没怎么见过"的场景。
LVIS有个特殊机制要心里有数:它是联邦式标注(federated annotation),每张图只标注一小部分类别,很多图上其实出现了某个rare类物体,但没被标出来。这意味着模型预测出一个"没标注的正确答案",按标准计算也会被当作误报。所以LVIS上的AP会系统性低估开放词汇模型的真实能力,但好在所有论文都在同一个标准下玩,横向比较公平,只是别把绝对值太当真。
另一个值得留意的点是训练数据与评测数据之间的"污染"。有些模型的预训练数据里可能隐含着LVIS类别的图文对,这在严格意义上已经不是"零样本"了。审稿时会查,自己做实验时也要留个心眼:如果目标是验证真正的开放词汇能力,训练数据里不应该出现评测类别的区域级标注,甚至应该尽量控制图像级图文对里评测类别的比例。
4.2 受限词汇评测的迷思:mAP之外还要看什么
不少论文会在几十个novel类别上报告mAP。这些数字能说明模型具备基础零样本能力,但不能证明它真的"开放"。真正的开放意味着类别词表理论上无限,概念层次复杂,包含同义词、多义词、超类子类、跨语言描述。如果评测类别都是规规矩矩的名词,那模型的语义理解深度基本没有暴露。
做实际评测时,我建议至少测三类:第一类是训练常见的seen类,保证不退化;第二类是训练中完全没有的unseen类,考察基础开放能力;第三类是"变体",包括同义词、昵称、复杂描述句子,比如"第二排穿红色外套的人"这种。只测mAP的榜单很容易卷,但加一组变体评测往往能测出模型真实的泛化边界。最好同时记录base类和novel类的AP差值,甚至直接算bias rate,用来衡量模型是不是在牺牲旧类保新类,这在业务上是很关键的信号。
如果你关心的是定位质量,建议再配合Flickr30K Entities或RefCOCO这类visual grounding评测集,因为检测mAP同时受分类和定位影响,而grounding任务能把"区域-文本匹配"这一步单独剥出来看。
5. 当前瓶颈:五个最让人头疼的实际问题
5.1 模型"认得"新词却"找不准"位置
在实际测试中,OVOD模型对novel类常见的一个失败模式是:分类置信度挺高,但box框得不准,要么框住了目标加背景,要么只框住目标的一部分。原因在于不少方法的文本知识主要参与分类分支,box回归分支的训练信号还是来自有框标注的那些base类,新类在回归任务上几乎没有见过。所以模型知道"这里有个东西",但不知道这东西的边界在哪。
想缓解这个问题,训练阶段可以引入一些区域级的对比学习,让teacher提供的位置信息参与回归;推理阶段可以用一些后处理,比如对相邻高置信度区域做NMS时保留更完整的轮廓。不过目前没有特别完美的解法,这仍然是领域里公认的开放问题。
5.2 背景抑制:未知区域与目标区域的边界
开放词汇模型很容易把背景区域错认成某个novel类。原因是推理时文本词表通常很大,任何一块纹理复杂度高的背景patch,总能在几十上百个类别词里匹配到一个分数不低的。背景误检率会随着输入类别数增长而上升,这在工程上很致命。
业界有用的对策包括OVR-CNN论文里强调的"背景集成",即把背景类也建模成文本特征,让背景不再是一个隐式的"其他";GLIP会在跨模态分数上做scaling,压低低质量匹配的分数;Grounding DINO提供了box_threshold和text_threshold两个独立阈值,让用户分别控制定位与分类的置信度。实际调参时我的经验是:类别越多,text_threshold要适当调高,而box_threshold不要跟着调太高,否则会把真目标一起丢掉。
5.3 训练数据的品类稀疏与长尾
图文对数据虽然量大,类别分布却极不均匀。"dog"的图可能有上千万张,"armadillo"可能只有几千张。LVIS标注本身就暴露了这个问题:rare类样本极少,模型即使有开放词汇能力,也很难在罕见类上建立稳定的视觉原型。长尾问题直接影响模型的泛化下限。
缓解手段包括对rare类做过采样、在损失函数里给不同类别设置不同权重、用文本侧的先验做类别均衡等。但在数据源头上的根本解决,目前还没有太好的办法,这也是为什么一些工作开始尝试用生成模型造罕见类样本来自动补数据。
5.4 复现门槛高,开源不等于好用
很多顶会论文的背后是几千张卡、几个月的大规模预训练,普通研究者无法复现。更麻烦的是,不少论文只公开代码不公开权重,或者权重只覆盖某几个模型规模,想在自己数据上微调时无从下手。
所以我的建议是,第一优先级选公开权重稳定、社区使用广泛的模型,比如Grounding DINO、OWL-ViT、ViLD的官方checkpoint;第二优先级才是追新论文。追新论文时不要先看论文的case图,先去看代码仓库的issue区和评测数字是否容易重复,踩过几轮坑之后你会认同这个习惯。
5.5 受控场景与真实开放世界的差距
论文里的评测集是人工挑选的"干净"场景,而真实项目里会遇到光源反射、透明物体、遮挡严重、形态不完整、域差异巨大的情况。开放词汇检测在受控基准上的分数再高,落到具体业务时仍然需要一个域适配的过程。
我的实践感受是,真实业务中OVOD模型更适合当作"召回器"而不是"过滤器"——先用开放词汇模型把候选区域和对应类别召回,再用规则或小模型做精排。这个分工模式可以容忍OVOD的误检,同时充分利用它对未知类别的高召回能力。
6. 从论文到落地:跑通与微调OVOD模型的实用建议
6.1 快速起步:可以直接上手的开源模型
我按"开箱即用程度"给几个主流模型排个序,方便第一次接触OVOD的人快速选择:
| 模型 | 框架 | 上手难度 | 备注 |
|---|---|---|---|
| Grounding DINO | PyTorch | 中 | 权重全、效果好、社区活跃 |
| OWL-ViT | HuggingFace | 低 | pipeline几行代码跑通 |
| Detic | PyTorch | 中 | 适合想要超大类表的情况 |
| GLIP | PyTorch | 偏高 | 复现成本高,伪标签管线复杂 |
| ViLD | PyTorch | 中 | 有助于理解蒸馏思路 |
第一次跑通时,建议先在官方demo脚本上替换自己的图片和文本,确认阈值能调节,再逐渐加自己的预处理逻辑。不要一上来就改模型结构,很多看起来"合理"的改动会直接影响对齐空间的可比性,反而导致指标下降。
6.2 在自有数据上微调要注意什么
微调OVOD模型和微调普通检测器不一样,最大的雷区是破坏对齐空间。很多人拿到预训练权重后,整个模型全部解冻去训练,训练集又只有几千张,结果base类涨了点,novel类大幅下跌——因为这个模型已经被"拉回"封闭词表了。
注意:OVOD微调的核心是"守住文本-视觉对齐空间",而不是简单地最大化当前训练集的AP。
相对可靠的做法是:冻结文本编码器,只微调visual backbone的高层、projection层和检测头;如果数据非常少,甚至可以把visual backbone也冻结,只训练projection和head。损失函数里建议保留一部分对比损失,而不是只保留检测损失,这样能让区域特征继续留在共享语义空间中。检测损失和对比损失的比例可以从1:1到5:1之间起步,具体看你的检测任务和开放词汇需求哪个更重。
6.3 部署推理时的工程化细节
推理阶段,我踩过的坑集中在三点。第一是显存优化,大模型推理建议打开半精度(FP16),配合批处理时用动态padding,比固定尺寸padding明显省显存,实测通常能省30%到40%;第二是阈值要分场景单独标定,室内和室外、近距离和俯拍,最佳阈值完全不同,最好做一个小的标定集而非靠经验值打天下;第三是文本prompt的批处理逻辑——如果同时输入上百个类别,别在一个batch里塞太多句子,文本编码器的显存占用很容易被忽视,超出OOM后排查起来很麻烦。
另外,输出端的NMS策略也要针对开放词汇做调整。因为类别词表大、语义重叠多,同类别的多个候选框可以在NMS时合并,但不同类别的候选框如果IoU过高,可能说明prompt设计有问题,反过来提示你需要调整文本描述,而不是简单把其中一个框干掉。这点和封闭集检测的工程习惯很不一样。
7. 下一步:OVOD与LLM/Grounded SAM等方向如何融合
7.1 从检测器到"任意目标分割"
检测给出的是box,很多业务其实要的是像素级结果。Grounded SAM这类组合方案——用Grounding DINO做文本引导的box生成,再用SAM做分割——已经变成社区里处理"任意目标分割"的标配。它体现了OVOD的另一个价值:作为上层视觉任务的"入口",把自然语言需求转成视觉任务的具体操作对象。我在实际项目里就是拿这个组合来做图像里特定物体的快速抠图,效果比传统交互式分割快很多。
与之类似的还有DINO-X一类的模型,它们把proposal gather机制和视觉语言模型结合起来,先无差别地收集高质量的box候选,再用文本或视觉prompt做二次匹配,让"先检后选"成为一个通用流程。这类设计已经开始把开放词汇检测推向"任意目标识别与理解"的更上层目标。
7.2 大语言模型作为"开放词汇大脑"
LLM在开放词汇里能扮演两个角色:一方面,它可以把用户的长描述拆解成检测器能处理的短prompt列表,比如"把那边穿蓝衣服、推着行李箱的人找出来",LLM负责把这个需求转成几个可执行的视觉概念;另一方面,LLM可以用世界常识补全类别表中的同义词和子类,扩大文本端的覆盖范围。这些做法正在把OVOD从"按名字找物体"推向"按意图找物体"。
7.3 一个实用的融合范例:多模态agent
我目前比较看好的落地形态是"视觉-语言多模态agent":LLM负责推理和规划,OVOD模型负责把文本概念落实到图像区域,SAM负责提供精细mask,VLM负责对区域做二次校验。这套组合在开放世界机器人抓取、工业异形件分拣、内容审核素材检索等场景里已经有可用的原型。OVOD在其中承担的是"概念到视觉锚点"的翻译职责,这个定位短期很难被替代。
做OVOD相关项目这一年多,我最大的感受是:不要被论文里的mAP牵着走。同样一个模型,在自己的数据分布上测,和官方benchmark上的数字可能是两个世界。真正决定项目成败的,往往是你对文本prompt的设计、对伪标签质量的把控、对背景误检的处理方式。建议所有想把OVOD用到实际业务里的朋友,拿到一个模型后先花时间建一个属于自己业务的几百张图的评测集,把阈值、prompt和NMS策略都固定下来,再谈优化模型。这些工程环节,才是开放词汇检测从demo走向生产力的真正门槛。