资讯动态

ViTPose 中的 DARK 分布感知坐标表示:无偏热图编码与解码的源码级解析

发布时间:2026/10/15 1:53:35 来源:尧图企业网站定制
人工智能计算机视觉深度学习【免费下载链接】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点击查看免费下载导读DARKDistribution-Aware coordinate Representation of Keypoints是 CVPR 2020 提出的一种模型无关的姿态估计后处理/前处理增强方法其核心发现是热图heatmap从预测到最终关节坐标的解码过程对精度影响远超预期。本文以 ViTPose 仓库中的算法文档 docs/en/papers/algorithms/dark.md 为主体结合仓库中TopDownGenerateTarget的无偏编码实现、keypoints_from_heatmaps的分布感知解码实现以及 ResNet/HRNet 的 dark 系列训练配置完整拆解 DARK 的数学原理、代码调用链与实际配置方法帮助你在自己的姿态估计模型上直接落地这套“即插即用”的精度提升方案。一、DARK 方法概述从论文摘要看核心主张在人体姿态估计领域热图长期是关节坐标表示的事实标准de facto standard但很少有工作深入剖析热图本身的设计。DARK 论文Zhang et al.,Distribution-aware coordinate representation for human pose estimation, CVPR 2020首次指出两个此前被忽视的环节解码环节至关重要将预测热图解码回原始图像空间中的最终关节坐标这一过程对最终性能的影响“惊人地显著”surprisingly significant。标准坐标解码方法取最大值并做固定偏移存在系统性偏差。编码环节可以更准将真实坐标转换为热图ground-truth coordinates → heatmaps的过程也可以改进通过生成无偏/更精确的热图来消除量化误差。论文将这两部分统一为一个完整方法——分布感知的关键点坐标表示DARK。作为模型无关的即插即用模块model-agnostic plug-inDARK 能为现有姿态估计模型带来显著性能提升论文报告其在 MPII 与 COCO 两个常见基准上取得当时的最佳结果并斩获 ICCV 2019 COCO Keypoints Challenge 第二名以上结论均出自论文摘要原文。在 ViTPose 仓库中DARK 并非一个独立模型而是以训练管线配置 评测后处理函数的形式存在编码端由数据管线TopDownGenerateTarget的unbiased_encoding开关控制解码端由keypoints_from_heatmaps的post_processunbiased分支驱动。二、编码端如何生成无偏的热图标签2.1 标准编码的问题量化取整引入偏差在 mmpose/datasets/pipelines/top_down_transform.py 中TopDownGenerateTarget支持三种编码方案encoding参数MSRA、Megvii、UDP并通过布尔开关unbiased_encoding决定是否采用 DARK 的无偏编码。默认配置为encodingMSRA、unbiased_encodingFalse。标准的 MSRA 编码流程unbiased_encodingFalse分支为feat_stride image_size / [W, H] mu_x int(joints_3d[joint_id][0] / feat_stride[0] 0.5) mu_y int(joints_3d[joint_id][1] / feat_stride[1] 0.5)这里将连续的真实坐标映射到热图网格时使用了int(... 0.5)的四舍五入取整高斯分布的中心被强制对齐到整数像素从而引入最多 ±0.5 像素的量化误差。这个误差在把热图解码回原图时会以特征步长feat_stride倍数放大。2.2 DARK 无偏编码保留亚像素位置当unbiased_encodingTrue时对应源码 L325-L348代码不再取整而是直接在浮点中心上放置高斯分布feat_stride image_size / [W, H] mu_x joints_3d[joint_id][0] / feat_stride[0] mu_y joints_3d[joint_id][1] / feat_stride[1] ... target[joint_id] np.exp(-((x - mu_x)**2 (y - mu_y)**2) / (2 * sigma**2))此时mu_x、mu_y是亚像素精度的浮点数每个热图像素的值按照其与真实中心的连续距离计算高斯分布的中心得以“落”在真实位置从而消除取整带来的系统偏差。这就是论文中“生成无偏/精确热图”unbiased/accurate heatmaps的仓库实现。值得注意的实现细节无偏编码分支用全图逐点计算高斯x np.arange(0, W, 1)而标准分支只在一个2*tmp_size1的局部窗口内生成高斯并切片写入L362-L379。无偏分支同样遵循 3-sigma 规则tmp_size sigma * 3做边界检查越界关节会被置为不可见。2.3 在训练配置中的开启方式在仓库的 dark 系列配置中训练管线里即开启了无偏编码。以 res50_coco_256x192_dark.py 为例dict(typeTopDownGenerateTarget, sigma2, unbiased_encodingTrue),其中sigma2控制训练热图中高斯分布的尺度它与解码端的调制核modulate_kernel存在严格的对应关系见下文。三、解码端分布感知的坐标解码3.1 解码入口与调用链推理时TopDown检测器在 top_down.py 中调用keypoint_head.decode()该方法定义于 topdown_heatmap_base_head.py最终进入评测核心函数keypoints_from_heatmaps定义于 mmpose/core/evaluation/top_down_eval.pypreds, maxvals keypoints_from_heatmaps( output, c, s, unbiasedself.test_cfg.get(unbiased_decoding, False), post_processself.test_cfg.get(post_process, default), kernelself.test_cfg.get(modulate_kernel, 11), ... )关键参数均来自test_cfgpost_processunbiased触发 DARK 解码modulate_kernel控制高斯调制核大小默认 11。需要注意的是源码中还保留了一个已废弃的unbiased布尔参数若设置unbiasedTrue会发出弃用警告并自动归一化为post_processunbiasedL555-L560因此新配置一律直接使用post_processunbiased。3.2 标准解码 vs DARK 解码keypoints_from_heatmaps中非 UDP 分支的解码逻辑L589-L612清晰地对比了三种后处理post_processdefault标准方法先取热图最大值_get_max_preds然后根据最大值两侧邻居的差分符号施加固定的±0.25 像素偏移。这个经验性偏移是启发式的当真实分布不对称时会产生系统性偏差——这正是 DARK 论文批评的对象。post_processunbiasedDARK同样先取最大值定位初值但随后对热图执行高斯调制 对数变换 泰勒展开亚像素修正_taylor。post_processmegvii仅对热图做高斯模糊_gaussian_blur并施加 0.5 偏移与特殊分数归一化maxvals maxvals / 255.0 0.5。DARK 解码的核心流程L591-L597if post_process unbiased: # alleviate biased coordinate # apply Gaussian distribution modulation. heatmaps np.log(np.maximum(_gaussian_blur(heatmaps, kernel), 1e-10)) for n in range(N): for k in range(K): preds[n][k] _taylor(heatmaps[n][k], preds[n][k])三步依次是高斯分布调制用_gaussian_blurL399-L438对预测热图做核大小为modulate_kernel的高斯模糊同时归一化回原始峰值heatmaps[i, j] * origin_max / np.max(...)使热图分布更接近训练时的高斯形态对数变换np.log将热图从响应值域转换为对数域便于后续泰勒展开直接拟合对数高斯即二次型曲面泰勒展开修正_taylorL298-L332在初值点计算一阶导数梯度与二阶导数海森矩阵按牛顿法一步求亚像素偏移dx 0.5 * (heatmap[py][px 1] - heatmap[py][px - 1]) dy 0.5 * (heatmap[py 1][px] - heatmap[py - 1][px]) dxx 0.25 * (heatmap[py][px 2] - 2 * heatmap[py][px] heatmap[py][px - 2]) dxy 0.25 * (heatmap[py 1][px 1] - heatmap[py - 1][px 1] - heatmap[py 1][px - 1] heatmap[py - 1][px - 1]) dyy 0.25 * (heatmap[py 2][px] - 2 * heatmap[py][px] heatmap[py - 2][px]) derivative np.array([[dx], [dy]]) hessian np.array([[dxx, dxy], [dxy, dyy]]) if dxx * dyy - dxy**2 ! 0: hessianinv np.linalg.inv(hessian) offset -hessianinv derivative coord offset其数学本质假设预测响应在对数域近似为高斯二次型则最优亚像素位置即梯度为零的点coord_new coord - H⁻¹·∇f。注意_taylor要求初值位于热图内1 px W-2 and 1 py H-2靠近边界时直接返回原始坐标。3.3 调制核与训练 sigma 的配套原则_gaussian_blur与keypoints_from_heatmaps的文档字符串均明确给出对应关系核大小必须与训练热图的 sigma 匹配——K17对应sigma3K11对应sigma2。因此 dark 配置中训练侧TopDownGenerateTarget(sigma2, unbiased_encodingTrue)与推理侧modulate_kernel11成对出现切勿随意改动其中一侧。3.4 与 UDP 的关系post_dark_udp仓库还提供了post_dark_udpL335-L396它是 DARK 解码在 UDPThe Devil is in the Details, CVPR 2020数据流程下的向量化实现对热图先做高斯模糊再np.clip(0.001, 50)后取对数随后通过预填充np.pad(..., modeedge)与平铺索引一次性完成全 batch 的导数/海森矩阵计算最后用np.linalg.inv(hessian eps * eye(2))求逆并做np.einsum修正。它在keypoints_from_heatmaps的use_udpTrue分支中被调用L567-L570同时在 bottom-up 范式的人群分组后处理mmpose/core/post_processing/group.py中也被复用是 DARK 思想在仓库内二次扩散的体现。四、ViTPose 仓库中的 DARK 配置实践4.1 完整的 dark 配置范式将编码端与解码端合起来一个标准的 dark 训练配置以 hrnet_w32_coco_256x192_dark.py 为例包含三个关键位置# 训练侧无偏编码sigma2 dict(typeTopDownGenerateTarget, sigma2, unbiased_encodingTrue), # 推理侧DARK 解码调制核与 sigma 配套 test_cfgdict( flip_testTrue, post_processunbiased, shift_heatmapTrue, modulate_kernel11)配套的还有data_cfg中的输入输出尺寸image_size[192, 256]、heatmap_size[48, 64]即 4 倍下采样以及标准优化配置Adam、lr5e-4、step 学习率策略、210 epochs。对比同尺寸的普通配置可以发现dark 版本与 baseline 的唯一区别正是上述编码开关与后处理模式充分体现了 DARK “模型无关插件”的定位。4.2 仓库提供的 dark 模型家族ViTPose 仓库在 COCO 与 MPII 上提供了完整的 dark 配置与权重发布记录COCOResNet 骨干resnet_dark_coco.md 收录 ResNet-50/101/152 在 256x192 与 384x288 两种分辨率下的 6 个 dark 模型例如res50_coco_256x192_darkAP 0.724与res152_coco_384x288_darkAP 0.757COCOHRNet 骨干hrnet_dark_coco.md 收录 HRNet-W32/W48 的 4 个 dark 模型最佳为hrnet_w48_coco_384x288_darkAP 0.772AP75 0.836MPIIHRNet 骨干hrnet_dark_mpii.md 收录 2 个 dark 模型hrnet_w48_mpii_256x256_dark达到 PCKh0.5 0.905、Mean0.1 0.360。各配置对应的.py文件与预训练权重下载记录统一维护在同目录的.yml文件如 hrnet_dark_coco.yml中模型名规范为topdown_heatmap_backbone_coco_input_size_dark。这些指标仅作为仓库内配置复现结果供参考实际以自行训练/评测为准。4.3 在 ViT 骨干上复用的思路从源码结构看DARK 完全作用于数据标签生成与热图后处理两层与骨干网络解耦TopDownGenerateTarget属于数据管线keypoints_from_heatmaps属于头部解码二者均不感知 backbone 类型。因此对于 ViTPose 的 Vision Transformer 骨干如 mmpose/models/backbones/vit.py只需沿用相同的unbiased_encodingTrue与post_processunbiased组合即可获得同等收益无需修改网络结构——这正是 DARK 作为“即插即用”插件的设计意图。五、测试验证从单元测试看 DARK 的行为约束仓库在 tests/test_evaluation/test_top_down_eval.py 中为 DARK 解码提供了直接的单测覆盖可据此验证实现行为preds, maxvals keypoints_from_heatmaps( heatmaps, center, scale, post_processunbiased) assert_array_almost_equal(preds, np.array([[[126, 126]]]), decimal4)测试构造一个64x64全 1、峰值2.0位于(31, 31)的对称热图post_processunbiased解码后仍应得到对称结果(126, 126)——对于对称分布泰勒修正偏移为零验证了 DARK 在无偏输入下不会引入额外偏差。同时测试还断言post_processunbiased时kernel0会触发断言错误AssertionError印证了 DARK 解码必须携带合法的调制核大小这一约束源码 L531-L532。六、总结与使用建议DARK 之所以能成为姿态估计工具箱中的常青技巧在于它用极小代价两个开关、一个后处理函数修正了热图流程两端最容易被忽视的系统偏差环节标准做法DARK 做法仓库实现位置编码坐标取整到整数像素放置高斯浮点中心放置高斯无偏编码top_down_transform.py L325-L348解码最大值 固定 ±0.25 偏移高斯调制 对数域泰勒展开求亚像素偏移top_down_eval.py L589-L597、L298-L332配置——unbiased_encodingTruepost_processunbiasedmodulate_kernel11hrnet_w32_coco_256x192_dark.py在实际项目中启用 DARK 时请务必遵守三条配套原则训练 sigma 与调制核必须匹配sigma2 ↔ kernel11sigma3 ↔ kernel17编码与解码必须同时开启仅开一端会因训练/推理分布不一致而效果打折注意输入分辨率与热图下采样倍率它们共同决定亚像素修正折算回原图后的实际位移量。参考仓库中的 resnet_dark_coco.yml 等元数据文件可以快速复现并在此基础上做增量实验。赞分享人工智能计算机视觉深度学习【免费下载链接】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点击查看免费下载相关推荐DarkPoseDARK分布感知坐标表示在 MMPose 中的原理、源码实现与训练配置实战DarkPoseDARK分布感知坐标表示在 MMPose 中的原理、源码实现与训练配置实战 本篇技术指南围绕 CVPR 2020 论文《Distributi计算机视觉人工智能深度学习ResNet DarkPose 在 COCO 人体姿态估计中的应用ViTPose 仓库 topdown_heatmap 配置解析与无偏热图解码原理ResNet DarkPose 在 COCO 人体姿态估计中的应用ViTPose 仓库 topdown_heatmap 配置解析与无偏热图解码原理 本文以人工智能计算机视觉深度学习ViTPose 仓库中的 ViPNAS 姿态估计模型COCO 顶级热图配置、网络结构搜索与源码解析ViTPose 仓库中的 ViPNAS 姿态估计模型COCO 顶级热图配置、网络结构搜索与源码解析 导读 ViPNASCVPR2021是一套面向高效人体人工智能计算机视觉深度学习上一篇3分钟快速上手Exo打造本地AI集群的终极指南 下一篇gsd-core ADR 1866 解读agent_skills 双重注入契约编排侧注入 Agent 侧自加载创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑