MMPose 动物二维关键点估计实战指南:Top-Down 热图范式与五大动物数据集模型库解析
2026/9/16 13:32:46 网站建设 项目流程

MMPose 动物二维关键点估计实战指南:Top-Down 热图范式与五大动物数据集模型库解析

【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmpose

本文聚焦 OpenMMLab 姿态估计工具箱 MMPose 中configs/animal_2d_keypoint/topdown_heatmap目录所承载的完整能力:从 Top-Down 两阶段思路与热图(Heatmap)编码原理出发,逐数据集解读 Animal-Pose、AP-10K、Desert Locust、Grévy's Zebra 与 Animal-Kingdom 五个动物关键点基准的官方配置、评估指标与可复现结果,并结合mmpose/codecsmmpose/models/heads等源码剖析 Heatmap 范式在 MMPose v1 中的底层实现。读完本文,你将能够直接复现官方榜单结果、理解并修改相关训练配置,以及将模型接入单目图像推理流程。

一、Top-Down 热图范式:两阶段流程与核心思想

在动物关键点估计任务中,Top-Down 方法将问题分解为两个阶段:目标检测单目标姿态估计。第一阶段先用检测器在图像中框出目标动物;第二阶段基于检测到的边界框,对框内单个动物实例估计关键点坐标。这一思路最早由Simple Baselines for Human Pose Estimation and Tracking(ECCV'2018)确立,MMPose 的动物 Top-Down 模型库同样遵循该范式。

与直接回归关键点坐标不同,Top-Down 热图方法让网络输出一组热图(Heatmap),每张热图对应一个关键点,热图中像素的响应值表示"该位置是关键点"的似然概率。训练阶段使用高斯核把标注关键点扩散成热图作为监督目标;推理阶段则从网络输出的热图中寻找峰值位置,再映射回原图坐标。由于热图保留了空间结构信息、监督信号平滑且天然具备不确定性表达,该范式在精度上长期优于直接坐标回归,也是 MMPose 中积累最丰富的范式之一。

仓库中本范式对应的主入口文档为 configs/animal_2d_keypoint/topdown_heatmap/README.md,所有子目录均围绕该 README 组织。

二、目录结构与模型库总览

configs/animal_2d_keypoint/topdown_heatmap/下按数据集划分为 5 个子目录,每个子目录内包含若干组td-hm_*命名规则(td表示 Top-Down,hm表示 Heatmap)的训练配置文件,以及对应的*.md结果页与*.yml元数据:

子目录数据集支持的骨干网络主要评估指标
animalpose/Animal-Pose (ICCV'2019)HRNet-w32/w48、ResNet-50/101/152AP / AR
ap10k/AP-10K (NeurIPS'2021)HRNet-w32/w48、ResNet-50/101、CSPNeXt-mAP
locust/Desert Locust (eLife'2019)ResNet-50/101/152PCK@0.2 / AUC / EPE
zebra/Grévy's Zebra (eLife'2019)ResNet-50/101/152PCK@0.2 / AUC / EPE
ak/Animal-Kingdom (CVPR'2022)HRNet-w32PCK(0.05)

配置文件采用 MMPose v1 的模块化注册机制,每个.py配置都完整描述了数据加载、编码器(codec)、模型(backbone + head)、训练策略与评估器。接下来我们逐个数据集深入。

三、Animal-Pose:跨域自适应动物姿态基准

3.1 数据集与关键点定义

Animal-Pose 由Cross-Domain Adaptation for Animal Pose Estimation(ICCV'2019)提出,其验证集包含 1117 个实例。数据集定义了 20 个关键点(L/R Eye、L/R EarBase、Nose、Throat、TailBase、Withers、各肢体 Elbow/Knee/Paw 等),完整定义可在数据集元信息 configs/base/datasets/animalpose.py 中查看,其中还包含每类关键点的swap配对(用于水平翻转增强)、sigmas(用于 AP 计算的 OKS 归一化)与joint_weights。对应的数据集实现类为 mmpose/datasets/datasets/animal/animalpose_dataset.py 中的AnimalPoseDataset,它继承自BaseCocoStyleDataset,通过METAINFO指向上述animalpose.py元信息文件。

3.2 配置逐段拆解(以 HRNet-w32 为例)

以 td-hm_hrnet-w32_8xb64-210e_animalpose-256x256.py 为例,这是一份最具代表性的 Top-Down 热图训练配置,核心段落如下:

运行与优化器设置

_base_ = ['../../../_base_/default_runtime.py'] train_cfg = dict(max_epochs=210, val_interval=10) optim_wrapper = dict(optimizer=dict(type='Adam', lr=5e-4)) param_scheduler = [ dict(type='LinearLR', begin=0, end=500, start_factor=0.001, by_epoch=False), # warm-up dict(type='MultiStepLR', begin=0, end=210, milestones=[170, 200], gamma=0.1, by_epoch=True) ] auto_scale_lr = dict(base_batch_size=512) default_hooks = dict(checkpoint=dict(save_best='coco/AP', rule='greater'))
  • 训练 210 个 epoch,每 10 个 epoch 验证一次;
  • 优化器为 Adam,初始学习率5e-4,先做 500 次迭代的线性 warm-up,再在 170/200 epoch 处以 0.1 倍率阶梯下降;
  • auto_scale_lr声明基准 batch size 为 512,当实际 batch size 不同时 MMPose 会自动线性缩放学习率;
  • 检查点保存策略为"取coco/AP指标更大者",default_runtime.py(见 configs/base/default_runtime.py)中额外挂载了PoseVisualizationHookBadCaseAnalysisHookSyncBuffersHook等默认钩子。

编码器(Codec)与模型

codec = dict( type='MSRAHeatmap', input_size=(256, 256), heatmap_size=(64, 64), sigma=2) model = dict( type='TopdownPoseEstimator', data_preprocessor=dict( type='PoseDataPreprocessor', mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], bgr_to_rgb=True), backbone=dict(type='HRNet', in_channels=3, extra=dict(...), init_cfg=...), head=dict( type='HeatmapHead', in_channels=32, out_channels=20, deconv_out_channels=None, loss=dict(type='KeypointMSELoss', use_target_weight=True), decoder=codec), test_cfg=dict(flip_test=True, flip_mode='heatmap', shift_heatmap=True))
  • codec选用MSRAHeatmap:输入图 256×256,下采样 4 倍得到 64×64 热图,高斯核sigma=2
  • 模型外壳为TopdownPoseEstimator(实现见 mmpose/models/pose_estimators/topdown.py),由 backbone + head 组成;
  • HRNet-w32 保持高分辨率特征,Head 输出的通道数out_channels=20正好对应 Animal-Pose 的 20 个关键点;对 HRNet 主干,deconv_out_channels=None表示不需要 SimpleBaselines 式反卷积上采样;
  • flip_test=True开启翻转测试增强,将原图与水平翻转图的热图按flip_mode='heatmap'方式合并取平均后再解码。

数据管道(Pipeline)与加载器

train_pipeline = [ dict(type='LoadImage'), dict(type='GetBBoxCenterScale'), dict(type='RandomFlip', direction='horizontal'), dict(type='RandomHalfBody'), dict(type='RandomBBoxTransform'), dict(type='TopdownAffine', input_size=codec['input_size']), dict(type='GenerateTarget', encoder=codec), dict(type='PackPoseInputs') ]

训练管道依次完成:读取图像 → 由标注框计算中心点与尺度 → 随机水平翻转 → 随机取半身样本 → 随机平移/缩放/旋转边界框 → 仿射变换裁剪到输入尺寸 → 用 codec 把关键点编码成高斯热图 → 打包成模型输入。验证管道则去掉所有随机增强,只保留裁剪与打包。

数据加载部分声明dataset_type = 'AnimalPoseDataset'data_root = 'data/animalpose/',训练用annotations/animalpose_train.json,验证用annotations/animalpose_val.json,评估器为CocoMetric(以 COCO 风格的 AP/AR 作为指标)。

3.3 官方结果(验证集 1117 实例)

下表完整继承自结果文档 animalpose/hrnet_animalpose.md 与 animalpose/resnet_animalpose.md:

模型输入尺寸APAP50AP75ARAR50
HRNet-w32256×2560.7400.9590.8330.7800.965
HRNet-w48256×2560.7380.9580.8310.7780.962
ResNet-152256×2560.7040.9360.7820.7480.947
ResNet-101256×2560.6960.9330.7810.7360.944
ResNet-50256×2560.6910.9300.7730.7360.943

对应配置文件分别为td-hm_hrnet-w32_8xb64-210e_animalpose-256x256.pytd-hm_hrnet-w48_8xb64-210e_animalpose-256x256.py以及td-hm_res{50,101,152}_8xb{64,64,32}-210e_animalpose-256x256.py,其中 ResNet 系列配置使用HeatmapHead默认的三层反卷积(256→256→256)进行上采样,out_channels同样为 20,backbone 预训练权重来自torchvision://resnet{50,101,152}

四、AP-10K:野外动物姿态大基准

AP-10K(NeurIPS'2021)是首个大规模"野外"动物姿态基准,覆盖 10K 张图片中的多种动物,每张热图配置输出 17 个关键点。数据集类实现为 mmpose/datasets/datasets/animal/ap10k_dataset.py 中的AP10KDataset

该子目录下的模型组合最为丰富,官方结果如下(验证集,完整数据见 ap10k/hrnet_ap10k.md、ap10k/resnet_ap10k.md 与 ap10k/cspnext_udp_ap10k.md):

模型输入尺寸APAP50AP75APMAPL
HRNet-w48256×2560.7280.9360.8020.5770.735
HRNet-w32256×2560.7220.9350.7890.5570.729
CSPNeXt-m (UDP)256×2560.7030.9440.7760.5130.710
ResNet-101256×2560.6810.9210.7510.5450.690
ResNet-50256×2560.6800.9260.7380.5520.687

其中 HRNet / ResNet 系列采用MSRAHeatmap编码(input_size=(256,256), heatmap_size=(64,64), sigma=2),而 CSPNeXt-m 配置 cspnext-m_udp_8xb64-210e_ap10k-256x256.py 具有几个值得注意的差异点:

  1. 编码器升级为UDPHeatmap(Unbiased Data Processing,CVPR'2020),且所有TopdownAffine变换都带use_udp=True,用于消除坐标变换过程中的量化误差;
  2. 骨干网络换用来自 MMDetection 的CSPNeXt_scope_='mmdet',RTMDet 系列骨干,输入 768 通道特征),配合AdamW(lr=4e-3、weight_decay=0.05)与余弦退火学习率;
  3. 引入两阶段训练custom_hooks中挂载mmdet.PipelineSwitchHook,在max_epochs - 30时切换为更温和的第二阶段管道(缩小旋转/缩放幅度、降低 CoarseDropout 概率),并配合EMAHookExpMomentumEMA,momentum=0.0002)做指数滑动平均;
  4. 数据增强更激进:训练管道中加入了mmdet.YOLOXHSVRandomAug颜色抖动与基于 albumentations 的BlurMedianBlurCoarseDropout遮挡增强;
  5. 数据组织上拆分为 train/val/test 三个 json(ap10k-train-split1.json等),分别配置独立的CocoMetric评估器。

五、Desert Locust 与 Grévy's Zebra:DeepPoseKit 生态的小物体姿态任务

这两个数据集均来自DeepPoseKit(eLife'2019),分别用于沙漠蝗虫与格列维斑马的关键点估计,且只使用 ResNet 系列骨干、输入分辨率降低到 160×160——相比猫狗等动物,这两类目标的尺寸与纹理复杂度更低,因此采用更小的输入即可达到很高的精度。对应的数据集实现为 mmpose/datasets/datasets/animal/locust_dataset.py 与 mmpose/datasets/datasets/animal/zebra_dataset.py。

以 td-hm_res50_8xb64-210e_locust-160x160.py 为例,与 Animal-Pose 配置相比主要有三处不同:

codec = dict( type='MSRAHeatmap', input_size=(160, 160), heatmap_size=(40, 40), sigma=2) train_pipeline = [ dict(type='LoadImage'), dict(type='GetBBoxCenterScale', padding=0.8), dict(type='RandomFlip', direction='horizontal'), dict(type='RandomBBoxTransform', shift_factor=0.25, rotate_factor=180, scale_factor=(0.7, 1.3)), dict(type='TopdownAffine', input_size=codec['input_size']), dict(type='GenerateTarget', encoder=codec), dict(type='PackPoseInputs') ] val_evaluator = [ dict(type='PCKAccuracy', thr=0.2), dict(type='AUC'), dict(type='EPE'), ]
  • 输入 160×160、热图 40×40(下采样 4 倍),GetBBoxCenterScale增加padding=0.8以扩大裁剪视野;
  • 旋转增强范围提高到 ±180°,以适应昆虫姿态的多向性;
  • 评估指标从 COCO AP 切换为PCKAccuracy(阈值为 0.2)、AUCEPE,checkpoint 保存策略相应改为save_best='AUC'

官方测试集结果(完整表见 locust/resnet_locust.md 与 zebra/resnet_zebra.md):

Desert Locust(测试集)

模型输入尺寸PCK@0.2AUCEPE
ResNet-152160×1601.0000.9251.49
ResNet-101160×1601.0000.9072.03
ResNet-50160×1601.0000.9002.27

Grévy's Zebra(测试集)

模型输入尺寸PCK@0.2AUCEPE
ResNet-152160×1601.0000.9211.67
ResNet-101160×1601.0000.9151.83
ResNet-50160×1601.0000.9141.87

注意两个数据集的out_channels不同:Locust 配置为 35 个关键点,Zebra 为 9 个关键点(见 zebra/td-hm_res50_8xb64-210e_zebra-160x160.py 的head.out_channels=9)。

六、Animal-Kingdom:按类别拆分的 23 关键点基准

Animal-Kingdom(CVPR'2022)是一个覆盖多物种的大规模动物行为理解数据集,MMPose 提供 7 个类别子模型,全部使用 HRNet-w32 +MSRAHeatmap,训练 300 epoch,out_channels=23(数据集类为 mmpose/datasets/datasets/animal/animalkingdom_dataset.py 中的AnimalKingdomDataset)。配置示例见 td-hm_hrnet-w32_8xb32-300e_animalkingdom_P1-256x256.py,其评估器为:

val_evaluator = [dict(type='PCKAccuracy', thr=0.05), dict(type='AUC')]

各子类别的验证集结果(PCK@0.05)如下(完整表见 ak/hrnet_animalkingdom.md,同时列出了官方仓库与论文报告值供对照):

类别配置文件PCK(0.05)Official RepoPaper
P1..._P1-256x256.py0.63230.63420.6606
P2..._P2-256x256.py0.37410.37260.393
P3_mammals..._P3_mammal-256x256.py0.5710.57190.6159
P3_amphibians..._P3_amphibian-256x256.py0.53580.54320.5674
P3_reptiles..._P3_reptile-256x256.py0.510.50.5606
P3_birds..._P3_bird-256x256.py0.76710.76360.7735
P3_fishes..._P3_fish-256x256.py0.64060.6360.6825

从 P1 到 P3_* 的划分体现了"按动物类别分别训练"的实用策略:不同类别(鸟类、鱼类、两栖类等)的姿态结构差异显著,单独建模可获得更可靠的结果。

七、源码级原理:Heatmap 范式在 MMPose v1 中的实现

7.1 编码器(Codec):MSRAHeatmapUDPHeatmap

Heatmap 编码/解码逻辑被抽象为独立的 codec 模块,统一继承BaseKeypointCodec并注册到KEYPOINT_CODECS

MSRAHeatmap(mmpose/codecs/msra_heatmap.py)实现了 Simple Baselines 的高斯热图方案:

  • encode():将关键点坐标按其与热图尺寸的比例(scale_factor = input_size / heatmap_size,即 256/64=4)投影到热图平面,用sigma控制的高斯核生成(K, H, W)的监督热图,并输出用于加权损失的关键点权重keypoint_weights
  • 解码时通过get_heatmap_maximum定位峰值,并支持可选的高斯调制精修(DarkPose 风格的refine_keypoints_dark,对应unbiased=Trueblur_kernel_size=11,此时 sigma 与核宽满足经验公式sigma = 0.3*((ks-1)*0.5-1)+0.8)。

UDPHeatmap(mmpose/codecs/udp_heatmap.py)则针对坐标变换中的量化偏差做了无偏化处理,支持gaussiancombined(二值标签图 + X/Y 偏移图)两种编码类型,并内置refine_keypoints_dark_udp解码精修。这正是 AP-10K 上 CSPNeXt-m 配置选用它的原因。

7.2 Head:HeatmapHead与测试时增强

mmpose/models/heads/heatmap_heads/heatmap_head.py 中的HeatmapHead是全部 5 个数据集共享的头部:输入低分辨率特征图后,先经过若干反卷积层上采样(默认deconv_out_channels=(256,256,256),核宽(4,4,4)),再通过final_layer(1×1 卷积)输出 K 通道热图。其predict()方法完整实现了翻转测试增强逻辑:

if test_cfg.get('flip_test', False): # feats = [orig, flipped] flip_indices = batch_data_samples[0].metainfo['flip_indices'] _batch_heatmaps = self.forward(_feats) _batch_heatmaps_flip = flip_heatmaps( self.forward(_feats_flip), flip_mode=test_cfg.get('flip_mode', 'heatmap'), flip_indices=flip_indices, shift_heatmap=test_cfg.get('shift_heatmap', False)) batch_heatmaps = (_batch_heatmaps + _batch_heatmaps_flip) * 0.5

训练损失为KeypointMSELossuse_target_weight=True表示按可见性权重加权),并同步计算热图级 PCK 精度作为日志输出;_load_state_dict_pre_hook还负责把 v1.0 之前旧版TopdownHeatmapSimpleHead的权重自动转换为新格式。

7.3 评估指标:AP/AR 与 PCK/AUC/EPE

两种指标族在源码中分属不同实现:

  • COCO 风格 AP/AR:由CocoMetric(mmpose/evaluation/metrics/coco_metric.py)按 OKS 阈值计算,Animal-Pose 与 AP-10K 使用;
  • PCK / AUC / EPE:分别对应 mmpose/evaluation/metrics/keypoint_2d_metrics.py 中的PCKAccuracyAUCEPE三个类,其底层数值计算函数位于 mmpose/evaluation/functional/keypoint_eval.py:
    • keypoint_pck_accuracy:计算预测点与真值的归一化距离,统计小于阈值thr的比例;
    • keypoint_auc:在 0 到norm_factor(默认 30 像素)之间均匀取 20 个阈值,对每个阈值计算平均 PCK 后求曲线下面积;
    • keypoint_epe:直接计算端到端平均像素误差,数值越低越好。

因此,在 Locust / Zebra 配置中同时挂载三个评估器,便可在一次验证中同时获得 PCK、AUC、EPE 三项指标;Animal-Kingdom 则用thr=0.05的严格 PCK 阈值衡量精细关键点的定位精度。

八、开箱即用:训练、测试与推理

以 Animal-Pose HRNet-w32 为例,仓库提供了完整的训练/测试脚本(见 tools/train.py 与 tools/test.py),在完成数据集准备后即可复现:

# 单卡训练 python tools/train.py configs/animal_2d_keypoint/topdown_heatmap/animalpose/td-hm_hrnet-w32_8xb64-210e_animalpose-256x256.py # 多卡分布式训练(8 卡) bash tools/dist_train.sh configs/animal_2d_keypoint/topdown_heatmap/animalpose/td-hm_hrnet-w32_8xb64-210e_animalpose-256x256.py 8 # 测试(需按 README 说明准备预训练权重) python tools/test.py configs/animal_2d_keypoint/topdown_heatmap/animalpose/td-hm_hrnet-w32_8xb64-210e_animalpose-256x256.py <checkpoint路径> --work-dir ./work_dir

离线推理可以直接使用高层的 Inferencer 接口(demo/inferencer_demo.py):

python demo/inferencer_demo.py <动物图片或视频路径> \ --pose2d configs/animal_2d_keypoint/topdown_heatmap/animalpose/td-hm_hrnet-w32_8xb64-210e_animalpose-256x256.py \ --vis-out-dir ./vis_output

由于 Top-Down 方法依赖检测框,在含多个动物的图像上可组合 MMDetection 检测器与姿态估计器进行端到端推理,示例脚本见 demo/topdown_demo_with_mmdet.py,检测器配置可参考 demo/mmdetection_cfg 下的各检测模型。

九、总结

configs/animal_2d_keypoint/topdown_heatmap/是 MMPose 动物关键点估计中最成熟、覆盖最广的范式目录:它以 Simple Baselines 确立的 Top-Down + 热图思路为骨架,在 5 个差异化的动物数据集上提供了 HRNet、ResNet、CSPNeXt 等骨干网络的完整配置、可复现指标与配套源码。理解这份模型库,等于同时掌握了 MMPose v1 中 codec、estimator、head、pipeline 与 evaluator 五个核心抽象的使用方式——它既是直接可用的动物姿态工具箱,也是学习如何在自定义动物数据集上落地热图方法的范本。

【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmpose

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询