
DEKR 解耦关键点回归MMPose 中 Bottom-up 人体姿态估计的完整实现与实战指南【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmposeDEKRDisentangled Keypoint Regression解耦关键点回归是 CVPR 2021 提出的一种 bottom-up 多人姿态估计方法其核心思想是放弃传统的检测关键点 分组两阶段流程改为直接回归人体实例根点到各关键点的密集位移场。本文以 docs/src/papers/algorithms/dekr.md 的论文介绍为骨架结合 MMPose 仓库中 DEKR 的完整实现配置、模型、编解码器、数据流与推理逻辑系统讲解其原理、源码结构、训练/测试配置与在 COCO、CrowdPose 上的实战用法帮助你理解并落地这一直接回归式 bottom-up 方案。一、DEKR 是什么从两阶段到解耦的直接回归1.1 背景bottom-up 范式的两种路径与 top-down先检测人框、再单人估计关键点不同bottom-up 方法需要在一张图中同时定位所有实例的所有关键点。传统 bottom-up 主流是关键点检测 分组两阶段框架先为每个关键点生成热图再通过额外算法如 Part Affinity Fields 式的关联把散落的关键点组装成实例。DEKR 的研究动机见 dekr.md 的 Abstract指出密集关键点回归dense keypoint regression框架此前精度劣于检测分组框架原因是——准确回归关键点位置需要学习聚焦于关键点区域的表征而普通卷积难以做到。1.2 核心贡献解耦的关键点回归DEKR 提出的解决方案可以概括为三点像素级空间变换 自适应卷积通过 pixel-wise spatial transformer 生成仿射变换参数激活关键点区域内的像素并从这些区域学习表征多分支独立回归每个分支用一套专用的自适应卷积学习一个关键点的表征并回归该关键点的位移从而把不同关节的表征解耦开来各自聚焦到对应关键点区域回归在空间上更精确实验验证直接回归法在 COCO 与 CrowdPose 两个基准上超越了检测分组方法取得了当时领先的 bottom-up 结果论文发表于 CVPR 2021详见 BibTeX 引用。仓库中对 DEKR 的定位说明也印证了这一思路见 configs/body_2d_keypoint/dekr/README.mdDEKR 同时检测所有实例并从实例中心回归到各关节的偏移为了更准确地预测偏移不同关节的偏移由带可变形卷积层的分离分支回归不同形状的卷积核被用于为对应关节提取特征。二、MMPose 中 DEKR 的整体架构与源码映射DEKR 在 MMPose 中并非零散脚本而是完整注册进框架的模块化实现。整体数据流为输入图像 → PoseDataPreprocessor 归一化 → HRNet 多尺度特征 → FeatureMapProcessor 拼接特征 → DEKRHead ├─ heatmap 分支1K 通道根点热图 各关键点热图 └─ displacement 分支2K 通道各关键点在 x/y 方向的密集位移场 → SPR codec 解码根点 NMS 位移采样→ RescoreNet 打分 → NMS 输出关键源码文件与职责如下模块源码位置职责头部mmpose/models/heads/hybrid_heads/dekr_head.py双分支结构、自适应激活块、损失计算、预测与解码调度编解码器mmpose/codecs/spr.pySPRStructured Pose Representation编码/解码生成热图与位移场解码关键点坐标主干mmpose/models/backbones/hrnet.pyHRNet 多分辨率特征提取颈mmpose/models/necks/feature_map_processor.py多尺度特征拼接损失mmpose/models/losses/regression_loss.pySoftWeightSmoothL1Loss位移回归推理 NMSmmpose/evaluation/functional/nms.pynearby_joints_nms 实例去重数据变换mmpose/datasets/transforms/bottomup_transforms.pyBottomupRandomAffine / BottomupResize整体模型mmpose/models/pose_estimators/bottomup.pyBottomupPoseEstimator 组装 backbone/neck/head2.1 DEKRHead双分支与解耦的落地点dekr_head.py 中注册的DEKRHead是解耦思想的核心实现包含两个分支heatmap 分支_make_heatmap_conv_layers输出1 num_keypoints通道第 0 通道是根点热图root heatmap指示每个人实例中心位置其余通道是各关键点热图当generate_keypoint_heatmapsTrue时用于计算逐关键点置信度displacement 分支_make_displacement_conv_layers输出2 * num_keypoints通道每个像素存储该像素所属实例到各关键点的二维偏移向量。displacement 分支中连续堆叠了两个AdaptiveActivationBlockdekr_head.py这正是论文中pixel-wise spatial transformer adaptive convolution的实现用transform_matrix_conv为每个像素预测一个6 * groups通道的仿射变换参数重组为(B, H, W, groups, 2, 3)的仿射矩阵与固定的regular_matrix9 个采样点坐标矩阵乘得到每个采样点的偏移量共groups * 18以该偏移量驱动DeformConv2d可变形卷积要求安装完整版 mmcv在关键点区域自适应采样特征输出经 BN ReLU 后与残差相加。代码中groups被设置为num_keypoints即每个关节的分支使用专属的形变卷积核从机制上实现了关节间表征的解耦。2.2 SPR 编解码器从热图与位移场还原实例DEKR 的监督信号由 SPR codecmmpose/codecs/spr.py生成encode过程包含计算每个实例的根点默认root_typekpt_center即可见关键点的平均坐标与对角长度丢弃小实例diagonal_lengths minimal_diagonal_length的实例不参与训练生成根点高斯热图必要时同时生成关键点热图形状为(K1, H, W)生成密集位移场每个像素记录到所属实例各关键点的偏移形状(2K, H, W)并用background_weight默认 0.1控制背景像素的损失权重。decode过程是编码的逆操作spr.py把位移场重排为(K, 2, H, W)加上规则网格坐标得到每个像素处的候选关键点在根点热图上做batch_heatmap_nms核大小decode_nms_kernel5取前decode_max_instances默认 30个局部极大值作为实例根按根点位置从posemaps中采样出各实例的关键点坐标将坐标乘回scale_factor图像尺寸/热图尺寸还原到原图坐标系。若启用了关键点热图还会用grid_sample在每个关键点坐标处采样热图值作为逐关键点置信度keypoint_scores。三、配置文件逐段精解以 COCO 为例完整可运行的配置位于 configs/body_2d_keypoint/dekr/coco/dekr_hrnet-w32_8xb10-140e_coco-512x512.pyCrowdPose 版本见 configs/body_2d_keypoint/dekr/crowdpose/dekr_hrnet-w32_8xb10-300e_crowdpose-512x512.py。以下分段说明其关键设计。3.1 训练策略与学习率调度_Base_ [../../../_base_/default_runtime.py] # runtime train_cfg dict(max_epochs140, val_interval10) # optimizer optim_wrapper dict(optimizerdict(typeAdam, lr1e-3)) # learning policy param_scheduler [ dict(typeLinearLR, begin0, end500, start_factor0.001, by_epochFalse), # warm-up dict(typeMultiStepLR, begin0, end140, milestones[90, 120], gamma0.1, by_epochTrue) ] # automatically scaling LR based on the actual training batch size auto_scale_lr dict(base_batch_size80)要点说明优化器使用 Adam初始学习率 1e-3前 500 步做线性 warm-up从 0.001 倍起步学习率在 epoch 90、120 处各衰减 0.1 倍CrowdPose 版对应 300 轮、milestones[200, 260]验证间隔 20 轮auto_scale_lr表示以base_batch_size80为基准自动缩放学习率实际 batch size 与之不同时会按线性缩放检查点钩子按coco/APCrowdPose 为crowdpose/AP以越大越好的规则保存最优模型。3.2 SPR codec 配置codec dict( typeSPR, input_size(512, 512), heatmap_size(128, 128), sigma(4, 2), minimal_diagonal_length32**0.5, generate_keypoint_heatmapsTrue, decode_max_instances30)各字段含义与 spr.py 的构造参数一一对应参数取值含义input_size(512, 512)模型输入图像尺寸 [w, h]heatmap_size(128, 128)热图/位移场尺寸 [W, H]scale_factor input_size / heatmap_size 4sigma(4, 2)二元组根点热图高斯标准差 4关键点热图标准差 2必须提供两个值因为generate_keypoint_heatmapsTrueminimal_diagonal_length32**0.5实例包围盒对角长度阈值小于该值的小实例不参与训练generate_keypoint_heatmapsTrue同时生成 K 张关键点热图用于逐关键点打分decode_max_instances30解码时最多输出的实例数3.3 模型主体Backbone Neck Headmodel dict( typeBottomupPoseEstimator, data_preprocessordict( typePoseDataPreprocessor, mean[123.675, 116.28, 103.53], std[58.395, 57.12, 57.375], bgr_to_rgbTrue), backbonedict( typeHRNet, in_channels3, extradict( stage1dict(num_modules1, num_branches1, blockBOTTLENECK, num_blocks(4,), num_channels(64,)), stage2dict(num_modules1, num_branches2, blockBASIC, num_blocks(4, 4), num_channels(32, 64)), stage3dict(num_modules4, num_branches3, blockBASIC, num_blocks(4, 4, 4), num_channels(32, 64, 128)), stage4dict(num_modules3, num_branches4, blockBASIC, num_blocks(4, 4, 4, 4), num_channels(32, 64, 128, 256), multiscale_outputTrue)), init_cfgdict(typePretrained, checkpointhttps://download.openmmlab.com/mmpose/ pretrain_models/hrnet_w32-36af842e.pth)), neckdict(typeFeatureMapProcessor, concatTrue), headdict( typeDEKRHead, in_channels480, num_keypoints17, heatmap_lossdict(typeKeypointMSELoss, use_target_weightTrue), displacement_lossdict( typeSoftWeightSmoothL1Loss, use_target_weightTrue, supervise_emptyFalse, beta1 / 9, loss_weight0.002), decodercodec, rescore_cfgdict( in_channels74, norm_indexes(5, 6), init_cfgdict( typePretrained, checkpointhttps://download.openmmlab.com/mmpose/ pretrain_models/kpt_rescore_coco-33d58c5c.pth))), test_cfgdict( multiscale_testFalse, flip_testTrue, nms_dist_thr0.05, shift_heatmapTrue, align_cornersFalse))关键设计解读typeBottomupPoseEstimatorbottom-up 专用估计器见 mmpose/models/pose_estimators/bottomup.py数据流不经过检测框HRNet 主干4 个 stage、最高 4 个分支multiscale_outputTrue输出多分辨率特征FeatureMapProcessor(concatTrue)将各分辨率特征上采样拼接后得到480 通道w32 的 3264128256正好对应DEKRHead的in_channels480损失函数KeypointMSELoss监督根点/关键点热图use_target_weightTrue使用逐像素权重背景权重来自 codec 的background_weightSoftWeightSmoothL1Loss监督位移场。该损失实现在 mmpose/models/losses/regression_loss.pybeta1/9是 L1/L2 切换阈值supervise_emptyFalse表示对无实例的像素不施加回归监督对应displacement_weights置零loss_weight在 COCO 上为 0.002、CrowdPose 上为 0.004用于平衡与热图损失的量级rescore_cfg可选的打分网络RescoreNetdekr_head.py输入预测关键点坐标、逐关节分数与骨架拓扑特征关节相对距离、归一化关节长度等输出该实例的 OKS 估计值并乘到根点分数上。COCO 版norm_indexes(5, 6)躯干关节对、in_channels74CrowdPose 版为norm_indexes(0, 1)、in_channels59。注意配置注释的提醒如果使用非原始数据集训练请务必移除rescore_cfgfind_unused_parameters True使用 rescore net 时启用 DDP 训练的必要设置测试策略flip_testTrue开启水平翻转 TTA翻转热图按flip_indices对齐后平均翻转位移场需做坐标修正nms_dist_thr0.05用于实例去重multiscale_testFalse表示默认不做多尺度测试。3.4 数据管线与评估训练/验证管线使用 bottom-up 专用变换见 mmpose/datasets/transforms/bottomup_transforms.pytrain_pipeline [ dict(typeLoadImage), dict(typeBottomupRandomAffine, input_sizecodec[input_size]), dict(typeRandomFlip, directionhorizontal), dict(typeGenerateTarget, encodercodec), dict(typeBottomupGetHeatmapMask), dict(typePackPoseInputs), ] val_pipeline [ dict(typeLoadImage), dict(typeBottomupResize, input_sizecodec[input_size], size_factor32, resize_modeexpand), dict(typePackPoseInputs, meta_keys(id, img_id, img_path, crowd_index, ori_shape, img_shape, input_size, input_center, input_scale, flip, flip_direction, flip_indices, raw_ann_info, skeleton_links)) ]BottomupRandomAffine在整图上做仿射数据增强GenerateTarget调用 SPR codec 的encode生成热图与位移场验证阶段BottomupResize使用resize_modeexpand图像尺寸会向上取整到size_factor32的整数倍保证后续下采样到热图尺寸时对齐COCO 评估使用CocoMetric且nms_modenone实例级去重由 head 内部的nearby_joints_nms完成见 mmpose/evaluation/functional/nms.py、score_modekeypointCrowdPose 版额外设置use_areaFalse、iou_typekeypoints_crowd、prefixcrowdpose并输出 AP(E)/AP(M)/AP(H) 分组指标。四、实验结果与模型仓库仓库内数据以下结果均来自仓库内文档未做多尺度测试与配置中multiscale_testFalse一致。COCO val2017configs/body_2d_keypoint/dekr/coco/hrnet_coco.mdArchInput SizeAPAP50AP75ARAR50HRNet-w32512x5120.6860.8680.7500.7350.898HRNet-w48640x6400.7140.8830.7770.7620.915CrowdPose testconfigs/body_2d_keypoint/dekr/crowdpose/hrnet_crowdpose.mdArchInput SizeAPAP50AP75AP (E)AP (M)AP (H)HRNet-w32512x5120.6630.8570.7140.7400.6710.576HRNet-w48640x6400.6790.8690.7310.7530.6880.593两张结果表说明 DEKR 在拥挤场景CrowdPose尤其是难例 AP(H)与通用场景COCO上都能保持较高精度w48 640x640 输入的配置在两项基准上均优于 w32 版本。权重与日志文件的下载地址已录入各 markdown 表格的 ckpt/log 列中。五、训练、测试与推理实战5.1 训练按照标准 MMPose 流程使用 tools/train.py 启动训练分布式脚本见 tools/dist_train.sh# 单卡 python tools/train.py configs/body_2d_keypoint/dekr/coco/dekr_hrnet-w32_8xb10-140e_coco-512x512.py # 8 卡分布式 bash tools/dist_train.sh configs/body_2d_keypoint/dekr/coco/dekr_hrnet-w32_8xb10-140e_coco-512x512.py 8训练前需按 docs/zh_cn/user_guides/prepare_datasets.md 准备 COCOdata/coco/annotations/person_keypoints_train2017.json、images/train2017/等或 CrowdPosedata/crowdpose/数据。默认配置使用 ImageNet 预训练的 HRNet 权重与 DEKR 官方 rescore net 权重均托管在 OpenMMLab 下载服务器由init_cfg自动拉取。5.2 测试与评估python tools/test.py configs/body_2d_keypoint/dekr/coco/dekr_hrnet-w32_8xb10-140e_coco-512x512.py \ checkpoint路径 --out result.pkl --dump 可视化结果目录评估器自动输出 COCO AP/AR 指标CrowdPose 配置输出带crowdpose前缀的 AP/AP(E)/AP(M)/AP(H)。5.3 单图推理InferencerDEKR 属于 bottom-up 模型无需检测器即可端到端推理。可以使用 demo/inferencer_demo.pypython demo/inferencer_demo.py 图像或视频路径 \ --pose2d configs/body_2d_keypoint/dekr/coco/dekr_hrnet-w32_8xb10-140e_coco-512x512.py \ --vis-out-dir 输出目录 --draw-heatmap--draw-heatmap可叠加输出根点/关键点热图与位移场可视化便于核对预测过程head 的predict在test_cfg[output_heatmaps]True时会返回 heatmaps 与 displacements见 dekr_head.py。5.4 内存与依赖注意点mmcv-full 依赖AdaptiveActivationBlock使用DeformConv2ddekr_head.py若未安装完整版 mmcv 会直接抛出 ImportError 提示batch size 约束DEKRHead.predict明确要求推理 batch size 为 1dekr_head.py因此验证/测试 dataloader 的batch_size1训练 batch size 为 10CrowdPose w48 配置为 58 卡对应更大总 batchrescore net 影响使用 rescore net 时需开启find_unused_parameters True且自定义数据集训练时应移除rescore_cfg。六、版本兼容旧权重自动迁移DEKRHead内部通过_version 2与_load_state_dict_pre_hookdekr_head.py实现旧版MMPose 1.0.0 之前权重的自动转换offset_conv_layers重命名为displacement_conv_layers并反转符号新旧版本的位移向量方向定义相反、根点热图从首通道移到末通道、rescore_net前缀补全。这意味着直接加载早期 DEKR 权重时无需手动改权重文件名框架会在加载时自动适配。七、总结DEKR 方案的适用场景与选型建议从仓库实现可以归纳出 DEKR 的技术特点优点单阶段端到端回归无需检测器与分组后处理多分支自适应卷积对关键点区域的特征聚焦使其在拥挤场景CrowdPose 的 AP(H)0.576~0.593表现稳健flip_test、RescoreNet等机制进一步提升了分数质量代价直接回归需要预测稠密位移场显存与计算量较大推理要求 batch size1 且依赖完整版 mmcv相比 top-down 方法在单人特写场景下仍存在关键点坐标精度上的天然劣势论文中即以检测分组方法为对标对象。因此 DEKR 适合需要同时处理多目标、尤其拥挤/遮挡场景且希望省去检测器流水线的 bottom-up 应用若追求单人的极致精度可对照仓库中的 topdown_heatmap 系列配置进行选型。通过本文的配置拆解与源码映射你可以直接基于 dekr 配置目录 中四个现成配置开始训练、微调或二次开发属于自己的 bottom-up 姿态估计模型。【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmpose创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考