ARTICLE DETAIL

资讯详情

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

mmpose 实战:SCNet 自校准卷积在 COCO-WholeBody-Face 面部关键点检测中的应用与配置全解析

mmpose 实战:SCNet 自校准卷积在 COCO-WholeBody-Face 面部关键点检测中的应用与配置全解析 mmpose 实战SCNet 自校准卷积在 COCO-WholeBody-Face 面部关键点检测中的应用与配置全解析【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmpose导读本文围绕 configs/face_2d_keypoint/topdown_heatmap/coco_wholebody_face/scnet_coco_wholebody_face.md 展开深入讲解如何在 OpenMMLab 姿态估计工具箱 mmpose 中使用 CVPR 2020 提出的 SCNetSelf-Calibrated Convolutions在 COCO-WholeBody-Face 数据集上完成 68 点面部关键点检测。读完本文你将掌握该模型完整配置文件的每一处参数含义、SCNet 自校准卷积的源码级实现原理、COCO-WholeBody-Face 数据集标注的解析方式以及如何复现 NME 0.0567 的评测结果并执行训练与测试。一、任务背景面部关键点检测的两个核心组件本模型配置由两个关键组件构成二者在原文档中分别以算法与数据集的引用信息给出1.1 算法SCNetCVPR2020SCNet 全称为 Improving Convolutional Networks with Self-Calibrated Convolutions由 Liu Jiang-Jiang 等人发表于 CVPR 2020。其核心思想是用自校准卷积Self-Calibrated Convolution, SCConv替代普通卷积在不显著增加参数量的前提下扩大每个卷积层的感受野从而让网络能够利用更大范围的上下文信息——这对面部关键点这类需要对局部特征眼睛、嘴角等与全局结构脸型轮廓同时建模的任务尤为有价值。原文档给出的 BibTeX 引用如下inproceedings{liu2020improving, title{Improving Convolutional Networks with Self-Calibrated Convolutions}, author{Liu, Jiang-Jiang and Hou, Qibin and Cheng, Ming-Ming and Wang, Changhu and Feng, Jiashi}, booktitle{Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition}, pages{10096--10105}, year{2020} }1.2 数据集COCO-WholeBody-FaceECCV2020COCO-WholeBody 是 Whole-Body Human Pose Estimation in the Wild 工作中提出的大规模人体姿态数据集在 COCO 的基础上补充了脚部、面部和手部的关键点标注。其中面部关键点采用 68 点标记方案mark-up对应数据集子任务 COCO-WholeBody-Face。mmpose 中以独立的CocoWholeBodyFaceDataset类封装该子集用于面部关键点定位任务。原文档给出的 BibTeX 引用如下inproceedings{jin2020whole, title{Whole-Body Human Pose Estimation in the Wild}, author{Jin, Sheng and Xu, Lumin and Xu, Jin and Wang, Can and Liu, Wentao and Qian, Chen and Ouyang, Wanli and Luo, Ping}, booktitle{Proceedings of the European Conference on Computer Vision (ECCV)}, year{2020} }二、模型结果与权重原文档的核心结论是 SCNet-50 在 COCO-WholeBody-Face 验证集上的评测结果。mmpose 对 2D 面部关键点任务使用NMENormalized Mean Error归一化平均误差作为评估指标ArchInput SizeNMEckptlogpose_scnet_50256x2560.0567已发布权重见 model-index.yml 与 scnet_coco_wholebody_face.yml训练日志已随模型发布其中Input Size 256x256输入到网络的图像分辨率NME 0.0567归一化平均误差数值越小精度越高模型权重与训练日志托管于 OpenMMLab 官方模型库元数据登记在 scnet_coco_wholebody_face.yml 中训练数据为 COCO-WholeBody-Face任务分类为 Face 2D Keypoint。三、配置文件逐段精读完整的训练配置文件位于 td-hm_scnet50_8xb32-60e_coco-wholebody-face-256x256.py文件名本身即概括了核心信息td-hmTop-Down Heatmap自顶向下热图范式、scnet50SCNet-50 骨干、8xb328 卡 × 每卡 batch 32、60e60 epoch、输入 256×256。下面按模块逐段拆解。3.1 运行时配置runtime_base_ [../../../_base_/default_runtime.py] # runtime train_cfg dict(max_epochs60, val_interval1)继承 default_runtime.py 中的通用运行配置日志、随机种子、环境等max_epochs60共训练 60 个 epochval_interval1每个 epoch 结束后执行一次验证。3.2 优化器与学习率调度optimizer scheduler# 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, end210, milestones[40, 55], gamma0.1, by_epochTrue) ] # automatically scaling LR based on the actual training batch size auto_scale_lr dict(base_batch_size256)使用Adam优化器初始学习率2e-3两段式学习率调度先执行 500 iteration 的线性 warm-upstart_factor0.001即从 1e-3 × 1e-3 起步线性爬升by_epochFalse表示按 iteration 计再切换到MultiStepLR在 epoch 40 和 55 处将学习率乘以gamma0.1衰减注意该调度器的end210大于max_epochs60实际以训练长度为准auto_scale_lr声明了基准 batch size 为 256mmengine 会根据实际使用的总 batch size 自动缩放学习率。3.3 模型结构backbone head# codec settings codec dict( typeMSRAHeatmap, input_size(256, 256), heatmap_size(64, 64), sigma2) # model settings model dict( typeTopdownPoseEstimator, data_preprocessordict( typePoseDataPreprocessor, mean[123.675, 116.28, 103.53], std[58.395, 57.12, 57.375], bgr_to_rgbTrue), backbonedict( typeSCNet, depth50, init_cfgdict( typePretrained, checkpointhttps://download.openmmlab.com/mmpose/ pretrain_models/scnet50-7ef0a199.pth)), headdict( typeHeatmapHead, in_channels2048, out_channels68, lossdict(typeKeypointMSELoss, use_target_weightTrue), decodercodec), test_cfgdict( flip_testTrue, flip_modeheatmap, shift_heatmapTrue, ))逐项说明MSRAHeatmapcodec采用 MSRA 方案即 Simple Baselines for Human Pose Estimation and Tracking 中的做法将关键点编码为高斯热图。input_size(256, 256)为输入图像尺寸heatmap_size(64, 64)为热图尺寸即 4 倍下采样sigma2为高斯核标准差。codec 同时承担编码训练时由GenerateTarget调用生成热图标签与解码测试时从热图回归关键点坐标两项职责具体实现在 mmpose/codecs/msra_heatmap.pyTopdownPoseEstimatormmpose 的通用自顶向下姿态估计器负责串联 preprocessor → backbone → head 的完整前向流程PoseDataPreprocessor图像归一化使用 ImageNet 统计量mean/std并设置bgr_to_rgbTrue适配 OpenCV 读取的 BGR 图像SCNet骨干depth50并加载 OpenMMLab 预训练的 scnet50 ImageNet 权重scnet50-7ef0a199.pth进行初始化HeatmapHead简单热图回归头in_channels2048对应 SCNet-50 最后一层输出通道out_channels68对应 68 个面部关键点损失函数为带关键点权重use_target_weightTrue的 MSE 损失KeypointMSELosstest_cfg测试阶段启用水平翻转测试flip_test翻转模式为heatmap对热图进行翻转融合并shift_heatmapTrue对翻转后的热图做像素偏移修正这是经典的自顶向下方法提升精度的标准技巧。3.4 数据流水线pipeline# pipelines train_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) ]训练流水线LoadImage加载图像 →GetBBoxCenterScale从标注框提取中心与尺度 →RandomFlip随机水平翻转 →RandomBBoxTransform做数据增强旋转 ±60°尺度缩放 0.75~1.25→TopdownAffine将人脸区域仿射裁剪到 256×256 →GenerateTarget用 MSRAHeatmap codec 生成 64×64 高斯热图标签 →PackPoseInputs打包验证流水线去除翻转与增强仅保留仿射对齐与打包保证评测一致性。3.5 数据加载data loadersdataset_type CocoWholeBodyFaceDataset data_mode topdown data_root data/coco/ train_dataloader dict( batch_size32, num_workers2, persistent_workersTrue, samplerdict(typeDefaultSampler, shuffleTrue), datasetdict( typedataset_type, data_rootdata_root, data_modedata_mode, ann_fileannotations/coco_wholebody_train_v1.0.json, data_prefixdict(imgtrain2017/), 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/coco_wholebody_val_v1.0.json, data_prefixdict(imgval2017/), test_modeTrue, pipelineval_pipeline, )) test_dataloader val_dataloader训练与验证分别读取coco_wholebody_train_v1.0.json与coco_wholebody_val_v1.0.json标注图像分别位于 COCO 的train2017/与val2017/目录data_modetopdown表示单实例样本模式每个样本包含一张人脸图像区域训练 batch size 32、shuffle验证不 shuffle、drop_lastFalsetest_dataloader直接复用val_dataloader。3.6 评估指标evaluatorval_evaluator dict( typeNME, norm_modekeypoint_distance, ) test_evaluator val_evaluatorNME 评估器定义于 mmpose/evaluation/metrics/keypoint_2d_metrics.py其norm_mode支持use_norm_item与keypoint_distance两种归一化模式前者读取标注中预先给出的归一化距离后者则根据标注中的关键点距离计算归一化因子。本配置使用keypoint_distance模式即利用面部几何尺度如两瞳孔距离对误差进行归一化得到无量纲的 NME 值。四、SCNet 源码级原理剖析SCNet 骨干网络实现在 mmpose/models/backbones/scnet.py它继承自 ResNet通过替换残差瓶颈块引入自校准卷积。4.1 SCConv自校准卷积的核心算子SCConv是自校准机制的最小实现单元scnet.py其前向计算可概括为out torch.sigmoid( torch.add(identity, F.interpolate(self.k2(x), identity.size()[2:]))) out torch.mul(self.k3(x), out) out self.k4(out)四个子模块分工如下子模块作用k2对输入做AvgPool2d(kernel_sizepooling_r, stridepooling_r)下采样以扩大感受野再经 3×3 卷积、BN 提取上下文特征最后通过F.interpolate上采样回原尺寸k33×3 卷积提取原始尺度的局部特征门控sigmoid(identity k2输出)生成 0~1 的软注意力权重对k3的输出做逐元素加权实现用大感受野信息校准局部特征k43×3 卷积stride 由外部传入聚合校准后的特征并输出其中pooling_r默认取 4类属性SCBottleneck.pooling_r 4即下采样 4 倍后提取上下文。这种下采样扩感受野 → 上采样 → sigmoid 门控的结构正是自校准一词的来源卷积核的权重被输入本身的全局结构所调制。4.2 SCBottleneck通道分流式残差块SCBottleneckscnet.py在标准 ResNet Bottleneck 基础上做了通道分流输入先经两个并行的 1×1 卷积conv1与conv2分别得到mid_channels的两种特征其中一路out_a走普通 3×3 卷积k1另一路out_b走上述 SCConv 自校准路径两路结果沿通道拼接后经conv31×1 卷积投影回out_channels再与残差identity相加、ReLU 输出。这种设计将传统 Bottleneck 的串行 1×1-3×3-1×1改造为并行双分支 自校准使模型能以接近原 ResNet 的计算量获得更丰富的多尺度表征。4.3 SCNet-50 的整体结构SCNet类scnet.py仅需指定depth其结构表为arch_settings { 50: (SCBottleneck, [3, 4, 6, 3]), 101: (SCBottleneck, [3, 4, 23, 3]) }即仅支持 50 层与 101 层两种深度其余超参base_channels、strides、dilations、frozen_stages、with_cp等均继承自ResNet。SCNet-50 的四阶段输出通道为 256/512/1024/2048与 ResNet-50 一致这正是配置中HeatmapHead.in_channels2048的由来。其正确性由单元测试 tests/test_models/test_backbones/test_scnet.py 覆盖包括非法深度如SCNet(20)会抛出KeyError各out_indices组合下的前向输出形状正确frozen_stages冻结、with_cp梯度检查点、zero_init_residual等 ResNet 继承特性均可用。五、COCO-WholeBody-Face 数据集的工程化处理5.1 数据集类与标注解析CocoWholeBodyFaceDataset定义于 mmpose/datasets/datasets/face/coco_wholebody_face_dataset.py继承自BaseCocoStyleDataset其parse_data_info方法负责将 COCO 风格 JSON 转成 mmpose 内部样本格式关键逻辑包括实例过滤仅当ann[face_valid]为真且max(ann[face_kpts]) 0时保留该人脸实例人脸框提取从ann[face_box]xywh 格式计算人脸包围框并裁剪到图像边界内输出为[1, 4]的 xyxy 框关键点转换face_kpts原始形状为(68, 3)x, y, 可见性reshape 为(1, 68, 3)后拆分出坐标keypoints与可见性keypoints_visible取min(1, 可见性)将 0/1/2 三类标注统一为是否可见。5.2 68 点语义与元信息数据集的 68 点语义定义在 configs/base/datasets/coco_wholebody_face.py0~16面部轮廓chin/face oval17~26眉毛eyebrows27~35鼻梁与鼻尖nose36~47眼睛eyes48~67嘴唇外沿与内沿mouth。该文件同时为每个关键点配置了swap映射如face-0↔face-16用于水平翻转时左右对称关键点的标签交换joint_weights[1.] * 68为全部关键点等权sigmas数组给出各关键点的归一化标准差供 NME/OKS 类指标使用。六、训练、测试与推理实战6.1 数据准备使用默认配置时需将 COCO-WholeBody 数据按以下布局放置data_root data/coco/data/coco/ ├── annotations/ │ ├── coco_wholebody_train_v1.0.json │ └── coco_wholebody_val_v1.0.json ├── train2017/ └── val2017/数据集下载与整理的完整说明可参考 prepare_datasets.md。6.2 训练单卡训练python tools/train.py configs/face_2d_keypoint/topdown_heatmap/coco_wholebody_face/td-hm_scnet50_8xb32-60e_coco-wholebody-face-256x256.py多卡分布式训练8 卡bash tools/dist_train.sh configs/face_2d_keypoint/topdown_heatmap/coco_wholebody_face/td-hm_scnet50_8xb32-60e_coco-wholebody-face-256x256.py 88xb32即 8 卡 × batch 32 256 总 batch size与auto_scale_lr.base_batch_size256对应因此单卡训练时学习率会被自动缩小以保持训练动力学一致。训练细节与参数含义可参考 train_and_test.md。6.3 测试与评测python tools/test.py configs/face_2d_keypoint/topdown_heatmap/coco_wholebody_face/td-hm_scnet50_8xb32-60e_coco-wholebody-face-256x256.py ${CHECKPOINT_FILE}其中${CHECKPOINT_FILE}为模型权重路径。测试阶段会自动应用test_cfg中的翻转测试策略并输出 NME 指标——官方发布的 SCNet-50 权重在验证集上的 NME 为0.0567。训练过程中的最佳模型保存策略由default_hooks中的save_bestNME, ruleless决定即始终保留 NME 最低的检查点。6.4 推理mmpose 也提供了统一的 Inferencer 接口进行快速推理可直接加载该配置对应的模型进行单张图片的关键点预测与可视化具体用法见 inference.md 与 demo/image_demo.py。七、总结SCNet-50 COCO-WholeBody-Face 配置是 mmpose 面部 2D 关键点检测体系中强骨干 标准热图范式的代表性方案算法层面SCNet 通过 SCConv 自校准机制下采样扩感受野 sigmoid 门控加权在几乎不增加参数的前提下提升骨干网络的上下文建模能力其实现可直接在 mmpose/models/backbones/scnet.py 中完整阅读工程层面该配置集中体现了 mmpose 自顶向下热图任务的完整范式——MSRAHeatmap codec 负责热图编解码、TopdownPoseEstimator串联骨干与回归头、RandomBBoxTransform做框级增强、NME评估器做归一化误差评测复现层面NME 0.0567 的结果可通过 td-hm_scnet50_8xb32-60e_coco-wholebody-face-256x256.py 一键复现权重元数据登记于 scnet_coco_wholebody_face.yml。对于希望在精度与速度之间取得平衡、或希望基于该骨干做迁移学习的开发者建议进一步对比同目录下的 resnet_coco_wholebody_face.mdResNet-50 基线与 hrnetv2_coco_wholebody_face.mdHRNet 高分辨率表示等配置结合自身任务需求选择骨干网络。【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmpose创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表