
MMDetection 中 Detic 开放词汇检测实战从 ImageNet-21K 图像级标注训练到两万类开放词汇推理【免费下载链接】mmdetectionOpenMMLab Detection Toolbox and Benchmark项目地址: https://gitcode.com/gh_mirrors/mm/mmdetection导读本文以 projects/Detic_new 为线索完整讲解如何在 MMDetection 中复现DeticDetector with image classes——一种仅使用图像级标注image-level labels即可训练检测器、并利用 CLIP 文本编码器实现开放词汇检测的算法。你将掌握从 CLIP 安装、LVIS/ImageNet-LVIS 数据准备到两阶段训练、多数据集联合采样配置以及用--texts自定义类别进行推理的完整实战流程并理解ZeroShotClassifier、图像级损失image loss与 Federated Loss 等核心模块的源码实现。一、Detic 是什么用图像级标注训练检测器Detic 是 ECCV 2022 论文 Detecting Twenty-thousand Classes using Image-level SupervisionarXiv 2201.02605作者 Xingyi Zhou、Rohit Girdhar 等提出的检测方法。其核心思想是传统检测器依赖框级标注box-level annotations标注成本高、类别覆盖有限Detic允许检测器在训练时同时使用框级标注数据如 LVIS与仅含类别标签的图像级标注数据如图像分类数据集 ImageNet-21K从而把检测的类别规模扩展到两万级别在推理侧Detic 借助CLIP的文本编码器将任意类别名称编码为分类权重从而能够检测训练时从未见过的类别开放词汇检测open-vocabulary detection。在本仓库中Detic 被整理为projects下的独立子项目 projects/Detic_new通过custom_imports机制注册到 MMDetection 框架中可以像使用内置模型一样训练、测试与部署。二、环境安装CLIP 依赖Detic 的开放词汇能力依赖 OpenAI CLIP 的文本编码器CLIPTextEncoder见 detic.py因此除了 MMDetection 本身的依赖外还需要额外安装 CLIPpip install githttps://github.com/openai/CLIP.git安装完成后源码会在推理时通过import clip加载ViT-B/32预训练模型detic.py 中的clip.load(model_name, devicecpu)把类别名称如 headphone编码为文本特征向量再转置为分类权重矩阵参与检测打分。这也解释了为什么 Detic 的模型配置文件里并没有把 CLIP 写进model字典——它是在前向推理过程中按需动态使用的。三、数据准备LVIS ImageNet-LVIS Metadata官方建议把数据集放在项目目录之外并将数据集根目录软链到$MMDETECTION/data。若目录结构与下文不一致需要同步修改配置文件中的对应路径。3.1 LVIS框级标注数据LVIS 作为框级box-labeled训练数据。对于开放词汇 LVIS 实验需要根据 Detic 官方的数据准备说明生成去除了 337 个稀有类标注的lvis_v1_train_norare.json即下文 open-vocabulary 设置中的lvisbase划分也可以直接下载 OpenMMLab 备份的lvis_v1_train_norare.json。目录结构如下mmdetection ├── data │ ├── lvis │ │ ├── annotations │ │ | ├── lvis_v1_train.json │ │ | ├── lvis_v1_val.json │ │ | ├── lvis_v1_train_norare.json │ │ ├── train2017 │ │ ├── val20173.2 ImageNet-LVIS图像级标注数据ImageNet-LVIS 作为图像级标注数据。从 ImageNet 官网下载 ImageNet-21K 后解压出与 LVIS 重叠的类别并按官方说明转换为 LVIS 标注格式含pos_category_ids等字段生成imagenet_lvis_image_info.json。目录结构如下mmdetection ├── data │ ├── imagenet │ │ ├── annotations │ │ | ├── imagenet_lvis_image_info.json │ │ ├── ImageNet-21K │ │ | ├── n00007846 │ │ | ├── n01318894 │ │ | ├── ...需要注意ImageNet-LVIS 数据的每张图片只提供类别标签而没有框。在源码中imagenet_lvis.py 的parse_data_info会读取pos_category_ids并构造只含bbox_label的instances且不包含bboxes字段——这正是训练代码判断这张图是检测图还是分类图的依据详见第五、六节。3.3 Metadata 元数据data/metadata/存放预处理好的元数据仓库已内置说明文件需自行下载/生成mmdetection ├── data │ ├── metadata │ │ ├── lvis_v1_train_cat_info.json │ │ ├── lvis_v1_clip_acname.npy其中lvis_v1_train_cat_info.json记录 LVIS 训练集中每个类别的出现频次image_count供Federated Loss采样使用lvis_v1_clip_acname.npyLVIS 每个类别预计算好的 CLIP 文本嵌入a 类别名直接作为ZeroShotClassifier的分类权重避免推理/训练时重复编码文本。两者也都可以从 OpenMMLab 备份地址直接下载。四、代码结构总览在进入训练与推理之前先理清projects/Detic_new的模块划分。所有自定义组件通过init.py 统一注册文件组件职责detic.pyDetic检测器、CLIPTextEncoder、get_class_weight、reset_cls_layer_weight整体检测器继承 Cascade R-CNN推理时动态用 CLIP 重置分类层zero_shot_classifier.pyZeroShotClassifier用预计算 CLIP 嵌入作为分类权重的分类头centernet_rpn_head.pyCenterNetRPNHead基于 CenterNet2 改进的 anchor-free RPN热图 中心点回归detic_bbox_head.pyDeticBBoxHead支持 Federated Loss 与图像级分类损失image loss的框头detic_roi_head.pyDeticRoIHeadCascade RoI Head训练时对无框图像执行图像级损失imagenet_lvis.pyImageNetLVISV1Dataset只含图像级类别标签的 LVIS 格式数据集heatmap_focal_loss.pyHeatmapFocalLossRPN 热图分类损失iou_loss.pyIOULossRPN 回归损失GIoU配置文件位于 projects/Detic_new/configs覆盖 R50 与 Swin-B 两种主干、box-supervised 与 in21k-lvis 两种训练设置以及 LVIS / LVIS-baseopen-vocabulary两种评测协议。五、开放词汇推理demo 实战Detic 的演示模型使用 LVIS COCO ImageNet-21K 联合训练COCO 数据让模型对 person 等类别有更好的视觉表现弥补 LVIS 联邦标注协议下 person 检测不佳的问题配置为 detic_centernet2_swin-b_fpn_4x_lvis_coco_in21k.py。说明该配置仅用于测试/推理不支持训练配置文件中已注明 not support training, only for testing。对应权重从 OpenMMLab 模型库下载detic_centernet2_swin-b_fpn_4x_lvis-coco-in21k 系列权重文件。如果你希望使用 Detic 官方 model zoo 中其他结构的权重需要先用 tools/model_converters/detic_to_mmdet.py 做权重格式转换python tools/model_converters/detic_to_mmdet.py --src /path/to/detic_weight.pth --dst /path/to/mmdet_weight.pth5.1 使用已有数据集词汇推理对既有数据集的类别做检测时用--texts lvis直接指定词汇表此时会从LVISV1Dataset.METAINFO[classes]读取全部 LVIS 类别detic.pypython demo/image_demo.py \ ${IMAGE_PATH} \ ${CONFIG_PATH} \ ${MODEL_PATH} \ --texts lvis \ --pred-score-thr 0.5 \ --palette random5.2 使用自定义词汇推理Detic 可以检测任意给定类别名的对象。只需把类别名以点号分隔写进--textspython demo/image_demo.py \ ${IMAGE_PATH} \ ${CONFIG_PATH} \ ${MODEL_PATH} \ --texts headphone . webcam . paper . coffe. \ --pred-score-thr 0.3 \ --palette random官方示例特意指出headphone、paper并非 LVIS 类别而coffe甚至是一个拼写错误的词——即便如此Detic 依然能给出合理的 coffee 检测结果。这说明开放词汇能力不依赖训练时的类别集合完全由 CLIP 对类别名的语义理解驱动。从源码看--texts传入自定义词汇后会进入 detic.py 的predict流程检测到custom_entities标记时调用get_class_weight用 CLIP 现场计算文本嵌入再由reset_cls_layer_weight把各级DeticBBoxHead的分类权重替换为新类别对应的zs_weightdetic.py。reset_cls_layer_weight中会对权重做 L2 归一化并补一列全零作为背景类。六、两阶段训练流程Detic 在 LVIS 上的训练分为两个阶段第一阶段只用框级标注LVIS训练一个 box-supervised baseline第二阶段加载 baseline 权重引入图像级标注数据ImageNet-LVIS联合微调。6.1 第一阶段框监督 baselinebash ./tools/dist_train.sh projects/Detic_new/detic_centernet2_r50_fpn_4x_lvis_boxsup.py 8对应配置 detic_centernet2_r50_fpn_4x_lvis_boxsup.py关键设计如下模型骨架Detic检测器 ResNet-50ImageNet-21K 预训练norm_evalTrue FPN CenterNetRPNHead 3 级 CascadeDeticRoIHead分类层cls_layer使用ZeroShotClassifier直接加载data/metadata/lvis_v1_clip_acname.npy作为固定权重zs_weight_dim512与 CLIP ViT-B/32 的文本嵌入维度一致norm_temperature50.0用于放大余弦相似度Federated LossDeticBBoxHead中use_fed_lossTrue配合cat_freq_path按类别频次做负类采样缓解 1203 类长尾问题见第七节训练规模max_iter90000配置注释说明总 batch 为 16 时 90k iter 约等于 1x/12 epochs总 batch 为 64 时约等于 4x优化器 AdamWlr2e-4LinearLR 预热 CosineAnnealingLRAMP 自动混合精度由AmpOptimWrapper启用数据流ClassBalancedDatasetoversample_thr1e-3包裹LVISV1Dataset使用lvis_v1_train_norare.json训练。6.2 第二阶段图像级标注微调bash ./tools/dist_train.sh projects/Detic_new/detic_centernet2_r50_fpn_4x_lvis_in21k-lvis.py 8对应配置 detic_centernet2_r50_fpn_4x_lvis_in21k-lvis.py它直接_base_继承第一阶段的 boxsup 配置改动点包括加载第一阶段权重load_from ./first_stage/detic_centernet2_r50_fpn_4x_lvis_boxsup.pth双数据集双流水线检测数据用 640×640、分类数据用 320×320 的独立增强流水线train_pipeline_det/train_pipeline_cls分类流水线LoadAnnotations(with_bboxFalse, with_labelTrue)不加载框多数据集训练配置train_dataloader通过_delete_True整体替换batch_size[8, 32]检测数据 batch 8、分类数据 batch 32MultiDataSamplerdataset_ratio[1, 4]两个数据源按 1:4 比例采样MultiDataAspectRatioBatchSamplernum_datasets2不同数据源可拥有不同的 batch size 且各自按长宽比组 batchConcatDataset把LVISV1Dataset与ImageNetLVISV1Dataset拼接不同标注类型、不同流水线共存于一次迭代find_unused_parameters True因为分类分支产生的部分参数如图像级损失路径可能在部分迭代中不参与计算。七、多数据集联合训练配置深度解析README 指出这一阶段提供了三件套改进的ConcatDataset、MultiDataSampler、MultiDataAspectRatioBatchSampler。其典型配置如下来自 detic_centernet2_r50_fpn_4x_lvis_in21k-lvis.pydataset_det dict( typeClassBalancedDataset, oversample_thr1e-3, datasetdict( typeLVISV1Dataset, data_rootdata/lvis/, ann_fileannotations/lvis_v1_train.json, data_prefixdict(img), filter_cfgdict(filter_empty_gtTrue, min_size32), pipelinetrain_pipeline_det, backend_argsbackend_args)) dataset_cls dict( typeImageNetLVISV1Dataset, data_rootdata/imagenet, ann_fileannotations/imagenet_lvis_image_info.json, data_prefixdict(imgImageNet-LVIS/), pipelinetrain_pipeline_cls, backend_argsbackend_args) train_dataloader dict( batch_size[8, 32], num_workers2, persistent_workersTrue, samplerdict( typeMultiDataSampler, dataset_ratio[1, 4]), batch_samplerdict( typeMultiDataAspectRatioBatchSampler, num_datasets2), datasetdict( typeConcatDataset, datasets[dataset_det, dataset_cls]))使用要点多数据集中若某个子集本身是ConcatDataset它仍然被视作一个数据集参与MultiDataAspectRatioBatchSampler的num_datasets计数MultiDataSampler的dataset_ratio控制各数据源的采样比例这里检测:分类 1:4即每个迭代中分类图像数远多于检测图像数batch_size与dataset_ratio的维度必须与num_datasets一致。对应源码层面Detic检测器在 detic.py 的loss中按 batch 数据是否有gt_instances.bboxes自动分流有框的走正常的 Cascade 匹配/采样/损失无框的样本来自 ImageNet-LVIS交给DeticRoIHead.loss走图像级损失分支。八、关键组件源码解析8.1 ZeroShotClassifier预计算嵌入做分类权重zero_shot_classifier.py 中的ZeroShotClassifier是 Detic 开放词汇能力的核心载体加载zs_weight_path指定的.npy嵌入转置为D x C权重并追加一列全零背景类norm_weightTrue时对权重做 L2 归一化前向时输入先经nn.Linear投影到zs_weight_dim再乘norm_temperature默认 50.0归一化后与权重矩阵做矩阵乘等价于温度缩放的余弦相似度打分当zs_weight_pathrand时退化为随机初始化分类层用于无 CLIP 嵌入的场景。推理时自定义词汇会通过reset_cls_layer_weight动态替换各级 bbox head 中的zs_weight因此同一份权重文件可以随时切换检测词汇表。8.2 DeticRoIHead图像级损失分支detic_roi_head.py 的loss对每个 Cascade stage 判断若该图有bboxes检测数据走常规bbox_loss mask lossmask 只在 stage 0 计算与 Detectron2 行为一致若该图无框分类数据取每个图像前ws_num_props128个 proposals调用image_lossdetic_roi_head.py将图像级类别标签的交叉熵损失作为监督信号——这就是用图像级标注训练检测器的落地点。8.3 DeticBBoxHeadFederated Loss 与 image_label_lossesdetic_bbox_head.py 的image_label_losses会取出每张图面积最大的 proposal对其分类 logits 施加图像级标签的 BCE 损失image_loss_weight0.1。同时sigmoid_cross_entropy_lossdetic_bbox_head.py实现了Federated Loss每 batch 只对当前出现的类别 按lvis_v1_train_cat_info.json频次加权随机采样出的类别计算梯度其余类别权重置 0。load_class_freq把 image_count 做**0.5次方作为采样权重显著降低 1203 类大分类头的显存与收敛压力。8.4 CenterNetRPNHead无锚框热图 RPNcenternet_rpn_head.py 实现 CenterNet2 改进版的无锚 RPNFPN 五个尺度stride 8~128上预测中心热图与四边距离HeatmapFocalLoss负责热图分类IOULoss(giou)负责回归测试时以torch.sqrt(heatmap)作为 proposal 分数与检测器输出按(s * ps[:, None])**0.5加权融合见 detic_roi_head.py 的 centernet2 风格 score reweighting。8.5 ImageNetLVISV1Dataset只读类别标签的数据集imagenet_lvis.py 定义ImageNetLVISV1Dataset继承LVISV1Dataset内置完整的 LVIS 1203 类METAINFO其parse_data_info从pos_category_ids构造无框标注并在return_classesTrue时把类别名与custom_entitiesTrue写入 meta 供推理使用。九、测试与评估使用 tools/test.py 评测训练好的模型python ./tools/test.py ${CONFIG_FILE} ${CHECKPOINT_FILE}评估器使用LVISMetricmetric[bbox, segm]验证/测试均指向data/lvis/annotations/lvis_v1_val.json。9.1 标准 LVIS 结果本仓库复现模型配置mask mAPmask mAP官方mask mAP_raremask mAP_rare官方detic_centernet2_r50_fpn_4x_lvis_boxsup31.631.526.625.6detic_centernet2_r50_fpn_4x_lvis_in21k-lvis32.933.230.929.7detic_centernet2_swin-b_fpn_4x_lvis_boxsup40.740.738.035.9detic_centernet2_swin-b_fpn_4x_lvis_in21k-lvis41.741.741.741.79.2 Open-vocabulary LVIS 结果模型配置mask mAPmask mAP官方mask mAP_raremask mAP_rare官方detic_centernet2_r50_fpn_4x_lvis-base_boxsup30.430.216.216.4detic_centernet2_r50_fpn_4x_lvis-base_in21k-lvis32.632.427.424.9评测设置说明open-vocabulary 设置lvisbase训练时使用去掉稀有类标注的lvis_v1_train_norare.json评测时把稀有类当作 novel 类计算 mAPin21k-lvis标记表示使用 ImageNet-21K 与 LVIS 重叠类别的图像作为图像级标注数据参与训练。测试侧同样提供由官方 model zoo 转换得到的 Swin-B open-vocabulary 权重及其结果detic_centernet2_swin-b_fpn_4x_lvis-base_boxsup达到 mask mAP 38.4 / novel mAP 21.9..._in21k-lvis达到 mask mAP 40.7 / novel mAP 34.0可用于直接复现开放词汇评测。十、引用若 Detic 对你的研究或应用有帮助请引用其论文BibTeX 见 projects/Detic_new/README.md 末尾inproceedings{zhou2022detecting, title{Detecting Twenty-thousand Classes using Image-level Supervision}, author{Zhou, Xingyi and Girdhar, Rohit and Joulin, Armand and Kr{\a}henb{\u}hl, Philipp and Misra, Ishan}, booktitle{ECCV}, year{2022} }总结通过本文你已经在 MMDetection 中完整走通了 Detic 的闭环安装 CLIP → 准备 LVIS / ImageNet-LVIS / metadata 三类数据 → 两阶段训练框监督 baseline 图像级标注微调→ 多数据集联合采样配置 → 开放词汇推理与评测。深入源码后可以看到Detic 的工程实现把图像级标签训练拆解为DeticRoIHead.image_lossDeticBBoxHead.image_label_losses两个落地点把开放词汇沉淀为ZeroShotClassifier CLIP 文本编码 动态权重重置而 Federated Loss 与 CenterNet2 RPN 则保证了超大类别数下的训练可行性。这一套组件化设计也为后续在 MMDetection 中复现其他开放词汇检测方法提供了可移植的参考范式。【免费下载链接】mmdetectionOpenMMLab Detection Toolbox and Benchmark项目地址: https://gitcode.com/gh_mirrors/mm/mmdetection创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考