ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

mmpose 中的 ResNetV1D 骨干网络:基于 CVPR 2019《Bag of Tricks》的结构改进与姿态估计实践

mmpose 中的 ResNetV1D 骨干网络:基于 CVPR 2019《Bag of Tricks》的结构改进与姿态估计实践 mmpose 中的 ResNetV1D 骨干网络基于 CVPR 2019《Bag of Tricks》的结构改进与姿态估计实践【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmpose本文以 mmpose 仓库中收录的 ResNetV1DCVPR2019骨干网络文档为核心系统梳理该结构在经典 ResNet 基础上的两处关键改动Deep Stem 与 Avg Down并结合 mmpose/models/backbones/resnet.py 的源码实现、configs/body_2d_keypoint/topdown_heatmap/coco 与 configs/body_2d_keypoint/topdown_heatmap/mpii 中的真实训练配置给出可直接复用的模型替换、参数含义与训练评估方法。读者读完后将掌握 ResNetV1D 的架构原理、mmpose 中注册与调用方式以及如何将其接入 topdown 姿态估计流程并解读评测结果。论文出处与收录信息ResNetV1D 由 He Tong 等人发表于 CVPR 2019论文题为《Bag of tricks for image classification with convolutional neural networks》。该论文的核心论点是近年来图像分类精度的提升很大程度上来源于训练流程层面的改进如数据增强、优化方法等而许多改进要么只在论文中被一笔带过要么只存在于源码中。论文通过系统的消融实验量化了这些tricks的影响并证明将它们组合使用可以显著提升多种 CNN 模型的精度——例如将 ImageNet 上 ResNet-50 的 top-1 验证精度从 75.3% 提升至 79.29%同时指出分类精度的提升可以迁移到目标检测、语义分割等下游任务。mmpose 仓库在 docs/src/papers/backbones/resnetv1d.md 中收录了该论文并给出了规范引用格式inproceedings{he2019bag, title{Bag of tricks for image classification with convolutional neural networks}, author{He, Tong and Zhang, Zhi and Zhang, Hang and Zhang, Zhongyue and Xie, Junyuan and Li, Mu}, booktitle{Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition}, pages{558--567}, year{2019} }在姿态估计领域ResNetV1D 常作为 top-down 方法先检测人体框再对每个框做关键点回归的骨干特征提取网络替代标准 ResNet 以获得更高的关键点精度。ResNetV1D 的结构改动两处关键 trickmmpose 源码中ResNetV1D 的实现位于 mmpose/models/backbones/resnet.py其类定义为class ResNetV1d(ResNet)通过MODELS.register_module()注册构造时直接以参数覆盖父类行为MODELS.register_module() class ResNetV1d(ResNet): def __init__(self, **kwargs): super().__init__(deep_stemTrue, avg_downTrue, **kwargs)可见它本质上就是deep_stemTrue, avg_downTrue的标准 ResNet。与默认 ResNet论文中称为 ResNetV1b相比ResNetV1D 有两处结构性改进1. Deep Stem用三个 3×3 卷积替换 7×7 卷积默认 ResNet 的输入 stem 使用一个 stride2 的 7×7 卷积加 BN 与 ReLU。而 ResNetV1D 将其替换为三个 3×3 卷积stride 依次为 2、1、1。这一改动在感受野上等价于 7×7 卷积但引入了更多非线性并降低了参数量与计算量。对应源码在_make_stem_layer中当self.deep_stem为真时stem 由三个ConvModule构成self.stem nn.Sequential( ConvModule(in_channels, stem_channels // 2, kernel_size3, stride2, padding1, ...), ConvModule(stem_channels // 2, stem_channels // 2, kernel_size3, stride1, padding1, ...), ConvModule(stem_channels // 2, stem_channels, kernel_size3, stride1, padding1, ...))可以看到输出通道按stem_channels // 2 → stem_channels // 2 → stem_channels的阶梯递增默认stem_channels64即 32→32→64与标准 ResNet 的conv1输出通道保持一致因此下游 stage 的输入通道无需调整。2. Avg Down下采样块中先平均池化再卷积在 Bottleneck 的残差分支中标准做法是让 1×1 卷积以 stride2 完成空间下采样。ResNetV1D 改为先接一个kernel_sizestride的 2×2 平均池化ceil_modeTrue, count_include_padFalse再将 1×1 卷积的 stride 改为 1。这样做可以避免在特征图较小时因 stride 卷积而丢失信息从而改善精度。对应实现位于ResLayer的构造逻辑mmpose/models/backbones/resnet.py 中make_res_layer/ResLayer部分if avg_down and stride ! 1: conv_stride 1 downsample.append( nn.AvgPool2d(kernel_sizestride, stridestride, ceil_modeTrue, count_include_padFalse)) downsample.extend([ build_conv_layer(conv_cfg, in_channels, out_channels, kernel_size1, strideconv_stride, biasFalse), build_norm_layer(norm_cfg, out_channels)[1] ])此外ResNetV1D 还继承了原论文中使用更精细的 stem 且不额外增加模型复杂度的设计哲学与论文将一系列训练/结构 tricks 组合以提升精度的主旨一致。论文中所述的多种训练 tricks如学习率调整、数据增强等同样适用于姿态估计训练流程mmpose 的 configs/body_2d_keypoint/topdown_heatmap/coco/td-hm_resnetv1d50_8xb64-210e_coco-256x192.py 中即可看到对应的学习率调度与预热等配置。在 mmpose 中的注册与调用方式ResNetV1d 通过MODELS.register_module()注册到模型注册表mmpose/models/backbones/init.py 中导出因此在配置文件中可以像其他骨干一样直接用字符串typeResNetV1d引用。支持的深度ResNet.arch_settings定义了各深度的残差块配置ResNetV1d 直接继承depth块类型stage 各层块数说明18BasicBlock(2, 2, 2, 2)轻量34BasicBlock(3, 4, 6, 3)经典浅层50Bottleneck(3, 4, 6, 3)常用主力101Bottleneck(3, 4, 23, 3)更深152Bottleneck(3, 8, 36, 3)最深若传入不在表中的 depth会抛出KeyError。实际 mmpose 姿态估计配置中主要使用 50/101/152 三种深度。主要可配置参数ResNetV1d 继承自ResNet其关键参数及默认值如下源自 mmpose/models/backbones/resnet.py 的ResNet.__init__文档字符串与实现参数默认值含义depth必填网络深度取值 18/34/50/101/152in_channels3输入图像通道数stem_channels64stem 层输出通道base_channels64第一个 stage 的中间通道数num_stages4stage 数量strides(1, 2, 2, 2)每个 stage 首个块的下采样步长dilations(1, 1, 1, 1)每个 stage 的空洞率out_indices(3,)输出哪些 stage 的特征若只给一个 stage则返回单个特征张量stylepytorchstride2 放在 3×3 卷积pytorch还是第一个 1×1 卷积caffedeep_stemFalse是否用 3 个 3×3 卷积替换 7×7 stemResNetV1d 固定为 Trueavg_downFalse下采样是否先平均池化再卷积ResNetV1d 固定为 Truefrozen_stages-1冻结前 N 个 stage-1 表示不冻结norm_evalFalse是否将 BN 设为 eval 模式以冻结 running statswith_cpFalse是否使用 checkpoint 以节省显存略微降低训练速度zero_init_residualTrue是否将残差块最后一个 BN 初始化为 0使残差块初始接近恒等映射其中frozen_stages常用于迁移学习冻结浅层特征、with_cp常用于显存受限场景两者在姿态估计训练中均有实际用途。在姿态估计中的完整配置示例以 COCO 数据集上的 top-down 姿态估计为例configs/body_2d_keypoint/topdown_heatmap/coco/td-hm_resnetv1d50_8xb64-210e_coco-256x192.py 展示了 ResNetV1D 的完整接入方式。模型部分核心配置如下codec dict( typeMSRAHeatmap, input_size(192, 256), heatmap_size(48, 64), sigma2) model dict( typeTopdownPoseEstimator, data_preprocessordict( typePoseDataPreprocessor, mean[123.675, 116.28, 103.53], std[58.395, 57.12, 57.375], bgr_to_rgbTrue), backbonedict( typeResNetV1d, depth50, init_cfgdict(typePretrained, checkpointmmcls://resnet50_v1d), ), headdict( typeHeatmapHead, in_channels2048, out_channels17, lossdict(typeKeypointMSELoss, use_target_weightTrue), decodercodec), test_cfgdict( flip_testTrue, flip_modeheatmap, shift_heatmapTrue, ))要点说明typeResNetV1d直接复用注册名无需改动源码即可替换标准 ResNetdepth50对应 Bottleneck 结构最终 stage 输出 2048 通道base_channels64时第 4 个 stage 为64 × 4 × 2^3 2048因此HeatmapHead的in_channels2048out_channels17对应 COCO 人体 17 个关键点init_cfg使用mmcls://resnet50_v1d加载在 ImageNet 上预训练的权重实现分类任务到姿态估计的迁移学习MSRAHeatmapcodec 负责将关键点坐标编码为高斯热图heatmap_size(48, 64)、sigma2训练时由GenerateTarget变换生成目标推理时由HeatmapHead的 decoder 从热图解码回坐标flip_testTrue表示测试时进行水平翻转并融合两次前向的热图结果shift_heatmapTrue用于修正翻转后关键点坐标偏移。该配置的训练流水线包含RandomFlip、RandomHalfBody、RandomBBoxTransform、TopdownAffine等变换训练 210 个 epoch学习率采用 Adamlr5e-4 前 500 步 LinearLR 预热 milestones[170, 200]的 MultiStepLR 衰减并通过auto_scale_lr dict(base_batch_size512)依据实际 batch size 自动缩放学习率。训练与测试命令遵循 mmpose 的标准流程python tools/train.py configs/body_2d_keypoint/topdown_heatmap/coco/td-hm_resnetv1d50_8xb64-210e_coco-256x192.py python tools/test.py configs/body_2d_keypoint/topdown_heatmap/coco/td-hm_resnetv1d50_8xb64-210e_coco-256x192.py checkpoint评估采用CocoMetric基于 COCO val2017 的person_keypoints_val2017.json并在default_hooks中设置save_bestcoco/AP保存最佳模型。MPII 数据集的对应配置位于 configs/body_2d_keypoint/topdown_heatmap/mpii/td-hm_resnetv1d50_8xb64-210e_mpii-256x256.py输入 256×256结构类似可对照参考。源码级验证与测试用例ResNetV1D 的实现正确性由单元测试保证。tests/test_models/test_backbones/test_resnet.py 中包含两处直接验证ResNetV1d(depth50, out_indices(0, 1, 2, 3))验证多 stage 输出的前向形状符合预期ResNetV1d(depth50, frozen_stages...)验证冻结阶段机制在 V1d 变体上正常工作BN 进入 eval、参数停止梯度。从源码结构还可以推断由于ResNetV1d仅通过deep_stem与avg_down两个开关改变 stem 与下采样路径其 forward 与标准 ResNet 共享同一主干逻辑ResNet.forward中if self.deep_stem: x self.stem(x)即切换分支因此将配置中的backbone.type在ResNet与ResNetV1d之间切换时其余 head、codec、loss 等模块无需任何改动。评测结果参考mmpose 在 configs/body_2d_keypoint/topdown_heatmap/coco/resnetv1d_coco.md 与 configs/body_2d_keypoint/topdown_heatmap/mpii/resnetv1d_mpii.md 中给出了该骨干在不同规模下的公开评测结果检测器在 COCO val2017 上的人体 AP 为 56.4可作为精度参考模型数据集输入尺寸关键指标pose_resnetv1d_50COCO256×192AP 0.722pose_resnetv1d_50COCO384×288AP 0.730pose_resnetv1d_101COCO256×192AP 0.732pose_resnetv1d_101COCO384×288AP 0.748pose_resnetv1d_152COCO256×192AP 0.737pose_resnetv1d_152COCO384×288AP 0.751pose_resnetv1d_50MPII256×256Mean 0.881pose_resnetv1d_101MPII256×256Mean 0.883pose_resnetv1d_152MPII256×256Mean 0.888可以看到两个规律其一在相同骨干下增大输入分辨率256×192 → 384×288能带来稳定的精度提升代价是更高的计算量其二骨干深度从 50 提升到 101、152 同样能持续改善精度。用户可根据算力与实时性要求在这些配置之间权衡选择。总结ResNetV1D 是Bag of Tricks论文中结构改进的经典产物通过 Deep Stem 与 Avg Down 两处低成本的架构改动在不显著增加参数量的前提下提升特征提取质量。在 mmpose 中它被注册为ResNetV1d并与标准 ResNet 共享绝大部分实现替换成本极低且已有 COCO、MPII 上的完整训练配置与公开评测结果可供参考。对于希望在姿态估计任务中获得比标准 ResNet 更好精度、又不想引入复杂新骨干的开发者ResNetV1D 是一个经过充分验证的稳妥选择。相关资源入口论文卡片 docs/src/papers/backbones/resnetv1d.md、源码实现 mmpose/models/backbones/resnet.py、测试用例 tests/test_models/test_backbones/test_resnet.py。【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmpose创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表