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

MMPose 人脸对齐实战:HRNetv2 + Adaptive Wing Loss 在 WFLW 98 点关键点上的完整配置与源码解析

MMPose 人脸对齐实战HRNetv2 Adaptive Wing Loss 在 WFLW 98 点关键点上的完整配置与源码解析【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmpose本篇技术指南以 MMPose 仓库中 td-hm_hrnetv2-w18_awing-8xb64-60e_wflw-256x256.py 这一官方配置为骨架系统讲解如何基于 HRNetv2高分辨率网络主干与 Adaptive Wing Loss 损失函数在 WFLW 数据集上完成 98 点人脸关键点人脸对齐任务的训练、验证与评估。读完本文你将掌握该模型的完整配置结构、每一项关键超参数的语义与取值依据、NME 指标的定义与归一化逻辑以及如何利用仓库源码损失实现、编码器、数据集解析、评估器佐证配置行为并能够直接运行官方脚本复现 4.02 的 NME 结果。任务背景WFLW 数据集与 98 点人脸对齐人脸关键点定位Face Alignment是计算机视觉中的经典任务目标是在人脸图像中回归出眉毛、眼睛、鼻子、嘴巴、人脸轮廓等语义点的坐标。WFLWWider Facial Landmarks in-the-wild数据集由 Wu 等人于 CVPR2018 提出其论文标题为Look at Boundary: A Boundary-Aware Face Alignment Algorithm见 wflw.py 数据集信息 中的 paper_info 引用。WFLW 的标注采用98 点标记体系并针对各种野外挑战性场景提供了专门的测试子集包括大姿态pose、光照变化illumination、遮挡occlusion、模糊blur、浓妆makeup与夸张表情expression。正因为测试集划分如此细致WFLW 成为衡量人脸对齐算法鲁棒性的标准基准。在 MMPose 中WFLW 由WFLWDataset实现源码位于 mmpose/datasets/datasets/face/wflw_dataset.py。其元信息98 个关键点的名称、颜色、左右对称 swap 关系在 configs/base/datasets/wflw.py 中定义。一个值得注意的细节是WFLWDataset.parse_data_info中标注框的尺度归一化系数为pixel_std 200.即 WFLW 的 bbox scale 以因子 200 归一化见 wflw_dataset.py随后通过bbox_cs2xyxy将中心点-尺度表示转换为 xyxy 形式的检测框。方法组合HRNetv2 主干 Adaptive Wing Loss本文涉及的模型卡片文档 hrnetv2_awing_wflw.md 明确了该配置的三篇核心论文引用HRNetv2TPAMI2019Deep High-Resolution Representation Learning for Visual Recognition作者为 Jingdong Wang、Ke Sun、Tianheng Cheng 等。HRNet 的核心思想是全程维持高分辨率特征表示并通过多分支并行与多尺度信息融合来同时保留空间细节与语义信息非常适合关键点这类对空间精度敏感的密集预测任务。Adaptive Wing LossICCV2019Adaptive Wing Loss for Robust Face Alignment via Heatmap Regression作者为 Xinyao Wang、Liefeng Bo、Fuxin Li。该损失专门针对人脸对齐的 heatmap 回归设计对误差较大区域采用线性L1 型惩罚对误差较小区域采用对数型惩罚从而在训练初期加快收敛、后期精细拟合。WFLWCVPR2018上述数据集论文。配置全景逐段拆解训练配置官方配置 td-hm_hrnetv2-w18_awing-8xb64-60e_wflw-256x256.py 的文件名已经概括了关键信息td-hmTopdown Heatmap自上而下的热力图方法、hrnetv2-w18主干、awing损失、8xb648 卡 × 每卡 64 样本、60e60 个 epoch、输入256x256。运行框架与学习率调度配置以 default_runtime.py 为基底并覆盖训练超参数# runtime train_cfg dict(max_epochs60, val_interval1) # optimizer optim_wrapper dict(optimizerdict( typeAdam, lr2e-3, )) # learning policy param_scheduler [ dict( typeLinearLR, begin0, end500, start_factor0.001, by_epochFalse), # warm-up dict( typeMultiStepLR, begin0, end60, milestones[40, 55], gamma0.1, by_epochTrue) ] # automatically scaling LR based on the actual training batch size auto_scale_lr dict(base_batch_size512)优化器使用Adam初始学习率 2e-3。学习率策略分两段前 500 个 iteration 为warm-up线性从 0.001 倍基学习率爬升by_epochFalse表示按 iteration 计随后进入MultiStepLR在第 40 与第 55 个 epoch 各将学习率乘以 0.1gamma0.1直到 60 个 epoch 结束。auto_scale_lr dict(base_batch_size512)表示按“总批大小 512”即 8 卡 × 64为基准自动缩放学习率若实际批大小不同框架会据此自动换算。保存最优模型default_hooks dict(checkpointdict(save_bestNME, ruleless, interval1))覆盖默认 checkpoint 行为以NME 为监控指标、数值越小越好ruleless每个 epoch 保存一次并保留验证集 NME 最优的权重。CodecMSRAHeatmap 高斯热力图编码codec dict( typeMSRAHeatmap, input_size(256, 256), heatmap_size(64, 64), sigma2)MSRAHeatmap是 MMPose 的 Codec编码-解码器之一源码位于 mmpose/codecs/msra_heatmap.py。其职责是编码encode把输入空间256×256中的关键点坐标按scale_factor input_size / heatmap_size 4缩放到 64×64 的热力图空间并以sigma2生成高斯热力图作为回归目标同时产出keypoint_weights作为各点权重见 msra_heatmap.py。解码decode推理时从预测热力图取最大值位置作为关键点坐标再映射回 256×256 输入空间见 msra_heatmap.py。需要指出的是本文的 awing 配置中unbiased未开启默认为 False因此使用普通高斯热力图与refine_keypoints亚像素修正而同一目录下的 DarkPose 变体 td-hm_hrnetv2-w18_dark-8xb64-60e_wflw-256x256.py 则设置了unbiasedTrue并默认使用blur_kernel_size11的调制核对应经验公式 sigma≈2解码时采用refine_keypoints_dark消除坐标偏置。模型定义TopdownPoseEstimatormodel 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_channels98, deconv_out_channelsNone, conv_out_channels(270, ), conv_kernel_sizes(1, ), lossdict(typeAdaptiveWingLoss, use_target_weightTrue), decodercodec), test_cfgdict( flip_testTrue, flip_modeheatmap, shift_heatmapTrue, ))各模块要点数据预处理器采用 ImageNet 统计的均值/标准差归一化且bgr_to_rgbTrueOpenCV 读入的 BGR 图像转为 RGB。BackboneHRNet-w18四阶段结构。stage1 单分支 Bottleneck 通道 64stage2 双分支18、36stage3 三分支18、36、72stage4 四分支18、36、72、144。multiscale_outputTrue表示输出四个尺度的特征交由 neck 融合。NeckFeatureMapProcessorconcatTrue将四个尺度的特征图上采样bilinearalign_cornersFalse并拼接拼接后通道数为 183672144270这正是 head 中in_channels270的来源。HeadHeatmapHead以 1×1 卷积把 270 通道映射为98 通道对应 WFLW 的 98 个关键点即输出 64×64×98 的热力图。损失函数为AdaptiveWingLoss且use_target_weightTrue即按关键点可见性加权。测试配置启用水平翻转测试flip_testTrue在热力图层面融合flip_modeheatmap并对翻转后的热力图做偏移校正shift_heatmapTrue。数据管线与 DataLoaderdataset_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) ]训练管线依次执行加载图像 → 由标注框计算中心点与尺度 → 水平随机翻转 → 随机旋转±60°与缩放0.75~1.25 倍shift_prob0表示不做平移扰动→ 仿射变换到 256×256 → 调用 codec 生成高斯热力图目标 → 打包样本。验证/测试管线不含数据增强与GenerateTarget评估阶段无需生成目标热力图。train_dataloader dict( batch_size64, num_workers2, persistent_workersTrue, samplerdict(typeDefaultSampler, shuffleTrue), datasetdict( typedataset_type, data_rootdata_root, data_modedata_mode, ann_fileannotations/face_landmarks_wflw_train.json, data_prefixdict(imgimages/), pipelinetrain_pipeline, )) val_dataloader dict( batch_size32, num_workers2, persistent_workersTrue, drop_lastFalse, samplerdict(typeDefaultSampler, shuffleFalse, round_upFalse), datasetdict( typedataset_type, data_rootdata_root, data_modedata_mode, ann_fileannotations/face_landmarks_wflw_test.json, data_prefixdict(imgimages/), test_modeTrue, pipelineval_pipeline, )) test_dataloader val_dataloader训练集使用face_landmarks_wflw_train.json测试集使用face_landmarks_wflw_test.json图像前缀均为images/。若准备数据集可参考 数据集准备指南 与 dataset_tools 文档。评估器NME 指标val_evaluator dict( typeNME, norm_modekeypoint_distance, ) test_evaluator val_evaluatorNMENormalized Mean Error归一化平均误差实现于 mmpose/evaluation/metrics/keypoint_2d_metrics.py。norm_modekeypoint_distance表示以两眼外眼角距离作为归一化因子对于 WFLW默认取keypoint_indices [60, 72]见DEFAULT_KEYPOINT_INDICES中wflw: [60, 72]对应“最右与最左眼关键点”。每个子集的 NME 独立计算因此可以分别报告 test / pose / illumination / occlusion / blur / makeup / expression 七项指标。源码级原理Adaptive Wing Loss 的实现Adaptive Wing Loss 的 PyTorch 实现位于 mmpose/models/losses/heatmap_loss.py默认超参数为def __init__(self, alpha2.1, omega14, epsilon1, theta0.5, use_target_weightFalse, loss_weight1.):alpha2.1指数参数用于控制小误差区域的曲线形态omega14线性段斜率相关参数epsilon1对数项中的平滑常数theta0.5区分小误差对数惩罚与大误差线性惩罚的阈值use_target_weightTrue配置中已开启按关键点权重对 loss 加权。其核心公式在criterion方法中体现heatmap_loss.pydelta (target - pred).abs() A self.omega * ( 1 / (1 torch.pow(self.theta / self.epsilon, self.alpha - target)) ) * (self.alpha - target) * (torch.pow( self.theta / self.epsilon, self.alpha - target - 1)) * (1 / self.epsilon) C self.theta * A - self.omega * torch.log( 1 torch.pow(self.theta / self.epsilon, self.alpha - target)) losses torch.where( delta self.theta, self.omega * torch.log(1 torch.pow(delta / self.epsilon, self.alpha - target)), A * delta - C)可以看到当误差delta theta时使用对数型惩罚omega * log(1 (delta/epsilon)^(alpha - target))其指数项依赖目标热力图值即自适应当误差较大时切换为线性段A * delta - C从而避免 MSE 对大误差的过度放大缓解人脸对齐中遮挡、大姿态样本带来的梯度不稳定问题。相比该目录下使用 MSE 的基线配置 td-hm_hrnetv2-w18_8xb64-60e_wflw-256x256.py其 loss 为KeypointMSELossAdaptive Wing Loss 是专门为人脸对齐设计的更鲁棒损失。实验结果WFLW 各挑战子集 NME官方结果记录于 hrnetv2_awing_wflw.yml模型仅在 WFLW train 上训练输入尺寸 256×256ArchInput SizeNMEtestNMEposeNMEilluminationNMEocclusionNMEblurNMEmakeupNMEexpressionpose_hrnetv2_w18_awing256×2564.026.943.974.784.593.874.28指标解读NMEtest4.02%是总体测试集误差误差按两眼距离归一化为百分比。最难子集为pose大姿态NME 高达 6.94符合人脸对齐任务的一般认知——大姿态下人脸自遮挡严重、标注不确定性高。occlusion遮挡与blur模糊也显著高于总体水平4.78、4.59说明鲁棒性瓶颈集中在遮挡与模糊场景。makeup浓妆子集误差最低3.87而 illumination光照与 expression表情相对接近总体水平。将该配置与同目录下另外两个变体横向对比均训练于 WFLW train、256×256 输入、60 epoch配置损失/解码NMEtestNMEposeNMEocclusiontd-hm_hrnetv2-w18_8xb64-60e_wflw-256x256.py见 hrnetv2_wflw.mdMSE4.066.974.83td-hm_hrnetv2-w18_dark-8xb64-60e_wflw-256x256.py见 hrnetv2_dark_wflw.mdMSE DarkPose3.986.984.78td-hm_hrnetv2-w18_awing-8xb64-60e_wflw-256x256.py本文Adaptive Wing Loss4.026.944.78从仓库记录的实测数据看Adaptive Wing Loss 在 pose6.94 vs 6.97/6.98与 makeup 等子集上带来收益而 DarkPose 通过无偏高斯编码与调制解码在总体 NME 上更低3.98。三者互为补充展示了损失函数与解码策略两个正交方向对人脸对齐精度的影响。训练、测试与推理单卡/多卡训练直接运行 tools/train.pypython tools/train.py configs/face_2d_keypoint/topdown_heatmap/wflw/td-hm_hrnetv2-w18_awing-8xb64-60e_wflw-256x256.py多卡分布式训练使用 tools/dist_train.shbash tools/dist_train.sh configs/face_2d_keypoint/topdown_heatmap/wflw/td-hm_hrnetv2-w18_awing-8xb64-60e_wflw-256x256.py 8其中8表示使用 8 张 GPU对应文件名中的8xb64。训练过程中验证集 NME 每 epoch 评估一次最优权重按 NME 最小保存。测试使用 tools/test.py 加载训练产出的 checkpoint 进行评估python tools/test.py configs/face_2d_keypoint/topdown_heatmap/wflw/td-hm_hrnetv2-w18_awing-8xb64-60e_wflw-256x256.py checkpoint路径多卡测试对应 tools/dist_test.sh。测试会自动执行水平翻转融合flip_testTrue并通过NME评估器输出各挑战子集的 NME。推理该配置属于TopdownPoseEstimator人脸 2D 关键点模型可配合检测器使用 demo/topdown_demo_with_mmdet.py 完成端到端推理或使用 MMPose 的通用推理 APIdemo/inferencer_demo.py直接指定该配置文件与权重进行单人脸关键点检测。更详细的流程可参考 2d 人脸演示文档 与 推理指南。小结本文围绕 MMPose 中 HRNetv2-w18 Adaptive Wing Loss 的 WFLW 配置完成了从数据集理解、模型结构、训练超参、Codec 编码、数据管线、评估指标到源码实现的完整闭环解读。核心要点可概括为架构TopdownPoseEstimator HRNet-w18 多尺度主干 FeatureMapProcessor 特征拼接 HeatmapHead 回归 98 通道热力图损失Adaptive Wing Lossα2.1、ω14、ε1、θ0.5对人脸对齐的遮挡/大姿态样本更鲁棒CodecMSRAHeatmap256×256 输入编码为 64×64 高斯热力图σ2评估NME 按两眼距离归一化官方报告总体 NME 4.02pose 子集最挑战6.94对比与 MSE4.06和 DarkPose3.98变体对比可针对性地选择损失与解码策略。如需进一步调整可阅读 MMPose 配置文档 与 codecs 指南理解每个字段与底层模块的对应关系后自由迁移到 300W、AFLW、COCO-WholeBody Face 等人脸关键点数据集。【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmpose创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

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

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