ARTICLE DETAIL

资讯详情

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

MMPose Top-down 回归式人体姿态估计实战:DeepPose + RLE(ResNet)在 MPII 上的完整配置与源码解析

MMPose Top-down 回归式人体姿态估计实战:DeepPose + RLE(ResNet)在 MPII 上的完整配置与源码解析 MMPose Top-down 回归式人体姿态估计实战DeepPose RLEResNet在 MPII 上的完整配置与源码解析【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmpose本文基于 MMPose 模型库文档configs/body_2d_keypoint/topdown_regression/mpii/resnet_rle_mpii.md系统讲解 DeepPose 架构叠加 RLEResidual Log-Likelihood Estimation损失后在 MPII 数据集上的 Top-down 2D 人体姿态估计方案从模型库性能表、可复现的完整训练配置到RLEHead、RLELoss、RegressionLabel编解码器与MpiiPCKAccuracy评测指标的真实源码实现帮助读者完整理解并复现这套“直接回归坐标”的姿态估计范式。一、模型定位与官方性能结果该模型库条目对应的模型命名为DeepPose RLE ResNet-50属于 Top-down 回归类topdown_regression人体 2D 关键点估计模型训练与评测均基于 MPII 数据集。模型元数据架构组成、数据集、结果指标与预训练权重信息记录在同目录的元数据文件 resnet_rle_mpii.yml 中其中 Architecture 明确标注为DeepPose、RLE、ResNet训练数据为 MPII。模型库文档给出的 MPII 验证集结果如下继承自原文档 Results on MPII val set 表格ArchInput SizeMeanMean0.1DeepPose-ResNet-50 (RLE)256x2560.8610.277Mean各关键点 PCKh 的均值以头部尺寸为归一化因子即 PCKhMean0.1在归一化距离阈值 0.1 下计算的 PCKh 均值对应训练配置文件为 td-reg_res50_rle-8xb64-210e_mpii-256x256.py预训练权重文件名为deeppose_res50_mpii_256x256_rle-5f92a619_20220504.pth下载链接记录于上述 yml 元数据文件的Weights字段。相关算法与数据集参考文献原文档为四个组成部分提供了 BibTeX 引用完整继承如下DeepPose (CVPR2014) —— 直接回归关键点坐标的开创性工作inproceedings{toshev2014deeppose, title{Deeppose: Human pose estimation via deep neural networks}, author{Toshev, Alexander and Szegedy, Christian}, booktitle{Proceedings of the IEEE conference on computer vision and pattern recognition}, pages{1653--1660}, year{2014} }RLE (ICCV2021) —— 残差对数似然估计建模误差分布而非仅回归点估计inproceedings{li2021human, title{Human pose regression with residual log-likelihood estimation}, author{Li, Jiefeng and Bian, Siyuan and Zeng, Ailing and Wang, Can and Pang, Bo and Liu, Wentao and Lu, Cewu}, booktitle{Proceedings of the IEEE/CVF International Conference on Computer Vision}, pages{11025--11034}, year{2021} }ResNet (CVPR2016) —— 特征提取骨干网络inproceedings{he2016deep, title{Deep residual learning for image recognition}, author{He, Kaiming and Zhang, Xiangyu and Ren, Shaoqing and Sun, Jian}, booktitle{Proceedings of the IEEE conference on computer vision and pattern recognition}, pages{770--778}, year{2016} }MPII (CVPR2014) —— 训练与评测数据集inproceedings{andriluka14cvpr, author {Mykhaylo Andriluka and Leonid Pishchulin and Peter Gehler and Schiele, Bernt}, title {2D Human Pose Estimation: New Benchmark and State of the Art Analysis}, booktitle {IEEE Conference on Computer Vision and Pattern Recognition (CVPR)}, year {2014}, month {June} }二、完整训练配置逐项解读训练配置入口为 td-reg_res50_rle-8xb64-210e_mpii-256x256.py它基于 default_runtime.py 基配置。下面按配置块逐一说明。2.1 训练轮数与验证频率# runtime train_cfg dict(max_epochs210, val_interval10)max_epochs210训练 210 个 epochval_interval10每 10 个 epoch 在 MPII 验证集上评测一次。2.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, end210, 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-4前 500 次迭代by_epochFalse执行线性 warmup学习率从5e-4 * 0.001线性升回基准值之后在第 170、200 epoch 处学习率各乘以gamma0.1衰减auto_scale_lr以基准 batch size 512 为参照即 8 卡 x 64当实际总 batch size 不同时按比例线性缩放学习率便于在显卡数量不同时尽量复现原训练效果。2.3 编解码器codec设置# codec settings codec dict(typeRegressionLabel, input_size(256, 256))回归式模型不使用 heatmapcodec 只承担“标签归一化/坐标反归一化”两个方向的工作训练时把图像内 2D 关键点归一化到网络可回归的空间推理时把网络输出还原为图像坐标。RegressionLabel的实现在 regression_label.py 中encode()输出keypoint_labels形状(N, K, D)D2 为 2D 坐标以及形状(N, K)的目标权重keypoint_weightsdecode()将网络预测的归一化坐标还原回图像空间坐标。input_size(256, 256)与数据管线中TopdownAffine的裁剪输出尺寸保持一致。2.4 模型结构backbone / neck / headmodel dict( typeTopdownPoseEstimator, data_preprocessordict( typePoseDataPreprocessor, mean[123.675, 116.28, 103.53], std[58.395, 57.12, 57.375], bgr_to_rgbTrue), backbonedict( typeResNet, depth50, init_cfgdict(typePretrained, checkpointtorchvision://resnet50), ), neckdict(typeGlobalAveragePooling), headdict( typeRLEHead, in_channels2048, num_joints16, lossdict(typeRLELoss, use_target_weightTrue), decodercodec), test_cfgdict( flip_testTrue, shift_coordsTrue, ))数据预处理采用 ImageNet 均值[123.675, 116.28, 103.53]与标准差[58.395, 57.12, 57.375]做 BGR→RGB 归一化BackboneResNet-50加载 torchvision 预训练权重输出通道数 2048NeckGlobalAveragePooling实现在 gap_neck.py把 2048 维特征图全局平均池化为 2048 维向量——这是 DeepPose 风格的“全局特征 全连接回归”结构HeadRLEHeadnum_joints16对应 MPII 的 16 个人体关键点损失为RLELoss且开启use_target_weightTrue对不可见/遮挡关节降权decodercodec用于推理阶段反归一化坐标test_cfgflip_testTrue开启水平翻转 TTA测试时融合原图与水平翻转图两次预测的结果shift_coordsTrue控制翻转坐标映射时是否做 1 像素偏移修正。2.5 数据管线与数据加载器dataset_type MpiiDataset data_mode topdown data_root data/mpii/ train_pipeline [ dict(typeLoadImage), dict(typeGetBBoxCenterScale), dict(typeRandomFlip, directionhorizontal), dict(typeRandomBBoxTransform, shift_prob0), 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) ]训练管线为典型 Top-down 流程读取人体裁剪图 → 由 bbox 计算中心与尺度 → 随机水平翻转 → bbox 随机平移/缩放增强 →TopdownAffine仿射变换到 256x256 →GenerateTarget用 codec 生成归一化坐标标签与权重 → 打包为模型输入。验证管线去掉随机增强与标签生成步骤。数据加载器配置要点训练集使用annotations/mpii_train.json验证/测试集使用annotations/mpii_val.jsonbatch_size648 卡即 8xb64与配置名中8xb64对应num_workers2训练开启persistent_workersTrue验证集额外指定headbox_filef{data_root}/annotations/mpii_gt_val.mat即 MPII 官方提供的头部尺寸标注文件供 PCKh 评测按头部大小归一化距离使用检查点保存策略为save_bestPCK按 PCK 越大越优保留最优权重评测器为MpiiPCKAccuracy。train_dataloader dict( batch_size64, num_workers2, persistent_workersTrue, samplerdict(typeDefaultSampler, shuffleTrue), datasetdict( typedataset_type, data_rootdata_root, data_modedata_mode, ann_fileannotations/mpii_train.json, data_prefixdict(imgimages/), pipelinetrain_pipeline, )) ... # hooks default_hooks dict(checkpointdict(save_bestPCK, rulegreater)) # evaluators val_evaluator dict(typeMpiiPCKAccuracy) test_evaluator val_evaluator三、RLEHead 源码解析同时回归坐标与方差核心实现在 rle_head.py。与普通 DeepPose 回归头的关键区别在于输出维度# Define fully-connected layers self.fc nn.Linear(in_channels, self.num_joints * 4)普通RegressionHeadregression_head.pyDeepPose 原始结构的全连接层输出num_joints * 2每个关键点仅 x、y而RLEHead输出num_joints * 4每个关键点额外回归两个 sigma坐标方差即网络输出(x, y, sigma_x, sigma_y)四元组forward()将其 reshape 为(B, K, 4)。前向与推理流程rle_head.py#L67-L116取 backbone 最后一层特征feats[-1]展平后经全连接层得到(B, K, 4)预测阶段对后两维做sigmoid将 sigma 压缩到(0, 1)区间保证方差恒正_batch_coords self.forward(_feats) _batch_coords[..., 2:] _batch_coords[..., 2:].sigmoid()若开启flip_test则取原图与翻转图两组特征分别前向翻转侧坐标经 flip_coordinatesshift_coords由test_cfg控制映射回原始坐标系后与原始预测取平均完成 TTA 融合结果扩维为(B, 1, K, 4)后经self.decode()调用RegressionLabelcodec 反归一化输出图像坐标。损失计算rle_head.py#L118-L153中预测被拆分为坐标pred_outputs[:, :, :2]与方差pred_outputs[:, :, 2:4]连同 GT 坐标、目标权重一起送入RLELoss同时用keypoint_pck_accuracy阈值 0.05在训练日志中额外报告acc_pose便于监控收敛。值得注意的细节RLEHead注册了_load_state_dict_pre_hook用于自动兼容 MMPose v1.0.0 之前旧版 DeepPose 回归头权重的键名loss.*重命名为loss_module.*使历史预训练权重可直接加载。四、RLELoss 源码解析残差对数似然估计损失函数实现在 regression_loss.py。RLE 的动机是点回归只监督“误差的期望”而 RLE 进一步用可学习流模型建模误差的分布。配置中通过use_target_weightTrue使用关键点权重。构造函数默认参数为size_averageTrue、residualTrue、q_distributionlaplace其中residual是否在流损失之外叠加一个 L1 风格的残差损失项拉普拉斯形式让流模型专注学习残差误差分布q_distribution残差项的先验误差分布可选laplace或gaussian内部实例化一个RealNVP正交耦合流模型实现在 mmpose/models/utils/realnvp.py。forward()的核心计算逻辑sigma sigma.sigmoid() error (pred - target) / (sigma 1e-9) # (B, K, 2) log_phi self.flow_model.log_prob(error.reshape(-1, 2)) log_phi log_phi.reshape(target.shape[0], target.shape[1], 1) log_sigma torch.log(sigma).reshape(target.shape[0], target.shape[1], 2) nf_loss log_sigma - log_phi if self.residual: assert self.q_distribution in [laplace, gaussian] if self.q_distribution laplace: loss_q torch.log(sigma * 2) torch.abs(error) else: loss_q torch.log( sigma * math.sqrt(2 * math.pi)) 0.5 * error**2 loss nf_loss loss_q逐行对应其含义sigma.sigmoid()将网络回归的原始方差压为正数与RLEHead预测阶段处理一致error (pred - target) / sigma把坐标误差按其方差归一化得到标准化残差nf_loss log(sigma) - log_phi负对数似然项。log_phi为流模型变换后的分布 log-prob密度归一化项为 Jacobian 行列式的 log即log|sigma|整体等价于对“观测误差分布”做极大似然训练residualTrue且laplace时loss_q log(2*sigma) |error|即拉普拉斯负对数似然作为残差项监督若选gaussian则退化为高斯负对数似然log(sigma*sqrt(2*pi)) 0.5*error^2use_target_weightTrue时逐点乘以target_weightMPII 中被遮挡或不可见的关节点对损失贡献被抑制最后按 batch 平均求和返回标量。作为对照同目录还收录了不带 RLE 的基线模型 td-reg_res50_8xb64-210e_mpii-256x256.py其 head 为普通RegressionHead仅输出 2 维坐标loss 为SmoothL1Lossregression_loss.py#L95-L138其余骨干、数据与训练超参完全相同。两套配置的差异恰好隔离出“RLE 方差建模 流模型”这一变量便于比较点回归与分布回归两种监督范式在同一架构下的表现。五、评测指标MpiiPCKAccuracyPCKh评测器MpiiPCKAccuracy实现在 keypoint_2d_metrics.py继承自通用PCKAccuracy专为 MPII 基准定制PCKh将预测关键点与 GT 的欧氏距离除以头部尺寸person head size归一化距离小于阈值thr即视为正确。头部尺寸信息正是配置中验证集headbox_filempii_gt_val.mat的来源两者在数据与评测层面是配套的输出指标包括每个关键点的独立 PCK以及PCK默认阈值下的均值即结果表中的Mean与PCK0.1即Mean0.1归一化距离阈值为 0.1等与模型库文档中的两列指标直接对应配置中save_bestPCK, rulegreater保证训练中自动保存 PCK 最优的检查点。六、复现与运行数据集准备MPII 的下载、组织成data/mpii/目录并放置annotations/mpii_train.json、mpii_val.json、mpii_gt_val.mat可参考官方文档 prepare_datasets.md训练与评测操作指南见 train_and_test.md。在仓库根目录下典型运行方式为# 训练以 8 卡为例与配置中 8xb64 一致 python tools/train.py \ configs/body_2d_keypoint/topdown_regression/mpii/td-reg_res50_rle-8xb64-210e_mpii-256x256.py # 测试加载训练得到的或模型库提供的检查点 python tools/test.py \ configs/body_2d_keypoint/topdown_regression/mpii/td-reg_res50_rle-8xb64-210e_mpii-256x256.py \ checkpoint_path运行说明与限制训练时长为 210 epoch验证每 10 epoch 触发一次实际耗时取决于 GPU 数量与显存若使用非 8 卡环境auto_scale_lr基准 batch 512会自动按总 batch size 缩放学习率尽量保持与原训练等效评测必须提供headbox_file指向的头部尺寸标注文件否则 PCKh 无法按头部大小归一化模型库条目对应的预训练权重文件名与下载位置记录在 resnet_rle_mpii.yml 的Weights字段中加载后可直接用于tools/test.py评测或 image_demo.py 等推理演示。七、小结该模型库条目完整展示了 MMPose 中“回归式 Top-down 姿态估计”的端到端实践ResNet-50 GlobalAveragePooling RLEHead的全连接回归结构RegressionLabelcodec 的坐标归一化闭环RLELoss中基于 RealNVP 流模型的误差分布建模以及面向 MPII 基准的MpiiPCKAccuracyPCKh评测体系。从源码结构看RLE 方案与 DeepPose 基线的代码差异被清晰地隔离在 head 输出维度num_joints * 4vsnum_joints * 2与 loss 模块两个位置配置层面仅通过替换head与loss即可切换两种范式这种设计使该系列配置res101/res152 变体见同目录 td-reg_res101_8xb64-210e_mpii-256x256.py成为研究回归式姿态估计监督策略的良好实验模板。【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmpose创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表