ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

MMDetection 中的 Feature Pyramid Grids(FPG):多路径特征金字塔网格的原理、配置解析与实战

MMDetection 中的 Feature Pyramid Grids(FPG):多路径特征金字塔网格的原理、配置解析与实战 MMDetection 中的 Feature Pyramid GridsFPG多路径特征金字塔网格的原理、配置解析与实战【免费下载链接】mmdetectionOpenMMLab Detection Toolbox and Benchmark项目地址: https://gitcode.com/gh_mirrors/mm/mmdetection导读Feature Pyramid GridsFPG是 MMDetection 中一个以网格化方式组织多尺度特征的金字塔结构 Neck它把特征尺度空间表示为若干条并行自底向上路径组成的规则网格并通过多方向横向连接融合路径间信息在相近计算代价下显著提升单路径 FPN 的检测精度。本文以仓库 configs/fpg/README.md 为主线结合 FPG 源码实现 与 configs/fpg/ 下的全套配置系统讲解 FPG 的设计思想、核心参数、crop640-50e 训练调度、FPG-chn128 内存压缩变体以及训练与评测的完整流程。一、FPG 是什么从 FPN 到特征金字塔网格1.1 背景单路径 FPN 的局限FPNFeature Pyramid Network通过一条自底向上bottom-up路径提取特征、一条自顶向下top-down路径传递高层语义是目标检测中最广泛采用的多尺度特征结构。但这种单路径结构对尺度空间的特征表达能力有限——不同尺度的信息只在相邻层级间流动深层金字塔表示deep pyramid representation的潜力没有被充分利用。1.2 FPG 的核心思想FPG论文Feature Pyramid GridsChen Kai 等arXiv:2004.03580提出了完全不同的组织方式规则网格将特征尺度空间表示为一个规则网格其中包含多条并行的自底向上路径即网格的列每条路径都覆盖完整的尺度层级网格的行多方向横向连接路径之间通过多方向的横向连接lateral connections进行融合信息可以在同尺度间across-pathway same-stage、跨尺度间down/up自由流动深层金字塔通过堆叠多轮路径 融合操作构建一个深度多路径金字塔从而在相近计算代价下获得比单路径 FPN 更强的特征表示。与神经网络搜索NAS得到的复杂结构相比FPG 结构统一、无需搜索即可获得有竞争力的性能因而可以作为目标识别领域后续工作的通用组件。二、MMDetection 中的实现源码级剖析FPG 的完整实现位于 mmdet/models/necks/fpg.py通过MODELS.register_module()注册为FPG可直接在配置的model.neck.type中引用。整个文件由三类过渡模块Transition和一个主干类组成。2.1 三种可插拔的过渡模块Transition源码将路径之间的连接抽象为Transition基类fpg.py#L10-L24并内置了三种具体实现模块源码位置功能UpInterpolationConv类型名interpolation_convfpg.py#L27-L70先按scale_factor默认 2与mode默认nearest做插值上采样再用一个卷积默认 kernel_size3精修特征用于自顶向下路径的跨尺度连接LastConv类型名last_convfpg.py#L73-L101接收num_inputs个输入所有 stack 层同一尺度的输出仅对最后一个输入做卷积精修用于输出过渡层ConvModule类型名convmmcv 通用卷积模块普通卷积含可选 norm/act用于同路径内的尺度变换、同尺度横向融合等这三者通过FPG.transition_types字典fpg.py#L144-L148映射用户在配置中通过type字段选择从而可以自定义新的过渡模块来充分探索 FPG 结构的潜力源码 docstring 亦明确说明这一点。2.2 FPG 主干的构造逻辑在FPG.__init__fpg.py#L150-L315中结构构建分为四步lateral_convs对每个 backbone 输入层级构造 1×1 卷积把 backbone 各层通道统一到inter_channelsextra_downsamples若num_outs大于 backbone 层级数为多余的层级生成下采样add_extra_convsTrue时用 stride2 的 3×3 卷积否则用MaxPool2d(1, stride2)fpn_transitions按stack_times×num_outs构造每个 stage、每个尺度上的五类连接模块same_up、same_down同一路径内跨尺度、across_lateral路径间同尺度、across_down、across_up路径间跨尺度、across_skip跳过连接output_transition为每个输出尺度构造output_trans默认last_conv融合该尺度在所有 stack 层的输出。2.3 前向计算流程forwardfpg.py#L333-L406的流程与论文结构严格对应用 lateral 卷积与 extra downsample 生成初始网格feats按paths指定的方向逐 stack 迭代每一轮先按方向bu从低层到高层、td从高层到低层遍历各尺度把同路径上一步输出same 上轮同尺度lateral 路径间跨尺度上下采样across_up/across_down 跳过连接across_skip通过fuse逐元素相加fpg.py#L323-L331融合最后一轮对每个尺度收集所有 stack 的输出列表交给output_transition生成最终多尺度输出。需要注意的是skip_inds指定的 stage 会直接旁路复制上一轮输出fpg.py#L351-L353这是控制连接密度的关键参数。三、核心配置参数详解FPG 的构造函数参数即配置参数含义与默认值整理如下依据 fpg.py#L150-L179参数类型默认值说明in_channelslist[int]必填backbone 各层输入通道数必须是 list源码有assert isinstance(in_channels, list)out_channelsint必填最终每个尺度的输出通道数num_outsint必填输出尺度数stack_timesint必填金字塔结构堆叠轮数pathslist[str]必填每轮的路径方向元素只能为bu自底向上或td自顶向下长度必须等于stack_timesinter_channelsint/list[int]None中间特征通道数None 时取out_channels可传与num_outs等长的 list 实现逐尺度差异化same_down_transdictNone同一路径内自顶向下的过渡same_up_transdictdict(typeconv, kernel_size3, stride2, padding1)同一路径内自底向上的过渡across_lateral_transdictdict(typeconv, kernel_size1)路径间同尺度横向连接across_down_transdictdict(typeconv, kernel_size3)路径间自顶向下连接across_up_transdictNone路径间自底向上连接across_skip_transdictdict(typeidentity)路径间跳过连接默认恒等映射output_transdictdict(typelast_conv, kernel_size3)最后一级输出过渡start_levelint0使用的第一个 backbone 层索引end_levelint-1使用的最后一个 backbone 层索引不含-1 表示最后一级此时num_outs num_ins - start_leveladd_extra_convsboolFalse是否用卷积为额外层级下采样False 时用 MaxPoolnorm_cfgdictNone归一化配置为 None 时卷积不带 bias源码self.with_bias norm_cfg is Noneskip_indslist[tuple]None每级跳过的 stack 索引当across_skip_trans非 None 时必须指定且每项长度不超过stack_times参数间存在严格约束违反会直接触发断言AssertionErrorend_level必须在[-1, num_ins-1]范围内显式指定非最后一层时要求num_outs end_level - start_level 1skip_inds中每一项的元素个数不得超过stack_times。这些约束均有测试用例覆盖见下文第六节。四、实战配置全解析4.1 基础配置Faster R-CNN FPGcrop640-50eFPG 的全部实验采用 NAS-FPN 引入的 crop 训练新调度crop training、大批量、BN 不冻结、50 epoch基础模型为 pytorch 风格的 ResNet-50。完整配置见 configs/fpg/faster-rcnn_r50_fpg_crop640-50e_coco.py其继承链为faster-rcnn_r50_fpg_crop640-50e_coco.py └── faster-rcnn_r50_fpn_crop640-50e_coco.py本目录内的 FPN 基线 ├── configs/_base_/models/faster-rcnn_r50_fpn.py ├── configs/_base_/datasets/coco_detection.py ├── configs/_base_/schedules/schedule_1x.py └── configs/_base_/default_runtime.pyFPG 核心片段继承 faster-rcnn_r50_fpn_crop640-50e_coco.py 后仅覆盖neckmodel dict( neckdict( typeFPG, in_channels[256, 512, 1024, 2048], # ResNet-50 C2~C5 out_channels256, inter_channels256, num_outs5, stack_times9, paths[bu] * 9, same_down_transNone, same_up_transdict( typeconv, kernel_size3, stride2, padding1, norm_cfgnorm_cfg, inplaceFalse, order(act, conv, norm)), across_lateral_transdict( typeconv, kernel_size1, norm_cfgnorm_cfg, inplaceFalse, order(act, conv, norm)), across_down_transdict( typeinterpolation_conv, modenearest, kernel_size3, norm_cfgnorm_cfg, order(act, conv, norm), inplaceFalse), across_up_transNone, across_skip_transdict( typeconv, kernel_size1, norm_cfgnorm_cfg, inplaceFalse, order(act, conv, norm)), output_transdict( typelast_conv, kernel_size3, order(act, conv, norm), inplaceFalse), norm_cfgnorm_cfg, skip_inds[(0, 1, 2, 3), (0, 1, 2), (0, 1), (0, ), ()]))要点解读norm_cfg dict(typeBN, requires_gradTrue)同时 backbone 设置norm_evalFalse即训练全程不冻结 BN全配置统一使用order(act, conv, norm)即先激活、再卷积、后归一化的 ConvModule 执行顺序same_up_trans用 stride2 的 3×3 卷积实现同路径自底向上的尺度变换across_down_trans用interpolation_convnearest 上采样 3×3 卷积实现路径间自顶向下across_up_transNone关闭路径间自底向上skip_inds[(0,1,2,3), (0,1,2), (0,1), (0,), ()]表示第 0 层在 stack 0~3 被跳过、第 1 层在 stack 0~2 被跳过……最高层从不跳过以此调控各尺度的融合密度。4.2 crop640 训练调度NAS-FPN 风格基线与调度的细节都定义在 faster-rcnn_r50_fpn_crop640-50e_coco.py 中FPG 配置直接继承无需重复书写输入尺寸与增强image_size (640, 640)data_preprocessor设置pad_size_divisor64并启用BatchFixedSizePad批级填充训练采用RandomResizescale 640ratio_range(0.8, 1.2)keep_ratioTrueRandomCropcrop_typeabsolute_rangeallow_negative_cropTrueRandomFlip数据加载train_dataloaderbatch_size8、num_workers48 卡共 64学习率调度前 1000 iter 使用LinearLRstart_factor0.1warmup之后MultiStepLR在 epoch 30/40 处以 gamma0.1 阶梯下降共 50 epochval_interval2优化器SGDlr0.08, momentum0.9, weight_decay0.0001paramwise_cfg中norm_decay_mult0使 BN 参数不衰减自动学习率缩放auto_scale_lr dict(base_batch_size64)改变批大小后可用工具自动换算学习率源码注释提醒用户勿手改该值。4.3 Mask R-CNN 与 RetinaNet 变体Mask R-CNN FPGmask-rcnn_r50_fpg_crop640-50e_coco.py 以mask-rcnn_r50_fpn_crop640-50e_coco.py为基neck 配置与 Faster R-CNN 完全一致num_outs5, stack_times9, paths[bu]*9验证 FPG 在实例分割上的迁移能力RetinaNet FPGretinanet_r50_fpg_crop640_50e_coco.py 直接以 configs/nas_fpn/retinanet_r50_nasfpn_crop640-50e_coco.py 为基并通过_delete_True删除 NAS-FPN 的 neck 替换为 FPG同时设置了start_level1与add_extra_convsTrue从 C2 起使用额外层级用卷积下采样说明同一 FPG 模块可以灵活适配不同检测头与 backbone 取用层级。五、FPG-chn128以少量精度换大幅内存FPG 的计算/内存开销较高README 中特别解释了 Chn128 的含义将 Neck 与 BBox Head 中特征与卷积的通道数从默认 256 降至 128可大幅降低显存消耗而几乎不损失精度。以 faster-rcnn_r50_fpg-chn128_crop640-50e_coco.py 为例它继承完整 FPG 配置后仅需五处覆盖model dict( neckdict(out_channels128, inter_channels128), rpn_headdict(in_channels128), roi_headdict( bbox_roi_extractordict(out_channels128), bbox_headdict(in_channels128)))这种窄通道 完整网格结构的组合使得 FPG-chn128 的显存占用几乎与 FPN 基线持平详见下表是显存受限场景下使用 FPG 的首选形态。六、实验结果与模型基准README 的实验统一在 NAS-FPN 引入的 crop-640、50 epoch 调度下进行backbone 均为 pytorch 风格 ResNet-50。指标、显存与配置文件汇总如下MethodNeckLr schdMem (GB)box APmask APConfigFaster R-CNNFPG50e20.042.3-configFaster R-CNNFPG-chn12850e11.941.2-configFaster R-CNNFPN50e20.038.9-configMask R-CNNFPG50e23.243.038.1configMask R-CNNFPG-chn12850e15.341.737.1configMask R-CNNFPN50e23.249.635.6configRetinaNetFPG50e20.840.5-configRetinaNetFPG-chn12850e19.939.9-config观察要点数据均来自 configs/fpg/README.mdFaster R-CNN 上 FPG 较同调度的 FPN 基线提升 3.4 个 box AP42.3 vs 38.9且显存占用相同均为 20.0 GB直观印证相近计算代价、更高性能的论文结论FPG-chn128 以约 1 个点左右的 box AP 换取显存近乎减半Faster R-CNN20.0 → 11.9 GBMask R-CNN23.2 → 15.3 GB训练资源配置为 8×V100 GPU见 configs/fpg/metafile.yml 的元数据预训练权重与训练日志均可通过各配置对应的 Download 链接获取模型元信息统一登记在 metafile.yml 中便于检索与复现。七、训练与评测实战7.1 训练使用仓库根目录的训练入口 tools/train.py单卡python tools/train.py configs/fpg/faster-rcnn_r50_fpg_crop640-50e_coco.py多卡如 8 卡bash tools/dist_train.sh configs/fpg/faster-rcnn_r50_fpg_crop640-50e_coco.py 8注意配置中的auto_scale_lr dict(base_batch_size64)对应 8 GPU × 8 samples/GPU若改变 GPU 数量或单卡 batch size可借助工具的自动学习率缩放功能而不要手工修改该字段。7.2 测试使用 tools/test.py 评测 COCO box APRetinaNet/Faster R-CNN或 box AP mask APMask R-CNNpython tools/test.py configs/fpg/mask-rcnn_r50_fpg_crop640-50e_coco.py \ /path/to/mask_rcnn_r50_fpg_crop640_50e_coco_20220311_011857-233b8334.pth \ --out results.pkl --eval bbox segm7.3 源码与测试佐证FPG 的正确性由单元测试保障test_fpgtests/test_models/test_necks/test_necks.py#L413-L527验证了end_level-1与显式指定end_level3构造等价end_level超过len(in_channels) - 1时抛出 AssertionErrornum_outs与end_level - start_level 1不一致时抛出 AssertionError。测试中的 FPG 实例化参数stack_times9, paths[bu]*9, skip_inds[(0,1,2,3), (0,1,2), (0,1), (0,), ()]等与仓库配置文件完全一致说明测试直接以发布配置为基准构造可作为读者自建 FPG 变体时的参数模板。八、引用若在研究中使用了 FPG请引用原论文与 configs/fpg/README.md 一致article{chen2020feature, title{Feature pyramid grids}, author{Chen, Kai and Cao, Yuhang and Loy, Chen Change and Lin, Dahua and Feichtenhofer, Christoph}, journal{arXiv preprint arXiv:2004.03580}, year{2020} }总结FPG 以多条并行自底向上路径组成的规则网格 多方向横向连接重构了特征金字塔在相同显存占用下相比 FPN 在 Faster R-CNN 上取得约 3.4 个点的 box AP 提升42.3 vs 38.9。在 MMDetection 中mmdet/models/necks/fpg.py 通过可插拔的 Transition 模块将网格构建、路径堆叠、多向融合与输出过渡完整落地stack_times、paths、skip_inds等参数让研究者可以自由定制网格密度与连接拓扑而 configs/fpg/ 下从 FPN 基线到 FPG、FPG-chn128 的完整配置链则为在 Faster R-CNN、Mask R-CNN、RetinaNet 三类检测器上复现与扩展该结构提供了开箱即用的起点。【免费下载链接】mmdetectionOpenMMLab Detection Toolbox and Benchmark项目地址: https://gitcode.com/gh_mirrors/mm/mmdetection创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表