
MMPose 中基于 Swin Transformer 的 Top-down 人体姿态估计基线COCO 上的配置、训练与源码剖析【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmpose本文以 MMPose 仓库中configs/body_2d_keypoint/topdown_heatmap/coco/swin_coco.md这一模型文档为主体系统讲解如何在 COCO 数据集上复现 SimpleBaseline2D Swin TransformerTiny/Base/Large的 Top-down 热图人体姿态估计基线包括完整的关键字配置优化器、学习率策略、Codec、数据管线、COCO val2017 基准成绩表、训练/测试命令并结合仓库源码剖析SwinTransformer主干的窗口注意力实现与预训练权重转换机制。读完本文你可以直接修改并运行这组配置并理解每个超参数背后的实现依据。一、模型定位与 COCO val2017 基准结果该模型文档对应的算法组合是算法框架SimpleBaseline2DECCV 2018即 Top-down 两阶段方案——先用人体检测器给出人体框再对每个人体裁剪框独立估计关键点主干网络Swin TransformerICCV 2021层级式移位窗口 Transformer特征聚合FPNCVPR 2017Swin 内部的 Patch Merging 起到类似多尺度聚合作用数据集COCO 2017ECCV 2014。文档给出的实验前提为在 COCO val2017 上使用一个人体检测 AP 为 56.4 的检测器对应配置中的预提取 bbox 文件各规模模型的结果如下模型输入尺寸APAP50AP75ARAR50配置文件pose_swin_t256x1920.7240.9010.8060.7820.940td-hm_swin-t-p4-w7_8xb32-210e_coco-256x192.pypose_swin_b256x1920.7370.9040.8200.7940.942td-hm_swin-b-p4-w7_8xb32-210e_coco-256x192.pypose_swin_b384x2880.7590.9100.8320.8110.946td-hm_swin-b-p4-w7_8xb32-210e_coco-384x288.pypose_swin_l256x1920.7430.9060.8210.7980.943td-hm_swin-l-p4-w7_8xb32-210e_coco-256x192.pypose_swin_l384x2880.7630.9120.8300.8140.949td-hm_swin-l-p4-w7_8xb32-210e_coco-384x288.py从结果看三个趋势明确模型规模增大t→b→l带来约 1.9 个点的 AP 提升输入分辨率从 256x192 提到 384x288b/l 分别再提升约 2.2 个点和 2.0 个点。原模型文档同时提供了各模型的 checkpoint 与训练日志下载链接官方 openmmlab 资源站此处按仓库内文件组织引用上述配置路径。二、配置全解以 swin-t 256x192 为例以 td-hm_swin-t-p4-w7_8xb32-210e_coco-256x192.py 为例配置继承自 default_runtime.py提供默认 hooks、logger、可视化后端等运行时项核心内容可分为运行时、优化器、学习率策略、模型、数据与评估六块。2.1 运行时与优化器# runtime train_cfg dict(max_epochs210, val_interval10) # optimizer optim_wrapper dict(optimizerdict(typeAdam, lr5e-4)) # learning policy param_scheduler [ dict(typeLinearLR, begin0, end500, start_factor0.001, by_epochFalse), # warm-up dict(typeMultiStepLR, begin0, end210, milestones[170, 200], gamma0.1, by_epochTrue) ] # automatically scaling LR based on the actual training batch size auto_scale_lr dict(base_batch_size256) # hooks default_hooks dict(checkpointdict(save_bestcoco/AP, rulegreater))要点说明max_epochs210与文件名中的210e对应每 10 个 epoch 验证一次优化器为 Adam初始学习率5e-4学习率策略采用「500 步线性 warm-up从 0.001 倍升到 1 倍 MultiStepLR170/200 epoch 各衰减 10 倍」auto_scale_lr以 256 为基准批量按实际批量线性缩放学习率——配置名义批量为8 卡 x batch 32 256单机 8 卡训练时学习率无需手动调整checkpoint hook 以coco/AP越大越优为准则保存最佳权重。值得注意的是swin-l 配置td-hm_swin-l-p4-w7_8xb32-210e_coco-256x192.py与 t/b 不同改用 AdamW 并带参数分组衰减optim_wrapper dict( optimizerdict(typeAdamW, lr5e-4, betas(0.9, 0.999), weight_decay0.01), paramwise_cfgdict( custom_keys{ absolute_pos_embed: dict(decay_mult0.), relative_position_bias_table: dict(decay_mult0.), norm: dict(decay_mult0.) }))即对绝对位置编码、相对位置偏置表和所有 norm 层关闭权重衰减——这是 Transformer 类模型常用的参数分组正则策略而 t/b 两个较小的配置没有做此分组使用 Adam。2.2 CodecMSRAHeatmapcodec dict( typeMSRAHeatmap, input_size(192, 256), heatmap_size(48, 64), sigma2)input_size(192, 256)为 [w, h] 顺序即 192x256宽 x 高的人体裁剪输入384x288 系列配置中该值相应增大heatmap_size(48, 64)为输入尺寸的 1/4与主干末层特征分辨率一致sigma2是高斯热图的标准差。其实现位于 msra_heatmap.pyMSRAHeatmap.encode将原始关键点坐标除以scale_factorinput_size / heatmap_size映射到热图空间后调用generate_gaussian_heatmaps生成 (K, H, W) 形状的高斯热图及逐关键点权重keypoint_weightsdecode阶段则对预测热图取最大值得到坐标。该 Codec 支持unbiasedTrueDarkPose 的无偏热图本文基线未开启。2.3 模型结构norm_cfg dict(typeSyncBN, requires_gradTrue) model dict( typeTopdownPoseEstimator, data_preprocessordict( typePoseDataPreprocessor, mean[123.675, 116.28, 103.53], std[58.395, 57.12, 57.375], bgr_to_rgbTrue), backbonedict( typeSwinTransformer, embed_dims96, depths[2, 2, 6, 2], num_heads[3, 6, 12, 24], window_size7, mlp_ratio4, qkv_biasTrue, qk_scaleNone, drop_rate0., attn_drop_rate0., drop_path_rate0.2, patch_normTrue, out_indices(3, ), with_cpFalse, convert_weightsTrue, init_cfgdict( typePretrained, checkpoint.../swin_tiny_patch4_window7_224.pth)), headdict( typeHeatmapHead, in_channels768, out_channels17, lossdict(typeKeypointMSELoss, use_target_weightTrue), decodercodec), test_cfgdict( flip_testTrue, flip_modeheatmap, shift_heatmapTrue, ))结构解读TopdownPoseEstimator是 Top-down 方案的估计器包装串联 backbone 与 headdata_preprocessor使用 ImageNet 均值/方差归一化并做 BGR→RGB 转换加载的 Swin 预训练权重为 ImageNet 训练三个规模的主干参数差异如下其余超参一致patch_size4、window_size7、mlp_ratio4、out_indices(3,)规模embed_dimsdepthsnum_headsdrop_path_ratehead.in_channels预训练权重swin-t96[2, 2, 6, 2][3, 6, 12, 24]0.2768ImageNet-1K 224 (tiny_patch4_window7)swin-b128[2, 2, 18, 2][4, 8, 16, 32]0.31024ImageNet-22K 224 (base_patch4_window7_22k)swin-l192[2, 2, 18, 2][6, 12, 24, 48]0.51536ImageNet-22K 224 (base_patch4_window7_22k)out_indices(3,)表示只取第 4 个 stage 的输出通道数为embed_dims * 2^3即 768/1024/1536与 head 的in_channels严格对应HeatmapHead输出 17 通道COCO 17 关键点热图损失为KeypointMSELoss(use_target_weightTrue)即按 MSRA 论文的可见性权重做逐关键点加权 MSEdecodercodec使 head 复用同一个 MSRAHeatmap 完成推理解码测试期开启flip_testheatmap 模式翻转测试和shift_heatmap热图中心偏移 1 像素的亚像素精化这两项是 Top-down 热图模型的常见免训练增强。2.4 数据管线与数据加载dataset_type CocoDataset data_mode topdown data_root data/coco/ train_pipeline [ dict(typeLoadImage), dict(typeGetBBoxCenterScale), dict(typeRandomFlip, directionhorizontal), dict(typeRandomHalfBody), dict(typeRandomBBoxTransform), dict(typeTopdownAffine, input_sizecodec[input_size]), dict(typeGenerateTarget, encodercodec), dict(typePackPoseInputs) ] val_pipeline [ dict(typeLoadImage), dict(typeGetBBoxCenterScale), dict(typeTopdownAffine, input_sizecodec[input_size]), dict(typePackPoseInputs) ]训练管线包含随机水平翻转、随机半身体、随机框变换RandomBBoxTransform三类增强TopdownAffine将人体框仿射到 codec 输入尺寸GenerateTarget用 MSRAHeatmap 编码热图标签。验证管线无增强。数据加载器的关键点训练集annotations/person_keypoints_train2017.jsontrain2017/图像batch_size32验证/测试集annotations/person_keypoints_val2017.json并指定预提取的人体检测结果bbox_filedata/coco/person_detection_results/COCO_val2017_detections_AP_H_56_person.json——这正是结果表所述检测器 AP 56.4的来源。Top-down 评估使用该固定 bbox 文件可保证不同方法在相同检测结果下可比评估器为CocoMetric按 COCO 关键点协议计算 AP/AR。三、源码剖析SwinTransformer 主干在 MMPose 中的实现主干实现位于 swin.py注册名为SwinTransformer。以下选取与本配置直接相关的实现细节。3.1 层级化结构与 stage 组装SwinTransformer.__init__约 L523 起按depths依次构建 4 个 stagefor i in range(num_layers): if i num_layers - 1: downsample PatchMerging( in_channelsin_channels, out_channels2 * in_channels, stridestrides[i 1], norm_cfgnorm_cfg if patch_norm else None, init_cfgNone) else: downsample None stage SwinBlockSequence(embed_dimsin_channels, num_headsnum_heads[i], feedforward_channelsmlp_ratio * in_channels, depthdepths[i], window_sizewindow_size, ...) self.stages.append(stage) if downsample: in_channels downsample.out_channels第一个 stage 使用非重叠卷积做 patch 嵌入断言strides[0] patch_size之后每个 stage 之间用PatchMerging做 2x 下采样并把通道数翻倍因此num_features [embed_dims * 2**i]第 4 stage 输出通道数正好是配置中 head 的in_channelsforward约 L721 起依次经过各 stage仅对out_indices指定的 stage 输出做norm 重排成 (B, C, H, W)——配置取(3,)故只有第 4 个 stage 的 1/32 分辨率特征被送给 headdrop_path_rate通过torch.linspace(0, drop_path_rate, total_depth)在全部 Transformer 块间线性递增分配这解释了 t/b/l 分别设置 0.2/0.3/0.5 的随机深度衰减率的原因模型越深正则越强。3.2 窗口注意力与移位窗口WindowMSA约 L23 起实现带相对位置偏置的窗口内多头自注意力relative_position_bias_table形状为(2*Wh-1) * (2*Ww-1), num_heads配合预计算索引relative_position_index查表得到偏置ShiftWindowMSA约 L128 起先F.pad到窗口整数倍再对移位分支执行torch.roll循环移位并构建 6 区域注意力掩码attn_mask取 0 或 -100使相邻窗口间能够交换信息——这正是移位窗口SW-MSA的机制window_size7与输入 192x256 的关系patch 嵌入后第 4 stage 特征为 6x8192/32 x 256/32小于窗口尺寸移位分支会因 pad 后特征尺寸变化而按SwinBlockSequence的逻辑处理特征不足一个窗口时移位分支退化为普通窗口注意力这一点可以从源码结构中推断。3.3 预训练权重加载与转换init_weights约 L659 起处理了从原始 Swin 仓库加载权重的三类兼容问题对应配置中的convert_weightsTrue与init_cfg(typePretrained)key 转换调用 ckpt_convert.py 中的swin_converter将原始 state_dict 的键名映射到 MMPose 结构绝对位置编码重排若 state_dict 含absolute_pos_embed则 reshape/permute 到 (N, C, H, W)本配置use_abs_pos_embedFalse该分支不会触发相对位置偏置表插值当预训练表的长度与当前模型不一致时例如window_size变化用双三次插值F.interpolate(..., modebicubic)将表重采样到当前形状后加载。加载采用load_state_dict(..., strictFalse)因此未覆盖的层如 head按init_cfg中 TruncNormal/LayerNorm 常量初始化。四、训练与测试4.1 训练按 train_and_test.md 的方式单机训练# 单卡8x32 配置在单卡上会自动将 lr 按 auto_scale_lr 缩放到 1/8 python tools/train.py configs/body_2d_keypoint/topdown_heatmap/coco/td-hm_swin-t-p4-w7_8xb32-210e_coco-256x192.py # 8 卡分布式训练 bash ./tools/dist_train.sh configs/body_2d_keypoint/topdown_heatmap/coco/td-hm_swin-t-p4-w7_8xb32-210e_coco-256x192.py 8分布式下可通过CUDA_VISIBLE_DEVICES、PORT指定显卡与通信端口CPU 训练使用CUDA_VISIBLE_DEVICES-1。断点续训追加--resume混合精度训练追加--amp对 Transformer 模型通常收益有限配置默认未开。4.2 测试python tools/test.py \ configs/body_2d_keypoint/topdown_heatmap/coco/td-hm_swin-t-p4-w7_8xb32-210e_coco-256x192.py \ CHECKPOINT_FILE --out RESULT_FILEtools/test.py支持--show-dir可视化预测结果分布式测试对应tools/dist_test.sh。4.3 推理除传统 API 外仓库提供了基于 Inferencer 的端到端推理入口 demo/inferencer_demo.py 与 demo/image_demo.py例如python demo/inferencer_demo.py tests/data/coco/000000000785.jpg \ --work-dir OUTPUT_DIR --show详细参数含--show-alias等见 inference.md。五、引用信息原模型文档同时给出了各组件的 BibTeX 引用供论文引用时使用Simple Baselines for Human Pose Estimation and TrackingXiao et al., ECCV 2018Swin Transformer: Hierarchical Vision Transformer using Shifted WindowsLiu et al., ICCV 2021Feature Pyramid Networks for Object DetectionLin et al., CVPR 2017Microsoft COCO: Common Objects in ContextLin et al., ECCV 2014六、关键文件索引内容路径本文主体文档模型成绩表swin_coco.mdswin-t 256x192 配置td-hm_swin-t-p4-w7_8xb32-210e_coco-256x192.pyswin-b 256x192 配置td-hm_swin-b-p4-w7_8xb32-210e_coco-256x192.pyswin-b 384x288 配置td-hm_swin-b-p4-w7_8xb32-210e_coco-384x288.pyswin-l 256x192 配置td-hm_swin-l-p4-w7_8xb32-210e_coco-256x192.pyswin-l 384x288 配置td-hm_swin-l-p4-w7_8xb32-210e_coco-384x288.pySwin 主干实现mmpose/models/backbones/swin.py预训练权重 key 转换mmpose/models/backbones/utils/ckpt_convert.pyMSRA 热图编解码mmpose/codecs/msra_heatmap.py默认运行时配置configs/base/default_runtime.py训练/测试指南docs/en/user_guides/train_and_test.md推理指南docs/en/user_guides/inference.md【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmpose创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考