
人工智能计算机视觉深度学习模型评测【免费下载链接】mmdetectionOpenMMLab Detection Toolbox and Benchmark项目地址https://gitcode.com/gh_mirrors/mm/mmdetection点击查看免费下载导读本文以 MMDetection 仓库 projects/EfficientDet 项目为对象系统讲解如何在 OpenMMLab 生态MMDetection MMCV MMEngine下复现 EfficientDet从 EfficientNet 主干、BiFPN 加权双向特征金字塔、独立 BN 的分离式检测头到 COCO 数据集的训练与测试全流程。读完本文你将掌握该项目的目录结构、两个分支官方 TensorFlow 权重转换分支与自训练复现分支的完整使用命令以及每个关键配置项背后的源码级实现原理。一、项目背景EfficientDet 是什么EfficientDet 由 Mingxing Tan、Ruoming Pang、Quoc V. Le 提出CVPR 2020 论文《EfficientDet: Scalable and Efficient Object Detection》是一族强调效率的目标检测器。其核心主张是在很宽的资源约束范围内相比同期方法以更少的参数量和 FLOPs 取得更好的精度——例如论文报告 D7 配置在 COCO test-dev 上达到 55.1 AP仅约 77M 参数与 410B FLOPs此数据来自 projects/EfficientDet/README.md 的 Abstract 转述属于原论文结论。EfficientDet 的两个关键技术支柱BiFPN加权双向特征金字塔网络一个简单却高效的多尺度特征融合网络。它引入可学习权重来学习不同输入特征的重要性并反复执行 top-down自顶向下与 bottom-up自底向上的多尺度融合。与 FPN、FPN PAN、NAS-FPN 等其他特征金字塔相比BiFPN 以更少的参数和 FLOPs 取得更高的精度。EfficientNet 复合缩放主干通过宽度、深度、分辨率的复合缩放得到从 D0 到 D7 的一系列模型配置。本仓库 projects/EfficientDet 正是基于 MMDetection、MMCV 与 MMEngine 的官方复现并额外提供了两条使用路径一条是直接加载 Google 官方 TensorFlow 权重进行评测90 类、yxyx 框编码另一条是按本仓库实现重新训练80 类、xyxy 编码后者最终取得了高于官方的结果。二、项目结构与源码地图先梳理 projects/EfficientDet 目录的完整结构后续所有讲解都可以在这里找到对应实现projects/EfficientDet/ ├── README.md # 本文主体文档 ├── convert_tf_to_pt.py # TensorFlow → PyTorch 权重转换脚本 ├── configs/ │ ├── efficientdet_effb0_bifpn_8xb16-crop512-300e_coco.py # 自训练 D0 配置 │ ├── efficientdet_effb3_bifpn_8xb16-crop896-300e_coco.py # 自训练 D3 配置README 主推 │ ├── efficientdet_effb3_bifpn_8xb16-crop896-300e_coco-90cls.py │ └── tensorflow/ │ └── efficientdet_effb0_bifpn_8xb16-crop512-300e_coco_tf.py # 官方权重评测 D0 配置 └── efficientdet/ ├── __init__.py # 模块注册入口 ├── efficientdet.py # EfficientDet 检测器继承 SingleStageDetector ├── bifpn.py # BiFPN 与 BiFPNStage ├── efficientdet_head.py # EfficientDetSepBNHead分离 BN 检测头 ├── huber_loss.py # HuberLossSmooth-L1 类回归损失 ├── utils.py # Conv2dSamePadding / MaxPool2dSamePadding / 深度可分离卷积块 └── tensorflow/ # 官方权重对齐专用组件 ├── anchor_generator.py # YXYXAnchorGenerator ├── yxyx_bbox_coder.py # YXYXDeltaXYWHBBoxCoder ├── trans_max_iou_assigner.py ├── coco_90class.py # Coco90Dataset90 类 ├── coco_90metric.py # Coco90Metric └── api_wrappers/所有自定义模块统一在 efficientdet/init.py 中导出并注册到 MMDetection 的注册器MODELS、TASK_UTILS等。配置文件中通过custom_imports dict(imports[projects.EfficientDet.efficientdet], ...)显式导入该包这也是所有projects/下模型接入 MMDetection 配置体系的通用入口。三、架构源码剖析3.1 检测器主体EfficientDetefficientdet.py 中的EfficientDet类结构非常简洁——它直接继承 MMDetection 的SingleStageDetector通过MODELS.register_module()注册构造参数只有backbone、neck、bbox_head以及训练/测试/预处理配置MODELS.register_module() class EfficientDet(SingleStageDetector): def __init__(self, backbone, neck, bbox_head, train_cfgNone, test_cfgNone, data_preprocessorNone, init_cfgNone): super().__init__(backbonebackbone, neckneck, bbox_headbbox_head, train_cfgtrain_cfg, test_cfgtest_cfg, data_preprocessordata_preprocessor, init_cfginit_cfg)也就是说EfficientDet 在实现上等价于EfficientNet 主干 BiFPN 颈 锚框检测头的单阶段检测器组合完全复用SingleStageDetector的 forward / loss / predict 流程项目的工作量集中在 BiFPN 与检测头的定制上。3.2 主干与 SamePadding 卷积主干直接复用 MMClassification 的EfficientNet关键点是卷积层必须替换为Conv2dSamePadding见 utils.pyEfficientDet 采用固定输入尺寸训练D0 为 512、D3 为 896要求卷积保持same padding语义。该实现先根据输入尺寸、卷积核大小与步长动态计算四个方向的补零量extra_w (math.ceil(img_w / self.stride[1]) - 1) * self.stride[1] - img_w kernel_w left, right extra_w // 2, extra_w - extra_w // 2之后F.padF.conv2d从而保证任何输入尺寸下输出尺寸均为输入尺寸除以步长向上取整。MaxPool2dSamePadding采用同样的策略服务于 BiFPN 内部的降采样。配合variance_scaling_trunc初始化截断正态分布按 fan_in 缩放整体风格与 TensorFlow 官方实现对齐。此外项目定义了深度可分离卷积块DepthWiseConvBlock3×3 分组卷积 1×1 逐点卷积与降通道块DownChannelBlock1×1 卷积并支持conv_bn_act_pattern开关控制是否把激活层内联进块中这是与官方图结构对齐的细节。3.3 BiFPN加权双向特征金字塔BiFPN 在 bifpn.py 中由两层结构实现BiFPNMODELS.register_module()根据num_stages串起多个BiFPNStage首个 stage 的first_timeTrueforward中按start_level截取主干输出本仓库取 P3、P4、P5 三层。BiFPNStage单个融合阶段的具体计算核心是快速归一化融合fast normalized fusion。以 D3 配置num_stages6为例第一个 stage 需要把主干输出的 P3/P4/P5 扩展为 P2~P7 五个层级通过p5_to_p6降通道卷积 stride 2 池化得到 P6再经p6_to_p7得到 P7P3/P4/P5 各自经DownChannelBlock统一到out_channels。之后进入两轮融合自顶向下p6_up、p5_up、p4_up、p3_out每个高层特征经nn.Upsample(scale_factor2, modenearest)上采样后与相邻低层特征按可学习权重加权求和再过一个DepthWiseConvBlock。自底向上p4_out~p7_out低层特征经MaxPool2dSamePadding降采样后与上层特征融合同样使用独立的可学习权重。权重设计是 BiFPN 的精髓每个融合点维护一个nn.Parameter如p6_w1长度为 2、p4_w2长度为 3前向时先过 ReLU 保证非负再除以和加一个极小的epsilon默认 1e-4实现归一化p6_w1 self.p6_w1_relu(self.p6_w1) weight p6_w1 / (torch.sum(p6_w1, dim0) self.epsilon) p6_up self.conv6_up(self.combine(weight[0] * p6_in weight[1] * self.p6_upsample(p7_in)))combine在非conv_bn_act_pattern模式下插入 Swish 激活。这种学出来的重要性权重正是 BiFPN 相比传统 FPN 均匀求和的关键改进也是它用更少参数取得更好精度的原因。默认norm_cfg为dict(typeBN, momentum1e-2, eps1e-3)D3 配置中则升级为SyncBN。3.4 检测头EfficientDetSepBNHeadefficientdet_head.py 中的EfficientDetSepBNHead继承自 MMDetection 的AnchorHead核心设计是分离 BNseparate BN分类与回归两支各用独立的卷积序列cls_conv_list/reg_conv_list每层为DepthWiseConvBlockapply_normFalse而 BN 层按层级 × 卷积层分别维护cls_bn_list/reg_bn_listself.reg_bn_list nn.ModuleList([ nn.ModuleList([build_norm_layer(self.norm_cfg, num_featuresself.feat_channels)[1] for j in range(self.num_ins)]) for i in range(self.stacked_convs)])即num_ins特征层级数本项目为 5对应 P3~P7与stacked_convs构成一个 BN 矩阵前向时forward_single_bbox(feat, level_id, i)按层取对应的 BN。这样每个金字塔层都有自己独立的统计量避免了不同尺度特征共享 BN 造成的统计漂移这是 EfficientDet 训练稳定性的关键工程细节。分类与回归分支共用卷积骨架后分别通过cls_header输出num_base_priors * cls_out_channels与reg_header输出num_base_priors * 4产出 logits 与框回归量。init_weights中回归/分类卷积偏置置零分类头偏置按bias_init_with_prob(0.01)初始化先验约 1% 正样本概率与官方一致。loss_by_feat走标准 AnchorHead 流程get_anchors→get_targets→multi_apply逐层计算损失。3.5 损失函数Focal Loss Huber Loss分类用FocalLossuse_sigmoidTrue, gamma1.5, alpha0.25解决正负锚框极端不平衡回归用项目自定义的 HuberLossbeta0.1, loss_weight50即带阈值beta的分段平滑 L1 损失diff torch.abs(pred - target) loss torch.where(diff beta, 0.5 * diff * diff, beta * diff - 0.5 * beta * beta)该模块通过MODELS.register_module()注册beta0.1时对误差小于 0.1 的预测使用二次项、其余使用线性项兼顾了大误差时的鲁棒性与小误差时的梯度平滑这也是官方 TensorFlow 实现所采用的损失形式。四、官方 TensorFlow 权重评测分支README 指出官方权重训练于90 类 COCO且使用yxyx 框编码。若想直接加载 Google 官方权重复现官方结果按以下三步操作。4.1 解压权重从官方发布页下载 EfficientDet 权重压缩包后解压tar -xzvf {EFFICIENTDET_WEIGHT}4.2 安装 TensorFlow权重读取依赖 TensorFlow 的 checkpoint 解析接口README 建议安装对应版本pip install tensorflow-gpu2.6.04.3 转换为 PyTorch 权重使用项目提供的转换脚本 convert_tf_to_pt.pypython projects/EfficientDet/convert_tf_to_pt.py \ --backbone {BACKBONE_NAME} \ --tensorflow_weight {TENSORFLOW_WEIGHT_PATH} \ --out_weight {OUT_PATH}三个参数含义--backbone为 EfficientNet 模型名如efficientnet-b0--tensorflow_weight指向解压后的官方权重文件如efficientdet-d0/model--out_weight为输出的 PyTorch 权重路径。从源码看转换的核心逻辑在convert_key与tf2pth函数中维度转置TensorFlow 权重按 NHWC 布局存储tf2pth对 4 维张量执行transpose(3, 2, 0, 1)转为 PyTorch 的 NCHW对 2 维矩阵转置深度可分离卷积的 kernel 额外执行transpose(1, 0)。键名映射把官方 checkpoint 的层级名如stem/conv2d/kernel、blocks_x/...、fpn_cells/cell_x/...、box_net/...、class_net/...逐一映射到本仓库模块的backbone.layers.*、neck.bifpn.*、bbox_head.*键路径。其中 BiFPN 融合权重WSM/WSM_1/WSM_2被收集到对应 stage 的pX_wY参数中直到该 stage 所有权重齐全才写入。BiFPN 重复次数repeat_map按模型编号给出 D0~D7 的 BiFPN 重复次数D0/D1 为 3D2 为 4D3 为 5D4 为 6D5/D6 为 7D7 为 8由--backbone名称中的数字自动解析。脚本跳过ExponentialMovingAverage与global_step等非模型参数最终以{state_dict: out}形式torch.save输出。4.4 用官方权重测试在 MMDetection 仓库根目录执行${CHECKPOINT_PATH}替换为转换好的权重python tools/test.py projects/EfficientDet/configs/tensorflow/efficientdet_effb0_bifpn_8xb16-crop512-300e_coco_tf.py ${CHECKPOINT_PATH}对应评测配置 tensorflow/efficientdet_effb0_bifpn_8xb16-crop512-300e_coco_tf.py 中有三个专门为官方权重定制的组件均位于 efficientdet/tensorflow/dataset_type Coco90Dataset、evalute_type Coco90Metric官方权重面向 90 类 COCO含 person 与 vehicle 细分因此数据与指标都换用 90 类版本coco_90class.py、coco_90metric.py。YXYXAnchorGenerator与YXYXDeltaXYWHBBoxCoder官方实现采用 yxyx 格式的框编码yxyx_bbox_coder.py 中的YXYXDeltaXYWHBBoxCoder继承 MMDetection 的DeltaXYWHBBoxCoder并重写 encode/decode 为 yx 顺序。TransMaxIoUAssigner处理框格式转换的最大 IoU 分配器。该分支的模型规模为 D0num_stages3out_channels64输入 512×512下表显示其能在本仓库上复现官方精度。五、自训练复现分支仓库推荐直接使用当前实现进行训练它采用80 类 COCO 与 xyxy 编码与 MMDetection 生态默认设置一致且最终精度更高。5.1 训练命令在 MMDetection 根目录执行python tools/train.py projects/EfficientDet/configs/efficientdet_effb3_bifpn_8xb16-crop896-300e_coco.py5.2 测试命令python tools/test.py projects/EfficientDet/configs/efficientdet_effb3_bifpn_8xb16-crop896-300e_coco.py ${CHECKPOINT_PATH}六、配置文件逐项精讲自训练主配置 efficientdet_effb3_bifpn_8xb16-crop896-300e_coco.py 是理解本项目参数语义的最佳范本逐段拆解如下。6.1 基础与数据预处理_base_ [ mmdet::_base_/datasets/coco_detection.py, mmdet::_base_/schedules/schedule_1x.py, mmdet::_base_/default_runtime.py ] custom_imports dict(imports[projects.EfficientDet.efficientdet], allow_failed_importsFalse) image_size 896 batch_augments [dict(typeBatchFixedSizePad, size(image_size, image_size))]继承 MMDetection 的标准 COCO 检测数据集配置、基础 schedule 与默认运行时custom_imports保证注册本项目全部模块D3 使用896×896固定输入D0 为 512BatchFixedSizePad把 batch 内所有图补齐到固定尺寸配合后面cudnn_benchmarkTrue可以显著加速固定尺寸训练。6.2 模型定义model dict( typeEfficientDet, data_preprocessordict( typeDetDataPreprocessor, mean[123.675, 116.28, 103.53], std[58.395, 57.12, 57.375], bgr_to_rgbTrue, pad_size_divisorimage_size, batch_augmentsbatch_augments), backbonedict( typeEfficientNet, archb3, drop_path_rate0.3, out_indices(3, 4, 5), frozen_stages0, conv_cfgdict(typeConv2dSamePadding), norm_cfgdict(typeSyncBN, requires_gradTrue, eps1e-3, momentum0.01), norm_evalFalse, init_cfgdict(typePretrained, prefixbackbone, checkpoint...efficientnet-b3...pth)), neckdict( typeBiFPN, num_stages6, in_channels[48, 136, 384], out_channels160, start_level0, norm_cfgdict(typeSyncBN, ...)), bbox_headdict( typeEfficientDetSepBNHead, num_classes80, num_ins5, in_channels160, feat_channels160, stacked_convs4, norm_cfgdict(typeSyncBN, ...), anchor_generatordict( typeAnchorGenerator, octave_base_scale4, scales_per_octave3, ratios[1.0, 0.5, 2.0], strides[8, 16, 32, 64, 128], center_offset0.5), bbox_coderdict( typeDeltaXYWHBBoxCoder, target_means[.0, .0, .0, .0], target_stds[1.0, 1.0, 1.0, 1.0]), loss_clsdict(typeFocalLoss, use_sigmoidTrue, gamma1.5, alpha0.25, loss_weight1.0), loss_bboxdict(typeHuberLoss, beta0.1, loss_weight50)), train_cfgdict( assignerdict(typeMaxIoUAssigner, pos_iou_thr0.5, neg_iou_thr0.5, min_pos_iou0, ignore_iof_thr-1), samplerdict(typePseudoSampler), # Focal loss 应使用 PseudoSampler allowed_border-1, pos_weight-1, debugFalse), test_cfgdict( nms_pre1000, min_bbox_size0, score_thr0.05, nmsdict(typesoft_nms, iou_threshold0.3, sigma0.5, min_score1e-3, methodgaussian), max_per_img100))关键参数说明配置项取值D3 / D0语义与实现依据backbone.archb3/b0EfficientNet 复合缩放版本D0 输入 512、D3 输入 896backbone.out_indices(3, 4, 5)取主干倒数三层作为 P3/P4/P5对应 BiFPN 的in_channelsD3 为 [48, 136, 384]backbone.drop_path_rate0.3/0.2Stochastic Depth 的 drop path 概率随模型规模增大而增大neck.num_stages6/3BiFPN 重复融合次数见 bifpn.py 的repeat_mapneck.out_channels160/64BiFPN 统一输出通道也是检测头in_channelshead.num_ins5P3~P7 五个金字塔层级驱动分离 BN 矩阵规模head.stacked_convs4/3分类/回归共享卷积的堆叠层数anchor_generator尺度 4、每倍频 3 尺度、比例 [1, 0.5, 2]、stride [8..128]每层 9 个锚框与官方一致train_cfg.assignerMaxIoUpos/neg 阈值均 0.5正负样本划分PseudoSampler配合 Focal Loss全样本参与、由损失自动加权test_cfg.nmssoft-NMSiou_threshold0.3, sigma0.5, methodgaussian高斯 soft-NMS 后处理nms_pre1000先截断再精排max_per_img100注意init_cfg中prefixbackbone因为预训练权重来自 MMClassification 的 EfficientNet键名前缀不同转换时统一挂到backbone.*命名空间下。6.3 数据流水线train_pipeline [ dict(typeLoadImageFromFile, backend_args{{_base_.backend_args}}), dict(typeLoadAnnotations, with_bboxTrue), dict(typeRandomResize, scale(image_size, image_size), ratio_range(0.1, 2.0), keep_ratioTrue), dict(typeRandomCrop, crop_size(image_size, image_size)), dict(typeRandomFlip, prob0.5), dict(typePackDetInputs) ] test_pipeline [ dict(typeLoadImageFromFile, backend_args{{_base_.backend_args}}), dict(typeResize, scale(image_size, image_size), keep_ratioTrue), dict(typeLoadAnnotations, with_bboxTrue), dict(typePackDetInputs, meta_keys(img_id, img_path, ori_shape, img_shape, scale_factor)) ]训练采用随机缩放0.1~2.0 比例范围 固定尺寸裁剪的增强组合RandomCrop裁到image_size确保与BatchFixedSizePad和pad_size_divisor兼容测试仅做固定尺寸 Resize。train_dataloader为batch_size16、num_workers8。6.4 优化与学习率optim_wrapper dict( optimizerdict(lr0.16, weight_decay4e-5), paramwise_cfgdict(norm_decay_mult0, bias_decay_mult0, bypass_duplicateTrue), clip_graddict(max_norm10, norm_type2)) param_scheduler [ dict(typeLinearLR, start_factor0.1, by_epochFalse, begin0, end917), dict(typeCosineAnnealingLR, eta_min0.0, begin1, T_max299, end300, by_epochTrue, convert_to_iter_basedTrue) ] train_cfg dict(max_epochs300, val_interval1)基础学习率0.16配合auto_scale_lr dict(base_batch_size128)8 GPU × 16 每卡自动缩放权重衰减 4e-5BN 与偏置参数不做权重衰减norm_decay_mult0, bias_decay_mult0梯度裁剪上限 10调度为前 917 个 iter 线性 warmup起始 0.1 倍 余弦退火到 0总训练 300 epoch每 epoch 验证一次。6.5 EMA 与运行时default_hooks dict(checkpointdict(typeCheckpointHook, interval15)) custom_hooks [ dict(typeEMAHook, ema_typeExpMomentumEMA, momentum0.0002, update_buffersTrue, priority49) ] env_cfg dict(cudnn_benchmarkTrue)训练启用指数滑动平均EMAmomentum0.0002稳定精度每 15 epoch 保存一次 checkpointcudnn_benchmarkTrue对固定 896 输入可加速卷积算子搜索配置注释明确说明可以加速固定尺寸训练。可视化同时开启 Local 与 TensorBoard 后端。七、实验结果与复现对照README 的 Results 表格记录了本项目与官方精度的对齐情况均为 COCO2017 Train 训练、Val 测试、300 epoch、ImageNet 预训练主干方法Backbone训练集测试集EpochVal Box AP官方 APefficientdet-d0*efficientnet-b0COCO2017 TrainCOCO2017 Val30034.434.3efficientdet-d3efficientnet-b3COCO2017 TrainCOCO2017 Val30047.246.8注标*的 D0 行表示使用官方 TensorFlow 权重直接测试走 tensorflow/efficientdet_effb0_bifpn_8xb16-crop512-300e_coco_tf.py 评测流程因此无需训练D3 行则是按本仓库配置从零训练得到的结果且47.2 高于官方 46.8——这正是 README 推荐当前实现版本80 类、xyxy 编码的原因。预训练模型与训练日志可通过 OpenMMLab 官方模型下载渠道获取模型名对应efficientdet_effb3_bifpn_8xb16-crop896-300e_coco。同时该模型已同步到 configs/efficientdet仓库根目录下的标准配置目录说明其已达到可融入核心包之外、被社区直接使用的成熟度。八、扩展说明依赖与前置条件本项目运行依赖 MMDetection v3.x、MMCV 与 MMEnginePyTorch 环境需保证安装版本与custom_imports导入的projects.EfficientDet.efficientdet包兼容官方权重分支额外依赖 TensorFlowREADME 指定tensorflow-gpu2.6.0用于 checkpoint 读取仅在需要转换官方权重时安装训练 D3896×896、batch 16对显存要求较高README 中的auto_scale_lr.base_batch_size128表示该学习率配置对应 8 卡场景减少卡数时应保持每卡 16 张、总 batch 128的比例或显式缩放学习率。九、引用复现与撰写本指南所依据的论文inproceedings{tan2020efficientdet, title{Efficientdet: Scalable and efficient object detection}, author{Tan, Mingxing and Pang, Ruoming and Le, Quoc V}, booktitle{Proceedings of the IEEE/CVF conference on computer vision and pattern recognition}, pages{10781--10790}, year{2020} }十、延伸阅读路径想深入源码细节推荐按以下顺序阅读本仓库相关文件projects/EfficientDet/README.md——项目总览、命令与结果表efficientdet/bifpn.py——BiFPN 加权融合与特征层级构建efficientdet/efficientdet_head.py——分离 BN 检测头与损失计算efficientdet/utils.py——SamePadding 卷积、深度可分离卷积与初始化convert_tf_to_pt.py——TensorFlow 权重转 PyTorch 的完整键映射逻辑efficientdet/tensorflow/——90 类数据集/指标、yxyx 编码与分配器efficientdet_effb3_bifpn_8xb16-crop896-300e_coco.py——D3 自训练完整配置tensorflow/efficientdet_effb0_bifpn_8xb16-crop512-300e_coco_tf.py——官方权重评测配置。赞分享人工智能计算机视觉深度学习模型评测【免费下载链接】mmdetectionOpenMMLab Detection Toolbox and Benchmark项目地址https://gitcode.com/gh_mirrors/mm/mmdetection点击查看免费下载相关推荐MMDetection 中的 Feature Pyramid GridsFPG多路径特征金字塔网格的原理、配置解析与实战MMDetection 中的 Feature Pyramid GridsFPG多路径特征金字塔网格的原理、配置解析与实战 导读 Feature Pyram人工智能计算机视觉深度学习模型评测EfficientDet骨干网络深度解析BiFPN架构与实现原理EfficientDet骨干网络深度解析BiFPN架构与实现原理 EfficientDet作为当前目标检测领域的SOTA模型其核心创新在于高效的骨干网络设计计算机视觉深度学习模型mmdetection 中的 NAS-FPN可扩展特征金字塔架构的原理、源码与配置实战mmdetection 中的 NAS FPN可扩展特征金字塔架构的原理、源码与配置实战 NAS FPNNeural Architecture Search人工智能计算机视觉深度学习模型评测创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考