尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

从零构建强基线:MMDetection Strong Baselines 的 LSJ 大规模抖动与长周期训练策略全解析

从零构建强基线:MMDetection Strong Baselines 的 LSJ 大规模抖动与长周期训练策略全解析 从零构建强基线MMDetection Strong Baselines 的 LSJ 大规模抖动与长周期训练策略全解析【免费下载链接】mmdetectionOpenMMLab Detection Toolbox and Benchmark项目地址: https://gitcode.com/gh_mirrors/mm/mmdetection导读本文围绕 MMDetection 仓库中configs/strong_baselines/目录下的 Strong Baselines 配置族展开系统讲解如何在 Mask R-CNN 上复现 Detectron2 提出的 new baselines 强基线方案即采用LSJLarge-Scale Jittering大规模随机抖动数据增强与更长训练周期50e/100e/400e并配合 RPN 双卷积、4 卷积 1 全连接检测头、全网络 SyncBN 等结构改动。读完本文你将掌握这套配置的每一处参数含义、从零训练的实现细节、caffe/pytorch 与 AMP 混合精度变体的差异以及训练时关于空 proposal 与 MMSyncBN 的关键注意事项并可直接复制文中命令在自己的数据集上复现。一、背景为什么要构建 Strong Baselines对象检测与实例分割领域长期存在一个现象很多新方法声称超越基线但对比的往往是未经充分调优的旧基线导致结论失真。Detectron2 团队在new_baselines目录中给出了答案——通过统一且更充分的训练设置把标准 Mask R-CNN 的精度提升到与许多新方法接近甚至相当的水平从而为公平对比提供可靠基准。MMDetection 的configs/strong_baselines/正是对这一思想的官方移植其做法可以概括为四点LSJ 大规模抖动训练时将图像随机缩放到原始尺寸的0.1x ~ 2.0x再随机裁剪到固定大小1024x1024极大增强尺度鲁棒性长训练周期配合RepeatDataset将数据重复打包实现 50e、100e 乃至 400e 的超长训练头部结构强化RPN 由 1 个卷积升级为 2 个卷积box head 由Shared2FCBBoxHead升级为Shared4Conv1FCBBoxHead4 卷积 1 全连接全网络使用 SyncBN从零训练init_cfgNone不加载 ImageNet 预训练权重直接以 8x V100 从零训练以检验结构本身的表征能力。二、配置族全景文件清单与对应关系configs/strong_baselines/目录共包含 6 份实例化配置外加metafile.yml模型索引按 backbone 风格与训练周期可划分为三组配置文件名仓库相对路径骨干风格周期特色mask-rcnn_r50_fpn_rpn-2conv_4conv1fc_syncbn-all_lsj-50e_coco.pypytorch50e基础短周期mask-rcnn_r50_fpn_rpn-2conv_4conv1fc_syncbn-all_lsj-100e_coco.pypytorch100e标准周期mask-rcnn_r50_fpn_rpn-2conv_4conv1fc_syncbn-all_amp-lsj-100e_coco.pypytorch100eAMP 混合精度版mask-rcnn_r50-caffe_fpn_rpn-2conv_4conv1fc_syncbn-all_lsj-100e_coco.pycaffe100eCaffe 风格归一化 独立管线mask-rcnn_r50-caffe_fpn_rpn-2conv_4conv1fc_syncbn-all_amp-lsj-100e_coco.pycaffe100eCaffe 风格 AMPmask-rcnn_r50-caffe_fpn_rpn-2conv_4conv1fc_syncbn-all_lsj-400e_coco.pycaffe400e超长周期RepeatDataset×16配置继承链清晰所有100e配置直接继承 common/lsj-100e_coco-instance.py 与基础模型 configs/base/models/mask-rcnn_r50_fpn.py50e与400e则再叠加继承自100e配置只通过修改RepeatDataset的times参数改变训练周期amp版本仅追加一行optim_wrapper配置。三、LSJ 数据管线从 0.1x 到 2.0x 的尺度冲击LSJ 的核心是把尺度增强做到极致。以 lsj-100e_coco-instance.py 与 caffe 版配置中的train_pipeline为例其训练流程为train_pipeline [ dict(typeLoadImageFromFile, backend_argsbackend_args), dict(typeLoadAnnotations, with_bboxTrue, with_maskTrue), dict( typeRandomResize, scaleimage_size, # (1024, 1024) ratio_range(0.1, 2.0), # 随机缩放到原图 10% ~ 200% keep_ratioTrue), dict( typeRandomCrop, crop_typeabsolute_range, crop_sizeimage_size, # 裁剪出固定 1024x1024 区域 recompute_bboxTrue, # 裁剪后重算边界框 allow_negative_cropTrue), # 允许完全不含目标的裁剪 dict(typeFilterAnnotations, min_gt_bbox_wh(1e-2, 1e-2)), # 过滤过小 GT dict(typeRandomFlip, prob0.5), dict(typePackDetInputs) ]各环节的作用可逐条解读RandomResize的ratio_range(0.1, 2.0)是 LSJ 的抖动本体。传统多尺度训练如 ms_3x_coco.py通常在0.5x ~ 1.75x区间做离散采样而 LSJ 将下限压到0.1x、上限拉到2.0x迫使模型在同一张图上同时见到被缩小 10 倍的微小目标和放大 2 倍的局部特写。RandomCrop的crop_typeabsolute_range直接裁出1024x1024的固定区域allow_negative_cropTrue允许裁剪结果不含任何 GT这是为了配合FilterAnnotations保留纯背景样本增强模型判别能力recompute_bboxTrue保证裁剪后边界框坐标同步修正。FilterAnnotations(min_gt_bbox_wh(1e-2, 1e-2))剔除裁剪后宽高小于 0.01 像素的退化标注避免极小目标给损失带来噪声。BatchFixedSizePad把 Batch 内图像对齐到固定尺寸由于 LSJ 下同一 batch 内各图缩放比例随机图像尺寸五花八门必须在对齐后才能批量前向。配置通过data_preprocessor注入batch_augmentsimage_size (1024, 1024) batch_augments [ dict(typeBatchFixedSizePad, sizeimage_size, pad_maskTrue) ]该模块的实现位于 mmdet/models/data_preprocessors/data_preprocessor.py。从源码看BatchFixedSizePad在forward中先比较输入张量与目标尺寸若src_h dst_h and src_w dst_w则原样返回否则用F.pad以常量 0 补齐宽高并同步更新data_samples的batch_input_shape元信息。pad_maskTrue表示实例分割掩码也同步填充这正是实例分割任务比纯检测多出的关键一步——否则 mask 与图像尺寸失配。值得注意训练时该 pad 以1024x1024为统一尺寸而测试阶段仍使用Resize(scale(1333, 800), keep_ratioTrue)的标准短边策略并通过pad_size_divisor32保证特征图可被 FPN 下采样整除。配置文件中的注释也明确指出pad_size_divisor32在训练中非必需但在测试中是必需的。四、模型结构改动更强的 RPN、更强的检测头、全网络 SyncBNStrong Baselines 并非只换数据增强网络结构也做了三处关键升级。以 mask-rcnn_r50_fpn_rpn-2conv_4conv1fc_syncbn-all_lsj-100e_coco.py 为例norm_cfg dict(typeSyncBN, requires_gradTrue) # 使用能处理空张量的 MMSyncBN待 pytorch issue #36530 修复后可换回 SyncBN head_norm_cfg dict(typeMMSyncBN, requires_gradTrue) model dict( data_preprocessordict( pad_size_divisor32, batch_augmentsbatch_augments), backbonedict( frozen_stages-1, norm_evalFalse, norm_cfgnorm_cfg, init_cfgNone), neckdict(norm_cfgnorm_cfg), rpn_headdict(num_convs2), # RPN 由 1 卷积升级为 2 卷积注释标明约带来 0.1 mAP roi_headdict( bbox_headdict( typeShared4Conv1FCBBoxHead, conv_out_channels256, norm_cfghead_norm_cfg), mask_headdict(norm_cfghead_norm_cfg)))逐项解析rpn_headdict(num_convs2)对比基础配置 mask-rcnn_r50_fpn.py 中默认的 1 卷积 RPN这里增加一个卷积层以提升候选框质量。配置文件注释明确标注leads to 0.1 mAP。Shared4Conv1FCBBoxHead将基础版Shared2FCBBoxHead2 个全连接替换为 4 卷积 1 全连接结构conv_out_channels256。卷积层能更好地保留空间信息对 LSJ 引入的极端尺度变化更鲁棒。全网络 SyncBNbackbone、neck、mask_head全部替换为 SyncBN且backbone设置frozen_stages-1不冻结任何 stage、norm_evalFalseBN 统计量随训练更新——这是从零训练的关键配套没有预训练权重全部归一化层都必须全程参与梯度更新。init_cfgNone从零训练基础配置默认加载torchvision://resnet50预训练权重见 mask-rcnn_r50_fpn.py而这里显式置空配合 8x V100 的大规模并行训练验证纯随机初始化 长周期 LSJ能否逼近预训练方案。caffe 变体的差异caffe 风格的 mask-rcnn_r50-caffe_fpn_rpn-2conv_4conv1fc_syncbn-all_lsj-100e_coco.py 与 pytorch 版有三处不同data_preprocessor使用 caffe 系归一化mean[103.530, 116.280, 123.675]、std[1.0, 1.0, 1.0]、bgr_to_rgbFalsebackbone追加stylecaffe对应 caffe 风格的 ResNet 下采样实现显式重写了train_pipeline/test_pipeline其内容与公共配置一致只是以{{_base_.backend_args}}方式引用基础配置的backend_args并完整内联了 LSJ 流程。五、训练策略RepeatDataset × 超长周期 × 学习率调度用 RepeatDataset 撑起 400eLSJ 训练最耗时MMDetection 用RepeatDatasetMMEngine 提供的数据集包装器把 COCO 训练集重复打包避免自定义周期轮数逻辑100e基础版times4max_epochs25即25 × 4 100个 epoch 的实际训练量见 lsj-100e_coco-instance.py50e版仅改times2mask-rcnn_r50_fpn_rpn-2conv_4conv1fc_syncbn-all_lsj-50e_coco.py400e版改times4 * 4 16注释明确说明从 100e 的 4 倍提升到 400e 的 16 倍mask-rcnn_r50-caffe_fpn_rpn-2conv_4conv1fc_syncbn-all_lsj-400e_coco.py。优化器与学习率调度公共配置 lsj-100e_coco-instance.py 给出了完整的训练超参其前提是总 batch size 6432 GPU × 2 张/卡optim_wrapper dict( typeOptimWrapper, optimizerdict(typeSGD, lr0.1, momentum0.9, weight_decay0.00004)) param_scheduler [ dict( typeLinearLR, start_factor0.067, by_epochFalse, begin0, end500), dict( typeMultiStepLR, begin0, endmax_epochs, by_epochTrue, milestones[22, 24], # 在 22、24 epoch 处各降 10 倍 gamma0.1) ]两段式调度的含义LinearLR预热前 500 次迭代内学习率从0.1 × 0.067 ≈ 0.0067线性升到0.1。从零训练时梯度噪声大预热是稳定训练的关键MultiStepLR衰减在第 22、24 个 epoch 分两次各降为原来的 0.1 倍注意这里仍以max_epochs25为基准配合 RepeatDataset 实现每 25 个 epoch 一个完整数据周期。在400e配置中这两个调度器被同步放大LinearLR的end变为500 * 4MultiStepLR的end变为 12milestones 调整为[22, 24]相对 400e 总周期。同时配置通过auto_scale_lr dict(base_batch_size64)声明了学习率缩放基准——当你的 batch size 不是 64 时MMEngine 的auto_scale_lr会按比例自动换算学习率用户不应手动修改该字段。另外default_hooks dict(checkpointdict(max_keep_ckpts2))只保留最近 2 个 checkpoint避免 400e 长训练撑爆磁盘。AMP 变体amp版配置如 mask-rcnn_r50_fpn_rpn-2conv_4conv1fc_syncbn-all_amp-lsj-100e_coco.py仅追加一行optim_wrapper dict(typeAmpOptimWrapper)即通过自动混合精度FP16 计算 FP32 主权重减少显存占用、加速训练其余配置与对应 LSJ 100e 版本完全一致适合在 LSJ 大图 大 batch 场景下缓解显存压力。六、基准结果与评估原文档给出的结果表如下box AP为检测精度mask AP为分割精度两者均在 COCO val2017 上以CocoMetric的[bbox, segm]双指标评测BackboneStyleLr schdbox APmask APR-50-FPNpytorch50eR-50-FPNpytorch100eR-50-FPNcaffe100e44.740.4R-50-FPNcaffe400e表中caffe 100e 的结果为 box AP 44.7 / mask AP 40.4该数值同样记录在 metafile.yml 中Training Resources: 8x V100 GPUs训练技术包含 SGD with Momentum、Weight Decay、LSJ。需要说明的是其余三行pytorch 50e/100e、caffe 400e在原文档中并未给出具体数值此处不做任何推测性补全。对照 Detectron2 的对应报告44.7/40.4 已接近甚至超过许多同期新方法论文公布的 Mask R-CNN 基线这正是强基线的实证价值。评测配置继承自 lsj-100e_coco-instance.pyval_evaluator使用CocoMetric并同时计算bbox与segm两类指标test_dataloader直接复用val_dataloader。七、训练与验证实操单机多卡训练在仓库根目录执行需先将 COCO 数据按data/coco/组织为annotations/instances_train2017.jsontrain2017/图片# 8 卡训练 caffe 100e 强基线 bash tools/dist_train.sh \ configs/strong_baselines/mask-rcnn_r50-caffe_fpn_rpn-2conv_4conv1fc_syncbn-all_lsj-100e_coco.py \ 8入口脚本为 tools/dist_train.sh底层调用 tools/train.py。若显存有限可改用 AMP 版配置mask-rcnn_r50_fpn_rpn-2conv_4conv1fc_syncbn-all_amp-lsj-100e_coco.py或自行降低单卡 batch size 并依赖auto_scale_lr(base_batch_size64)自动换算学习率。测试与指标复现# 用训练产出的最佳 checkpoint 评测 bash tools/dist_test.sh \ configs/strong_baselines/mask-rcnn_r50-caffe_fpn_rpn-2conv_4conv1fc_syncbn-all_lsj-100e_coco.py \ checkpoint路径 \ 8评测入口为 tools/test.py将输出 val2017 上的 box AP 与 mask AP用于与上表数值对照。八、注意事项空 Proposal 与 MMSyncBN原文档的 Notice 是这套配置最容易踩坑的地方务必阅读当使用大规模抖动LSJ训练时box head 与 mask head 中有时会出现空 proposalempty proposals。这要求使用支持空张量的 MMSyncBN。因此请使用 mmcv-full1.3.14 来训练本目录下的模型。产生空 proposal 的机理是allow_negative_cropTrueFilterAnnotations过滤后某些裁剪 patch 中可能没有目标RoI 采样阶段便可能得到 0 个正/负样本此时常规SyncBN在空张量上计算均值/方差会直接报错而MMSyncBNmmcv 提供的可处理空张量版本能安全跳过。这也解释了为何配置中 head 部分单独使用head_norm_cfg dict(typeMMSyncBN, requires_gradTrue)而非与其他层共用普通SyncBN——配置注释说明待 PyTorch 官方修复相关问题issue #36530后可整体换回SyncBN。两点版本提示以当前仓库为准原 README 中的mmcv-full1.3.14是 MMDetection 2.x 时代的说明当前仓库为 3.x 架构mmdet/models、mmdet/engine、mmdet/structures布局实际安装请遵循仓库根目录 requirements.txt 与 setup.py 中锁定的 mmengine/mmcv 版本配置中MMSyncBN的实现在本仓库mmdet/源码内已不存在说明该能力当前由 mmcv 提供使用时以实际安装的 mmcv 为准。从零训练init_cfgNone意味着收敛速度远慢于预训练方案务必保证 8 卡及以上的并行规模与足够的总 batch size否则难以达到表中 44.7/40.4 的水平单卡小 batch 场景建议直接改用带预训练的 mask-rcnn_r50_fpn_ms-poly-3x_coco.py 等常规强基线。九、参考文件索引配置族入口configs/strong_baselines/LSJ 公共训练配置configs/common/lsj-100e_coco-instance.py基础模型定义被继承并覆盖configs/base/models/mask-rcnn_r50_fpn.pyBatchFixedSizePad源码mmdet/models/data_preprocessors/data_preprocessor.py模型元数据含 44.7/40.4 结果configs/strong_baselines/metafile.yml训练/测试入口tools/train.py、tools/test.py、tools/dist_train.sh、tools/dist_test.sh结语Strong Baselines 配置族是理解公平对比与现代训练技巧的绝佳范本LSJ 解决尺度多样性长周期解决从零训练的收敛结构升级解决头部容量而 MMSyncBN 解决极端增强下的数值稳定性。无论你是要复现论文基线、评估新方法还是为自定义数据集寻找高精度起点都可以基于configs/strong_baselines/快速搭建——只需修改data_root、ann_file与num_classes即可将这套强基线迁移到自己的检测/分割任务上。【免费下载链接】mmdetectionOpenMMLab Detection Toolbox and Benchmark项目地址: https://gitcode.com/gh_mirrors/mm/mmdetection创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表