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/codecs、mmpose/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/152 | AP / AR |
ap10k/ | AP-10K (NeurIPS'2021) | HRNet-w32/w48、ResNet-50/101、CSPNeXt-m | AP |
locust/ | Desert Locust (eLife'2019) | ResNet-50/101/152 | PCK@0.2 / AUC / EPE |
zebra/ | Grévy's Zebra (eLife'2019) | ResNet-50/101/152 | PCK@0.2 / AUC / EPE |
ak/ | Animal-Kingdom (CVPR'2022) | HRNet-w32 | PCK(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)中额外挂载了PoseVisualizationHook、BadCaseAnalysisHook、SyncBuffersHook等默认钩子。
编码器(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:
| 模型 | 输入尺寸 | AP | AP50 | AP75 | AR | AR50 |
|---|---|---|---|---|---|---|
| HRNet-w32 | 256×256 | 0.740 | 0.959 | 0.833 | 0.780 | 0.965 |
| HRNet-w48 | 256×256 | 0.738 | 0.958 | 0.831 | 0.778 | 0.962 |
| ResNet-152 | 256×256 | 0.704 | 0.936 | 0.782 | 0.748 | 0.947 |
| ResNet-101 | 256×256 | 0.696 | 0.933 | 0.781 | 0.736 | 0.944 |
| ResNet-50 | 256×256 | 0.691 | 0.930 | 0.773 | 0.736 | 0.943 |
对应配置文件分别为td-hm_hrnet-w32_8xb64-210e_animalpose-256x256.py、td-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):
| 模型 | 输入尺寸 | AP | AP50 | AP75 | APM | APL |
|---|---|---|---|---|---|---|
| HRNet-w48 | 256×256 | 0.728 | 0.936 | 0.802 | 0.577 | 0.735 |
| HRNet-w32 | 256×256 | 0.722 | 0.935 | 0.789 | 0.557 | 0.729 |
| CSPNeXt-m (UDP) | 256×256 | 0.703 | 0.944 | 0.776 | 0.513 | 0.710 |
| ResNet-101 | 256×256 | 0.681 | 0.921 | 0.751 | 0.545 | 0.690 |
| ResNet-50 | 256×256 | 0.680 | 0.926 | 0.738 | 0.552 | 0.687 |
其中 HRNet / ResNet 系列采用MSRAHeatmap编码(input_size=(256,256), heatmap_size=(64,64), sigma=2),而 CSPNeXt-m 配置 cspnext-m_udp_8xb64-210e_ap10k-256x256.py 具有几个值得注意的差异点:
- 编码器升级为
UDPHeatmap(Unbiased Data Processing,CVPR'2020),且所有TopdownAffine变换都带use_udp=True,用于消除坐标变换过程中的量化误差; - 骨干网络换用来自 MMDetection 的
CSPNeXt(_scope_='mmdet',RTMDet 系列骨干,输入 768 通道特征),配合AdamW(lr=4e-3、weight_decay=0.05)与余弦退火学习率; - 引入两阶段训练:
custom_hooks中挂载mmdet.PipelineSwitchHook,在max_epochs - 30时切换为更温和的第二阶段管道(缩小旋转/缩放幅度、降低 CoarseDropout 概率),并配合EMAHook(ExpMomentumEMA,momentum=0.0002)做指数滑动平均; - 数据增强更激进:训练管道中加入了
mmdet.YOLOXHSVRandomAug颜色抖动与基于 albumentations 的Blur、MedianBlur、CoarseDropout遮挡增强; - 数据组织上拆分为 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)、AUC与EPE,checkpoint 保存策略相应改为save_best='AUC'。
官方测试集结果(完整表见 locust/resnet_locust.md 与 zebra/resnet_zebra.md):
Desert Locust(测试集)
| 模型 | 输入尺寸 | PCK@0.2 | AUC | EPE |
|---|---|---|---|---|
| ResNet-152 | 160×160 | 1.000 | 0.925 | 1.49 |
| ResNet-101 | 160×160 | 1.000 | 0.907 | 2.03 |
| ResNet-50 | 160×160 | 1.000 | 0.900 | 2.27 |
Grévy's Zebra(测试集)
| 模型 | 输入尺寸 | PCK@0.2 | AUC | EPE |
|---|---|---|---|---|
| ResNet-152 | 160×160 | 1.000 | 0.921 | 1.67 |
| ResNet-101 | 160×160 | 1.000 | 0.915 | 1.83 |
| ResNet-50 | 160×160 | 1.000 | 0.914 | 1.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 Repo | Paper |
|---|---|---|---|---|
| P1 | ..._P1-256x256.py | 0.6323 | 0.6342 | 0.6606 |
| P2 | ..._P2-256x256.py | 0.3741 | 0.3726 | 0.393 |
| P3_mammals | ..._P3_mammal-256x256.py | 0.571 | 0.5719 | 0.6159 |
| P3_amphibians | ..._P3_amphibian-256x256.py | 0.5358 | 0.5432 | 0.5674 |
| P3_reptiles | ..._P3_reptile-256x256.py | 0.51 | 0.5 | 0.5606 |
| P3_birds | ..._P3_bird-256x256.py | 0.7671 | 0.7636 | 0.7735 |
| P3_fishes | ..._P3_fish-256x256.py | 0.6406 | 0.636 | 0.6825 |
从 P1 到 P3_* 的划分体现了"按动物类别分别训练"的实用策略:不同类别(鸟类、鱼类、两栖类等)的姿态结构差异显著,单独建模可获得更可靠的结果。
七、源码级原理:Heatmap 范式在 MMPose v1 中的实现
7.1 编码器(Codec):MSRAHeatmap与UDPHeatmap
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=True与blur_kernel_size=11,此时 sigma 与核宽满足经验公式sigma = 0.3*((ks-1)*0.5-1)+0.8)。
UDPHeatmap(mmpose/codecs/udp_heatmap.py)则针对坐标变换中的量化偏差做了无偏化处理,支持gaussian与combined(二值标签图 + 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训练损失为KeypointMSELoss(use_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 中的
PCKAccuracy、AUC、EPE三个类,其底层数值计算函数位于 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),仅供参考