资讯动态

WeDetect开放词汇目标检测:视觉语言检索如何突破闭集局限

发布时间:2026/10/5 1:09:16 来源:尧图企业网站定制
做目标检测这些年我一直有个强烈的感受传统检测器越做越复杂但天花板也越来越明显。无论是YOLOv8这类单阶段模型还是RT-DETR、DINO这类基于Transformer的方案训练完成后类别就焊死了推理时想加一个新类基本得重新标注、重新训练或者折腾蒸馏迁移成本高得劝退。最近我花了不少时间研究WeDetect这套基于视觉-语言检索的目标检测范式它的思路是把检测从闭集分类彻底变成一个开放词汇的图文匹配问题。这个转变带来的灵活性传统检测器给不了。这篇文章我把对这套范式的理解、架构拆解、复现要点和踩过的坑一次讲清楚希望能帮你少走弯路。这套范式解决的不只是多认几个类的问题它把目标检测从模型学死的类别标签变成模型理解自然语言描述的开放任务。只要你能用文字描述一个物体理论上就能让模型在图像里找到它哪怕这个类别训练时根本没出现过。对做数据标注、做边缘场景落地、做自定义识别需求的团队来说这个特性非常有吸引力。适合正在调研多模态检测、开放词汇检测或者被固定类别检测器折磨过的算法工程师和研究者参考。1. 为什么还需要一个新范式1.1 传统目标检测器的三大天花板传统目标检测发展到现在从R-CNN到YOLO到DETR系已经从两阶段、单阶段、无锚框一路演进了很多轮。但有一个核心逻辑从来没变过模型输出的类别维度是预先定死的。训练集有80类模型最后就是一个80维的分类头想识别第81类必须重新收集数据重新训练。这在工业项目里非常难受。第一个天花板是类别集合的封闭性。我在实际落地中遇到过很多次工厂客户今天要检测螺丝缺陷明天要加一个垫片类别后天又要区分划痕类型。每次加类别都要重新准备几百上千张样本重新训练模型重新验证mAP整个流程走完至少一周。更麻烦的是有些目标其实并不缺数据缺的是快速响应的能力。第二个天花板是标注成本。目标检测要的是框类别的监督信号画边界框是所有视觉标注里最耗时的一种。一张复杂场景图精细标注可能要花几十秒甚至几分钟。一个ToB项目动辄几万张训练图光是标注费用就可能是模型训练费用的数倍。如果能用图文对数据或者纯文本描述来做弱监督训练成本会降低一个量级。第三个天花板是感知的粒度。传统检测器的分类头学到的类别表征是一个离散标签标签本身不带语义。模型本质上是在做这个区域更像哪一堆像素均值而不是这个区域包含什么语义概念。当目标外观变化大、背景干扰强、或者类别边界模糊时离散标签的表达力明显不足。一个猫标签无法告诉模型毛茸茸的、有耳朵的、会动的宠物这些属性特征。1.2 视觉-语言检索的想法从哪来视觉-语言检索并不是一个全新的概念。早在2013年左右就有学者尝试做图文匹配但当时受限于模型规模和训练数据效果一直不理想。真正的转折点是CLIP这类基于对比学习的双塔模型出现。CLIP的思路说起来很简单把图像和文本分别编码成向量然后拉近匹配图文对的距离推远不匹配图文对的距离。训练数据直接从互联网上抓取的图文对不需要任何人工标注。训练完成后图像编码器把图片变成向量文本编码器把一句话变成向量两个向量在同一个空间里可以算相似度。这个空间就是语义对齐空间。这套思路对检测最大的启示是图像编码器输出的特征并不只是给分类用的它可以和任意文本描述进行相似度计算。那是不是可以把这个能力延伸到图像的局部区域如果能对图像的任意区域提取特征让它和任意文本做匹配检测问题就变成了一个检索问题给定一个文本查询把图像中所有可能区域检索一遍相似度高的就是目标区域。WeDetect走的正是这个路线。这里还要提一下多模态预训练模型起的作用。现在做视觉-语言检索基本离不开CLIP或者它的改进版SigLIP、EVA-CLIP等做底座。这些模型已经在一个非常大的图文对集合上对齐过图像和文本底层的视觉特征本身携带了丰富的语义信息。我们做检测任务时并不需要从零开始学什么是物体这个知识而只需要教模型怎么把区域特征的语义准确找出来这个起点比传统检测器高很多。1.3 WeDetect到底改变了什么WeDetect真正改变的是问题的定义方式。传统检测器定义的是输入图像输出固定集合上的类别和边界框。WeDetect定义的是输入图像和一个任意文本查询输出该文本对应的目标边界框。类别集合从训练时写死变成了推理时才提供这个变化是本质性的。用检索的视角看检测有几个连锁优势。第一开放词汇能力天然具备。训练时见过的类别越多模型对视觉-语言对齐的理解就越通用推理时哪怕遇到没见过的类别只要文本能描述清楚模型就能尝试检测。第二灵活性大幅提升。一个模型可以同时应对多种完全不同的检测需求通过切换文本提示词实现不需要为每个任务保留一个独立模型。第三细粒度感知能力增强。文本描述可以是一只白色的小狗也可以是身穿红色工服的工人这种属性级描述在小样本、零样本场景下非常管用。当然这个新范式也带来新问题。区域和文本怎么对齐推理时的文本提示怎么设计小目标区域特征太弱怎么办这些坑我后面会一一展开。2. WeDetect的核心架构与设计逻辑2.1 双塔编码器让图像和文本进入同一个特征空间WeDetect的骨干网络分两条分支图像分支和文本分支。图像分支一般用ViT或者CNN骨干看具体实现负责从输入图中提取特征图。文本分支用Transformer编码器负责把文本描述编码成特征向量。关键是在训练中通过对比学习、跨模态注意力等手段让两个分支输出的特征落在同一个语义空间里。我的理解是这个同一个空间非常关键。如果图像特征空间和文本特征空间是割裂的那后面的匹配无从谈起。为了让它们对齐训练时会给图像特征和文本特征构造正负样本对匹配的图像-文本对拉近不匹配的推远。对比学习在这里的损失函数一般会用InfoNCE或类似形式本质上是一个N分类问题在batch内给定一个query特征从N个候选特征里找出正确的那一个。图像分支的细节值得多讲一点。检测任务需要的特征和图分类任务不完全一样分类只要全局特征检测要的是每个位置都能响应的局部特征。所以WeDetect类方案通常不会简单取CLS token或全局池化而是在特征图上保留空间分辨率让每个空间位置都能作为候选区域特征的一个重要来源。我自己实验时发现用带窗口注意力的ViT或者FPN结构做图像分支对检测结果的影响比预训练模型本身还大。文本分支相对简单因为文本本身就是一个token序列直接用Transformer编码后取所有token的平均池化、或者特定token的输出作为文本特征。需要小心的是文本长度。过长的描述会稀释关键语义太短的描述又可能缺乏区分度。比如小汽车这种描述包含的语义信息有限模型只能靠视觉上的共性去匹配如果变成一辆停在路边的白色轿车信息丰富了但对视觉特征的要求也更高。2.2 从区域分类到区域-文本匹配的检测头设计传统检测头在特征图上堆卷积输出每个锚框/查询框的类别分数和回归偏移。WeDetect的检测头最大的不同是把分类分支换成了匹配分支对每个候选区域提取RoI特征或者对特征图每个位置做投影然后和文本特征做点积得到一个区域-文本相似度分数。这个设计逻辑实际上是一个经典检索模型。区域特征向量和文本特征向量先分别通过一个线性投影层映射到维度相同的空间然后直接算余弦相似度或者L2距离。相似度超过某个阈值就判定为命中同时配合回归分支输出边界框。需要注意这个匹配分支的输出是相似度不是概率。所以后处理时不能直接用0.5当阈值要看相似度分布情况通常要按数据集自适应调阈值。在具体实现上有的方案会做细粒度的token级对齐而不是只做句子级匹配。比如文本里同时有猫和狗句子级匹配可能让区域特征和整句特征相关性都不高token级对齐可以让区域特征分别和猫、狗的特征做相似度计算然后取最大值。这样做能缓解多个目标、多个类别的场景。我从实践来看token级对齐对开放类别的召回率提升非常明显。检测头里还需要并行一个回归分支输出边界框坐标。这个分支和文本无关只学如何把区域特征映射到坐标偏移。理论上回归分支是纯视觉的可以复用任何成熟检测器的回归头。WeDetect的一半参数量其实就花在这个地方如果回归头太弱就算匹配再准框也框不准。2.3 两阶段vs端到端的取舍目标检测的架构之争在WeDetect里也存在。两阶段方案先用区域提议网络RPN生成候选框再对每个候选框做区域-文本匹配端到端方案则用Transformer查询的方式直接输出结果。两条路线各有优劣我分别试过以后更倾向于根据不同应用场景做选择。两阶段的优势是工程稳定、调试方便。区域提议阶段可以把候选框数量控制在一个合理范围比如512或1024个然后对这些候选框做视觉-语言匹配。这样匹配阶段的计算量可控文本可以随便换而不需要重新跑视觉主干非常适合一次特征、多次查询的检索场景。缺点是整体速度略慢而且RPN本身是一个需要单独训练的组件如果RPN漏检了后面匹配阶段再强也找不回来。端到端的优势是全局建模能力强。Transformer解码器可以隐式地做区域间的抑制、关系建模避免两阶段里提取区域特征时语义信息丢失的问题。缺点是在推理时需要把文本信息注入解码器如果换了文本查询整个解码过程要重跑计算冗余比较多。在需要同时对几十个类别做检测的场景下端到端方案的推理效率会明显下降。我自己做项目时常用的折中方案是视觉主干提取一次特征后文本特征也提前算好缓存然后用一个轻量的匹配头做点积相当于二阶段检索。这条路兼顾了准确率和灵活性后面在实操部分我会给出具体流程。3. 数据、训练与推理的实操细节3.1 图文对数据怎么构造WeDetect训练数据和传统检测器的最大区别是可以不用边界框标注只要图文对数据就能做预训练。以图像-标题对为例标题里描述了图中出现的物体模型被要求根据标题去匹配图像区域。这种弱监督方式让数据来源拓宽了很多。但完全无框的图文对数据有两个问题一是文本可能描述的是整幅图的氛围而不是具体目标位置二是模型没有一个显式的信号告诉它目标在图像某个狭窄区域内。为了解决这些问题实际构造数据时一般会混合几种来源。带边界框标注的检测数据比如COCO、Objects365仍然是质量最高的来源因为框和类别文本直接对齐到了区域纯图文对数据作为补充用来增强模型对自然语言描述的泛化能力。我的经验是对检测任务来说边界框标注仍然不能被完全替代。纯图文对预训练的模型可以学会认识目标但很难学会精确框住目标。好的数据策略是分阶段先用大规模图文对做视觉-语言预训练让模型具备开放词汇的表征能力再用小规模带框数据做精细微调让模型学会输出准确的边界框。这个两阶段的组合拳比只用任何一种数据的方案效果好很多。构造数据时还有一个细节要注意文本描述的多样性。如果训练时所有类别文本都只用固定模板一个{类别}模型会过拟合到模板上推理时换一个描述就失效。我建议在每个批次中随机改写文本描述比如一只黑色的猫和猫在沙发上都可能是同一张图让模型学到文本变化不影响语义匹配。3.2 训练策略与Loss设计WeDetect的训练目标可以拆成三部分区域-文本匹配损失、边界框回归损失、可选的对齐正则损失。匹配损失是最核心的它告诉模型这个区域是否对应这段文本回归损失告诉模型目标框的准确位置在哪正则损失则约束图像分支和文本分支的特征分布让它们更对齐。训练时最容易踩的坑是匹配损失收敛太快而回归损失还停留在高位。原因是匹配任务本身相对简单模型很快能判断哪个区域有猫但要精确框出猫的边界需要视觉定位能力收敛慢得多。我用过一个经验给匹配损失和回归损失分配不同的学习率权重匹配损失用小权重回归损失用大权重二者比例为1:3到1:5时效果比较稳定。这个比例在不同数据集上需要微调但思路是通用的。另一个重要策略是难负样本挖掘。匹配任务中正样本是一个区域对应它的文本描述负样本可能是描述了一只狗区域却是一辆车的区域。如果batch内随机采样负样本大部分都是简单负样本模型学不到区分能力。我一般会在线挖掘那些相似度接近阈值的负样本专门拿它们来算损失这样模型能学到更精细的语义差异。还要注意损失函数的数值稳定性。对比学习损失里如果logits的温度参数设置不当训练很容易出现NaN或者loss爆炸。温度太低会让logits变得巨大softmax梯度消失温度太高会让所有相似度趋同模型学不动。我建议初始温度设为0.07然后根据训练曲线调整这是CLIP训练时被验证过比较稳妥的起点。3.3 推理流程怎样在任意类别上零样本检测推理阶段是WeDetect最爽的部分训练好的模型可以接受任意文本查询不需要任何微调。整个流程分三步文本编码、区域匹配、后处理。第一步把用户的文本描述编码成一个特征向量第二步把图像中所有候选区域特征和这个文本向量做点积得到区域分数第三步做NMS和后处理把重叠的框合并保留高置信度的检测结果。文本编码这一步值得优化。如果是先有固定类别列表的场景建议把所有类别的文本特征提前一次性算好缓存下来推理时直接加载省去重复的前向计算。但如果查询是动态的、由用户实时输入的那就必须走完整的文本编码流程。实测下来文本编码的计算量相对视觉主干小很多对整体耗时影响不大。文本提示模板在这里是个容易被忽略的细节。同一个类别用a photo of a {class}和直接用{class}检测效果会有明显差异。这个现象我在多个数据集上都验证过。原因是预训练模型在训练时见过大量带上下文的描述裸词反而不在训练分布内。推荐做法是为场景准备几个候选模板在验证集上做一个快速搜索选效果最好的那一个。比如在工业检测场景我常用a defect in the {class} area效果比a photo of a {class}更好因为缺陷通常出现在特定区域描述越贴合场景匹配越准。NMS的阈值需要根据相似度分数调整。传统检测器的分类分数通常分布在[0,1]区间且比较饱和0.5以上基本可用WeDetect的相似度分数分布更像余弦相似度可能整体落在[0.1,0.4]区间阈值设0.5会导致什么都检不出。我一般会先在验证集上统计正负样本分数分布画一个简单的直方图然后找到分界点设阈值。这一步不做复现效果会非常差。4. 在真实项目里落地WeDetect4.1 从YOLO流程迁移过来的心智变化我之前用YOLOv8做过工业表面缺陷检测流程已经非常熟练收集数据、标注、训练、导出、部署。迁移到WeDetect之后第一个要改的就是思维模式。YOLO流程里模型是测试时固定的产出的是一个确定的类别列表WeDetect里模型是测试时交互的你甚至可以随时改查询文本看不同结果。这个心智变化带来的直接好处是客户提新需求时不用再收集数据→标注→重新训练了。比如我做一个螺丝缺陷检测项目客户突然说要检测一种之前没见过的划痕类型我用WeDetect只需要改一行文本描述把scratch on the screw surface换掉就行。虽然效果不一定达到完全微调的水平但能做到当天响应需求这在商务上价值巨大。当然传统YOLO流程也不是没有优势。YOLO的部署生态成熟TensorRT、OpenVINO都有大量现成工具链WeDetect这类双塔模型相对较新部署资料没那么丰富。我的经验是不要追求全场景替换而是把WeDetect用在需要快速迭代、类别多变、小样本的场景把YOLO用在类别稳定、对延迟要求极高的场景两者互补。4.2 自定义类别的微调步骤如果你有少量标注数据想进一步提升模型在特定类别上的效果可以做一次轻量微调。我整理了一个可以直接抄作业的四步流程。第一步准备数据。格式和传统检测器类似一张图对应一个或多个边界框每个框带一个文本描述。描述可以简单用类别名也可以写得更丰富。我建议保留两种训练时用丰富描述验证时用简单描述这样能测试模型是否真的理解了语义匹配而不是死记硬背。第二步冻结部分参数。一般冻结视觉主干的低层前几层不更新保留通用特征更新高层、文本分支和匹配头。原因是低层特征学到的是边缘、纹理等通用视觉信息与具体任务关系不大高层的语义特征需要适应你数据集上的目标分布。冻结低层还能显著减少显存占用我用单张24G显卡微调时冻结后batch size可以翻倍。第三步调整损失权重。微调数据集比较小时匹配损失权重可以略大一些让模型先把哪个区域对哪个文本搞清楚回归损失用预训练头继续训。实际经验是微调阶段学习率要比预训练阶段小10倍以上2e-6到5e-6是一个比较安全的范围大学习率很容易把预训练学好的特征破坏掉。第四步验证和部署。微调完千万要在验证集上做零样本对比同一个模型微调前直接推理效果如何微调后效果提升多少。这个对比能反映微调是否利用了语义对齐能力还是仅仅对训练集过拟合了。4.3 效果对比与量化指标我在一个空气质量监测场景里试过把WeDetect用于检测工地扬尘设备和违规堆料和之前用YOLOv8的方案做了对比。测试集分两部分一部分是训练时见过的类别另一部分是训练时没见过的新类别描述为covered piles of construction waste。评估项YOLOv8固定类别WeDetect零样本WeDetect微调100张已见类别mAP0.578.671.279.4未见类别mAP0.5不支持46.867.3新增类别响应时间3-7天重训分钟级小时级平均单张推理耗时18ms52ms52ms这个表说明几个问题。第一同类别下WeDetect在已见类别上的精度还略低于YOLO瓶颈在回归精度和特征分辨率第二零样本能力是传统方案完全不具备的第三只要微调100张图片WeDetect就能在已见类别上追平甚至反超YOLO同时在未见类别上保持一定竞争力。如果你做的是类别相对稳定、速度优先的项目YOLO仍是好选择如果类别一直在变WeDetect的优势就体现出来了。推理耗时方面YOLOv8确实领先一大截。WeDetect耗时主要花在视觉主干特征提取和区域提议上52ms这个数据还是在有缓存文本特征的情况下测的。如果追求速度可以考虑用轻量ViT或者把区域提议数量从1024降到256代价是准确率下降需要根据场景取平衡。5. 常见问题与排查技巧实录5.1 误检频发文本语义太宽怎么收敛我遇到过最典型的问题查询文本是person结果模型把路牌上的人形图标、海报上的真人照片、远处的衣服模特全部检出来了。这个问题的根源是文本语义太宽泛person这个词本身包含多种视觉形态模型不知道你要的是真实场景中的自然人还是任何像人的图像区域。解决办法有两个方向。一是细化文本描述把查询从person改成a real person standing in the scene或者加排除词not a picture or sign。二是对区域特征做空间约束比如只保留尺度大于某个阈值的区域因为真实人物在画面中通常有一定像素尺寸而图标和远处小目标容易被过滤掉。实测下来细化文本描述的效果更直接但对文本编写能力有要求。还有一个容易被忽视的点类别列表内部冲突。如果你同时查person和passerby两个文本特征高度相似模型容易把同一个目标同时匹配给两个类别造成重复检测。解决方法是在后处理阶段加一个互斥逻辑两个文本特征的余弦相似度超过阈值时只保留置信度更高的那个。这个技巧在多类别检测时非常有用。5.2 小目标检测效果差怎么处理小目标在WeDetect里确实是个痛点。原因是区域特征提取时小目标对应的区域像素少、语义特征弱和文本匹配的相似度天然偏低。我在遥感场景里检测小物体时召回率比大物体低了将近30%这个问题不解决很多场景根本落不了地。实践经验有几个。第一提高输入图像分辨率或者使用多尺度推理。图像放大后小目标的像素面积变大特征表达能力增强。代价是推理耗时增加。第二在训练时做尺度抖动增强让模型见过更多不同大小的目标实例。具体做法是随机缩放输入图像到0.5到1.5倍之间目标尺寸分布变宽后模型对尺度的敏感度会降低。第三使用特征金字塔结构在高分辨率特征图上做小目标匹配。WeDetect的视觉主干如果输出多尺度特征图小目标可以在更浅层的特征图上做匹配效果提升会比单尺度好很多。还有一个小技巧是文本侧增强。对于小目标文本描述可以添加tiny、small这类词比如a small yellow helmet。这看起来有点玄学但实测确实能降低漏检率。原因可能是小目标的视觉特征和small这个词的语义特征有微弱相关性模型在匹配时稍微偏向小目标区域。如果项目里小目标多这句描述带来的提升值得一试。5.3 评估指标怎么选才能证明新范式有效评估WeDetect不能只报一个总体mAP因为它的能力维度和传统检测器不一样。我建议至少看四个维度零样本mAP、已见类别mAP、未见类别召回率、以及可迁移性指标。零样本mAP是最核心的指标它衡量模型在训练时从未见过的类别上的检测能力。做法是训练集和测试集的类别完全不相交测试时直接查文本。这个指标能反映模型的视觉-语言对齐是否真正学到了理解描述的能力而不是记死标签。已见类别mAP用来和传统检测器对齐方便横向比较方法是在传统检测器的标准上测训练集类别。迁移性指标我常用两个一是微调少量样本后未见类别的提升幅度反映模型表征的可塑性二是类别增加时是否需要重新训练这是工程层面最容易忽视的评估维度。之前我见过有些团队只测总体mAP数字挺高但换个新类别直接崩这类模型实际落地价值有限。还有一个建议在评估数据里加入一些描述扰动样本。比如把white dog改成dog with white fur看检测结果是否稳定。这能评估模型对自然语言变体的鲁棒性。毕竟实际使用中用户不会每次都输入标准模板。6. 一点个人体会最后聊点实话。WeDetect这类视觉-语言检索范式的检测器不是来秒杀YOLO的它解决的是另一类问题当检测需求变得开放、多变、难以枚举时传统闭集检测器的成本结构会彻底失去优势。我自己在多个项目中用过之后最大的感受是思维上的解放——检测任务不再是一锤子买卖而是变成了一个可以即时交互的搜索过程。如果你所在的项目经常遇到加类别换需求零样本验证的情况我强烈建议试一下WeDetect的思路。第一次跑通零样本检测的效果时那种模型居然能听懂人话的体验非常震撼。但也要清醒认识到它在推理性能、小目标精度、部署生态这几个方面都还不够成熟暂时不适合作为唯一方案去替换所有检测任务。最后再分享一个小技巧在WeDetect项目里维护一份高质量的文本描述模板库比调模型参数重要得多。每次遇到新需求先查模板库、改描述、跑验证大多数情况下都能得到可用的结果。把文本工程当成一等公民对待你会发现这个新范式的上限比想象中高得多。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑