ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

开放词汇目标检测全解析:从范式转移到工程落地

开放词汇目标检测全解析:从范式转移到工程落地 常规目标检测器本质上是一台只会背单词的翻译机。你在COCO上训一个Faster R-CNN让它找giraffe没问题可你要让它找长颈鹿或者让它找训练集里从未出现过的塑料瓶盖它基本就罢工了。这不是某一个模型的缺陷而是整套范式决定的传统检测器的分类头输出维度是固定的有多少训练类别就输出多少维词表之外的类别根本没有承载空间。过去四年里业内对这件事的容忍度越来越低因为真实场景里的物体种类是开放的而人工标注集永远是封闭的。开放词汇目标检测Open-Vocabulary Object DetectionOVOD正是在这个矛盾中长出来的研究方向训练时只见过有限类别推理时却能响应任意文本描述的类别。这篇文章我打算把OVOD这条线从动机、经典工作、技术骨架到评估协议完整梳理一遍也会穿插一些我实际跑模型、调阈值、踩数据坑的经验适合刚入门这个方向的学生也适合想评估OVOD技术能不能用到自己业务里的工程师参考。1. 从封闭词汇到开放词汇目标检测的一次范式转移1.1 传统检测器为什么看不见未知类别传统目标检测的流程可以压缩成两句话先找区域再分区域。区域由RPN、selective search或者DETR里的query给出分类则交给一个全连接层。这个全连接层的权重矩阵是[输入维度, C1]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-CNN2021年发表在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整个推理非常端到端。相比GLIPOWL-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、DeticGLIP、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 embeddingGrounding 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 DINOPyTorch中权重全、效果好、社区活跃OWL-ViTHuggingFace低pipeline几行代码跑通DeticPyTorch中适合想要超大类表的情况GLIPPyTorch偏高复现成本高伪标签管线复杂ViLDPyTorch中有助于理解蒸馏思路第一次跑通时建议先在官方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我目前比较看好的落地形态是视觉-语言多模态agentLLM负责推理和规划OVOD模型负责把文本概念落实到图像区域SAM负责提供精细maskVLM负责对区域做二次校验。这套组合在开放世界机器人抓取、工业异形件分拣、内容审核素材检索等场景里已经有可用的原型。OVOD在其中承担的是概念到视觉锚点的翻译职责这个定位短期很难被替代。做OVOD相关项目这一年多我最大的感受是不要被论文里的mAP牵着走。同样一个模型在自己的数据分布上测和官方benchmark上的数字可能是两个世界。真正决定项目成败的往往是你对文本prompt的设计、对伪标签质量的把控、对背景误检的处理方式。建议所有想把OVOD用到实际业务里的朋友拿到一个模型后先花时间建一个属于自己业务的几百张图的评测集把阈值、prompt和NMS策略都固定下来再谈优化模型。这些工程环节才是开放词汇检测从demo走向生产力的真正门槛。
返回列表