拓冰建站拓冰建站
首页 / 资讯中心 / 正文

MMPose 人脸关键点检测实战:HRNetv2-W18 在 COCO-WholeBody-Face 数据集上的配置与实现解析

MMPose 人脸关键点检测实战HRNetv2-W18 在 COCO-WholeBody-Face 数据集上的配置与实现解析【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmpose本篇文章以 hrnetv2_coco_wholebody_face.md 模型卡片为核心结合 MMPose 仓库中的完整训练配置、数据集定义与底层源码系统讲解如何基于 HRNetv2-W18 骨干网络在 COCO-WholeBody-Face 68 点人脸数据集上完成 2D 人脸关键点检测任务的配置、训练与评测。读完本文你将掌握该模型从数据组织、热图编解码、模型组装到 NME 指标评估的完整技术链路并能够直接复现或改造这套配置。一、任务与背景COCO-WholeBody-Face 人脸关键点检测COCO-WholeBody 是《Whole-Body Human Pose Estimation in the Wild》(ECCV2020) 提出的全身人体姿态估计数据集其在 COCO 数据集的基础上额外标注了人脸、手部与脚部的关键点。其中COCO-WholeBody-Face子集专门用于人脸关键点定位遵循68 点人脸标注规则68 points mark-up。在 MMPose 中该数据集的元信息由 configs/base/datasets/coco_wholebody_face.py 定义具体体现在68 个关键点索引 0~67命名规范为face-0至face-67左右对称关键点配对每个关键点通过swap字段声明水平翻转后的对应关系例如face-0 ↔ face-16、face-17 ↔ face-26、face-36 ↔ face-45等。RandomFlip数据增强正是依赖该信息在翻转后交换左右侧关键点的标签关键点权重与 σ 值joint_weights全部为1.sigmas给出每个关键点用于 OKS 评估的归一化标准差数值越小代表该关键点定位精度要求越严苛如眼角、鼻尖区域的关键点 σ 值普遍更小。对应的数据集加载器为CocoWholeBodyFaceDataset源码见 mmpose/datasets/datasets/face/coco_wholebody_face_dataset.py其parse_data_info方法的核心逻辑包括实例过滤当ann[face_valid]为假或ann[face_kpts]的最大值不大于 0即人脸关键点全部无效时直接丢弃该实例人脸框提取从ann[face_box]格式为xywh解析出人脸 bbox并裁剪到图像边界内最终转换为[1, 4]的x1, y1, x2, y2格式关键点提取将ann[face_kpts]重塑为[1, K, 3]前两维为坐标、第三维为可见性标志keypoints_visible取min(1, vis)得到二值可见掩码。训练与验证分别使用annotations/coco_wholebody_train_v1.0.json与annotations/coco_wholebody_val_v1.0.json标注文件图片分别位于train2017/与val2017/目录下data_root统一为data/coco/。二、模型卡片速览官方基准结果模型卡片 hrnetv2_coco_wholebody_face.md 在 COCO-WholeBody-Face 验证集上给出了该配置的官方结果模型架构输入尺寸NME越低越好配置文件权重与日志pose_hrnetv2_w18256×2560.0569td-hm_hrnetv2-w18_8xb32-60e_coco-wholebody-face-256x256.py见模型卡片中的 ckpt 与 log 链接其中NMENormalized Mean Error归一化平均误差是人脸关键点任务的标准评测指标数值越低代表关键点定位越精准。0.0569 的 NME 意味着平均定位误差约为双眼外眼角间距即关键点 36 与 45 之间的距离的 5.69%。模型卡片中还提供了该论文与数据集的 BibTeX 引用条目可用于学术引用HRNetv2Deep High-Resolution Representation Learning for Visual RecognitionTPAMI2019COCO-WholeBodyWhole-Body Human Pose Estimation in the WildECCV2020。三、完整配置逐段拆解本节逐段解析 td-hm_hrnetv2-w18_8xb32-60e_coco-wholebody-face-256x256.py 这份官方训练配置它遵循 MMPose 的配置继承机制头部通过_base_引用../../../_base_/default_runtime.py。3.1 训练策略60 个 epoch 与自动学习率缩放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, end210, milestones[40, 55], gamma0.1, by_epochTrue) ] auto_scale_lr dict(base_batch_size256) default_hooks dict(checkpointdict(save_bestNME, ruleless, interval1))要点说明优化器使用Adam初始学习率2e-3学习率调度前 500 次迭代执行LinearLR线性 warm-up起始系数 0.001随后在 epoch 40 与 55 处按MultiStepLR以gamma0.1衰减学习率自动学习率缩放auto_scale_lr声明基准 batch size 为 256。实际训练中 MMPose 会依据真实 batch size 与基准值的比例线性调整学习率保证更换 batch size 后收敛行为基本一致检查点保存save_bestNME, ruleless表示以验证集 NME 最小为准则保存最优权重且每个 epoch 保存一次 checkpoint值得注意的是配置文件中的end210是MultiStepLR调度器的终止步数内部沿用原 repo 的写法实际训练轮次由max_epochs60控制milestones 在 60 epoch 内均会触发。3.2 编解码器MSRAHeatmapcodec dict( typeMSRAHeatmap, input_size(256, 256), heatmap_size(64, 64), sigma2)codec定义了关键点与热图之间的编解码方式其实现位于 mmpose/codecs/msra_heatmap.pyencode训练时生成标签将 256×256 输入图像空间中的关键点坐标除以scale_factor即input_size / heatmap_size此处为 4映射到 64×64 热图空间再以sigma2生成高斯热图同时输出keypoint_weights权重矩阵。该方法源自论文Simple Baselines for Human Pose Estimation and TrackingXiao et al., 2018decode推理时解码坐标通过get_heatmap_maximum求热图最大值位置作为粗定位再调用refine_keypoints进行亚像素精度细化最后乘回scale_factor还原到原图坐标可扩展项该编解码器还支持unbiasedTrueDarkPose 无偏编解码与blur_kernel_size参数用于进一步提升定位精度本配置未启用。3.3 模型结构HRNet 骨干 特征融合 热图头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_modules3, 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_channels68, deconv_out_channelsNone, lossdict(typeKeypointMSELoss, use_target_weightTrue), conv_out_channels(270, ), conv_kernel_sizes(1, ), decodercodec), test_cfgdict( flip_testTrue, flip_modeheatmap, shift_heatmapTrue, ))这段配置是整套系统的核心逐项说明如下估计器TopdownPoseEstimator是 MMPose 中「自顶向下」top-down姿态估计的统一封装先检测人脸再估计关键点数据预处理器PoseDataPreprocessor采用 ImageNet 的均值/标准差对输入归一化bgr_to_rgbTrue适配 OpenCV 读图通道顺序骨干网络 HRNet-W18四阶段高分辨率网络。W18 的含义体现在 stage2~stage4 各分支通道数为 (18, 36, 72, 144)。stage4 开启multiscale_outputTrue即输出四个分辨率分支的特征init_cfg加载在 ImageNet 上预训练的hrnetv2_w18权重颈部特征融合FeatureMapProcessor源码见 mmpose/models/necks/fmap_proc_neck.py在concatTrue时将 HRNet 输出的多分辨率特征统一缩放到同一尺寸后沿通道维拼接形成 183672144 270通道的特征这正对应head.in_channels270热图回归头HeatmapHead以 1×1 卷积将 270 通道特征映射为 68 张热图对应 68 个关键点损失函数为KeypointMSELoss带use_target_weight的关键点加权 MSEdecodercodec绑定解码器用于推理阶段坐标还原测试增强flip_testTrue开启水平翻转测试原图与翻转图的预测热图取平均flip_modeheatmap表示在热图层面融合shift_heatmapTrue补偿翻转带来的亚像素偏移。3.4 数据流水线pipelinetrain_pipeline [ dict(typeLoadImage), dict(typeGetBBoxCenterScale), dict(typeRandomFlip, directionhorizontal), dict( typeRandomBBoxTransform, 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水平随机翻转并利用数据集元信息中的swap字段交换左右侧关键点RandomBBoxTransform对 bbox 做随机扰动旋转幅度 ±60°尺度缩放因子在 0.75~1.25 之间TopdownAffine依据扰动后的 bbox 将人脸区域仿射变换到 256×256 输入尺寸GenerateTarget调用codec.encode生成高斯热图标签。验证与测试阶段则不使用任何随机增强仅做仿射归一化保证评测可复现。3.5 数据加载器与评估器train_dataloader dict( batch_size32, num_workers2, persistent_workersTrue, samplerdict(typeDefaultSampler, shuffleTrue), datasetdict( typedataset_type, # CocoWholeBodyFaceDataset data_rootdata_root, # data/coco/ data_modedata_mode, # topdown ann_fileannotations/coco_wholebody_train_v1.0.json, data_prefixdict(imgtrain2017/), pipelinetrain_pipeline, )) val_evaluator dict( typeNME, norm_modekeypoint_distance, ) test_evaluator val_evaluator配置名中的8xb32即表示 8 张 GPU × 每卡 batch size 32与auto_scale_lr的 256 基准 batch size 一致。验证与测试共享同一套评估器。四、NME 评估指标的底层原理人脸关键点评测使用的是NME指标类源码见 mmpose/evaluation/metrics/keypoint_2d_metrics.py它支持两种归一化模式use_norm_item使用标注中的某个字段如bbox_size作为归一化因子keypoint_distance本配置采用使用一对关键点之间的距离作为归一化因子通常取两眼外眼角之间的距离以消除人脸尺度差异对误差的影响。NME类内置了DEFAULT_KEYPOINT_INDICES映射表其中coco_wholebody_face: [36, 45]正是左右外眼角关键点的索引。因此本配置中无需显式指定keypoint_indices评估器会自动依据数据集名称从映射表中取出[36, 45]计算二者平均距离后将每个关键点的平均定位误差除以该距离最终得到 NME 值。这一细节解释了为何 configs/base/datasets/coco_wholebody_face.py 中 36 号与 45 号关键点恰好构成swap配对face-36 ↔ face-45它们既是几何对称点又是评估归一化的基准锚点。从评估实现看NME.process收集预测关键点、真值关键点与可见性掩码compute_metrics依据掩码过滤不可见关键点后调用keypoint_nme计算归一化误差并以metrics[NME]输出。五、训练与测试如何复现与验证在准备好数据将 COCO-WholeBody 标注文件与图片按data/coco/目录结构摆放后可直接使用仓库提供的工具脚本复现训练# 单机多卡训练 bash tools/dist_train.sh \ configs/face_2d_keypoint/topdown_heatmap/coco_wholebody_face/td-hm_hrnetv2-w18_8xb32-60e_coco-wholebody-face-256x256.py \ 8 # 单卡训练 python tools/train.py \ configs/face_2d_keypoint/topdown_heatmap/coco_wholebody_face/td-hm_hrnetv2-w18_8xb32-60e_coco-wholebody-face-256x256.py训练结束后使用tools/test.py加载官方或自训权重在验证集上复现 NME 指标python tools/test.py \ configs/face_2d_keypoint/topdown_heatmap/coco_wholebody_face/td-hm_hrnetv2-w18_8xb32-60e_coco-wholebody-face-256x256.py \ checkpoint路径 --out 结果文件训练与测试的通用参数细节可参考 docs/zh_cn/user_guides/train_and_test.md英文版见 docs/en/user_guides/train_and_test.md。此外仓库还提供了一整套可视化与推理工具可使用 demo/topdown_demo_with_mmdet.py 配合检测器完成端到端的人脸关键点演示或参考 docs/zh_cn/user_guides/inference.md 使用高层推理接口MMPoseInferencer加载该模型权重直接推理。六、扩展与改造建议基于本配置可以从以下几个方向进行低成本改造更换输入分辨率将codec.input_size与流水线中的仿射尺寸同步调整为 224×224 或 384×384精度与速度将随之此消彼长同时建议同步调整heatmap_size保持 4 倍下采样比例启用 DarkPose 精修在codec中加入unbiasedTrue配合KeypointMSELoss与解码阶段的refine_keypoints_dark通常在 NME 上可获得进一步收益更换骨干将backbone替换为 MMPose 内置的其他骨干如CSPNeXt、LiteHRNet等FeatureMapProcessor的拼接通道数与head.in_channels需按新骨干输出通道重新计算调整训练超参修改train_cfg.max_epochs、param_scheduler.milestones或优化器学习率时注意auto_scale_lr.base_batch_size应与实际总 batch size 保持一致否则学习率缩放会偏离预期。如需查看更多人脸关键点模型的横向对比可查阅 configs/face_2d_keypoint/README.md 与 docs/zh_cn/dataset_zoo/2d_face_keypoint.md英文版 docs/en/dataset_zoo/2d_face_keypoint.md其中包含基于 300W、WFLW、AFLW、COFW 等数据集的多模型评测总览。七、小结本文以 HRNetv2-W18 在 COCO-WholeBody-Face 上的模型卡片为线索完整覆盖了数据集定义与 68 点标注规范configs/base/datasets/coco_wholebody_face.py、数据集加载器的实例解析逻辑coco_wholebody_face_dataset.py、高斯热图编解码原理msra_heatmap.py、HRNet 多分支特征融合与热图头结构、NME 指标的眼距归一化机制keypoint_2d_metrics.py以及训练测试的完整命令行流程。该配置在验证集上取得 0.0569 的 NME可作为人脸关键点任务中「高分辨率表示 热图回归」这一经典范式的可靠基线与迁移起点。【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmpose创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门