MMPose 实操指南:基于 SimCC 与 MobileNetV2 的轻量级人体姿态估计(COCO 256×192)
MMPose 实操指南基于 SimCC 与 MobileNetV2 的轻量级人体姿态估计COCO 256×192【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmpose本文围绕 OpenMMLab 姿态估计工具箱 MMPose 中SimCC MobileNetV2这一轻量级 top-down 人体关键点方案展开从 SimCC 将关键点估计重构为一维坐标分类的核心思想出发完整解析其在 COCO 上的模型配置、COCO val2017 基准结果并结合仓库源码逐层剖析 SimCCLabel 编解码器、SimCCHead 网络头与 KLDiscretLoss 的实现细节。读完本文你将掌握该配置的每一行参数含义、背后的训练与推理流程以及如何基于它训练、测试和部署自己的轻量级人体姿态估计模型。一、模型卡片核心信息SimCC MobileNetV2 on COCO仓库中的模型卡片 mobilenetv2_coco.md 对应配置 simcc_mobilenetv2_wo-deconv-8xb64-210e_coco-256x192.py它组合了三项核心技术SimCCECCV2022由 Li Yanjie 等人提出的简单坐标分类Simple Coordinate Classification视角将姿态估计中连续坐标的回归/热图预测问题转化为 X、Y 两个方向的一维标签分类问题论文编号 arXiv:2107.03332。MobileNetV2CVPR2018Mark Sandler 等人提出的基于倒残差结构 线性瓶颈Inverted Residuals and Linear Bottlenecks的轻量级骨干网络适合移动端与低算力场景。COCOECCV2014Microsoft COCO 通用物体上下文数据集本文使用其人体关键点子任务17 个关键点。配置名中的wo-deconv表明这是一个不含反卷积上采样头的轻量变体SimCC 头直接作用于骨干输出的低分辨率特征图通过全连接层生成一维分布从而进一步压缩计算量是理解 SimCC省去热图高分辨率上采样优势的典型示例。二、COCO val2017 基准结果模型卡片给出在 COCO val2017 上、使用在 COCO val2017 上人体 AP 为 56.4 的检测器提供人体框top-down 流程时该模型的完整评测结果ArchInput SizeAPAP50AP75ARAR50simcc_mobilenetv2_wo_deconv256×1920.6200.8550.6970.6780.902以 256×192 输入、8×GPU 每卡 batch 64、训练 210 epoch 的设定模型在 COCO val2017 上取得AP 0.620 / AP500.855 / AP750.697。权重与训练日志的记录位于模型索引文件 mobilenetv2_coco.yml 中Weights字段登记了simcc_mobilenetv2_wo-deconv-8xb64-210e_coco-256x192-4b0703bb_20221010.pth及对应指标可通过该索引按模型名检索获取。需要说明的是这里 AP 值是在检测器提供的人体框之上的 top-down 姿态估计结果评测依赖COCO_val2017_detections_AP_H_56_person.json这一预检测框文件后文数据加载器部分会详细解释。三、训练配置逐段解析完整配置见 simcc_mobilenetv2_wo-deconv-8xb64-210e_coco-256x192.py下面按逻辑模块拆解。3.1 基础与运行时_base_ [../../../_base_/default_runtime.py] # runtime train_cfg dict(max_epochs210, val_interval10)继承 configs/base/default_runtime.py 的通用运行时日志、钩子、环境等设置训练 210 个 epoch每 10 个 epoch 在验证集上评测一次。3.2 优化器与学习率策略# 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, endtrain_cfg[max_epochs], milestones[170, 200], gamma0.1, by_epochTrue) ] # automatically scaling LR based on the actual training batch size auto_scale_lr dict(base_batch_size512)使用Adam 优化器初始学习率 5e-4ResNet50 版本为 1e-3见 simcc_res50_8xb64-210e_coco-256x192.py前 500 次迭代执行warm-upLinearLRby_epochFalse起始因子 0.001之后采用MultiStepLR在 epoch 170 与 200 处将学习率乘以 0.1gamma0.1auto_scale_lr以base_batch_size512为基准自动按实际总 batch size 缩放学习率因此当你改变 batch size 时无需手动重新调 LR。3.3 Codec 设置SimCC 标签的定义# codec settings codec dict( typeSimCCLabel, input_size(192, 256), sigma6.0, simcc_split_ratio2.0)这是整个方案的灵魂SimCCLabel编解码器源码见 mmpose/codecs/simcc_label.py负责把关键点坐标编码成一维标签、把网络输出解码回坐标。各参数含义如下input_size(192, 256)输入图像宽 192、高 256w, h 顺序sigma6.0高斯平滑标签的 σ 值决定一维分布鼓包的宽度对应 3σ 规则下的标签半径simcc_split_ratio2.0标签长度 输入尺寸 × split ratio。即 X 方向标签长度为192 × 2 384Y 方向为256 × 2 512相当于把每个像素细分为 2 个坐标分类单元这是 SimCC 能够取得亚像素精度的关键设计。3.4 模型结构TopdownPoseEstimatormodel dict( typeTopdownPoseEstimator, data_preprocessordict( typePoseDataPreprocessor, mean[123.675, 116.28, 103.53], std[58.395, 57.12, 57.375], bgr_to_rgbTrue), backbonedict( typeMobileNetV2, widen_factor1., out_indices(7, ), init_cfgdict( typePretrained, checkpointmmcls://mobilenet_v2, )), headdict( typeSimCCHead, in_channels1280, out_channels17, input_sizecodec[input_size], in_featuremap_sizetuple([s // 32 for s in codec[input_size]]), simcc_split_ratiocodec[simcc_split_ratio], deconv_out_channelsNone, lossdict(typeKLDiscretLoss, use_target_weightTrue), decodercodec), test_cfgdict(flip_testTrue, ))data_preprocessorPoseDataPreprocessor使用 ImageNet 统计的均值/标准差做归一化bgr_to_rgbTrue处理输入通道顺序backboneMobileNetV2widen_factor1.0标准宽度out_indices(7,)取第 7 个 stage 的输出作为最终特征图。注意这里未指定 ResNet 式的depthMobileNetV2 的输出通道数为 1280与head.in_channels1280严格对应init_cfg用 mmcls 的预训练权重初始化headSimCCHeadin_featuremap_sizetuple([s // 32 for s in input_size])表示骨干输出特征图为输入的 1/32192×256 → 6×8deconv_out_channelsNone即关闭反卷积wo-deconv直接在该低分辨率特征图上接全连接生成一维分布decodercodec复用同一 SimCCLabel 配置完成解码lossKLDiscretLossuse_target_weightTrue表示按关键点可见性加权test_cfgflip_testTrue开启水平翻转测试TTA推理时对原图与翻转图各预测一次再取平均。四、源码级原理SimCCLabel 编解码器理解 simcc_label.py 是掌握整个方案的关键它实现了SimCCLabel类注册在KEYPOINT_CODECS中。4.1 编码encodeencode()接收原始关键点坐标N, K, D与可见性N, K输出keypoint_x_labels形状 (N, K, Wx)Wx w * simcc_split_ratiokeypoint_y_labels形状 (N, K, Wy)Wy h * simcc_split_ratiokeypoint_weights形状 (N, K)对应关键点权重。支持两种标签平滑策略smoothing_typegaussian默认调用_generate_gaussian()对每个可见关键点在 X/Y 轴上分别以关键点位置mu为中心、按exp(-(x-mu)^2 / (2σ²))生成高斯分布并遵循3σ 规则限定标签半径sigma超出边界的关键点权重被置 0。当normalizeTrue默认时标签除以σ·√(2π)做归一化。每个关键点最终由两条一维高斯分布表示standard调用_generate_standard()使用标准标签平滑label_smooth_weight0时即退化为 one-hot 向量该模式下sigma不参与编码。坐标映射发生在_map_coordinates()关键点坐标乘以simcc_split_ratio并取整得到 SimCC 空间中的整数索引。4.2 解码decodedecode()接收网络的 X/Y 一维分布调用 post_processing.py 中的get_simcc_maximum()求取最大响应位置与置信度再除以simcc_split_ratio还原到输入图像坐标系。可选开关包括use_darkTrue启用 DARK 亚像素细化refine_simcc_dark根据 σ 自动计算高斯模糊核大小并对峰值位置做泰勒展开修正可进一步提升精度decode_visibilityTrue通过decode_beta默认 150.0对分布做带温度 softmax 得到可见性分数此时返回(scores, visibility)元组。4.3 测试用例佐证仓库在 tests/test_codecs/test_simcc_label.py 中对该编解码器进行了完整覆盖验证了 gaussian/standard 两种平滑方式的编码形状、权重处理以及解码坐标还原的数值正确性可作为阅读与二次开发的参照。五、SimCCHead 网络头两条一维分类分支SimCCHead见 mmpose/models/heads/coord_cls_heads/simcc_head.py负责把骨干特征图转化为 X/Y 两个一维分布# Define SimCC layers flatten_dims self.heatmap_size[0] * self.heatmap_size[1] W int(self.input_size[0] * self.simcc_split_ratio) H int(self.input_size[1] * self.simcc_split_ratio) self.mlp_head_x nn.Linear(flatten_dims, W) self.mlp_head_y nn.Linear(flatten_dims, H)其核心结构是两个共享输入特征的全连接分支把特征图展平为flatten_dims维向量后mlp_head_x输出长度W input_w × simcc_split_ratio的 X 方向分布mlp_head_y输出长度H input_h × simcc_split_ratio的 Y 方向分布。前向时x torch.flatten(feats, 2) pred_x self.mlp_head_x(x) pred_y self.mlp_head_y(x)这正体现了 SimCC 与热图法的核心差异无需将特征图上采样回输入分辨率生成二维热图而是直接在低分辨率特征图上做一维分类显著减少计算量与参数。SimCCHead 还保留了对反卷积头的兼容能力当deconv_out_channels非空时可通过deconv_typeheatmap复用 HeatmapHead或vipnas复用 ViPNASHead先做上采样再接 MLP。例如同目录下的 simcc_vipnas-mbv3_8xb64-210e_coco-256x192.py 就配置了deconv_typevipnas与deconv_out_channels(160, 160, 160)。而本文主角deconv_out_channelsNone走的是零反卷积分支只保留一个 1×1 convfinal_layer将 1280 通道压缩到 17再展平接两个全连接层是真正的轻量化形态。六、损失函数KLDiscretLoss训练采用KLDiscretLoss离散 KL 散度损失实现在 mmpose/models/losses/classification_loss.py对预测分布pred * beta施加LogSoftmax与标签分布计算逐位置KLDivLoss再按关键点权重加权求和并除以关键点数 K可选label_softmaxTrue对标签也做label_beta温度 softmax支持mask与mask_weight对指定关键点做额外加权由于 X/Y 两个分支共享同一损失函数forward()内会遍历(pred_x, pred_y)与(gt_x, gt_y)两组分布叠加损失。同时SimCCHead.loss()在返回loss_kpt之外还会基于simcc_pck_accuracy计算训练中的 PCK 精度acc_pose便于在日志中实时观察关键点定位质量。七、数据管线与评测流程7.1 数据与管线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) ]训练阶段依次执行加载图像 → 由检测框得到中心与尺度 → 随机水平翻转 → 随机半身增强RandomHalfBody→ 随机框变换 → 仿射裁剪到 192×256 → 用SimCCLabel编码目标标签 → 打包数据。验证阶段不引入随机增强仅做仿射对齐。7.2 数据加载器与评测train_dataloader dict( batch_size64, num_workers2, persistent_workersTrue, samplerdict(typeDefaultSampler, shuffleTrue), datasetdict( typedataset_type, data_rootdata_root, data_modedata_mode, ann_fileannotations/person_keypoints_train2017.json, data_prefixdict(imgtrain2017/), pipelinetrain_pipeline, )) val_dataloader dict( batch_size32, ... datasetdict( ... ann_fileannotations/person_keypoints_val2017.json, bbox_filef{data_root}person_detection_results/ COCO_val2017_detections_AP_H_56_person.json, data_prefixdict(imgval2017/), test_modeTrue, pipelineval_pipeline, ))训练数据为person_keypoints_train2017.jsonCOCO 2017 训练集data_modetopdown表明是 top-down 模式验证数据使用COCO_val2017_detections_AP_H_56_person.json作为预检测人体框输入——这正是模型卡片中检测器人体 AP 为 56.4的前提评测的是姿态估计本身在给定检测框下的表现评估指标由val_evaluator中的CocoMetric提供基于person_keypoints_val2017.json覆盖 AP/AP50/AP75/AR 等标准 COCO 关键点指标default_hooks中配置save_bestcoco/AP, rulegreater训练过程中自动保存验证 AP 最高的检查点。八、同系列配置横向对比configs/body_2d_keypoint/simcc/coco/目录下还提供了同一套训练范式下的其他骨干与输入尺寸变体方便横向对比 SimCC 框架的扩展方式配置骨干输入尺寸头结构simcc_mobilenetv2_wo-deconv-8xb64-210e_coco-256x192.pyMobileNetV21280 ch256×192SimCCHead 无反卷积simcc_res50_8xb64-210e_coco-256x192.pyResNet-502048 ch256×192SimCCHead 默认三层反卷积simcc_res50_8xb32-140e_coco-384x288.pyResNet-50384×288SimCCHead140 epochsimcc_vipnas-mbv3_8xb64-210e_coco-256x192.pyViPNAS_MobileNetV3160 ch256×192SimCCHeaddeconv_typevipnas对比要点MobileNetV2 版本通过deconv_out_channelsNone去掉全部反卷积而 ResNet-50 版本保留默认的(256, 256, 256)三层反卷积两者在精度与算力之间取舍不同输入尺寸变化会同步影响input_size、in_featuremap_size仍是 1/32以及一维标签长度Codec 中simcc_split_ratio2.0与sigma6.0保持一致更高分辨率384×288对应更短的训练周期140 epoch与更小 batch32学习率同为 1e-3 但实际有效学习率由auto_scale_lr依据 batch 自动折算。九、训练、测试与推理在完成 COCO 数据准备结构为data/coco/annotations/与data/coco/train2017|val2017/详见 数据准备指南后可按 训练与测试指南 操作训练python tools/train.py configs/body_2d_keypoint/simcc/coco/simcc_mobilenetv2_wo-deconv-8xb64-210e_coco-256x192.py测试指定权重python tools/test.py configs/body_2d_keypoint/simcc/coco/simcc_mobilenetv2_wo-deconv-8xb64-210e_coco-256x192.py \ /path/to/simcc_mobilenetv2_wo-deconv-8xb64-210e_coco-256x192-4b0703bb_20221010.pth单张图片推理使用 inferencer_demo.pypython demo/inferencer_demo.py tests/data/coco/000000000785.jpg \ --pose2d configs/body_2d_keypoint/simcc/coco/simcc_mobilenetv2_wo-deconv-8xb64-210e_coco-256x192.py \ --pose2d-weights /path/to/simcc_mobilenetv2_wo-deconv-8xb64-210e_coco-256x192-4b0703bb_20221010.pth \ --vis-out-dir vis_results由于该配置是纯 top-down 模型端到端人体姿态估计通常需要搭配检测器可参考 2D 人体姿态 Demo 中topdown_demo_with_mmdet.py的用法。十、总结与使用建议SimCC 的价值把二维热图估计降维为两条一维分布配合simcc_split_ratio获得亚像素精度且可省去反卷积上采样wo-deconv非常适合轻量级、边缘端人体姿态估计MobileNetV2 的定位在本配置中承担低算力骨干角色1280 通道输出直接对接无上采样 SimCCHead与 ResNet-50 变体形成精度/速度两个档位的选择关键调参入口sigma标签平滑宽度、simcc_split_ratio坐标细分粒度、smoothing_typegaussian/standard、use_dark亚像素细化、flip_test翻转 TTA、deconv_out_channels是否启用反卷积头这些参数在 mmpose/codecs/simcc_label.py 与 mmpose/models/heads/coord_cls_heads/simcc_head.py 中均有对应实现可查。该配置连同同目录下的 ResNet-50、ViPNAS-MobileNetV3 变体共同构成了 MMPose 中 SimCC 家族在 COCO 上的完整参考基线既是入门 top-down 姿态估计的理想起点也是在此基础上进行轻量化改造与算法对比的可靠基准。【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmpose创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考