在 MMDetection 中训练 V3Det 万类视觉检测模型数据集准备、配置解析与源码剖析【免费下载链接】mmdetectionOpenMMLab Detection Toolbox and Benchmark项目地址: https://gitcode.com/gh_mirrors/mm/mmdetection导读V3DetVast Vocabulary Visual Detection Dataset是 ICCV 2023Oral提出的超大规模词汇视觉检测数据集其类别规模高达 13,204 类是 LVIS 等既有大规模词汇数据集的约 10 倍。本文以 configs/v3det/README.md 为骨架结合仓库内 10 份 V3Det 官方配置与 mmdet/datasets/v3det.py、mmdet/models/layers/normed_predictor.py 等源码实现系统讲解如何基于 MMDetection 完成 V3Det 数据准备、复现 Faster R-CNN / Cascade R-CNN / FCOS / Deformable-DETR / DINO 五类基线模型并深入剖析面向万类检测的归一化分类头、自定义损失、类别均衡采样与重复框扰动perm-repeat等关键技术细节。V3Det 数据集概述V3Det 面向更通用的视觉目标检测提出核心目标是打破现有检测数据集词汇量受限的瓶颈。根据 configs/v3det/README.md 中的 Abstract其核心特性包括巨大词汇量Vast Vocabulary在真实世界图像上为13,204 个类别标注了边界框词汇量约为现有大规模词汇检测数据集如 LVIS的10 倍层次化类别组织Hierarchical Category Organization全部类别由一棵类别树组织标注了类别之间的包含关系为大规模与开放词汇检测中的类别关系研究提供支撑丰富标注Rich Annotations在243k 张图像上提供精确标注同时由人类专家与强聊天机器人撰写每个类别的专业描述。该数据集已收录进 MMDetection 仓库作为官方支持的检测数据集之一其数据集类型、标注格式、评估协议均在 mmdet/datasets/v3det.py 与配置文件中有完整实现。数据准备与目录结构下载与整理V3Det 数据需从 V3Det 官方主页v3det.openxlab.org.cn与 V3Det 官方 GitHub 仓库下载。数据包含训练集与验证集共13,204 个类别其中训练集含183,354 张图像验证集含29,821 张图像。按照 configs/v3det/README.md 给出的数据组织方式下载后应整理为如下结构data/ V3Det/ images/ category_node/ |────image_name.png ... ... annotations/ |────v3det_2023_v1_category_tree.json # Category tree |────category_name_13204_v3det_2023_v1.txt # Category name |────v3det_2023_v1_train.json # Train set |────v3det_2023_v1_val.json # Validation set其中图像按类别节点category_node分目录存放v3det_2023_v1_category_tree.json保存层次化类别树category_name_13204_v3det_2023_v1.txt每行一个类别名共 13,204 行v3det_2023_v1_train.json/v3det_2023_v1_val.json为 COCO 格式的训练/验证标注文件。数据集根目录约定仓库所有 V3Det 配置统一使用data_root data/V3Det/见 configs/base/datasets/v3det.py即默认数据放置在工作区根目录的data/V3Det/下与上述目录结构一致。V3Det 数据集在 MMDetection 中的实现V3DetDataset从 COCO 格式继承而来的万类数据集MMDetection 通过V3DetDataset类接入该数据集实现在 mmdet/datasets/v3det.py。它直接继承自CocoDataset因为 V3Det 的标注文件是 COCO JSON 格式仅在构造时额外做了一件事通过mmengine.list_from_file读取data_root下的类别名文件annotations/category_name_13204_v3det_2023_v1.txt默认路径得到 13,204 个类别名的元组将类别名注入metainfo[classes]再交给父类初始化。class V3DetDataset(CocoDataset): METAINFO {classes: None, palette: None} def __init__(self, *args, metainfoNone, data_root, label_fileannotations/category_name_13204_v3det_2023_v1.txt, **kwargs): class_names tuple(mmengine.list_from_file(os.path.join(data_root, label_file))) if metainfo is None: metainfo {classes: class_names} super().__init__(*args, data_rootdata_root, metainfometainfo, **kwargs)这意味着训练/验证标注文件路径annotations/v3det_2023_v1_train.json、annotations/v3det_2023_v1_val.json、图像前缀data_prefixdict(img)均遵循上文目录结构可直接沿用 COCO 的加载、过滤filter_cfg与评估CocoMetric机制。基类数据集配置configs/base/datasets/v3det.py 是各 V3Det 实验共用的基类数据集配置关键点包括训练管线LoadImageFromFile→LoadAnnotations(with_bboxTrue)→RandomChoiceResize短边从 640/672/704/736/768/800 中随机选择、长边 1333keep_ratioTrue→RandomFlip(prob0.5)→PackDetInputs测试管线Resize(scale(1333, 800), keep_ratioTrue)固定尺度并建议无 GT 时删除LoadAnnotations训练数据外层用ClassBalancedDataset(oversample_thr1e-3)包裹V3DetDataset并设置filter_cfgdict(filter_empty_gtTrue, min_size4)过滤空图与过小框验证/测试test_modeTrue评估器为CocoMetric关键参数use_mp_evalTrue多进程评估与proposal_nums[300]。模型结果与基线复现configs/v3det/README.md 给出了官方在 V3Det 验证集上的评测结果覆盖 ResNet-50 与 Swin-B 两种骨干、五种检测范式BackboneModelLr schdbox APConfigR-50Faster R-CNN2x25.4faster_rcnn_r50_fpn_8x4_sample1e-3_mstrain_v3det_2x.pyR-50Cascade R-CNN2x31.6cascade_rcnn_r50_fpn_8x4_sample1e-3_mstrain_v3det_2x.pyR-50FCOS2x9.4fcos_r50_fpn_8x4_sample1e-3_mstrain_v3det_2x.pyR-50Deformable-DETR50e34.4deformable-detr-refine-twostage_r50_8xb4_sample1e-3_v3det_50e.pyR-50DINO36e33.5dino-4scale_r50_8xb2_sample1e-3_v3det_36e.pySwin-BFaster R-CNN2x37.6faster_rcnn_swinb_fpn_8x4_sample1e-3_mstrain_v3det_2x.pySwin-BCascade R-CNN2x42.5cascade_rcnn_swinb_fpn_8x4_sample1e-3_mstrain_v3det_2x.pySwin-BFCOS2x21.0fcos_swinb_fpn_8x4_sample1e-3_mstrain_v3det_2x.pySwin-BDeformable-DETR50e42.5deformable-detr-refine-twostage_swin_16xb2_sample1e-3_v3det_50e.pySwin-BDINO36e42.0dino-4scale_swin_16xb1_sample1e-3_v3det_36e.py其中sample1e-3指训练时使用ClassBalancedDataset且oversample_thr1e-3。Swin-B 系列配置均在对应 R-50 配置基础上通过_delete_True替换骨干为SwinTransformerembed_dims128、depths[2,2,18,2]、num_heads[4,8,16,32]、window_size7、drop_path_rate0.3并相应调整neck的in_channels两阶段模型为[128,256,512,1024]DINO 为[256,512,1024]例如 cascade_rcnn_swinb_fpn_8x4_sample1e-3_mstrain_v3det_2x.py 与 dino-4scale_swin_16xb1_sample1e-3_v3det_36e.py。运行训练与测试按照 MMDetection 标准流程训练与测试的命令如下以 Faster R-CNN 为例# 单卡训练 python tools/train.py configs/v3det/faster_rcnn_r50_fpn_8x4_sample1e-3_mstrain_v3det_2x.py # 多卡训练8 卡 bash tools/dist_train.sh configs/v3det/faster_rcnn_r50_fpn_8x4_sample1e-3_mstrain_v3det_2x.py 8 # 测试 python tools/test.py configs/v3det/faster_rcnn_r50_fpn_8x4_sample1e-3_mstrain_v3det_2x.py checkpoint路径注意仓库只提供训练/测试入口预训练权重需按 configs/v3det/README.md 的下载链接从 V3Det 官方模型仓库获取后将checkpoint路径替换为实际权重文件位置。面向万类检测的模型设计要点归一化线性分类头 NormedLinear万类分类头13,204 类直接使用普通nn.Linear容易导致权重与特征尺度失配。MMDetection 为此提供了归一化线性层NormedLinear实现位于 mmdet/models/layers/normed_predictor.py其前向过程为weight_ self.weight / (self.weight.norm(dim1, keepdimTrue).pow(self.power) self.eps) x_ x / (x.norm(dim1, keepdimTrue).pow(self.power) self.eps) x_ x_ * self.tempearture return F.linear(x_, weight_, self.bias)即同时对分类权重与输入特征做 L2 归一化并乘以温度系数temperature控制 logits 的锐利程度权重初始化采用均值 0、标准差 0.01 的正态分布偏置初始化为 0。V3Det 各两阶段与单阶段配置统一使用cls_predictor_cfgdict(typeNormedLinear, tempearture50, biasTrue)注意源码中参数名拼写为tempearture配置需保持一致。自定义分类损失CrossEntropyCustomLoss 与 FocalCustomLoss由于类别数高达 13,204MMDetection 专门实现了两类自定义分类损失它们通过设置custom_cls_channels、custom_activation、custom_accuracy三个标志接管分类头输出通道数、激活函数与精度计算的默认逻辑两阶段模型Faster R-CNN / Cascade R-CNN使用CrossEntropyCustomLoss实现于 mmdet/models/losses/cross_entropy_loss.py 的CrossEntropyCustomLoss类。配置为use_sigmoidTrue、num_classes13204get_cls_channels返回num_classessigmoid 模式不需要额外的背景通道get_activation对前num_classes维做 sigmoid并额外构造一个无目标背景得分通道score_neg 1 - score_classes.sum(dim1)clamp 到 [0,1]后拼接用于统一的概率分布表示get_accuracy仅在labels num_classes的正样本上统计acc_classes。单阶段模型FCOS使用FocalCustomLoss实现于 mmdet/models/losses/focal_loss.py 的FocalCustomLoss类。配置为use_sigmoidTrue、num_classes13204、gamma2.0、alpha0.25其get_activation直接对前num_classes维做 sigmoid 作为类别得分契合 focal loss 的多标签二分类建模。重复 GT 框扰动perm_repeat_gt_cfgV3Det 数据中存在大量完全相同的重复标注框同一张图中多个物体共用同一坐标的 GT 框。这些完全一致的框会干扰 MaxIoUAssigner 对 anchor/proposal 的唯一性匹配。V3Det 系列配置在 assigner 中加入perm_repeat_gt_cfgdict(iou_thr0.7, perm_range0.01)其实现位于 mmdet/models/task_modules/assigners/max_iou_assigner.pyperm_repeat_bboxes第 53 行起找出所有完全重复的 GT 框对每一组重复框调用_perm_box做微扰_perm_box第 14 行起为每个框的坐标乘以uniform_(1-perm_range, 1perm_range)的随机扰动因子并校验扰动后宽高仍为正、且与原框 IoU 高于iou_thr默认 0.97若不满足则缩小扰动范围每轮perm_range - counter * 0.001递归重试最多max_iter5次扰动的唯一框随后进入overlaps self.iou_calculator(gt_bboxes_unique, priors)参与 IoU 匹配从而将重复框转化为语义一致但坐标略异的多个正样本。这是 V3Det 训练中一个关键的隐性设置直接影响分配器行为的正确性。类别均衡采样ClassBalancedDataset 与 oversample_thrV3Det 的 13,204 类呈极端长尾分布。为解决该问题所有训练配置均采用ClassBalancedDataset来自 mmengine包裹 V3Det 数据集并设置oversample_thr1e-3该包装器根据每个类别的样本频率对稀有类别的图像进行重复采样repeat 次数基于oversample_thr与类别频率之比计算使低频类别在训练过程中被更频繁地看到。这也解释了配置文件名中的sample1e-3语义——例如 configs/v3det/deformable-detr-refine-twostage_r50_8xb4_sample1e-3_v3det_50e.py 与 configs/v3det/dino-4scale_r50_8xb2_sample1e-3_v3det_36e.py 均以ClassBalancedDataset(oversample_thr1e-3)作为外层包装。训练策略与超参数解读V3Det 配置全部采用基于迭代iter-based的训练循环与 COCO 常规的 epoch 式训练不同这是由数据集规模决定的单轮遍历 18 万 训练图耗时巨大。两阶段模型2x训练策略以 faster_rcnn_r50_fpn_8x4_sample1e-3_mstrain_v3det_2x.py 为例其核心设置包括模型头bbox_head.num_classes13204reg_class_agnosticTrue类别无关回归万类下共享同一回归分支loss_cls用CrossEntropyCustomLosssigmoid 13204 类loss_bbox用L1Loss分配/采样rpn_proposaldict(nms_pre4000, max_per_img2000)更多候选框rcnn 分支的 assigner 加入perm_repeat_gt_cfgdict(iou_thr0.7, perm_range0.01)推理设置test_cfg.rcnn中score_thr0.0001超低阈值保证长尾类别不被误滤、nms(iou_threshold0.6)、max_per_img300每图最多输出 300 个框训练循环max_iter 68760 * 2即 2xval_intervalmax_iter仅训练结束时验证一次学习率先LinearLR(start_factor1/2048, end5000)做 warmup再MultiStepLR(milestones[45840*2, 63030*2], gamma0.1)衰减优化器AdamW(lr1e-4, weight_decay0.1)配合clip_grad(max_norm35, norm_type2)梯度裁剪自动学习率缩放auto_scale_lrdict(enableFalse, base_batch_size32)8 GPU × 4 样本当前默认关闭保存/日志CheckpointHook(by_epochFalse, interval5730*2)LogProcessor(window_size50, by_epochFalse)。Cascade R-CNN 配置cascade_rcnn_r50_fpn_8x4_sample1e-3_mstrain_v3det_2x.py在此基础上把roi_head.bbox_head扩展为三个级联Shared2FCBBoxHead级联阈值依次为 IoU 0.5 / 0.6 / 0.7每级都带reg_class_agnosticTrue、NormedLinear分类头与CrossEntropyCustomLoss每级 sampler 采样 512 个样本、正样本比例 0.25并将 RPN 回归损失替换为L1Loss。Transformer 检测器50e / 36e训练策略Deformable-DETR 与 DINO 系列配置直接继承 COCO 版本_base_指向configs/deformable_detr/与configs/dino/仅覆盖必要字段模型bbox_head.num_classes13204test_cfg.max_per_img300训练管线RFSRandom Resize Random Crop以RandomChoice二选一——要么直接在 11 档尺度[(480,1333)…(800,1333)]中随机选一缩放要么先在大图尺度[(400,4200),(500,4200),(600,4200)]缩放后做RandomCrop(crop_size(384,600), allow_negative_cropTrue)再按上述尺度缩放注释说明训练集全部图像长宽比 7与官方实现保持一致数据加载ClassBalancedDataset(oversample_thr1e-3)filter_cfgdict(filter_empty_gtFalse)Transformer 检测器不丢弃空图训练循环DINO 配置max_iter412560bs16 下每 epoch 约 11460 iter对应 36eval_intervalmax_iter/5Deformable-DETR 配置max_iter286500bs32 下每 epoch 约 5730 iter对应 50e学习率MultiStepLRDINO 在 343800 iter30e处衰减 0.1Deformable-DETR 在 229200 iter40e处衰减 0.1Checkpointinterval按各自每 epoch 迭代数设置max_keep_ckpts3控制磁盘占用评估use_mp_evalTrue、proposal_nums[300]配合测试端max_per_img300。FCOS 的差异点fcos_r50_fpn_8x4_sample1e-3_mstrain_v3det_2x.py 完全展开定义模型不依赖模型基类使用 FPN FCOSHead(num_classes13204)strides[8,16,32,64,128]loss_cls为FocalCustomLoss(gamma2.0, alpha0.25)loss_bbox为IoULossloss_centerness为 sigmoidCrossEntropyLoss训练 2x 时max_iter 68760*2*2FCOS 的迭代数是两阶段模型的 2 倍学习率为1e-4*0.25并设置find_unused_parametersTrue。评估协议细节V3Det 验证评估统一通过CocoMetricmetricbbox完成基类配置见 configs/base/datasets/v3det.pyann_file指向annotations/v3det_2023_v1_val.jsonuse_mp_evalTrue启用多进程评估13,204 类 近 3 万张验证图的 IoU 计算量极大多进程评估可显著加速proposal_nums[300]只统计每图前 300 个检测框的指标与test_cfg.max_per_img300对齐。Transformer 类配置DINO / Deformable-DETR在各自文件中覆盖了val_evaluator/test_evaluator但参数语义一致。引用如果 V3Det 数据集的实验成果被用于研究工作请按 configs/v3det/README.md 提供的 BibTeX 引用论文inproceedings{wang2023v3det, title {V3Det: Vast Vocabulary Visual Detection Dataset}, author {Wang, Jiaqi and Zhang, Pan and Chu, Tao and Cao, Yuhang and Zhou, Yujie and Wu, Tong and Wang, Bin and He, Conghui and Lin, Dahua}, booktitle {The IEEE International Conference on Computer Vision (ICCV)}, month {October}, year {2023} }小结本文围绕 configs/v3det/README.md 完整梳理了在 MMDetection 中开展 V3Det 万类检测实验的全链路从数据集下载与目录组织数据准备到V3DetDataset的实现细节mmdet/datasets/v3det.py再到五类官方基线的配置与复现命令同时结合源码剖析了万类场景下的三项关键技术——NormedLinear归一化分类头normed_predictor.py、CrossEntropyCustomLoss/FocalCustomLoss自定义损失cross_entropy_loss.py、focal_loss.py、以及perm_repeat_gt_cfg重复框扰动max_iou_assigner.py并解释了ClassBalancedDataset长尾采样与 iter-based 训练调参逻辑。这些配置与实现可作为大规模词汇、开放词汇检测研究的直接实验基线读者可在此基础上进一步探索类别关系建模、层次化检测等方向。【免费下载链接】mmdetectionOpenMMLab Detection Toolbox and Benchmark项目地址: https://gitcode.com/gh_mirrors/mm/mmdetection创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
