全身姿态估计实战指南:Bottom-Up 分组原理、COCO-WholeBody 配置与训练推理)
人工智能计算机视觉深度学习【免费下载链接】ViTPoseThe official repo for [NeurIPS22] ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation and [TPAMI23] ViTPose: Vision Transformer for Generic Body Pose Estimation项目地址https://gitcode.com/gh_mirrors/vi/ViTPose点击查看免费下载本文围绕 Associative EmbeddingAEREADME 展开系统讲解 AE 这一最流行的 2D Bottom-Up 姿态估计范式先检测图像中所有关键点再通过关联标签tag将它们分组为个体实例并结合 ViTPose 仓库中 COCO-WholeBody 的 HRNet/HigherHRNet 配置、源码实现与结果给出可复用的训练、评测与推理方案。读完本文你将理解 tag 分组的核心原理、push/pull 损失的计算方式、HeatmapParser 后处理链路并掌握如何基于仓库配置在 133 关键点的全身数据集上训练与部署 AE 模型。一、AE 算法核心原理检测 分组Associative EmbeddingAE出自 Newell 等人 2017 年的论文Associative embedding: End-to-end learning for joint detection and groupingNIPS2017是 2D 人体姿态估计中最主流的bottom-up自底向上方法之一。与 top-down 方法先检测人体框、再对每个人单独估计关键点不同bottom-up 方法直接处理整张图像检测阶段一次性检测出图像中所有人的所有关键点heatmap 输出分组阶段把这些零散的关键点按人体实例归组构成完整姿态。分组的关键在于 AE 提出的关联标签tag机制网络为每个检测到的关键点额外预测一个 tag 值。同一个人的所有关键点 tag 彼此接近不同人的 tag 彼此远离因此可以依据 tag 的相似性把关键点聚类为不同个体。这一先全部检测、再按 tag 关联的设计让 AE 天然适合拥挤、遮挡场景无需依赖目标检测器。仓库中该算法对应的注册实现为 AssociativeEmbedding 检测器其 docstring 明确给出了与上述 README 一致的定义Associative embedding pose detectors。1.1 tag 的训练信号push 损失与 pull 损失tag 的同类相近、异类相远特性不是凭空出现的而是由专门的AE 损失监督学习得到。仓库中的实现位于 multi_loss_factory.pypull 损失拉近损失把同一人各关键点的 tag 拉向它们的均值公式为pull mean((tmp - mean(tag))^2)对应代码见 AELoss.singleTagLoss 中的pull pull torch.mean((tmp - tags[-1].expand_as(tmp))**2)push 损失推远损失把不同人的 tag 均值互相推开。当ae_loss_typeexp时push sum(exp(-(diff)^2)) - num_tags等价于指数形式的排斥项当ae_loss_typemax时则采用 hinge 形式clamp(1 - |diff|, min0)。两种类型的选择见 AELoss。最终MultiLossFactory会按每个 stage 分别组合 heatmap 损失均方误差、push 损失与 pull 损失并用heatmaps_loss_factor、push_loss_factor、pull_loss_factor加权见 MultiLossFactory.forward。1.2 tag 的维度tag_per_joint关于 tag 的通道数配置项tag_per_joint决定tag_per_jointTrue每个关键点独立预测自己的 tagtag 通道数等于关键点数量dim_tag num_jointstag_per_jointFalse所有关键点共享单一 tagdim_tag 1。该逻辑在 AESimpleHead 与 AEHigherResolutionHead 中均有体现out_channels num_joints dim_tag即网络的输出通道被划分为关键点热图部分 tag 部分两部分。在推理时由split_ae_outputs见 bottom_up_eval.py按with_heatmaps与with_ae拆分。二、仓库内的 AE 实现链路与后处理2.1 检测器整体流程AssociativeEmbedding.forward_test 展示了完整的推理链路对每个测试尺度test_scale_factor前向网络得到多尺度 heatmaps 与 tags若开启flip_testTrue将图像水平翻转再次前向并用flip_index恢复关键点左右对应关系flip_feature_maps随后与原始输出做平均聚合aggregate_stage_flip多尺度之间通过aggregate_scale聚合heatmap 取平均tag 采用unsqueeze_concat拼接以保留多尺度信息调用 HeatmapParser.parse 完成关键点分组通过get_group_preds把热图坐标映射回原图坐标。2.2 HeatmapParser从热图到人体姿态HeatmapParser 是 AE 后处理的核心其流水线为Heatmap NMS先用MaxPool2d(nms_kernel, stride1, paddingnms_padding)对热图做非极大值抑制保留局部峰值见 nmsTop-K 选取对每个关键点通道取置信度最高的max_num_people默认 30个候选位置及其对应 tag 值见 top_ktag 匹配_match_by_tag用Munkres匈牙利算法求解候选关键点与已有 person 分组之间的最优匹配匹配代价由 tag 距离决定并受detection_threshold关键点置信度门槛默认 0.1与tag_thresholdtag 距离门槛默认 1约束见 _match_by_tagadjust 与 refineadjustTrue时对坐标做 ±0.25 的亚像素微调adjustrefineTrue时利用检测到关键点的平均 tag回头检索漏检关键点refine。值得注意的是对于 17 关键点的 COCO 人体模型_Params还内置了固定的joint_order处理顺序group.py其他关键点数量则按自然顺序处理。三、COCO-WholeBody133 关键点的全身任务AE 在仓库中落地于COCO-WholeBody全身姿态数据集Jin 等人ECCV2020。该数据集在 COCO 人体 17 点基础上扩展为133 个关键点数据集定义见 configs/base/datasets/coco_wholebody.py其分组结构为部位关键点索引数量身体 body0–1617脚部 foot17–226面部 face23–9068手部 hand左右各 2191–13242该划分在数据集类 BottomUpCocoWholeBodyDataset 的 docstring 与body_num/foot_num/face_num/left_hand_num/right_hand_num属性中均有体现其_do_python_keypoint_eval会分别对 body、foot、face、left hand、right hand 以及 wholebody 六组分别调用 COCOeval 计算 mAPbottom_up_coco_wholebody.py。评测指标方面仓库配置统一使用metricmAP、key_indicatorAP即全身姿态的整体 AP/AR并细分为 Body、Foot、Face、Hand 与 Whole 五档见下文结果表。四、配置详解HRNet 与 HigherHRNet 两种 AE 模型仓库在该目录下提供了两组模型家族共 8 个训练配置输入 512×512 与 640×640 两种分辨率模型家族配置文件目录HRNet-w32 / w48coco-wholebody/HigherHRNet-w32 / w48同上4.1 HRNet AESimpleHead 配置逐项解读以 hrnet_w32_coco_wholebody_512x512.py 为例逐段拆解 AE 训练配置训练与优化器设置_base_ [ ../../../../_base_/default_runtime.py, ../../../../_base_/datasets/coco_wholebody.py ] checkpoint_config dict(interval50) evaluation dict(interval50, metricmAP, key_indicatorAP) optimizer dict(typeAdam, lr0.0015) optimizer_config dict(grad_clipNone) lr_config dict( policystep, warmuplinear, warmup_iters500, warmup_ratio0.001, step[200, 260]) total_epochs 300使用 Adam 优化器初始学习率 0.0015线性 warmup 500 轮比例 0.001在第 200、260 epoch 阶梯式下降总计训练 300 epoch每 50 个 epoch 保存一次 checkpoint 并做一次验证验证指标为 mAP主指标为 AP。通道与数据配置channel_cfg dict( num_output_channels133, dataset_joints133, dataset_channel[list(range(133))], inference_channellist(range(133))) data_cfg dict( image_size512, base_size256, base_sigma2, heatmap_size[128], num_jointschannel_cfg[dataset_joints], dataset_channelchannel_cfg[dataset_channel], inference_channelchannel_cfg[inference_channel], num_scales1, scale_aware_sigmaFalse, )num_joints133对应 COCO-WholeBody 全部关键点heatmap_size[128]表示输出热图尺寸为输入 512 的 1/4scale_aware_sigmaFalse表示不使用与人体框尺寸挂钩的自适应高斯 sigma而统一使用base_sigma2生成目标热图。模型结构AssociativeEmbedding HRNet AESimpleHeadmodel dict( typeAssociativeEmbedding, pretrainedhttps://download.openmmlab.com/mmpose/ pretrain_models/hrnet_w32-36af842e.pth, 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)))), keypoint_headdict( typeAESimpleHead, in_channels32, num_joints133, num_deconv_layers0, tag_per_jointTrue, with_ae_loss[True], extradict(final_conv_kernel1, ), loss_keypointdict( typeMultiLossFactory, num_joints133, num_stages1, ae_loss_typeexp, with_ae_loss[True], push_loss_factor[0.001], pull_loss_factor[0.001], with_heatmaps_loss[True], heatmaps_loss_factor[1.0], supervise_emptyFalse)), ... )关键点backbone为标准 HRNet-w32stage1 单分支 BOTTLENECK 64 通道stage2–stage4 逐步扩展为 2/3/4 分支、32/64/128/256 通道输出 32 通道高分辨率特征AESimpleHead不接反卷积num_deconv_layers0直接在 HRNet 输出上做 1×1 卷积final_conv_kernel1输出 133热图 133tag 266 通道损失采用MultiLossFactoryae_loss_typeexpheatmap 损失权重 1.0push/pull 损失权重各 0.001且supervise_emptyFalse表示不对空通道施加监督见 HeatmapLoss 中empty_mask的处理pretrained加载 ImageNet 预训练的 HRNet-w32 权重。test_cfg后处理与测试策略test_cfgdict( num_joints133, max_num_people30, scale_factor[1], with_heatmaps[True], with_ae[True], project2imageTrue, align_cornersFalse, nms_kernel5, nms_padding2, tag_per_jointTrue, detection_threshold0.1, tag_threshold1, use_detection_valTrue, ignore_too_muchFalse, adjustTrue, refineTrue, flip_testTrue)这些参数与上文 HeatmapParser 一一对应单尺度测试scale_factor[1]、热图与 tag 均输出、NMS 核 5/填充 2、检测置信度门槛 0.1、tag 距离门槛 1、开启 flip test、坐标微调与漏检修复。数据流水线train_pipeline [ dict(typeLoadImageFromFile), dict(typeBottomUpRandomAffine, rot_factor30, scale_factor[0.75, 1.5], scale_typeshort, trans_factor40), dict(typeBottomUpRandomFlip, flip_prob0.5), dict(typeToTensor), dict(typeNormalizeTensor, mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]), dict(typeBottomUpGenerateTarget, sigma2, max_num_people30), dict(typeCollect, keys[img, joints, targets, masks], meta_keys[]), ]训练时随机旋转 30°、缩放 0.75–1.5 倍、平移 40 像素、50% 概率水平翻转BottomUpGenerateTarget以 sigma2 生成热图目标同时输出joints用于 AE 损失的 tag 监督与masks验证/测试流水线使用BottomUpGetImgSize与BottomUpResizeAlign完成尺度对齐。这些变换的实现见 bottom_up_transform.py。数据加载data_root data/coco data dict( workers_per_gpu2, train_dataloaderdict(samples_per_gpu24), val_dataloaderdict(samples_per_gpu1), test_dataloaderdict(samples_per_gpu1), traindict(typeBottomUpCocoWholeBodyDataset, ann_filef{data_root}/annotations/coco_wholebody_train_v1.0.json, img_prefixf{data_root}/train2017/, ...), valdict(typeBottomUpCocoWholeBodyDataset, ann_filef{data_root}/annotations/coco_wholebody_val_v1.0.json, img_prefixf{data_root}/val2017/, ...), testdict(...同上 val...), )训练 batch size 为 24单卡推理 batch size 为 1AssociativeEmbedding.forward_test中assert img.size(0) 1。数据集类型为BottomUpCocoWholeBodyDatasetbottom_up_coco_wholebody.py。4.2 HigherHRNet多尺度高分辨率 head与 HRNet 版本的区别在于 higherhrnet_w32_coco_wholebody_512x512.py 使用HigherHRNet的尺度感知设计data_cfg dict( image_size512, base_size256, base_sigma2, heatmap_size[128, 256], # 双分辨率热图 num_scales2, scale_aware_sigmaFalse, ) keypoint_headdict( typeAEHigherResolutionHead, in_channels32, num_joints133, tag_per_jointTrue, extradict(final_conv_kernel1, ), num_deconv_layers1, num_deconv_filters[32], num_deconv_kernels[4], num_basic_blocks4, cat_output[True], with_ae_loss[True, False], # 原始分辨率分支算 AE 损失反卷积分支不算 loss_keypointdict( typeMultiLossFactory, num_joints133, num_stages2, ae_loss_typeexp, with_ae_loss[True, False], push_loss_factor[0.001, 0.001], pull_loss_factor[0.001, 0.001], with_heatmaps_loss[True, True], heatmaps_loss_factor[1.0, 1.0], supervise_emptyFalse)), test_cfgdict( ... with_heatmaps[True, True], with_ae[True, False], ...)通过一层步长 2 的反卷积num_deconv_layers1kernel 4后接 4 个 BasicBlock把 HRNet 输出上采样到原始分辨率得到[128, 256]双尺度热图缓解小尺度人体关键点定位困难cat_output[True]表示反卷积输入会与前一阶段输出做通道拼接见 AEHigherResolutionHead.forward原始分辨率分支计算 AE 损失with_ae_loss[True, False]反卷积分支只计算热图损失测试时同理只对原始分辨率分支取 tag。4.3 实验设置说明预训练策略根据仓库中 hrnet_coco-wholebody.md 与 higherhrnet_coco-wholebody.md 的 Note表中表示模型先在原始 COCO 人体关键点数据集上预训练再在 COCO-WholeBody 上微调仓库作者发现该策略能带来更好的性能。五、COCO-WholeBody 实验结果以下结果均来自仓库文档评测于 COCO-WholeBody v1.0 val 集未使用多尺度测试。5.1 HRNet AESimpleHead结果表ArchInput SizeBody APBody ARFoot APFoot ARFace APFace ARHand APHand ARWhole APWhole ARHRNet-w32512x5120.5510.6500.2710.4510.5640.6180.1590.2380.3420.453HRNet-w48512x5120.5920.6860.4430.5950.6190.6740.3470.4380.4220.5325.2 HigherHRNet AEHigherResolutionHead结果表ArchInput SizeBody APBody ARFoot APFoot ARFace APFace ARHand APHand ARWhole APWhole ARHigherHRNet-w32512x5120.5900.6720.1850.3350.6760.7210.2120.2980.4010.493HigherHRNet-w48512x5120.6300.7060.4400.5730.7300.7770.3890.4770.4870.574可见 HigherHRNet 借助高分辨率分支在 Face/Hand 等精细部位上普遍优于同级 HRNet。以上各配置的 ckpt 与 log 下载入口以仓库中对应模型的.md/.yml文件为准如 hrnet_coco-wholebody.yml、higherhrnet_coco-wholebody.yml。六、训练、评测与推理实操6.1 训练使用仓库 tools/train.py 训练 AE 模型参数与单卡/多卡用法如下# 单卡训练 python tools/train.py \ configs/wholebody/2d_kpt_sview_rgb_img/associative_embedding/coco-wholebody/hrnet_w32_coco_wholebody_512x512.py \ --work-dir work_dirs/hrnet_w32_coco_wholebody_512x512 # 多卡分布式训练8 卡 bash tools/dist_train.sh \ configs/wholebody/2d_kpt_sview_rgb_img/associative_embedding/coco-wholebody/hrnet_w32_coco_wholebody_512x512.py \ 8 \ --work-dir work_dirs/hrnet_w32_coco_wholebody_512x512前置条件需按 data_preparation.md 将 COCO-WholeBody 数据置于data/coco/coco_wholebody_train_v1.0.json、coco_wholebody_val_v1.0.json与对应图像目录。6.2 评测使用 tools/test.py 在 val 集上复现仓库指标python tools/test.py \ configs/wholebody/2d_kpt_sview_rgb_img/associative_embedding/coco-wholebody/hrnet_w32_coco_wholebody_512x512.py \ ${CHECKPOINT_FILE} \ --out work_dirs/hrnet_w32_coco_wholebody_512x512/result.pkl评测过程会按 Body / Foot / Face / Left Hand / Right Hand / WholeBody 六个分组分别输出 AP/AR 指标见上文_do_python_keypoint_eval。6.3 图像推理与可视化仓库提供 bottom-up 专用推理脚本 demo/bottom_up_img_demo.py无需检测器直接对整图推理python demo/bottom_up_img_demo.py \ ${MMPOSE_CONFIG_FILE} ${MMPOSE_CHECKPOINT_FILE} \ --img-path ${IMG_PATH} \ --out-img-root vis_results \ --devicecuda:0 \ --kpt-thr 0.3 \ --pose-nms-thr 0.9脚本内部调用inference_bottom_up_pose_model完成单图 bottom-up 推理并通过vis_pose_result渲染 133 关键点姿态--kpt-thr控制显示关键点置信度门槛--pose-nms-thr为姿态级 OKS NMS 阈值。七、源码级验证单元测试仓库测试 tests/test_models/test_bottom_up_forward.py 直接验证了 AE 检测器的完整链路以AssociativeEmbedding ResNet-18 backbone AESimpleHeadMultiLossFactory构造模型17 关键点构造(1, 3, 256, 256)随机输入、目标热图(N, 17, H/32, W/32)、mask 与joints分别验证forward(return_lossTrue)返回包含heatmap_loss/push_loss/pull_loss的损失字典以及forward(return_lossFalse)与forward_dummy的推理路径。该测试从源码层面印证了本文所述heatmap 损失 push/pull AE 损失联合训练、tag 分组推理的完整机制也说明 AE 组件是仓库中可独立复用、被 CI 覆盖的核心模块。八、小结本文以 Associative Embedding README 为骨架完整覆盖了 AE 的两阶段先检测、后分组思想与 tag 关联机制并结合仓库源码深入剖析了 push/pull 损失、tag_per_joint、HeatmapParser 分组流水线、HRNet/HigherHRNet 两类 head 的差异、COCO-WholeBody 133 关键点配置、四组官方结果以及训练/评测/推理的完整命令。对于需要在拥挤场景或全身姿态任务中落地 bottom-up 方案的开发者这套配置与代码即是现成的起点——只需准备数据、下载对应 checkpoint 即可复现仓库结果或将AssociativeEmbedding检测器与AESimpleHead/AEHigherResolutionHead复用到自定义关键点数据集上。赞分享人工智能计算机视觉深度学习【免费下载链接】ViTPoseThe official repo for [NeurIPS22] ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation and [TPAMI23] ViTPose: Vision Transformer for Generic Body Pose Estimation项目地址https://gitcode.com/gh_mirrors/vi/ViTPose点击查看免费下载相关推荐ViTPose 仓库全身体姿态估计Bottom-Up实战HigherHRNet Associative Embedding 在 COCO-WholeBody 上的配置与调优ViTPose 仓库全身体姿态估计Bottom Up实战HigherHRNet Associative Embedding 在 COCO WholeB人工智能计算机视觉深度学习ViTPose 仓库中的 Hourglass-AE基于 Associative Embedding 的 COCO 自底向上人体姿态估计全解析ViTPose 仓库中的 Hourglass AE基于 Associative Embedding 的 COCO 自底向上人体姿态估计全解析 导读 本文以 h人工智能计算机视觉深度学习ViTPose 仓库 Associative Embedding HRNet COCO 自底向上人体姿态估计配置全解析ViTPose 仓库 Associative Embedding HRNet COCO 自底向上人体姿态估计配置全解析 导读 本文以 hrnet_coco.人工智能计算机视觉深度学习创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考