UniDetector如何认识任意类别?BBoxHeadCLIP零样本分类头源码逐行解析 UniDetector如何认识任意类别BBoxHeadCLIP零样本分类头源码逐行解析【免费下载链接】UniDetectorCode release for our CVPR 2023 paper Detecting Everything in the Open World: Towards Universal Object Detection.项目地址: https://gitcode.com/gh_mirrors/un/UniDetectorUniDetector 是 CVPR 2023 论文《Detecting Everything in the Open World: Towards Universal Object Detection》的官方开源代码它让一个目标检测模型能够零样本识别训练时从未见过的任意类别。其核心秘密藏在 bbox_head_clip.py 中的 BBoxHeadCLIP 分类头用 CLIP 预训练好的文本向量替换了传统检测器里的全连接分类层。本文将面向新手逐行拆解这个零样本分类头是如何工作的。一、为什么一个模型能认识任意类别传统检测器的痛点类别写死在输出层里普通 Faster R-CNN 的分类头是一个全连接层输出维度等于训练集的类别数比如 COCO 的 80 类。想检测新类别必须重新标注数据、重新训练输出层。CLIP 的启示文字和图片住在同一个空间CLIP 是一个图文对比学习模型同一张图片和它的描述文本会被编码到同一向量空间里的相近位置。这意味着——一张长椅的照片这个文本向量和真正的长椅图像特征做相似度计算就能给出很高的分数完全不需要见过长椅的训练样本。UniDetector 的巧思把分类器换成文本向量查表UniDetector 的做法非常干脆图像侧用 CLIP 的视觉 ResNetclipresnet.py提取特征类别侧把每个类别名喂给 CLIP 文本编码器得到一组冻结的文本向量存成.npy文件项目已自带 clip_embeddings/ 下的 4 份预计算嵌入分类打分图像特征和文本向量做余弦相似度相似度就是分类得分。类别数量不再由网络结构决定而是由这个文本向量表决定——想检测 1230 类LVIS还是 80 类COCO只是换一张表。二、BBoxHeadCLIP 源码逐段解析 以下代码位于 mmdet/models/roi_heads/bbox_heads/bbox_head_clip.py。第 1 步加载冻结的文本向量build_zs_layerzs_weights np.load(self.zeroshot_path) zs_weights torch.tensor(zs_weights, dtypetorch.float32).permute(1, 0).contiguous() zs_weights torch.cat([zs_weights, zs_weights.new_zeros((zs_weights.shape[0], 1))], dim1) self.register_buffer(zs_weights, zs_weights)四行代码做了三件事读取.npy文本嵌入、转置成类别 × 维度、拼上一列零向量当背景类。关键是register_buffer——它把文本向量注册为缓冲区而非可训练参数前向参与计算反向永不更新这正是零样本的数学保证。第 2 步AttentionPool2d 把区域特征压成一个向量每个候选框RoI先经过 RoIAlign 和 clip_res_layer.py 中的 CLIP 第四层2048 通道得到 7×7 特征图再送入AttentionPool2d(7, 2048, 32, 1024)把 49 个空间位置展平成 49 个 token加上一个均值 token当聚合器用 32 头自注意力让每个位置互相看一眼取均值 token 的输出作为整个区域的 1024 维全局特征。这其实是 CLIP 视觉编码器原生池化方式的复刻保证图像特征和文本向量天然对齐。第 3 步一行余弦相似度完成零样本分类 ⭐cls_score torch.mm(100 * F.normalize(x_cls, p2, dim1), F.normalize(self.zs_weights, p2, dim0))这是全文件最核心的一行图像特征与所有类别文本向量各自做 L2 归一化 → 点积即余弦相似度乘以 100 是 CLIP 惯例的温度系数把相似度拉陡成可用的 logit输出形状(N, 类别数1)与经典分类头完全一致后续 NMS 流程零改动。没有 fc_cls没有 softmax 竞争——每个类别独立打分最后用 sigmoid 转成 0~1 的概率天然支持多标签一个物体同时是人和骑车者。第 4 步框回归照常训练fc_reg分类层虽然冻结了fc_reg线性层1024 → 4类别无关回归仍然可训练配合 L1 损失微调候选框。也就是说是什么靠冻结的文本知识在哪靠少量数据精修——这正是解耦训练clip_decouple_faster_rcnn_r50_c4_1x_coco_2ndstage.py 中with_clsFalse能只用一个数据集就把 1230 类检测跑通的原因。第 5 步FED 损失让长尾类别不被淹没LVIS 有 1230 类单个 batch 里往往只出现几十类。loss()中实现了 FEDFine-grained Entity Decoupling策略每个 batch 只取本批出现的类别 随机补样的类别默认上限fed_loss_num_cat50参与损失用逐类别二分类交叉熵binary_cross_entropy_with_logits替代 softmax 交叉熵类别之间互不牵制类别频率由 scripts/get_cat_info.py 统计避免高频类别主导训练。第 6 步推理头 BBoxHeadCLIPInference分数融合与概率校准 同文件的子类BBoxHeadCLIPInference面向开放世界推理做了两处增强配置见 clip_decouple_faster_rcnn_r50_c4_1x_lvis_v0.5_2ndstage_withcalibration.py频率校准scores × (1/freq^γ)压制高频类别得分虚高的偏差γ0.6双证据融合最终得分 分类分^β × 候选框分^(1-β)β0.3让框拟不像和内容不对两路证据互相把关。三、任意类别的文本向量是怎么生成的想加新类别只需运行 dump_clip_features_manyprompt.py从数据集标注中读取类别名如coco、lvis的 categories每个类别套用80 条提示模板a photo of a {}、a blurry photo of the {}、a cartoon {}……生成 80 句话全部句子过 CLIP 文本编码器后取平均得到一个更鲁棒的类别向量存成.npy。项目已附带四份预计算结果coco(80 类)、lvis_v0.5(1230 类)、objects365、oid位于 clip_embeddings/开箱即用。四、最快上手三步跑通零样本检测 准备代码与权重获取 UniDetector 仓库按 README 安装 mmdetection v2.18.0 CLIP二阶段推理COCO 单数据集配置为例bash tools/dist_test.sh configs/inference/clip_decouple_faster_rcnn_r50_c4_1x_lvis_v0.5_2ndstage.py [你的checkpoint] 8 --eval bbox换成 LVIS 配置即可在 1230 类开放世界数据集上评测——同一套权重类别空间由文本向量表决定。五、开放世界泛化的真实表现零样本不等于纸上谈兵。论文在 LVIS v0.5 的 1230 类开放世界基准上评测了该方案并做了鲁棒性实验在噪声、运动模糊、雾、JPEG 压缩等 15 种图像扰动下模型依然能保持稳定的检测能力测试工具见 tools/analysis_tools/robustness_eval.py。训练数据经 mmdetection 标准流水线处理六、一页速览BBoxHeadCLIP 的记忆口诀 ✅组件一句话总结zs_weights冻结的 CLIP 文本向量表类别数的唯一决定者AttentionPool2d复刻 CLIP 原生池化让图像特征与文本天然对齐100 × cos(图像, 文本)全文件最核心的一行相似度即得分fc_reg唯一可训练的分类头组件负责把框修准FED loss每 batch 采样 50 类 二分类损失治长尾BBoxHeadCLIPInference频率校准 框分融合开放世界推理调优核心启示零样本目标检测的钥匙不是更大的网络而是把类别知识从参数里搬进文本空间。理解了 BBoxHeadCLIP 这一行余弦相似度你就掌握了 UniDetector 认识任意类别的全部秘密 。相关文件导航零样本分类头mmdet/models/roi_heads/bbox_heads/bbox_head_clip.py多数据集分区版分类头mmdet/models/roi_heads/bbox_heads/bbox_head_clip_partitioned.pyCLIP 视觉骨干mmdet/models/backbones/clipresnet.py文本向量生成脚本scripts/dump_clip_features_manyprompt.py预计算文本嵌入clip_embeddings/【免费下载链接】UniDetectorCode release for our CVPR 2023 paper Detecting Everything in the Open World: Towards Universal Object Detection.项目地址: https://gitcode.com/gh_mirrors/un/UniDetector创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

最新新闻

论文等级与期刊分类(超详细版)

论文等级与期刊分类(超详细版)

学术之路,从读懂论文开始。这篇文章帮你理清那些让人头秃的英文缩写和等级划分,建议收藏慢慢看。 作为一个刚踏入学术圈的小白,想必你也有过这样的经历:导师让你去读几篇“核心期刊”论文,你满口答应,转头…

2026/8/22 15:44:50
C# 在逗号分割的字符串中判断是否包含指定字符

C# 在逗号分割的字符串中判断是否包含指定字符

目录 方法1:使用 Contains 方法 方法2:分割字符串并检查每个元素 方法3:使用 LINQ 方法4:正则表达式(如果需要更复杂的匹配) 总结 如果您喜欢此文章,请收藏、点赞、评论,谢谢&a…

2026/8/22 15:44:50
SPA 刷新 404 难题终结者:boot-react SinglePageAppConfig pushState 资源解析器深度剖析

SPA 刷新 404 难题终结者:boot-react SinglePageAppConfig pushState 资源解析器深度剖析

SPA 刷新 404 难题终结者:boot-react SinglePageAppConfig pushState 资源解析器深度剖析 【免费下载链接】boot-react A starter application with spring boot and react 项目地址: https://gitcode.com/gh_mirrors/bo/boot-react 🚀 boot-reac…

2026/8/22 15:44:50
文献综述的“时空折叠法”:书匠策AI把百年学术史放进你的电脑屏幕

文献综述的“时空折叠法”:书匠策AI把百年学术史放进你的电脑屏幕

官网:www.shujiangce.com | 微信公众号:书匠策AI 文献综述最怕什么?最怕你读了100篇论文,脑子里还是一团浆糊——分不清谁先谁后、谁支持谁反对、哪个方向已经做烂了、哪个角落还没人碰过。就像站在一个巨大的图书馆里&#xff…

2026/8/22 15:44:50
FloPy + MODPATH完全教程:构建粒子追踪模拟并可视化地下水流路径

FloPy + MODPATH完全教程:构建粒子追踪模拟并可视化地下水流路径

FloPy MODPATH完全教程:构建粒子追踪模拟并可视化地下水流路径 【免费下载链接】flopy A Python package to create, run, and post-process MODFLOW-based models. 项目地址: https://gitcode.com/gh_mirrors/fl/flopy FloPy 是一个强大的 Python 地下水模…

2026/8/22 15:44:50
【LangChain】示例选择器(Example Selectors)实战指南

【LangChain】示例选择器(Example Selectors)实战指南

🔥草莓熊Lotso:个人主页 ❄️个人专栏: 《C知识分享》 《Linux 入门到实践:零基础也能懂》 ✨生活是默默的坚持,毅力是永久的享受! 🎬 博主简介: 文章目录前言一. 什么是示例选择器?…

2026/8/22 15:39:50