公司动态

UniDetector如何认识任意类别?BBoxHeadCLIP零样本分类头源码逐行解析

📅 2026/8/22 14:54:59
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),仅供参考