ARTICLE DETAIL

资讯详情

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

MMPose 中的 CPM(Convolutional Pose Machines)骨干网络:多阶段顺序预测与中间监督的源码级解析

MMPose 中的 CPM(Convolutional Pose Machines)骨干网络:多阶段顺序预测与中间监督的源码级解析 MMPose 中的 CPMConvolutional Pose Machines骨干网络多阶段顺序预测与中间监督的源码级解析【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmpose本篇技术指南以 docs/src/papers/backbones/cpm.md 的论文记录为骨架围绕 OpenMMLab 姿态估计工具箱 MMPose 中 CPM 骨架的完整落地展开从论文溯源与核心思想到CpmBlock/CPM骨干与CPMHead多阶段热图头的源码剖析再到 COCO、MPII、JHMDB 三个数据集上的真实训练配置文件与基准结果最后给出测试用例验证。读完本文你将掌握 CPM 在 MMPose 中的结构细节、参数语义、中间监督机制的实现方式以及如何直接复现其训练与评估流程。一、论文溯源CPM 在仓库文档中的记录在 MMPose 仓库中CPM 的论文记录位于 docs/src/papers/backbones/cpm.md同时在docs/src/papers/algorithms/目录下也存在一份 docs/src/papers/algorithms/cpm.md 副本。两份文档内容一致均以details折叠块形式给出标准 BibTeX 引用inproceedings{wei2016convolutional, title{Convolutional pose machines}, author{Wei, Shih-En and Ramakrishna, Varun and Kanade, Takeo and Sheikh, Yaser}, booktitle{Proceedings of the IEEE conference on Computer Vision and Pattern Recognition}, pages{4724--4732}, year{2016} }即 CPM 论文发表于 CVPR 2016Wei et al.卡内基梅隆大学backbones/目录将其归类为骨干网络backbone条目与hrnet.md、hourglass.md、mspn.md等并列。一处需要澄清的事实该文档中存放的 Abstract 段落实际描述的是 Newell 等人于 NIPS 2017 提出的 Associative Embedding关联嵌入方法而非 CPM 原文内容——同样的摘要文本也出现在 docs/src/papers/algorithms/associative_embedding.md 中属于仓库文档整理时引入的复制粘贴错位。因此本文后续关于 CPM 原理的阐述将以仓库内真实实现mmpose/models/backbones/cpm.py与论文题目的公开事实为依据而不沿用该段错位的摘要。二、核心思想多阶段顺序预测与中间监督CPMConvolutional Pose Machines的核心设计是用一系列顺序连接的卷积阶段逐步精化关键点位置置信图heatmap顺序预测Sequential Prediction每一阶段以上一阶段输出的热图作为输入的一部分叠加原始图像的浅层特征从而让网络在后续阶段看到自己对上一阶段的预测并据此修正误差中间监督Intermediate Supervision每个阶段都直接与真实热图计算损失避免深层的梯度消失问题并迫使每个阶段都能独立输出有意义的姿态估计——这一特性在 MMPose 的CPMHead中得到了完整的保留见第五节。这也是Pose Machines姿态机2014 年提出的经典框架思想从手工特征向端到端卷积网络迁移的代表性工作为后续 Stacked Hourglass堆叠沙漏等多阶段热图网络奠定了范式。三、源码剖析CPM 骨干网络的四段式结构CPM 骨干实现在 mmpose/models/backbones/cpm.py并通过 mmpose/models/backbones/init.py 以CPM名称注册进MODELS注册表可在配置文件中以typeCPM直接使用。它继承自BaseBackbone并在构造参数上做了明确约束in_channels必须为 3RGB 输入num_stages必须不小于 1。3.1 构造参数与默认值参数默认值含义in_channels必填输入通道数实现中断言必须等于 3out_channels必填每个阶段输出的热图通道数等于数据集关键点数量feat_channels128每个 CPM 阶段的中间特征通道数middle_channels32中间浅层特征分支压缩后的通道数num_stages6顺序阶段总数含第一阶段的 stemnorm_cfgdict(typeBN, requires_gradTrue)卷积模块的归一化配置init_cfg见实现默认对Conv2d使用 std0.001 的高斯初始化对 BN/GroupNorm 用常数 13.2 网络结构stem / middle / cpm_stages / middle_conv / out_convs从__init__的代码可以清晰看到网络被组织为五个组成部分mmpose/models/backbones/cpm.py① stem第一阶段主干——由 5 个ConvModule与 3 个MaxPool2d交替构成Conv 9×9 → 128MaxPool 3×3 stride 2Conv 9×9 → 128MaxPool 3×3 stride 2Conv 9×9 → 128MaxPool 3×3 stride 2Conv 5×5 → 32Conv 9×9 → 512Conv 1×1 → 512Conv 1×1 → out_channelsact_cfgNone即最后一个 1×1 卷积不带激活直接输出原始热图 logits可以看出三个 stride2 的最大池化使空间分辨率降为输入的 1/8最终产生第一个阶段的初始热图stage1_out。② middle浅层特征分支——与 stem 的前半部分完全同构3 个 9×9 卷积 3 个最大池化输出 128 通道它在每个后续阶段提供同一份、与原图对齐的浅层外观特征middle_out用于帮助后续阶段修正预测。③ cpm_stages / middle_conv / out_convs第 2~N 阶段——对num_stages - 1个后续阶段循环构建middle_conv[i]一个Conv 5×5把 128 通道的middle_out压缩到middle_channels32cpm_stages[i]一个CpmBlock输入通道为middle_channels out_channels即压缩后的浅层特征拼接上一阶段输出热图内部串联 3 个默认11×11、128 通道的ConvModuleout_convs[i]依次为Conv 1×1 → feat_channels带 BN 激活Conv 1×1 → out_channels无激活把 CpmBlock 的特征转成该阶段的热图。3.3 CpmBlock可配置的多层卷积块CpmBlock是 CPM 的基本积木参数为in_channels、channels(128,128,128)、kernels(11,11,11)。实现中先断言len(channels) len(kernels)再按层拼接ConvModule每个卷积使用padding(kernels[i]-1)//2保持空间尺寸不变mmpose/models/backbones/cpm.py。其前向输出与输入同分辨率作为out_convs的输入。3.4 前向传播返回多阶段热图列表forward的流程mmpose/models/backbones/cpm.py完全对应论文的顺序预测思想stage1_out self.stem(x) # 第一阶段初始热图 middle_out self.middle(x) # 共享浅层特征 out_feats [stage1_out] for ind in range(self.num_stages - 1): inp_feat torch.cat([out_feats[-1], self.middle_convind], 1) cpm_feat single_stage(inp_feat) # CpmBlock out_feat out_conv(cpm_feat) # 1x1 卷积输出热图 out_feats.append(out_feat) return out_feats即每个阶段都把上一阶段热图与原始图像浅层特征拼接后输入本阶段网络最终返回num_stages张分辨率相同输入的 1/8的热图。类 docstring 中给出了标准示例输入(1, 3, 368, 368)输出 6 张(1, 17, 46, 46)的热图。3.5 特征图分辨率速查来自测试用例test_models/test_backbones/test_cpm.py 验证了不同输入尺寸下的输出形状输入尺寸输出热图尺寸缩放关系256×19232×241/8384×28848×361/8368×36846×461/8四、CPMHead多阶段热图头与中间监督损失骨干只负责产出各阶段特征真正把特征转成热图并计算损失的是 mmpose/models/heads/heatmap_heads/cpm_head.py 中的CPMHead。该类注册为CPMHead其 docstring 明确指出它同样被 Stacked Hourglass NetworksNewell et al., 2016复用属于多阶段热图头通用实现。4.1 构造参数参数默认值含义in_channels必填输入特征通道数out_channels必填输出热图通道数关键点数num_stages必填阶段数与骨干的num_stages对应deconv_out_channelsNone各反卷积层输出通道数如(256, 256, 256)为None时各阶段用nn.Identity()跳过上采样deconv_kernel_sizes(4, 4, 4)反卷积核大小仅支持 4/3/2分别对应特定 padding 组合final_layerdict(kernel_size1)末层 1×1 卷积参数为None时用nn.Identity()lossdict(typeKeypointMSELoss, use_target_weightTrue)各阶段损失配置可传列表实现逐阶段不同损失decoderNone解码器配置如MSRAHeatmap用于从热图解出关键点坐标几个值得注意的实现细节跳过反卷积的典型用法由于 CPM 骨干已经自带了到 1/8 分辨率的输出且out_channels直接是热图通道数COCO/MPII/JHMDB 配置中一律写deconv_out_channelsNone, final_layerNone此时multi_deconv_layers与multi_final_layers均退化为nn.Identity()热图尺寸与骨干输出一致反卷积层的 padding 规则_make_deconv_layers对 kernel4/3/2 分别采用(padding1, output_padding0)、(padding1, output_padding1)、(padding0, output_padding0)且每层后接BatchNorm2d ReLUcpm_head.py默认初始化default_init_cfg对Conv2d/ConvTranspose2d用 std0.001 的高斯分布对BatchNorm2d用常数 1与骨干的初始化策略一致。4.2 前向与中间监督损失forward对每个阶段独立执行反卷积层 → 末层卷积返回与阶段数等长的热图列表cpm_head.py并断言特征数量与num_stages一致。loss方法完整实现了论文的中间监督思想cpm_head.pylosses dict() for i in range(self.num_stages): loss_func self.loss_module[i] if isinstance(self.loss_module, nn.ModuleList) \ else self.loss_module loss_i loss_func(multi_stage_pred_heatmaps[i], gt_heatmaps, keypoint_weights) losses[loss_kpt] losses.get(loss_kpt, 0) loss_i每一阶段的预测热图都与同一份GT 热图计算KeypointMSELoss带use_target_weight最终损失为各阶段损失之和即所有阶段都被显式监督loss中还通过pose_pck_accuracy计算最后一阶段的 PCK 精度acc_pose用于训练过程监控loss配置支持传列表[dict(typeKeypointMSELoss, ...)] * num_stages可实现逐阶段独立损失函数列表长度必须等于num_stages否则抛出 ValueError见测试用例。4.3 推理与水平翻转 TTApredict方法在test_cfg[flip_test]True时执行水平翻转测试时增强TTA分别对原图与翻转图前向取最后一个阶段的热图用flip_heatmaps按flip_indices翻回并对齐shift_heatmap再取均值最后交给decoder解码出关键点坐标cpm_head.py。若test_cfg[output_heatmaps]True还会额外返回每张图的PixelData热图。五、实战配置在 COCO / MPII / JHMDB 上复现 CPM仓库在configs/body_2d_keypoint/topdown_heatmap/下提供了 6 套可运行的 CPM 配置COCO 2 套、MPII 1 套、JHMDB 3 套并配套了基准结果文档coco/cpm_coco.md、mpii/cpm_mpii.md、jhmdb/cpm_jhmdb.md。5.1 COCO 256×192 配置逐段解读以 configs/body_2d_keypoint/topdown_heatmap/coco/td-hm_cpm_8xb64-210e_coco-256x192.py 为例拆解各关键段落训练超参与调度Adam 优化器初始学习率 5e-4先线性预热 500 iterstart_factor0.001再按 epoch 在[170, 200]处乘以 0.1 阶梯下降总训练 210 epochauto_scale_lr以 512 为基准批量自动缩放学习率。Codec 编码器使用MSRAHeatmap实现在 mmpose/codecs/msra_heatmap.pyinput_size(192, 256)、heatmap_size(24, 32)、sigma2。该 codec 同时负责训练时由关键点坐标生成高斯热图 GT以及推理时把热图峰值解码回坐标。模型组装TopdownPoseEstimator自顶向下估计器backbonedict( typeCPM, in_channels3, out_channels17, # COCO 17 个关键点 feat_channels128, num_stages6), headdict( typeCPMHead, in_channels17, out_channels17, num_stages6, deconv_out_channelsNone, final_layerNone, lossdict(typeKeypointMSELoss, use_target_weightTrue), decodercodec), test_cfgdict( flip_testTrue, flip_modeheatmap, shift_heatmapTrue)注意这里的参数配合关系骨干输出 17 通道的 24×32 热图头部的in_channels17直接承接骨干输出deconv_out_channelsNone表示不做反卷积上采样最终热图分辨率即 24×32test_cfg开启水平翻转 TTA。数据流水线训练用RandomFlip水平、RandomHalfBody、RandomBBoxTransform、TopdownAffine、GenerateTarget验证只用仿射对齐与打包。数据来自data/coco/训练 8 卡 × batch 64验证 batch 32评估用CocoMetricAP/AP50/AP75/AR 等checkpoint 按coco/AP取最优保存。5.2 三数据集配置对照配置数据集关键点数输入尺寸热图尺寸训练轮数评估指标coco 256×192COCO17256×19224×32210COCO APcoco 384×288COCO17384×28848×36210COCO APmpii 368×368MPII16368×36846×46210PCKjhmdb sub1 等 3 套JHMDB15368×36846×4640PCK0.2三套配置的骨干/头部结构与学习率策略保持一致仅按数据集特点调整MPII 用MpiiPCKAccuracy评估、保存最优PCKJHMDB 用JhmdbPCKAccuracythr0.2分别按 bbox 与 torso 归一化评估、每 epoch 保存 checkpoint并放宽了RandomBBoxTransform的旋转/缩放幅度。5.3 训练与测试命令仓库根目录下的 tools/train.py 与 tools/test.py 提供了标准入口配置继承自_base_/default_runtime.py# 单机多卡训练8 GPU bash tools/dist_train.sh configs/body_2d_keypoint/topdown_heatmap/coco/td-hm_cpm_8xb64-210e_coco-256x192.py 8 # 单卡训练 python tools/train.py configs/body_2d_keypoint/topdown_heatmap/coco/td-hm_cpm_8xb64-210e_coco-256x192.py # 测试需先准备 ckpt 路径 python tools/test.py configs/body_2d_keypoint/topdown_heatmap/coco/td-hm_cpm_8xb64-210e_coco-256x192.py checkpoint六、基准结果官方记录的实验数据各配置目录下的基准文档记录了当前仓库认可的实验结果以下数据均原样引用自仓库文档。6.1 COCO val2017检测器 Human AP 56.4来源coco/cpm_coco.md。输入尺寸APAP⁵⁰AP⁷⁵ARAR⁵⁰256×1920.6270.8620.7090.6890.906384×2880.6520.8650.7300.7100.9076.2 MPII val来源mpii/cpm_mpii.md。输入尺寸Mean (PCK)Mean0.1368×3680.8760.2856.3 Sub-JHMDB模型仅在 MPII 上预训练无多尺度/旋转 TTA来源jhmdb/cpm_jhmdb.md。按人体尺寸归一化PCK0.2SplitHeadShoElbWriHipKneeAnkMeanSub196.191.981.078.996.690.887.389.5Sub298.193.677.170.994.089.184.787.4Sub397.994.987.384.098.694.486.292.4平均97.493.581.577.996.491.486.189.8按躯干尺寸归一化时三组平均 PCK 为 66.0 / 61.1 / 70.3总体平均 65.7具体各部位数值见文档表格。七、测试验证行为契约与边界约束仓库用两组单测锁定了 CPM 的行为可作为理解实现细节的权威参考tests/test_models/test_backbones/test_cpm.py验证CpmBlock的len(channels)len(kernels)断言验证骨干in_channels3、num_stages1的断言验证多分辨率下输出尺寸256×192→32×24、384×288→48×36、368×368→46×46均为输入的 1/8验证num_stages2时返回两张等尺寸热图tests/test_models/test_heads/test_heatmap_heads/test_cpm_head.py覆盖deconv_out_channelsNone时退化为nn.Identity、final_layerNone时跳过末层、decoder 构建、逐阶段独立损失列表长度须等于num_stages验证predict的特征数断言、翻转 TTA、output_heatmaps输出以及loss中loss_kpt/acc_pose的产出还覆盖了deconv_kernel_sizes长度不匹配、不支持的核尺寸如 1等异常路径。八、总结与定位在 MMPose 中CPM 以多阶段骨干 多阶段头部 全阶段中间监督的组合被完整复现骨干的 stem/middle/cpm_stages 实现了顺序预测的信息流上一阶段热图 浅层特征拼接CPMHead把每个阶段的特征转成热图并对每一阶段计算 MSE 损失最终以最后阶段热图结合翻转 TTA 解码出关键点。这套设计使 CPM 成为理解多阶段精化范式的最佳入门骨架之一——它所确立的顺序精化思想在仓库的 Hourglass、MSPN 等多阶段网络中一脉相承。若需要进一步阅读可对照 cpm_coco.md 的结果表、CPM 骨干源码 与 CPMHead 源码 逐行验证本文所述的每个细节。【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmpose创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表