ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

MMPose 中的 YOLOX-Pose:基于 OKS 损失的单阶段多人姿态估计实践指南

MMPose 中的 YOLOX-Pose:基于 OKS 损失的单阶段多人姿态估计实践指南 MMPose 中的 YOLOX-Pose基于 OKS 损失的单阶段多人姿态估计实践指南【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmpose导读YOLOX-Pose 是 MMPose 基于 YOLO-PoseCVPRW 2022思想与 YOLOX 目标检测框架实现的一套自底向上bottom-up单阶段多人姿态估计方案它将人检测与关键点回归统一到一次前向推理中天然适配实时应用场景。本篇文章以 yoloxpose_coco.md 为骨架结合仓库中的配置文件与源码系统讲解 YOLOX-Pose 的算法原理、四种规格模型的配置结构、训练流程与评估方式读完后你将能够在 MMPose 中完成 YOLOX-Pose 的复现、调参与评估。一、算法背景从 YOLO-Pose 到 YOLOX-PoseYOLO-Pose 是一篇发表于 CVPRW 2022 的工作论文标题为Yolo-pose: Enhancing YOLO for multi person pose estimation using object keypoint similarity loss核心思想是在单次前向传播中同时完成所有人实例的检测与关键点回归属于典型的自底向上方法避免了 Top-Down 两阶段方案中先检测、再逐人裁剪推理所带来的计算冗余。MMPose 在 YOLO 检测框架上复现并扩展了该思路实现为YOLOX-Pose相关说明见 README.md继承 YOLO-Pose检测与姿态估计统一的优势为更精确地预测关键点位置为不同关节分别回归偏移量使用带自适应卷积的独立分支从而针对每个关键点优化特征提取过程。算法层面YOLOX-Pose 的关键创新是引入OKSObject Keypoint Similarity目标关键点相似度损失作为标签分配与回归监督的核心度量这也是 YOLO-Pose 论文标题所强调的贡献点。二、整体架构CSPDarknet YOLOXPAFPN YOLOXPoseHead从 yoloxpose_s_8xb32-300e_coco-640.py 可以看出YOLOX-Pose 的模型由三部分组成整体注册为BottomupPoseEstimator模块类型关键参数backboneCSPDarknetout_indices(2,3,4)spp_kernal_sizes(5,9,13)激活函数SwishneckYOLOXPAFPNin_channels[128,256,512]out_channels128num_csp_blocks1headYOLOXPoseHeadnum_keypoints17featmap_strides(8,16,32)其中 backbone 的初始化直接复用了 MMDetection 中在 COCO 上预训练好的 YOLOX 权重prefixbackbone.这意味着姿态模型以检测特征为基础进行迁移学习。neck 与 head 中均使用BNmomentum0.03, eps0.001与Swish激活与 YOLOX 原始训练设定保持一致。YOLOXPoseHead的底层实现位于 yoloxpose_head.py其模块YOLOXPoseHeadModule在每一层特征图上初始化了三个平行分支分类分支cls branchstacked_convs层堆叠卷积后输出num_classes的分类分数回归分支reg branch输出 4 维边界框bbox_preds与 1 维目标度objectness姿态分支pose branch采用stacked_convs * 2层即两倍深度的自适应卷积输出num_keypoints * 2维关键点偏移kpt_offsets与num_keypoints维关键点可见度kpt_vis。姿态分支使用两倍深度的卷积层正是为不同关节分别学习偏移量、独立优化特征提取这一设计意图的直接体现见 yoloxpose_head.py。此外head 在初始化时会通过bias_init_with_prob(0.01)设置分类与目标度分支的偏置以保证训练初期预测稳定见 yoloxpose_head.py。2.1 标签分配SimOTAAssigner 与 OKSYOLOX-Pose 的标签分配使用SimOTAAssigner并设置dynamic_k_indicatoroks——即以 OKS 作为动态 k 的衡量指标来决定每个真实目标匹配的 anchor 数量assignerdict(typeSimOTAAssigner, dynamic_k_indicatoroks), overlaps_power0.5,overlaps_power0.5用于对 OKS 重叠度做幂次缩放影响分配时的代价计算。这是用 OKS 损失增强 YOLO这一论文思想在实现层的直接落地。2.2 损失函数组合配置文件 中定义了六个损失分工如下损失类型reductionloss_weight作用loss_clsBCELosssum1.0分类分数loss_bboxIoULossmodesquareeps1e-16sum5.0边界框回归loss_objBCELossuse_target_weightTruesum1.0目标度loss_oksOKSLossnone30.0关键点回归核心loss_visBCELossuse_target_weightTruemean1.0关键点可见度loss_bbox_auxL1Losssum1.0辅助边界框回归其中loss_oks的metainfo指向configs/_base_/datasets/coco.py用于读取 COCO 17 个关键点的归一化标准差按类别尺度归一化关键点回归目标norm_target_weightTrue表示按目标权重归一化。OKS 损失权重 30.0 是全部损失中最大的突出了关键点回归在整个模型目标中的核心地位。2.3 测试配置test_cfgdict( score_thr0.01, nms_thr0.65, )推理时保留分数高于 0.01 的预测并对其做阈值为 0.65 的 NMS 后处理。三、四种规格模型与 COCO 精度基准仓库在configs/body_2d_keypoint/yoloxpose/coco/下提供了 tiny / s / m / l 四种规格对应 YOLOX 系列的宽度与深度缩放因子配置输入尺寸widen_factordeepen_factor预训练权重来源yoloxpose_tiny_4xb64-300e_coco-416.py416×4160.3750.33YOLOX-tinyyoloxpose_s_8xb32-300e_coco-640.py640×6400.50.33YOLOX-syoloxpose_m_8xb32-300e_coco-640.py640×6400.750.67YOLOX-myoloxpose_l_8xb32-300e_coco-640.py640×6401.01.0YOLOX-l在 COCO val2017 上的精度如下数据来自 yoloxpose_coco.md 与 yoloxpose_coco.ymlArchInput SizeAPAP^50AP^75ARAR^50yoloxpose_tiny416×4160.5260.7930.5560.5710.833yoloxpose_s640×6400.6410.8720.7020.6820.902yoloxpose_m640×6400.6950.8990.7660.7330.926yoloxpose_l640×6400.7120.9010.7820.7490.926可以看到从 tiny 到 lAP 随模型容量稳步提升tiny 以 416 输入获得 52.6 AP适合轻量部署l 在 640 输入下达到 71.2 AP同时保持着自底向上方法一次前向、全员检测的效率特性。3.1 变体配置的继承方式tiny / m / l 三个配置均以 s 配置为基础继承。例如 tiny 配置通过_base_ ./yoloxpose_s_8xb32-300e_coco-640.py继承全部结构仅覆盖模型缩放因子、预训练权重、neck 通道数、batch_size 与输入尺寸而 m / l 则在覆盖widen_factor、deepen_factor、in_channels/out_channels、num_csp_blocks与权重路径。这种_base_继承机制让换一个规格只需改几行成为可能。四、训练配置深度解析4.1 训练循环与学习率调度train_cfg dict( _delete_True, typeEpochBasedTrainLoop, max_epochs300, val_interval10, dynamic_intervals[(280, 1)])总训练 300 epoch每 10 epoch 验证一次从第 280 epoch 起验证间隔动态调整为 1 epoch配合下文模式切换 hook 使用。学习率采用三段式调度param_scheduler [ dict(typeQuadraticWarmupLR, by_epochTrue, begin0, end5, convert_to_iter_basedTrue), dict(typeCosineAnnealingLR, eta_min0.0002, begin5, T_max280, end280, by_epochTrue, convert_to_iter_basedTrue), dict(typeConstantLR, by_epochTrue, factor1, begin280, end300), ]即前 5 epoch 使用二次曲线 warmup按 iteration 计5–280 epoch 余弦退火至eta_min0.0002最后 20 epoch 保持恒定学习率。优化器为AdamW(lr0.004, weight_decay0.05)其中 BN 参数与 bias 不做权重衰减并启用clip_gradmax_norm0.1防止梯度爆炸。配置同时声明auto_scale_lr dict(base_batch_size256)在改变 batch_size 时可自动线性缩放学习率。4.2 两阶段训练YOLOX 风格的强增强与模式切换YOLOX-Pose 完整继承了 YOLOX 的两阶段训练策略这也是训练配置中最值得关注的部分阶段一0–280 epoch启用Mosaic、BottomupRandomAffineshift_factor0.1、rotate_factor10、scale_factor(0.75,1.0)采用透视变换模式、YOLOXMixUpratio_range(0.8,1.6)等强数据增强见 train_pipeline_stage1。阶段二最后 20 epoch关闭 Mosaic 与 MixUp仅保留不带随机仿射的BottomupRandomAffine各 prob 置 0、YOLOXHSVRandomAug与RandomFlip让模型在接近真实分布的数据上精调。两个阶段的切换由自定义 hook 完成custom_hooks [ dict(typeYOLOXPoseModeSwitchHook, num_last_epochs20, new_train_pipelinetrain_pipeline_stage2, priority48), dict(typeSyncNormHook, priority48), dict(typeEMAHook, ema_typeExpMomentumEMA, momentum0.0002, update_buffersTrue, strict_loadFalse, priority49), ]YOLOXPoseModeSwitchHook实现在 mode_switch_hooks.py在最后 20 epoch 将训练 pipeline 切换到阶段二SyncNormHook在分布式训练时同步 BN 统计量EMAHook维护指数滑动平均momentum 0.0002的模型副本验证与测试时使用 EMA 权重是 YOLO 系列提升稳定性的常用技巧。数据预处理端PoseDataPreprocessor使用pad_size_divisor32将输入 padding 到 32 的倍数并在 batch 级启用BatchSyncRandomResizerandom_size_range(480,800)在训练中动态改变输入分辨率以增强尺度鲁棒性。4.3 数据流与标签编码data_modebottomup明确声明了自底向上的数据组织方式。训练集使用CocoDataset加载person_keypoints_train2017.json并经过FilterAnnotations(by_kptTrue, by_boxTrue)过滤掉不含关键点或边界框的样本。标签编码由 codec 完成codec dict(typeYOLOXPoseAnnotationProcessor, input_sizeinput_size)YOLOXPoseAnnotationProcessor实现在 annotation_processors.py其职责是将 COCO 标注转换为 YOLOX-Pose 需要的输入格式将类别 ID 减 1 转为 0 起始的标签并通过label_mapping_table将bbox/bbox_labels/keypoints/keypoints_visible/area映射为bboxes/labels/keypoints/keypoints_visible/areas。它还提供了expand_bbox选项当开启时会把边界框扩张到包含所有可见关键点见 annotation_processors.py确保关键点不会落在框外——这对后续的检测框与关键点一致性非常重要。4.4 评估配置val_evaluator dict( typeCocoMetric, ann_filedata_root coco/annotations/person_keypoints_val2017.json, score_modebbox, nms_modenone, )评估使用 COCO 官方指标关键点检测框bbox作为打分依据nms_modenone表示在指标内部不做额外的 NMS 处理。验证与测试共用同一套 dataloader 与 evaluator。五、从零开始训练与评估实操在准备好 COCO 数据集目录结构为data/coco/annotations/person_keypoints_{train,val}2017.json与data/coco/{train,val}2017/并完成环境安装后即可使用仓库自带的 tools/train.py 开始训练# 单卡训练 s 规格 python tools/train.py configs/body_2d_keypoint/yoloxpose/coco/yoloxpose_s_8xb32-300e_coco-640.py # 8 卡分布式训练 bash tools/dist_train.sh configs/body_2d_keypoint/yoloxpose/coco/yoloxpose_s_8xb32-300e_coco-640.py 8评估与推理可使用 tools/test.pypython tools/test.py configs/body_2d_keypoint/yoloxpose/coco/yoloxpose_s_8xb32-300e_coco-640.py \ /path/to/yoloxpose_s_8xb32-300e_coco-640-56c79c1f_20230829.pth预训练权重可从配置对应 yml 元数据中记录的地址下载如 yoloxpose_coco.yml 中的Weights字段。训练时的 checkpoint 每 10 epoch 保存一次CheckpointHook(interval10, max_keep_ckpts3)只保留最近 3 份以控制磁盘占用。若希望用训练好的模型直接对图片推理可参考 demo/inferencer_demo.py 以及 推理指南 中基于 MMPose Inferencer 的用法。六、总结与适用场景YOLOX-Pose 是 MMPose 在检测与姿态估计一体化方向上的重要实现单阶段自底向上一次前向同时输出全部人体的框、类别、17 个关键点及可见度推理高效OKS 驱动的标签分配与回归SimOTAAssignerOKSLoss让关键点质量直接参与匹配与监督两阶段训练策略Mosaic/MixUp 强增强配合最后 20 epoch 的 pipeline 切换与 EMA训练稳定、收敛良好多规格可扩展通过_base_继承与 widen/deepen 因子即可在 52.6 APtiny到 71.2 APl之间按算力选型。对于需要实时处理视频流、多人密集场景、且希望同时获得检测框与骨架的开发者而言YOLOX-Pose 是一个兼顾速度与精度的开箱即用方案。深入阅读 yoloxpose_head.py 与 annotation_processors.py 可以进一步理解其损失计算与标签分配细节便于在此基础上定制自己的姿态模型。【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmpose创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进