ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

MMPose 基于 HRNetv2-Dark 的 WFLW 人脸关键点检测配置与实现解析

MMPose 基于 HRNetv2-Dark 的 WFLW 人脸关键点检测配置与实现解析 MMPose 基于 HRNetv2-Dark 的 WFLW 人脸关键点检测配置与实现解析【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmpose导读本文以 MMPose 仓库中 hrnetv2_dark_wflw.md 为核心线索系统讲解基于HRNetv2-w18 DarkPose的 WFLW 人脸关键点检测方案。你会了解到该模型的训练配置td-hm_hrnetv2-w18_dark-8xb64-60e_wflw-256x256.py中每一个关键参数的含义、DarkPoseDistribution-Aware Coordinate Representation在编码与解码两个阶段如何被落地实现、WFLW 数据集的目录组织与评测协议以及如何使用 MMPose 的 train/test 工具与推理 API 复现和部署该模型。读完本文你将能够独立复现该配置的训练与评测流程并深入理解 MMPose codec 机制背后的原理。一、方案概览HRNetv2 DarkPose WFLW 三者如何组合该方案由三部分技术栈构成分别对应论文、模型与数据集三个维度在 hrnetv2_dark_wflw.md 中均以 BibTeX 引用的形式给出了原始出处组成部分论文在此方案中的角色HRNetv2Deep High-Resolution Representation Learning for Visual Recognition(TPAMI2019, Wang et al.)高分辨率特征提取骨干网络DarkPoseDistribution-Aware Coordinate Representation for Human Pose Estimation(CVPR2020, Zhang et al.)无偏高斯热图编码与分布感知坐标解码WFLWLook at Boundary: A Boundary-Aware Face Alignment Algorithm(CVPR2018, Wu et al.)98 点人脸关键点评测基准三者分工清晰HRNetv2-w18 负责从256x256输入图像中提取多分辨率、高分辨率的特征DarkPose 负责将关键点坐标编码为无偏高斯热图训练目标并在解码阶段用分布感知的泰勒展开修正量化误差推理后处理WFLW 则定义了 98 个关键点的标注格式与 NME归一化平均误差评测协议。整体模型结构为经典的自顶向下Top-down热图回归管线检测框裁剪人脸 → HRNet 提特征 → 1x1 卷积输出 98 通道热图 → Dark 解码得到关键点坐标。在仓库中的文件位置本方案在仓库中对应以下文件均位于configs/face_2d_keypoint/topdown_heatmap/wflw/目录结果文档hrnetv2_dark_wflw.md本文核心依据元数据hrnetv2_dark_wflw.yml训练/测试配置td-hm_hrnetv2-w18_dark-8xb64-60e_wflw-256x256.py同目录下还提供两个对照配置便于研究 DarkPose 带来的增益不使用 Dark 的 td-hm_hrnetv2-w18_8xb64-60e_wflw-256x256.py以及使用 AWing 损失Adaptive Wing Loss的 td-hm_hrnetv2-w18_awing-8xb64-60e_wflw-256x256.py。二、WFLW 数据集98 点人脸关键点基准2.1 数据集定义WFLW 数据集在仓库中的定义位于 configs/base/datasets/wflw.py共定义 98 个关键点keypoint_info中 id 从 0 到 97每个关键点除了坐标信息外还携带swap字段用于标注左右对称点例如kpt-0与kpt-32互为镜像kpt-16为鼻尖对称轴上的点无对称点。这些 swap 信息在训练阶段的RandomFlip水平翻转增强中用于正确交换左右关键点的监督信号。对应数据集类为 mmpose/datasets/datasets/face/wflw_dataset.py 中的WFLWDataset它继承自BaseCocoStyleDataset并通过METAINFO dict(from_fileconfigs/_base_/datasets/wflw.py)直接复用上述元信息。其parse_data_info中有一个关键细节WFLW 的 bbox scale 以 200 为归一化因子代码中pixel_std 200.即注释中的scale需要乘以 200 才能还原为像素尺度的人脸框再经bbox_cs2xyxy转为 xyxy 格式的检测框。2.2 目录结构与数据准备按 docs/en/dataset_zoo/2d_face_keypoint.md 的说明WFLW 数据准备如下从 WFLW 官方页面下载原始图像下载 MMPose 预处理好的标注文件wflw_annotations.tar解压到仓库根目录下的data目录最终目录结构为mmpose ├── mmpose ├── docs ├── tests ├── tools ├── configs ── data │── wflw |── annotations | |── face_landmarks_wflw_train.json | |── face_landmarks_wflw_test.json | |── face_landmarks_wflw_test_blur.json | |── face_landmarks_wflw_test_occlusion.json | |── face_landmarks_wflw_test_expression.json | |── face_landmarks_wflw_test_largepose.json | |── face_landmarks_wflw_test_illumination.json | |── face_landmarks_wflw_test_makeup.json | ── images |── 0--Parade ...其中face_landmarks_wflw_train.json用于训练face_landmarks_wflw_test.json用于整体测试而blur / occlusion / expression / largepose / illumination / makeup六个子集注释则对应 WFLW 评测协议中的六类困难场景模糊、遮挡、夸张表情、大姿态、光照变化、浓妆用于分项评估模型鲁棒性。配置中的data_root data/wflw/与data_prefix dict(imgimages/)与此目录结构一一对应。三、配置文件逐段精读核心配置文件为 td-hm_hrnetv2-w18_dark-8xb64-60e_wflw-256x256.py文件名即概括了关键超参td-hmtop-down heatmap、hrnetv2-w18骨干、darkDarkPose 编解码、8xb648 卡 × batch 64、60e60 epoch、256x256输入尺寸。下面按配置文件的逻辑顺序逐段解读。3.1 运行时与优化器设置_base_ [../../../_base_/default_runtime.py] train_cfg dict(max_epochs60, val_interval1) optim_wrapper dict(optimizerdict( typeAdam, lr2e-3, )) param_scheduler [ dict( typeLinearLR, begin0, end500, start_factor0.001, by_epochFalse), # warm-up dict( typeMultiStepLR, begin0, end60, milestones[40, 55], gamma0.1, by_epochTrue) ] auto_scale_lr dict(base_batch_size512) default_hooks dict(checkpointdict(save_bestNME, ruleless, interval1))训练 60 epoch每个 epoch 后执行一次验证val_interval1。优化器为Adam初始学习率2e-3。学习率策略分两段前 500 个 iteration 用LinearLR做 warm-up从 0.001 倍初始 LR 线性升到 1 倍by_epochFalse表示按 iteration 计之后按 epoch 用MultiStepLR在第 40 和第 55 epoch 将学习率衰减为原来的 0.1 倍gamma0.1。auto_scale_lr声明该配置的基准 batch size 为 5128 卡 × 64当实际训练 batch size 不同时MMPose 会自动按比例缩放学习率。断点保存策略为每个 epoch 保存一次且以验证集 NME 为监控指标ruleless表示 NME 越小越好自动保留最优权重。3.2 Codec 设置DarkPose 的落点codec dict( typeMSRAHeatmap, input_size(256, 256), heatmap_size(64, 64), sigma2, unbiasedTrue)这是整个方案区别于普通热图方法的核心。codec编解码器是 MMPose 中负责关键点坐标 ↔ 训练目标双向转换的模块typeMSRAHeatmap对应 mmpose/codecs/msra_heatmap.py 中的MSRAHeatmap类源自Simple Baselines的高斯热图方案input_size(256, 256)网络输入尺寸heatmap_size(64, 64)输出热图空间尺寸为输入的 1/4故scale_factor input_size / heatmap_size 4sigma2高斯核标准差unbiasedTrue开启 DarkPose。编码时使用无偏高斯热图generate_unbiased_gaussian_heatmaps见 mmpose/codecs/utils/gaussian_heatmap.py解码时使用分布感知坐标精修refine_keypoints_dark见 mmpose/codecs/utils/refinement.py。在 MMPose 官方文档对 codecs 的介绍 中MSRAHeatmap是 Face/Animal/Body 热图任务最常用的 codec 之一。需要说明的是unbiasedTrue时对每个关键点独立生成高斯目标只有当前关键点对应的热图位置贡献正样本监督其余关键点的对应位置不会叠加该高斯峰从而避免多个关键点尤其是密集人脸关键点的响应峰相互干扰这正是 DarkPose 无偏 的含义之一。3.3 模型结构model dict( typeTopdownPoseEstimator, 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(18, 36)), stage3dict(num_modules4, num_branches3, blockBASIC, num_blocks(4, 4, 4), num_channels(18, 36, 72)), stage4dict(num_modules4, num_branches4, blockBASIC, num_blocks(4, 4, 4, 4), num_channels(18, 36, 72, 144), multiscale_outputTrue), upsampledict(modebilinear, align_cornersFalse)), init_cfgdict(typePretrained, checkpointopen-mmlab://msra/hrnetv2_w18), ), neckdict(typeFeatureMapProcessor, concatTrue), headdict( typeHeatmapHead, in_channels270, out_channels98, deconv_out_channelsNone, conv_out_channels(270, ), conv_kernel_sizes(1, ), lossdict(typeKeypointMSELoss, use_target_weightTrue), decodercodec), test_cfgdict( flip_testTrue, flip_modeheatmap, shift_heatmapTrue, ))TopdownPoseEstimator自顶向下姿态估计器实现见 mmpose/models/pose_estimators流程为输入单实例图像 → 骨干提特征 → 颈部融合 → 头部回归热图。HRNet骨干四个阶段分别维持 1/2/3/4 条并行分支通道数 18→36→72→144stage4开启multiscale_outputTrue输出四个分辨率的特征图。实现位于 mmpose/models/backbones/hrnet.py。FeatureMapProcessor颈部mmpose/models/necks/feature_map_processor.py负责把多尺度特征 concat 起来因此 head 的in_channels270 183672144正好对应四分支通道之和。HeatmapHead输出通道out_channels98与 WFLW 的 98 个关键点一一对应用 1x1 卷积conv_kernel_sizes(1,)替代反卷积保持高分辨率语义。Head 的实现见 mmpose/models/heads/heatmap_heads/heatmap_head.py。损失函数为KeypointMSELoss并开启use_target_weightTrue即对每个关键点按其可见性权重加权计算 MSE遮挡/未标注点不参与惩罚。test_cfg推理时开启水平翻转测试flip_testTrue先对原图与翻转图各自预测热图在热图空间融合flip_modeheatmap后再解码并用shift_heatmapTrue补偿翻转导致的坐标偏移——这是人脸这类左右对称任务的常见提分手段。对比同目录下的基础配置 td-hm_hrnetv2-w18_8xb64-60e_wflw-256x256.py 可以发现除 codec 中多了unbiasedTrue并额外引入blur_kernel_size11的默认高斯调制核之外其余结构完全相同。因此两套配置的精度差异可直接归因于 DarkPose是观察该技术增益的理想对照实验。3.4 数据管线与加载器dataset_type WFLWDataset data_mode topdown data_root data/wflw/ train_pipeline [ dict(typeLoadImage), dict(typeGetBBoxCenterScale), dict(typeRandomFlip, directionhorizontal), dict( typeRandomBBoxTransform, shift_prob0, rotate_factor60, scale_factor(0.75, 1.25)), 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) ]训练管线要点RandomFlip水平翻转依赖 2.1 节提到的关键点swap语义交换左右对称点RandomBBoxTransform做数据增强rotate_factor60表示最多旋转 ±60°scale_factor(0.75, 1.25)表示缩放比例在 0.75~1.25 之间随机shift_prob0关闭平移扰动TopdownAffine依据人脸框做仿射变换将人脸对齐到256x256GenerateTarget调用 codec 的encode将关键点坐标转换为64x64的无偏高斯热图监督目标验证管线不做任何随机增强仅做仿射对齐。数据加载器方面训练batch_size64、8 卡即全局 512与auto_scale_lr基准一致训练/验证 annotation 文件分别为face_landmarks_wflw_train.json与face_landmarks_wflw_test.json验证加载器round_upFalse、drop_lastFalse保证评测覆盖全部测试样本。3.5 评测器NME 协议val_evaluator dict( typeNME, norm_modekeypoint_distance, ) test_evaluator val_evaluator评测指标为 NMENormalized Mean Error实现于 mmpose/evaluation/metrics/keypoint_2d_metrics.py 的NME类。norm_modekeypoint_distance表示以特定关键点对的距离作为归一化因子。该类的DEFAULT_KEYPOINT_INDICES中为wflw指定了[60, 72]恰好对应 WFLW 的左右眼外眦点——即 NME 所有关键点平均欧氏距离 ÷ 双眼间距这是 WFLW 官方协议的标准定义。此外 NME 指标还支持norm_modeuse_norm_item配合norm_item使用如 AFLW 用bbox_size归一化可在换用其他人脸数据集时灵活切换。四、DarkPose 源码级原理从有偏到无偏DarkPose 在本方案中的落地完全依赖MSRAHeatmapcodec 的unbiased开关其实现横跨编码与解码两个阶段均可在 mmpose/codecs/msra_heatmap.py 中看到完整逻辑。4.1 编码阶段无偏高斯热图if self.unbiased: heatmaps, keypoint_weights generate_unbiased_gaussian_heatmaps( heatmap_sizeself.heatmap_size, keypointskeypoints / self.scale_factor, keypoints_visiblekeypoints_visible, sigmaself.sigma)普通热图编码generate_gaussian_heatmaps存在一个系统性偏差一个关键点的高斯峰在另一个关键点的位置上也会投影出正响应当关键点距离很近时人脸关键点尤其密集这种串扰会把真实峰的位置拉偏导致解码坐标偏向峰值之间。无偏编码则逐关键点独立生成目标消除这种相互干扰其实现位于 mmpose/codecs/utils/gaussian_heatmap.py。4.2 解码阶段分布感知坐标精修解码时先取热图最大值得到整数像素坐标get_heatmap_maximum见 mmpose/codecs/utils/post_processing.py随后if self.unbiased: keypoints refine_keypoints_dark( keypoints, heatmaps, blur_kernel_sizeself.blur_kernel_size) else: keypoints refine_keypoints(keypoints, heatmaps)两种解码策略对比核心实现在 mmpose/codecs/utils/refinement.pyrefine_keypoints普通方式从最大值位置向次大值方向移动固定 0.25 像素实现简单但对量化误差的补偿有限refine_keypoints_darkDarkPose 方式先用blur_kernel_size11的高斯核对热图做平滑调制gaussian_blur再对热图取对数随后在峰值邻域内用中心差分计算一阶梯度和 Hessian 矩阵通过一次牛顿步offset -H⁻¹ · g解析地解出亚像素偏移。高斯核大小与 sigma 遵循经验公式sigma 0.3 * ((ks-1) * 0.5 - 1) 0.8ks11时对应sigma≈2与该配置编码端sigma2一致两个超参在数值上自洽。从源码结构看refine_keypoints_dark之所以比固定 0.25 像素移动精度更高是因为它显式建模了热图在峰值附近的二阶分布形态将坐标偏移从启发式升级为基于局部分布的最优解。该机制也经过了单元测试的验证在 tests/test_codecs/test_msra_heatmap.py 中MSRAHeatmap分别以unbiasedFalsemsra与unbiasedTruemsradark两种模式构造并验证编解码往返一致性可直接运行该测试文件复现 codec 层行为。五、评测结果解读依据 hrnetv2_dark_wflw.md 与 hrnetv2_dark_wflw.yml 中记录的官方复现结果模型在 WFLW 训练集上训练各子集 NME%越低越好如下ArchInput SizeNMEtestNMEposeNMEilluminationNMEocclusionNMEblurNMEmakeupNMEexpressionpose_hrnetv2_w18_dark256x2563.986.983.964.784.563.894.29结果解读要点整体测试 NME 为 3.98是七个指标中的核心参考值大姿态pose子集 NME 高达 6.98远高于其他子集这符合人脸对齐任务的一般规律侧脸/大姿态下左右对称关键点信息缺失、自遮挡严重是所有方法都面临的硬挑战遮挡occlusion 4.78与模糊blur 4.56子集也明显高于平均说明这两类退化场景对关键点定位的干扰大于光照3.96、浓妆3.89与表情4.29变化将 test 3.98 与基础 HRNetv2-w18 配置对比可以观察到 DarkPose 在亚像素坐标精度上的贡献具体数值差异可在复现实验中获得本文不代为断言具体增益。六、训练、评测与推理实践6.1 训练确认数据目录结构符合 2.2 节后用仓库提供的多卡脚本启动训练单卡可直接调用tools/train.pybash tools/dist_train.sh configs/face_2d_keypoint/topdown_heatmap/wflw/td-hm_hrnetv2-w18_dark-8xb64-60e_wflw-256x256.py 8训练过程中default_hooks.checkpoint会按 epoch 保存断点并依据验证集 NME 自动保留最优权重save_bestNME, ruleless因此无需手动挑选最优 epoch。6.2 评测使用tools/test.py加载权重并在 WFLW 测试集上计算全部七个 NME 指标bash tools/dist_test.sh configs/face_2d_keypoint/topdown_heatmap/wflw/td-hm_hrnetv2-w18_dark-8xb64-60e_wflw-256x256.py checkpoint路径 8验证加载器默认只读取face_landmarks_wflw_test.json若想对某个困难子集如 blur/occlusion单独评测可将对应子集注释文件路径写入配置的ann_file后重新运行。NME指标类在 mmpose/evaluation/metrics/keypoint_2d_metrics.py 中注册评测输出即表 5.1 中的各子集指标。6.3 推理MMPose 提供了统一推理接口Inferencer可零配置直接对单张图片做人脸关键点检测需配合人脸检测器from mmpose.apis import MMPoseInferencer inferencer MMPoseInferencer( pose2dconfigs/face_2d_keypoint/topdown_heatmap/wflw/td-hm_hrnetv2-w18_dark-8xb64-60e_wflw-256x256.py, pose2d_weightscheckpoint路径, ) results inferencer(demo.jpg, vis_out_diroutputs/)也可参考 demo/inferencer_demo.py 用命令行方式运行。注意自顶向下方案推理时输入需为人脸框裁剪结果因此端到端使用前需先接入检测器仓库 demo/docs/zh_cn/2d_face_demo.md 提供了完整的人脸检测 关键点级联演示。七、总结本文围绕 MMPose 的HRNetv2-w18 DarkPoseWFLW 人脸关键点方案完成了从数据集、配置文件到源码原理的完整拆解。核心要点归纳如下DarkPose 的落点是 codecMSRAHeatmapcodec 的unbiasedTrue同时改变编码无偏高斯热图与解码分布感知亚像素精修两个阶段这是该方案精度的关键来源配置即文档td-hm_hrnetv2-w18_dark-8xb64-60e_wflw-256x256.py 中每个字段都能在 mmpose/codecs、mmpose/models、mmpose/datasets、mmpose/evaluation 的源码中找到对应实现形成完整的可追溯链条评测协议清晰NME 以左右眼外眦距离归一化wflw: [60, 72]pose/occlusion/blur 三类子集是主要精度瓶颈实践路径完整数据准备docs/en/dataset_zoo/2d_face_keypoint.md→ 训练tools/dist_train.sh→ 评测tools/dist_test.sh→ 推理MMPoseInferencer全链路均已就绪。对于希望进一步提升精度的读者同目录下的 td-hm_hrnetv2-w18_awing-8xb64-60e_wflw-256x256.pyAWing 损失与本方案形成对照而codecs目录下的UDPHeatmap、SimCCLabel等编解码器则提供了除 DarkPose 之外的另一类坐标表示思路可作为进阶研究方向。参考资料均位于当前仓库hrnetv2_dark_wflw.md本方案结果文档含论文引用与评测表td-hm_hrnetv2-w18_dark-8xb64-60e_wflw-256x256.py本方案配置文件mmpose/codecs/msra_heatmap.pyMSRAHeatmapcodec 实现mmpose/codecs/utils/refinement.pyDark 解码精修实现mmpose/datasets/datasets/face/wflw_dataset.pyWFLWDataset实现configs/base/datasets/wflw.pyWFLW 98 点元信息定义mmpose/evaluation/metrics/keypoint_2d_metrics.pyNME指标实现docs/en/dataset_zoo/2d_face_keypoint.mdWFLW 数据准备指南tests/test_codecs/test_msra_heatmap.pycodec 单元测试demo/inferencer_demo.py推理示例脚本【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmpose创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表