ViTPose 仓库 Associative Embedding + HRNet COCO 自底向上人体姿态估计配置全解析

发布时间:2026/10/14 1:47:00
ViTPose 仓库 Associative Embedding + HRNet COCO 自底向上人体姿态估计配置全解析
人工智能计算机视觉深度学习【免费下载链接】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点击查看免费下载导读本文以 hrnet_coco.md 为骨架系统讲解 ViTPose 仓库中基于 Associative Embedding关联嵌入与 HRNet 骨干的 COCO 自底向上bottom-up人体姿态估计方案从算法原理、官方评测指标到 hrnet_w32_coco_512x512.py / hrnet_w48_coco_512x512.py 的逐段配置解读、损失函数与后处理分组源码剖析再到训练、测试与单图推理的完整实战命令。读完本文你将能够理解自底向上姿态估计先检点、后分组的完整数据流并可直接在 COCO 数据集上复现文档中的评测指标。一、方法背景为什么选择 Associative Embedding HRNet1.1 三种核心算法引用文档开头以 BibTeX 形式引用了三篇奠基性工作对应方法、骨干与数据集的组合Associative EmbeddingNIPS2017Newell et al.提出检测 分组的自底向上范式。网络对每个关键点不仅预测热力图heatmap还额外预测一个 tag嵌入向量。同一人的各关键点 tag 彼此接近不同人的 tag 相互远离据此可将散落的关键点聚合成完整姿态。HRNetCVPR2019Sun et al.高分辨率表示学习网络。整个网络始终维护高分辨率特征分支并通过多分支并行与跨分辨率特征融合避免因下采样丢失空间细节非常契合小目标与密集人群场景下的关键点定位。COCOECCV2014评测基准数据集提供person_keypoints_train2017.json与person_keypoints_val2017.json等标注文件。三者结合即本文的核心方案用 HRNet 提取高分辨率特征由关联嵌入头同时输出 17 类关键点热力图与分组 tag在 COCO val2017 上验证精度。1.2 自底向上 vs 自顶向下与先检测人框、再逐框回归关键点的自顶向下top-down方法不同自底向上方法直接在整张图上检测所有关键点再分组。其优势在于天然规避了自顶向下方法对检测框质量的依赖、无需重复裁剪但对密集场景的分组正确性要求更高——这正是 AE tag 机制要解决的问题。更完整的说明可参见 associative_embedding 目录 README。二、官方评测结果文档核心数据文档给出了 HRNet-w32 / HRNet-w48 两种骨干在 COCO val2017 上的两套评测结果。2.1 单尺度测试无 multi-scale testArchInput SizeAPAP50AP75ARAR50HRNet-w32配置512x5120.6540.8630.7200.7100.892HRNet-w48配置512x5120.6650.8600.7270.7160.8892.2 多尺度测试3 个默认尺度 [2, 1, 0.5]ArchInput SizeAPAP50AP75ARAR50HRNet-w32512x5120.6980.8770.7600.7480.907HRNet-w48512x5120.7120.8800.7710.7570.909关键结论多尺度测试multi-scale test显著提升指标——HRNet-w48 的 AP 从 0.665 提升至 0.7124.7 个点。原因在于多尺度推理聚合了不同分辨率下的热力图响应对尺度变化更鲁棒代价是推理耗时按尺度数成倍增加。文档中 ckpt/log 链接对应 OpenMMLab 官方发布的权重与训练日志可用于直接复现或作为预训练起点。三、配置逐段精读以 hrnet_w48_coco_512x512.py 为例下文以 hrnet_w48_coco_512x512.py 为蓝本逐段拆解hrnet_w32_coco_512x512.py 除骨干宽度32 vs 48与samples_per_gpu24 vs 16外结构一致。3.1 基础继承与训练节奏_base_ [ ../../../../_base_/default_runtime.py, ../../../../_base_/datasets/coco.py ] checkpoint_config dict(interval50) evaluation dict(interval50, metricmAP, save_bestAP)_base_继承两份基础配置default_runtime.py日志、checkpoint 间隔、分布式参数等与 datasets/coco.pyCOCO 的dataset_info含 17 个关键点名称、骨架连接、joint_weights、sigmas等。训练 300 个 epoch 期间每 50 个 epoch 保存一次 checkpoint 并在验证集上以mAP为指标评估同时按save_bestAP保存最优模型。3.2 优化器与学习率策略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不裁剪梯度。前 500 次迭代以 0.001 倍初始学习率线性预热随后在第 200 与第 260 epoch 处按step策略分档衰减共训练 300 epoch。3.3 通道与数据配置channel_cfg dict( dataset_joints17, dataset_channel[[0, 1, ..., 16]], inference_channel[0, 1, ..., 16]) 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)image_size512训练输入图像短边尺寸base_size256为基准尺寸配合test_scale_factor[1]还原原始尺度。heatmap_size[128]输出热力图尺寸为 128x128即相对于 512 输入做了 4 倍下采样。num_scales1、scale_aware_sigmaFalse当前方案为单尺度训练、使用固定高斯 sigma而非 HigherHRNet 式的多尺度监督。640x640 输入版本如 hrnet_w48_coco_640x640.py将base_size提高到 320、heatmap_size提高到 160以更高分辨率换取更精细定位。3.4 模型定义AssociativeEmbedding 检测器model dict( typeAssociativeEmbedding, pretrainedhttps://download.openmmlab.com/mmpose/pretrain_models/hrnet_w48-8ef0771d.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(48, 96)), stage3dict(num_modules4, num_branches3, blockBASIC, num_blocks(4, 4, 4), num_channels(48, 96, 192)), stage4dict(num_modules3, num_branches4, blockBASIC, num_blocks(4, 4, 4, 4), num_channels(48, 96, 192, 384)))), keypoint_headdict( typeAESimpleHead, in_channels48, num_joints17, num_deconv_layers0, tag_per_jointTrue, with_ae_loss[True], extradict(final_conv_kernel1), loss_keypointdict( typeMultiLossFactory, num_joints17, 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])), ... )检测器typeAssociativeEmbedding对应 mmpose/models/detectors/associative_embedding.py 中的AssociativeEmbedding类。其forward_train依次执行 backbone 提取特征 → head 输出 →keypoint_head.get_loss计算损失forward_test则执行多尺度/翻转推理、热力图与 tag 聚合再交给HeatmapParser完成分组。骨干 HRNetstage1 为单分支 Bottleneck64 通道后续逐级扩到 2/3/4 个并行分支w48 对应 48/96/192/384 通道全程并行高分辨率特征。关联嵌入头 AESimpleHead继承自 mmpose/models/heads/ae_simple_head.py 中的DeconvHead。tag_per_jointTrue表示每个关键点类别预测独立的 tag 通道输出通道数为num_joints num_joints 3417 个热力图 17 个 tag若为 False 则共用 1 个 tag 通道共 18 通道。num_deconv_layers0表示直接以 HRNet 输出分辨率为热力图分辨率。3.5 测试配置决定推理与分组行为test_cfgdict( num_joints17, 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)各参数含义如下max_num_people30每张图最多分组 30 人热力图topk的 K 值也取 30见HeatmapParser.top_k。nms_kernel5、nms_padding2对热力图做 5x5 最大池化 NMS抑制重复峰值。detection_threshold0.1关键点峰值分数低于该值视为未检出tag_threshold1tag 距离超过该阈值视为不同人见 mmpose/core/post_processing/group.py 的_match_by_tag中的diff_saved[row][col] params.tag_threshold判断。adjustTrue, refineTrue坐标微调与分组后细化。flip_testTrue开启水平翻转测试热力图取平均、tag 取 concattag 维度翻倍可稳定提升精度。3.6 数据管线与数据集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、平移 40px与随机翻转目标生成采用sigma2的高斯核每图最多 30 人。验证/测试管线使用BottomUpGetImgSizeBottomUpResizeAligntest_scale_factor[1]单尺度。数据集为BottomUpCocoDataset实现位于 mmpose/datasets/datasets/bottom_up/bottom_up_coco.py标注文件指向data/coco/annotations/person_keypoints_{train,val}2017.json。训练时samples_per_gpu16w48或 24w32每 GPU 2 个 worker。四、源码级原理tag 是怎么聚人的4.1 联合损失MultiLossFactoryloss_keypoint使用的MultiLossFactory定义在 mmpose/models/losses/multi_loss_factory.py它按num_stages逐阶段组合两类损失HeatmapLoss关键点检测对输出前num_joints通道与目标热力图计算均方误差乘heatmaps_loss_factor[1.0]。AELoss关联嵌入作用于 tag 通道包含两项——pull loss吸引同一人的各关键点 tag 应互相接近最小化其与均值 tag 的平方距离push loss排斥不同人的均值 tag 应互相远离ae_loss_typeexp时用指数形式push sum(exp(-diff^2)) - num_tags实现。两者权重均为0.001。注意 AELoss 中joints记录了各关键点在 heatmap 上的位置坐标joint[0]用于从 tag 图采样对应位置的 tag 值——这正是每个关键点带一个 tag的监督来源。4.2 后处理从热力图到多人姿态推理分组的完整链路在 mmpose/models/detectors/associative_embedding.py 的forward_test与 mmpose/core/post_processing/group.py 中实现split_ae_outputs将 head 输出拆分为热力图与 tag若开启flip_test对水平翻转图像再推理一次热力图平均融合、tag 拼接aggregate_stage_flip/aggregate_scale完成多尺度聚合本文单尺度仅 1 个 scaleHeatmapParser.parse执行最终分组top_k先用nms_kernel5的 MaxPool2d 做 NMS再取每个关键点热力图的前max_num_people个峰值位置及其对应 tag_match_by_tag按关键点连接顺序COCO 17 点有专门定义的joint_order逐类关键点做匈牙利匹配Munkres 算法以 tag 距离为代价矩阵将各关键点并入已有分组或新建分组。从源码结构可以推断分组的正确率高度依赖 tag 质量因此tag_per_jointTrue的独立 tag 通道与 pull/push 损失系数是整套方案的关键超参。五、实战训练、测试与推理5.1 单卡训练python tools/train.py configs/body/2d_kpt_sview_rgb_img/associative_embedding/coco/hrnet_w48_coco_512x512.py默认在./work_dirs/hrnet_w48_coco_512x512下保存日志与权重。常用参数详见 tools/train.py--work-dir覆盖默认工作目录--resume-from从指定 checkpoint 恢复训练--no-validate跳过训练期间验证--gpu-id指定 GPU非分布式模式默认 0--seed/--deterministic固定随机种子保证可复现--cfg-options以kv形式临时覆盖配置如model.backbone.extra.stage4.num_channels--launchernone单卡/pytorch分布式/slurm。多卡训练可使用仓库提供的 tools/dist_train.sh如bash tools/dist_train.sh CONFIG GPU_NUM。5.2 测试与评估python tools/test.py \ configs/body/2d_kpt_sview_rgb_img/associative_embedding/coco/hrnet_w48_coco_512x512.py \ /path/to/hrnet_w48_coco_512x512.pth \ --eval mAP--eval mAP对应evaluation.metricmAP输出 COCO 姿态 AP/AR 系列指标--out保存结果文件--fuse-conv-bn融合 Conv-BN 提升推理速度评估实现位于 mmpose/datasets/datasets/bottom_up/bottom_up_coco.py预测结果会先写为result_keypoints.json再经 COCOeval 计算。5.3 单图推理演示python demo/bottom_up_img_demo.py \ configs/body/2d_kpt_sview_rgb_img/associative_embedding/coco/hrnet_w48_coco_512x512.py \ /path/to/hrnet_w48_coco_512x512.pth \ --img-path tests/data/coco/000000000785.jpg \ --out-img-root vis_results支持单张图片或图片目录png/jpg/jpeg/tiff/bmp见 demo/bottom_up_img_demo.py关键参数--kpt-thr默认 0.3过滤低分关键点、--pose-nms-thr默认 0.9控制姿态级 NMS 的 OKS 阈值、--device指定推理设备注意底向上 demo 无需检测框输入直接把整图喂给模型返回的结果即为分组后的多人姿态。六、同目录扩展配置一览associative_embedding/coco目录下还提供了丰富的变体配置便于横向对比参见 目录 README 及对应 .md 评测页输入分辨率512x512 与 640x640 两档如 hrnet_w48_coco_640x640.pyUDP 变体*_udp.py配置在 data_cfg 与 test_cfg 中开启use_udpTrueUnbiased Data Processing可缓解下采样导致的坐标偏差其他骨干ResNet 系列resnet_coco.md、Hourglass-AEhourglass_ae_coco.md、MobilenetV2mobilenetv2_coco.md以及多尺度监督的 HigherHRNethigherhrnet_coco.md。七、小结本文从 hrnet_coco.md 出发将其中两张评测表所代表的方案完整还原为可运行的配置与源码链路HRNet 高分辨率骨干 → AESimpleHead 联合输出热力图与 tag → MultiLossFactory 的 heatmap push/pull 联合监督 → HeatmapParser 的 NMS 匈牙利匹配分组。无论你是想复现指标、迁移到新数据集还是深入理解自底向上姿态估计的工程细节上述配置与源码路径都值得继续研读。赞分享人工智能计算机视觉深度学习【免费下载链接】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 仓库实战Associative Embedding HRNet-w32 在 AIC 数据集上的自底向上人体姿态估计配置全解ViTPose 仓库实战Associative Embedding HRNet w32 在 AIC 数据集上的自底向上人体姿态估计配置全解 本文以仓库中人工智能计算机视觉深度学习ViTPose 仓库中的 Hourglass-AE基于 Associative Embedding 的 COCO 自底向上人体姿态估计全解析ViTPose 仓库中的 Hourglass AE基于 Associative Embedding 的 COCO 自底向上人体姿态估计全解析 导读 本文以 h人工智能计算机视觉深度学习HigherHRNet 自底向上人体姿态估计实战ViTPose 仓库 COCO 配置与原理全解析HigherHRNet 自底向上人体姿态估计实战ViTPose 仓库 COCO 配置与原理全解析 本文以 higherhrnet_coco.md https:人工智能计算机视觉深度学习上一篇深入探索PersistentBottomNavBar - 一款高效且灵活的底部导航栏库下一篇如何为Koel音乐流平台构建可靠的端到端测试Cypress自动化测试完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考