MMPose 预训练检测模型库(MMDetection Model Zoo)完全指南:人体、手部、人脸与动物检测器的选型与使用
【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmpose
MMPose 提供demo/docs/en/mmdet_modelzoo.md作为官方检测模型清单,汇总了配合 top-down 姿态估计流水线使用的四类 bounding box 检测模型:人体、手部、人脸与动物。本指南以该模型库为骨架,结合仓库内demo/mmdetection_cfg/下的真实配置与demo/topdown_demo_with_mmdet.py推理脚本,帮助你快速完成检测器的选型、权重下载、参数解读与端到端演示运行,并掌握用 MMDetection 复现"单类检测器"的关键配置要点。
为什么 top-down 姿态估计需要一个外部检测器
MMPose 的 top-down 姿态估计流程是典型的两阶段结构:先用检测器圈出目标实例的 bounding box,再对裁剪区域进行关键点估计。检测器的质量直接决定姿态估计的输入质量——漏检会导致关键点丢失,定位不准会降低关键点精度。
仓库中的 demo/topdown_demo_with_mmdet.py 正是这一流程的完整落地:它通过init_detector+inference_detector(来自 MMDetection)得到检测结果,再通过init_pose_estimator+inference_topdown(来自 MMPose)完成关键点预测。因此运行这类 demo 前,必须先安装 mmdet(脚本入口处有assert has_mmdet, 'Please install mmdet to run the demo.'的硬性校验),并准备好一份可用的检测模型。
检测模型从哪来?两个途径:复用 MMDetection 官方 Model Zoo 的 COCO 80 类预训练模型,或使用本模型库列出的、基于特定数据集(OneHand10K、COCO-face、MacaquePose)专门训练的检测器。后者正是demo/docs/en/mmdet_modelzoo.md的核心内容,下文逐一展开。
人体检测模型:直接使用 MMDetection 的 COCO 80 类模型
对于人体 bounding box 检测,MMPose 官方不额外训练专用模型,而是直接复用 MMDetection 提供的 COCO 预训练模型。MMDetection 的模型库包含 80 个 COCO 类别的检测权重,其中已经包含了person(类别索引 0)这一类别,因此无需任何微调即可用于人体检测。
仓库在 demo/mmdetection_cfg/rtmdet_m_640-8xb32_coco-person.py 提供了一个"单类化"的人体检测配置:它以 MMDetection 的 RTMDet-m 为基座,通过bbox_head=dict(num_classes=1)把输出类别数收缩为 1,并通过metainfo=dict(classes=('person',))把类别语义锁定为 person,同时设置了test_cfg(score_thr=0.05、nms=dict(type='nms', iou_threshold=0.6)、max_per_img=100)来控制推理时的输出。对应权重为rtmdet_m_8xb32-100e_coco-obj365-person-235e8209.pth。
在 demo/docs/en/2d_human_pose_demo.md 中,人体 demo 的官方示例命令如下:
python demo/topdown_demo_with_mmdet.py \ demo/mmdetection_cfg/rtmdet_m_640-8xb32_coco-person.py \ https://download.openmmlab.com/mmpose/v1/projects/rtmpose/rtmdet_m_8xb32-100e_coco-obj365-person-235e8209.pth \ configs/body_2d_keypoint/rtmpose/body8/rtmpose-m_8xb256-420e_body8-256x192.py \ https://download.openmmlab.com/mmpose/v1/projects/rtmposev1/rtmpose-m_simcc-body7_pt-body7_420e-256x192-e48f03d0_20230504.pth \ --input tests/data/coco/000000197388.jpg --show --draw-heatmap \ --output-root vis_results/若追求更快的推理速度,同一目录下的 demo/mmdetection_cfg/rtmdet_nano_320-8xb32_coco-person.py 提供了 nano 规模的人体检测配置(输入 320,deepen_factor=0.33、widen_factor=0.25),适合资源受限或对实时性要求高的场景。
手部检测模型:OneHand10K 上的两个选项
与人体不同,手部检测无法直接复用 COCO 80 类模型,因为 COCO 不包含手部类别。因此 MMPose 使用 MMDetection 在OneHand10K 数据集上专门训练了手部检测模型,官方结果如下:
手部检测在 OneHand10K 测试集上的结果(Hand detection results on OneHand10K test set)
| 架构(Arch) | Box AP | 权重(ckpt) | 日志(log) |
|---|---|---|---|
| Cascade_R-CNN X-101-64x4d-FPN-1class | 0.817 | ckpt | log |
| RTMDet-nano | 0.760 | ckpt | - |
两个模型代表两种取舍:Cascade R-CNN X-101-64x4d 精度更高(0.817),而RTMDet-nano 更轻量快速(0.760),是官方手部 demo 的默认选择。
Cascade R-CNN X-101-64x4d-FPN-1class 配置解读
demo/mmdetection_cfg/cascade_rcnn_x101_64x4d_fpn_1class.py 是完整的单类 Cascade R-CNN 配置,其关键设计点:
- backbone:ResNeXt-101-64x4d,通过
init_cfg=dict(type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d')加载 ImageNet 预训练权重; - neck:FPN,
in_channels=[256, 512, 1024, 2048],out_channels=256,输出 5 层金字塔特征; - roi_head:
CascadeRoIHead,num_stages=3,stage_loss_weights=[1, 0.5, 0.25]——三个级联阶段的回归损失权重逐级衰减,这是 Cascade R-CNN 渐进式精修的标志性设计; - 三个 bbox head 均设置
num_classes=1、reg_class_agnostic=True:单类别 + 类别无关回归,配合逐级缩小的target_stds([0.1,...]→[0.05,...]→[0.033,...]),使每一级 head 的监督目标越来越严格; - loss:分类用
CrossEntropyLoss,回归用SmoothL1Loss(beta=1.0)。
从模型文件名..._20e_...可以看出该模型按 20 epoch(20e)的训练计划产出。reg_class_agnostic=True是"1 类检测"配置的重要细节:类别无关的回归头对边界框坐标不区分类别,这对单类检测任务是合理的简化。
RTMDet-nano 手部检测配置解读
demo/mmdetection_cfg/rtmdet_nano_320-8xb32_hand.py 展示了另一种思路——从 MMDetection 的 RTMDet 大模型配置出发做轻量化改造:
_base_ = 'mmdet::rtmdet/rtmdet_l_8xb32-300e_coco.py':直接继承 RTMDet-L 的完整训练设置;- 模型缩放:
deepen_factor=0.33、widen_factor=0.25、use_depthwise=True,把主干与颈部压缩为 nano 级别;neck 的in_channels=[64, 128, 256]、out_channels=64、num_csp_blocks=1也随之收缩; - 输入分辨率:
input_shape = 320,训练与测试均以 320×320 为准; - 训练数据:
ConcatDataset拼接了 OneHand10K、FreiHand、RHD、HalpeHand 四个数据集的训练集(通过mmpose.OneHand10KDataset等mmpose.*数据集类型加载),测试仍用 OneHand10K 测试集——这是典型的"多源数据增强手部泛化"做法; - 训练技巧:
EMAHook(ExpMomentumEMA,momentum=0.0002)做权重滑动平均;PipelineSwitchHook在 epoch 280 时切换到train_pipeline_stage2(去掉 Mosaic、降低增强强度),这是 YOLO 系模型"大 epoch 训练后期减弱增强"的经典策略。
在 demo/docs/en/2d_hand_demo.md 中,手部 demo 的官方示例命令:
python demo/topdown_demo_with_mmdet.py \ demo/mmdetection_cfg/rtmdet_nano_320-8xb32_hand.py \ https://download.openmmlab.com/mmpose/v1/projects/rtmposev1/rtmdet_nano_8xb32-300e_hand-267f9c8f.pth \ configs/hand_2d_keypoint/rtmpose/hand5/rtmpose-m_8xb256-210e_hand5-256x256.py \ https://download.openmmlab.com/mmpose/v1/projects/rtmposev1/rtmpose-m_simcc-hand5_pt-aic-coco_210e-256x256-74fb594_20230320.pth \ --input tests/data/onehand10k/9.jpg \ --show --draw-heatmap人脸检测模型:COCO-face 上训练的 YOLOX-s
对于人脸 bounding box 检测,MMPose 使用 MMDetection 在COCO-face数据上训练了一个YOLOX-s检测器,官方结果如下:
人脸检测在 COCO-face 测试集上的结果(Face detection results on COCO-face test set)
| 架构(Arch) | Box AP | 权重(ckpt) |
|---|---|---|
| YOLOX-s | 0.408 | ckpt |
yolox-s_8xb8-300e_coco-face.py 这份配置的要点:
- 加载 COCO 预训练权重再微调:
load_from指向 MMDetection 的yolox_s_8x8_300e_coco权重,在 COCO 检测能力基础上迁移到人脸任务; - 主干与颈部:CSPDarknet(
deepen_factor=0.33、widen_factor=0.5)+ YOLOXPAFPN,均为 YOLOX-s 的典型缩放; - bbox_head:
YOLOXHead,num_classes=1,训练用SimOTAAssigner(center_radius=2.5)做标签分配,测试时score_thr=0.01、nms=dict(type='nms', iou_threshold=0.65); - 训练计划:300 epochs,SGD(lr=0.01,nesterov=True),前 5 epoch 用
QuadraticWarmupLR预热,随后CosineAnnealingLR衰减到 eta_min=0.0005;custom_hooks挂载了YOLOXModeSwitchHook(最后 15 epoch 关闭增强)、SyncNormHook与EMAHook; - 数据与类别:训练/验证使用 COCO 格式的
coco_face_train.json/coco_face_val.json,并显式声明metainfo=dict(CLASSES=('person',), ...)——即把"人脸"作为一个单类别来训练。
在 demo/docs/en/2d_face_demo.md 中,人脸 demo 的官方示例命令:
python demo/topdown_demo_with_mmdet.py \ demo/mmdetection_cfg/yolox-s_8xb8-300e_coco-face.py \ https://download.openmmlab.com/mmpose/mmdet_pretrained/yolo-x_8xb8-300e_coco-face_13274d7c.pth \ configs/face_2d_keypoint/rtmpose/face6/rtmpose-m_8xb256-120e_face6-256x256.py \ https://download.openmmlab.com/mmpose/v1/projects/rtmposev1/rtmpose-m_simcc-face6_pt-in1k_120e-256x256-72a37400_20230529.pth \ --input tests/data/cofw/001766.jpg \ --show --draw-heatmap动物检测模型:COCO 动物类别与 Macaque 专项模型
COCO 数据集中的 10 个常见动物类别
COCO 数据集共 80 个目标类别,其中包含10 个常见动物类别(类目 id 与名称对应如下):
(14: 'bird', 15: 'cat', 16: 'dog', 17: 'horse', 18: 'sheep', 19: 'cow', 20: 'elephant', 21: 'bear', 22: 'zebra', 23: 'giraffe')
如果检测目标属于以上类别,可以直接从 MMDetection 的 COCO 80 类模型库中挑选相应模型,然后在运行 demo 时用--det-cat-id指定目标类别的索引即可(例如--det-cat-id=15表示只保留检测结果为 'cat' 的框)。
MacaquePose 测试集上的猕猴检测结果
针对 COCO 之外的猕猴(macaque)检测,MMPose 提供了两个专门训练的模型,官方结果如下:
| 架构(Arch) | Box AP | 权重(ckpt) | 日志(log) |
|---|---|---|---|
| Faster_R-CNN_Res50-FPN-1class | 0.840 | ckpt | log |
| Cascade_R-CNN X-101-64x4d-FPN-1class | 0.879 | ckpt | log |
注意:两个模型共用同一个 cascade_rcnn_x101_64x4d_fpn_1class.py 配置文件结构,只是训练数据(OneHand10K 手部 vs MacaquePose 猕猴)不同,这正是"一份单类检测配置 + 换数据集重训"复用模式的体现。
其中 faster_rcnn_r50_fpn_1class.py 是经典的 Faster R-CNN 配置:ResNet50 主干(pretrained='torchvision://resnet50',frozen_stages=1)、FPN 颈部、RPN +StandardRoIHead,num_classes=1;训练使用 COCO 1x schedule(total_epochs = 12,SGD lr=0.02,step 在 [8, 11] 处衰减),测试时score_thr=0.05、NMSiou_threshold=0.5、max_per_img=100。
动物 demo 示例
在 demo/docs/en/2d_animal_demo.md 中,动物姿态 demo 使用 COCO 检测器 +--det-cat-id筛选类别的官方示例:
python demo/topdown_demo_with_mmdet.py \ demo/mmdetection_cfg/rtmdet_m_8xb32-300e_coco.py \ https://download.openmmlab.com/mmdetection/v3.0/rtmdet/rtmdet_m_8xb32-300e_coco/rtmdet_m_8xb32-300e_coco_20220719_112220-229f527c.pth \ configs/animal_2d_keypoint/topdown_heatmap/animalpose/td-hm_hrnet-w32_8xb64-210e_animalpose-256x256.py \ https://download.openmmlab.com/mmpose/animal/hrnet/hrnet_w32_animalpose_256x256-1aa7f075_20210426.pth \ --input tests/data/animalpose/ca110.jpeg \ --show --draw-heatmap --det-cat-id=15其中--det-cat-id=15表示只使用标签为 'cat' 的检测框(15 是 COCO 中 'cat' 的类别索引);对视频输入则把--det-cat-id换成目标动物的索引即可(如 16 对应 'dog')。其余动物(如猕猴)则使用上文的专项检测模型。
统一推理入口:topdown_demo_with_mmdet.py 参数详解
上述所有 demo 共用同一个脚本 demo/topdown_demo_with_mmdet.py,完整命令模板为:
python demo/topdown_demo_with_mmdet.py \ ${MMDET_CONFIG_FILE} ${MMDET_CHECKPOINT_FILE} \ ${MMPOSE_CONFIG_FILE} ${MMPOSE_CHECKPOINT_FILE} \ --input ${INPUT_PATH} \ [--output-root ${OUTPUT_DIR}] [--save-predictions] \ [--show] [--draw-heatmap] [--device ${GPU_ID or CPU}] \ [--bbox-thr ${BBOX_SCORE_THR}] [--kpt-thr ${KPT_SCORE_THR}]从脚本源码(parser.add_argument部分)可以整理出完整参数表:
| 参数 | 默认值 | 说明 |
|---|---|---|
det_config | 必填 | MMDetection 检测器配置文件(位置参数,如demo/mmdetection_cfg/rtmdet_m_640-8xb32_coco-person.py) |
det_checkpoint | 必填 | MMDetection 检测器权重路径或 URL(位置参数) |
pose_config | 必填 | MMPose 姿态估计配置文件(位置参数) |
pose_checkpoint | 必填 | MMPose 姿态估计权重路径或 URL(位置参数) |
--input | '' | 输入图像/视频路径,或webcam(调用摄像头) |
--show | False | 是否弹窗显示结果 |
--output-root | '' | 可视化结果保存目录,不指定则不保存 |
--save-predictions | False | 是否把预测结果保存为 JSON(需配合--output-root) |
--device | cuda:0 | 推理设备,CPU 推理传cpu |
--det-cat-id | 0 | 检测模型输出的类别索引,用于筛选目标类别(动物 demo 的关键参数) |
--bbox-thr | 0.3 | 检测框得分阈值 |
--nms-thr | 0.3 | 检测框 NMS 的 IoU 阈值 |
--kpt-thr | 0.3 | 关键点可视化置信度阈值 |
--draw-heatmap | False | 是否同时可视化热图(仅对 heatmap 类模型有效) |
--show-kpt-idx | False | 是否在关键点上显示索引编号 |
--skeleton-style | mmpose | 骨架可视化风格,可选mmpose/openpose |
--radius | 3 | 关键点绘制半径 |
--thickness | 1 | 骨架连线粗细 |
--show-interval | 0 | 视频逐帧之间的睡眠秒数 |
--alpha | 0.8 | 检测框的透明度 |
--draw-bbox | False | 是否绘制检测框 |
脚本内部的检测→姿态估计调用链也值得了解(对应process_one_image函数,见 demo/topdown_demo_with_mmdet.py):
inference_detector(detector, img)得到pred_instances;- 按
pred_instance.labels == args.det_cat_id与scores > args.bbox_thr过滤框,再用nms(bboxes, args.nms_thr)做非极大值抑制; - 把最终 bbox 交给
inference_topdown(pose_estimator, img, bboxes)逐框估计关键点; merge_data_samples合并结果后交给visualizer.add_datasample可视化。
理解这条链路后,你就能自由组合"任意 MMDetection 检测器 + 任意 MMPose 姿态模型",而不局限于官方示例。
进阶:从这些配置学习"单类检测器"的训练要点
综合四个方向的配置,可以总结出用 MMDetection 训练"1 类检测器"(专用于姿态估计前置检测)的通用配方:
- 输出类别收缩:把 bbox head 的
num_classes改为 1,如 Cascade R-CNN 配置中的num_classes=1;对类别无关回归(reg_class_agnostic=True)可进一步简化。 - 类别语义声明:通过
metainfo=dict(CLASSES=('person',))(RTMDet 与 YOLOX 配置)或直接修改数据集元信息,把单类语义写进配置。 - 数据来源:可以使用单一数据集(OneHand10K、COCO-face、MacaquePose),也可以用
ConcatDataset拼接多个数据集(如手部配置拼接 OneHand10K + FreiHand + RHD + HalpeHand)以增强泛化。 - 预训练迁移:无论是
init_cfg=dict(type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d')(主干预训练)还是load_from整个 COCO 检测权重(YOLOX 人脸配置),迁移学习都是在小数据集上快速收敛的关键。 - 测试输出控制:
test_cfg中的score_thr、NMS 的iou_threshold与max_per_img决定最终送给姿态模型的框数量与质量,应根据任务场景调参。
这些配置与权重在 demo/mmdetection_cfg/ 目录下均可直接查看与复用。
加速推理的小技巧
- 关闭测试时的翻转增强:在姿态估计配置中设置
model.test_cfg.flip_test=False(各任务的官方示例可见 2d_human_pose_demo.md、2d_animal_demo.md 等文档),可显著减少前向次数,代价是少量精度。 - 换用更快的检测器:在检测精度可接受的前提下,把 Cascade R-CNN X-101 这类重模型换成 RTMDet-nano、RTMDet-tiny 或 YOLOX-s 等轻量模型,是 top-down 流水线最常见的提速手段——这也是模型库同时提供高精度与轻量两档选项的原因。
相关文档导航:完整的演示命令可继续查阅 2d_human_pose_demo.md、2d_hand_demo.md、2d_face_demo.md、2d_animal_demo.md;本模型的英文原版清单见 demo/docs/en/mmdet_modelzoo.md,中文版见 demo/docs/zh_cn/mmdet_modelzoo.md。
【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmpose
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考