MMPose 数据集标注与格式转换实战指南:从原始标注到 COCO 格式的完整流水线
2026/9/17 16:53:05 网站建设 项目流程

MMPose 数据集标注与格式转换实战指南:从原始标注到 COCO 格式的完整流水线

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

MMPose(OpenMMLab Pose Estimation Toolbox)的训练与评测环节对数据格式有明确要求,本指南基于docs/en/user_guides/dataset_tools.md系统讲解数据集处理的完整工作流:包括使用 Label Studio 等工具完成标注、借助 browse_dataset 可视化校验数据、通过 MIM 从 OpenXLab 一键下载格式化数据集,以及将 Animal-Pose、COFW、DeepPoseKit、MacaquePose、Human3.6M、MPII、UBody 等公开数据集的原始标注转换为 MMPose 兼容的 COCO 风格标注文件。读完本文,你将掌握每种数据集的目录组织规范、转换脚本的调用方式与底层实现逻辑,能够自主完成自定义数据集的准备与格式校验。

一、数据集标注:工具不限,格式为准

MMPose 对用户使用的标注工具不做任何限制,只要最终标注结果符合 MMPose 的数据格式要求即可。这意味着无论是开源的 Label Studio、商业标注平台,还是自研脚本,产出的标注只需满足 COCO 风格的字段规范(关键点 keypoints、边界框 bbox、类别 categories 等)即可被直接消费。

对于使用 Label Studio 中的方法进行标注,并将结果导出为 Label Studio 标准的.json文件,同时将Labeling Interface中的Code保存为.xml文件——这两个文件是后续转换脚本labelstudio2coco.py的输入。MMPose 官方也非常欢迎社区用户贡献更多标注工具的使用教程和转换脚本。

Label Studio 标注要点

在 Label Studio 中新建项目后,需要在Settings中找到Labeling Interface,点击Code并粘贴如下配置,其中包含三种标注类型,分别对应 COCO 格式中的三个字段:

  • KeyPointLabels→ 对应 COCO 的keypoints
  • PolygonLabels→ 对应 COCO 的segmentation
  • RectangleLabels→ 对应 COCO 的bbox
<View> <KeyPointLabels name="kp-1" toName="img-1"> <Label value="person" background="#D4380D"/> </KeyPointLabels> <PolygonLabels name="polygonlabel" toName="img-1"> <Label value="person" background="#0DA39E"/> </PolygonLabels> <RectangleLabels name="label" toName="img-1"> <Label value="person" background="#DDA0EE"/> </RectangleLabels> <Image name="img-1" value="$img"/> </View>

标注顺序有严格要求:先标注关键点,再标注多边形/矩形框。一个实例的标注必须以关键点开始、以非关键点(多边形或矩形)结束,这样脚本才能将不同类型的标注合并为同一个实例。其中KeyPointLabels的顺序和数量必须与 MMPose 配置文件中dataset_info里定义的关键点顺序一致;PolygonLabelsRectangleLabels的顺序可以互换,且只需标注其中一种。

需要注意:bbox 和 area 会基于后标注的 PolygonLabels/RectangleLabels 计算。若先标注 PolygonLabels,则 bbox 以之后的 RectangleLabels 范围为准、area 等于矩形面积;反之则以多边形的最小外接矩形为 bbox、以多边形面积为 area。标注完成后点击Export按钮,选择JSON格式导出即可。由于导出的文件仅包含标注不含原图,建议使用Export功能中的 COCO 导出工具,其压缩包内会附带图片文件夹。

标注转 COCO:labelstudio2coco.py

仓库提供了 labelstudio2coco.py 将 Label Studio 的.json标注文件转换为 COCO 风格的.json文件,命令格式为:

python tools/dataset_converters/labelstudio2coco.py ${LS_JSON_FILE} ${LS_XML_FILE} ${OUTPUT_COCO_JSON_FILE}

例如:

python tools/dataset_converters/labelstudio2coco.py config.xml project-1-at-2023-05-13-09-22-91b53efa.json output/result.json

其中config.xml是上文所述Labeling Interface的 Code,project-1-at-2023-05-13-09-22-91b53efa.json是从 Label Studio 导出的 JSON 文件,output/result.json是输出路径(目录不存在时脚本会自动创建)。转换完成后,将图片文件夹放入输出目录即可得到完整的 COCO 数据集:

. ├── images │ ├── 38b480f2.jpg │ └── aeb26f04.jpg └── result.json

在 MMPose 配置中使用该数据集时,只需在 dataloader 的 dataset 字典中按如下方式指向标注文件和图片前缀:

dataset=dict( type=dataset_type, data_root=data_root, data_mode=data_mode, ann_file='result.json', data_prefix=dict(img='images/'), pipeline=train_pipeline, )

二、浏览数据集:可视化校验加载与增强结果

MMPose 提供了数据集浏览工具 browse_dataset.py,可以可视化查看数据集的原始标注数据增强后的标注,是排查数据集加载、数据增强配置是否正确的利器。

python tools/misc/browse_dataset.py ${CONFIG} [-h] [--output-dir ${OUTPUT_DIR}] [--max-item-per-dataset ${MAX_ITEM_PER_DATASET}] [--not-show] [--phase ${PHASE}] [--mode ${MODE}] [--show-interval ${SHOW_INTERVAL}]

各参数含义如下:

参数说明
CONFIG配置文件路径,工具依据其中的 dataloader 配置加载数据集
--output-dir OUTPUT_DIR可视化结果保存目录;不指定则不保存
--not-show不在外部窗口中显示可视化结果
--phase {train, val, test}选择数据集的阶段
--mode {original, transformed}original显示未预处理的原图;transformed显示预处理后的图像
--show-interval SHOW_INTERVAL两张图像之间的显示间隔时间
--max-item-per-dataset每个数据集最多处理的样本数,默认 50

例如,可视化 COCO 数据集的原图与标注:

python tools/misc/browse_dataset.py configs/body_2d_keypoint/topdown_heatmap/coco/td-hm_hrnet-w32_8xb64-e210_coco-256x192.py --mode original

工具会在原图上绘制边界框和关键点。若将mode改为transformed,则可查看送入模型前的预处理结果;如果 pipeline 中生成了热图目标(如GenerateTarget使用 MSRAHeatmap 等编解码器),热图也会一并可视化:

python tools/misc/browse_dataset.py configs/body_2d_keypoint/topdown_heatmap/coco/td-hm_hrnet-w32_8xb64-e210_coco-256x192.py --mode transformed

三、通过 MIM 下载开源数据集

借助 OpenXLab 平台,用户可以直接获取多领域的免费格式化数据集。通过平台的搜索功能可以快速定位所需数据集,从而高效地开展跨数据集任务。

使用 MIM 下载需要确保其版本高于 v0.3.8,完整流程如下:

# 升级 MIM pip install -U openmim # 安装 OpenXLab CLI 工具 pip install -U openxlab # 登录 OpenXLab openxlab login # 通过 MIM 下载 coco2017 并自动预处理 mim download mmpose --dataset coco2017

目前支持通过 MIM 下载的数据集如下(列表持续更新):

任务类型数据集下载命令
BodyCOCO 2017mim download mmpose --dataset coco2017
BodyMPIImim download mmpose --dataset mpii
BodyAI Challengermim download mmpose --dataset aic
BodyCrowdPosemim download mmpose --dataset crowdpose
FaceLaPamim download mmpose --dataset lapa
Face300Wmim download mmpose --dataset 300w
FaceWFLWmim download mmpose --dataset wflw
HandOneHand10Kmim download mmpose --dataset onehand10k
HandFreiHandmim download mmpose --dataset freihand
HandHaGRIDmim download mmpose --dataset hagrid
Whole BodyHalpemim download mmpose --dataset halpe
AnimalAP-10Kmim download mmpose --dataset ap10k

四、格式转换脚本:把原始标注统一为 COCO 风格

MMPose 在 tools/dataset_converters/ 目录下提供了一系列脚本,将不同数据集的原始标注转换为 COCO 风格格式。以下逐一讲解各数据集的目录组织、脚本调用与输出结果。

4.1 Animal-Pose(ICCV'2019)

Animal-Pose 数据集(论文Cross-Domain Adaptation for Animal Pose Estimation)的图像与标注可从官方站点下载。转换脚本为 parse_animalpose_dataset.py,官方也提供了预处理好的标注文件。如需自行生成标注,步骤如下:

  1. 下载原始图像与标注并解压到$MMPOSE/data,按如下结构组织:

    mmpose ├── mmpose ├── docs ├── tests ├── tools ├── configs `── data │── animalpose │ │-- VOC2012 │ │-- Annotations │ │-- ImageSets │ │-- JPEGImages │ │-- SegmentationClass │ │-- SegmentationObject │ │-- animalpose_image_part2 │ │-- cat │ │-- cow │ │-- dog │ │-- horse │ │-- sheep │ │-- PASCAL2011_animal_annotation │ │-- cat │ │ |-- 2007_000528_1.xml │ │ |-- 2007_000549_1.xml │ │ │-- ... │ │-- cow │ │-- dog │ │-- horse │ │-- sheep │ │-- annimalpose_anno2 │ │-- cat │ │ |-- ca1.xml │ │ |-- ca2.xml │ │ │-- ... │ │-- cow │ │-- dog │ │-- horse │ │-- sheep
  2. $MMPOSE下运行:

    python tools/dataset_converters/parse_animalpose_dataset.py

    生成的标注文件保存在$MMPOSE/data/animalpose/annotations

从源码看,脚本内部完成了三项工作(见 parse_animalpose_dataset.py):先用xml2coco_trainval解析 PascalVOC 的 PASCAL2011 动物标注 XML 生成 trainval 合并文件,再用split_train_val借助 xtcocotools 按验证标注数(1117)随机切分训练/验证集,最后用xml2coco_test解析animalpose_anno2生成测试集。Animal-Pose 定义了一套 20 关键点规范(左/右眼、左/右耳基、鼻子、喉部、尾基、鬐甲以及四肢的肘/膝/爪等),脚本中通过name2id字典将 XML 中的关键点名称映射为固定索引,并将原始visible标记统一转换为 COCO 的可见性编码(可见关键点置 2)。

由于官方数据集未提供 train/val/test 划分,MMPose 的做法是:选取来自 PascalVOC 的图像作为 train & val,train+val 共3608 张图像、5117 个标注,其中2798 张图像、4000 个标注用于训练,810 张图像、1117 个标注用于验证;其余来源的1000 张图像、1000 个标注用于测试。

4.2 COFW(ICCV'2013)

COFW(Robust Face Landmark Estimation Under Occlusion)的人脸关键点数据需从 COFW Dataset (Color Images) 下载COFW_train_color.matCOFW_test_color.mat,并移动到$MMPOSE/data/cofw/

mmpose ├── mmpose ├── docs ├── tests ├── tools ├── configs `── data │── cofw |── COFW_train_color.mat |── COFW_test_color.mat

该脚本依赖h5py读取 MATLAB 的.mat文件,先安装依赖再运行:

pip install h5py python tools/dataset_converters/parse_cofw_dataset.py

运行后得到:

mmpose ├── mmpose ├── docs ├── tests ├── tools ├── configs `── data │── cofw |── COFW_train_color.mat |── COFW_test_color.mat |── annotations | |── cofw_train.json | |── cofw_test.json |── images |── 000001.jpg |── 000002.jpg

从 parse_cofw_dataset.py 源码可以看到几个关键的坐标转换细节:脚本从.mat中分别读取训练集(IsTr/phisTr/bboxesTr)与测试集(IsT/phisT/bboxesT)数据,将关键点的遮挡标记2/1反转为 COCO 的可见性编码(2 - keypoints[:, 2],即 2 表示可见、1 表示遮挡),并将 MATLAB 的 1 起始索引转换为 Python 的 0 起始索引,同时把负值的 bbox 与关键点坐标截断为 0。转换的同时会把.mat中内嵌的图像逐张写出为images/下的 JPG 文件。

4.3 DeepPoseKit:Vinegar Fly / Desert Locust / Grévy's Zebra(eLife'2019)

DeepPoseKit 生态下的三个动物姿态数据集(果蝇 fly、沙漠蝗虫 locust、格列维斑马 zebra)的标注文件可从 DeepPoseKit-Data 仓库下载。转换脚本为 parse_deepposekit_dataset.py,官方也提供预处理好的标注文件(vinegar_fly_annotations、locust_annotations、zebra_annotations)与图像包(vinegar_fly_images、locust_images、zebra_images)。自行生成的步骤如下:

  1. 下载原始图像与标注并解压到$MMPOSE/data,组织为:

    mmpose ├── mmpose ├── docs ├── tests ├── tools ├── configs `── data | |── DeepPoseKit-Data | `── datasets | |── fly | | |── annotation_data_release.h5 | | |── skeleton.csv | | |── ... | | | |── locust | | |── annotation_data_release.h5 | | |── skeleton.csv | | |── ... | | | `── zebra | |── annotation_data_release.h5 | |── skeleton.csv | |── ... | │── fly `-- images │-- 0.jpg │-- 1.jpg │-- ...

    注意图像包需要单独下载(fly/locust/zebra 三个数据集各有对应的 images 压缩包)。

  2. 运行:

    python tools/dataset_converters/parse_deepposekit_dataset.py

    生成的标注文件分别保存在$MMPOSE/data/fly/annotations$MMPOSE/data/locust/annotations$MMPOSE/data/zebra/annotations

从源码看,脚本以h5py读取annotation_data_release.h5中的annotations(关键点坐标)、annotated(可见性标记)、images(图像数据)与skeleton(骨架连接)四个字段,并为三个数据集分别定义了不同的关键点定义:fly 为 32 点(含头部、胸腹、左右前中后腿各 4 段及双翅),locust 为 35 点(含触角、复眼及左右三对腿的各节段),zebra 为 9 点(吻部、头、颈、四肢与尾)。标注写入时 bbox 由可见关键点的最小/最大坐标计算。由于官方未提供测试集,脚本使用固定的随机种子(np.random.seed(0))打乱样本后,90% 用于训练、剩余 10% 用于评估

4.4 MacaquePose(bioRxiv'2020)

MacaquePose 是面向猕猴的无标记动作捕捉数据集,图像与标注可从其官网下载。转换脚本为 parse_macaquepose_dataset.py,官方也提供预处理好的 macaque_annotations。自行生成标注的步骤如下:

  1. 下载数据并解压到$MMPOSE/data

    mmpose ├── mmpose ├── docs ├── tests ├── tools ├── configs `── data │── macaque │-- annotations.csv │-- images │-- 01418849d54b3005.jpg │-- 0142d1d1a6904a70.jpg │-- 01ef2c4c260321b7.jpg │-- 020a1c75c8c85238.jpg │-- 020b1506eef2557d.jpg │-- ...
  2. 运行:

    python tools/dataset_converters/parse_macaquepose_dataset.py

    生成的标注文件保存在$MMPOSE/data/macaque/annotations

从 parse_macaquepose_dataset.py 源码看,脚本读取annotations.csv,其中每行包含图像名、关键点 JSON 字符串与分割多边形 JSON 字符串;关键点采用 17 点人体风格布局(鼻、双眼、双耳、双肩、双肘、双腕、双髋、双膝、双踝)。面积通过鞋带公式(Shoelace formula)由分割多边形计算(get_poly_area),bbox 由分割多边形的极值坐标推出。由于官方未提供测试集,脚本打乱后取12500 张图像用于训练,其余用于评估。

4.5 Human3.6M(TPAMI'2014)

Human3.6M 是 3D 人体姿态估计的标志性大规模数据集。从官网下载数据后放置到$MMPOSE/data/h36m,然后运行预处理脚本 preprocess_h36m.py:

python tools/dataset_converters/preprocess_h36m.py --metadata {path to metadata.xml} --original data/h36m

该脚本会解压原始.tgz压缩包,在**全帧率(50 FPS)降频帧率(10 FPS)**两种采样率下提取相机参数和姿态标注。处理后的数据应具有如下结构:

mmpose ├── mmpose ├── docs ├── tests ├── tools ├── configs `── data ├── h36m ├── annotation_body3d | ├── cameras.pkl | ├── fps50 | | ├── h36m_test.npz | | ├── h36m_train.npz | | ├── joint2d_rel_stats.pkl | | ├── joint2d_stats.pkl | | ├── joint3d_rel_stats.pkl | | `── joint3d_stats.pkl | `── fps10 | ├── h36m_test.npz | ├── h36m_train.npz | ├── joint2d_rel_stats.pkl | ├── joint2d_stats.pkl | ├── joint3d_rel_stats.pkl | `── joint3d_stats.pkl `── images ├── S1 | ├── S1_Directions_1.54138969 | | ├── S1_Directions_1.54138969_00001.jpg | | ├── S1_Directions_1.54138969_00002.jpg | | ├── ... | ├── ... ├── S5 ├── S6 ├── S7 ├── S8 ├── S9 `── S11

从 preprocess_h36m.py 源码可以补充以下实现细节:

  • --metadata指向官网的metadata.xml,脚本通过解析它获得受试者(S1–S11)、动作序列映射、动作名称与相机内参原始数据;
  • --original为原始数据集目录,其中各受试者的.tgz文件需放在对应小写子目录(如s1)下;
  • 可选参数--extracted--processed可指定解压目录与输出目录,默认与original_dir同级;--sample-rate控制降采样倍率(默认 5,即 50 FPS → 10 FPS,可通过修改该参数得到不同帧率的输出);
  • 脚本从 CDF 文件中读取 32 关节的 2D/3D 姿态,仅保留movable_joints指定的 17 个可动关节,3D 坐标从毫米转换为米,并以1.2的比例因子由 2D 关节坐标外扩生成 bbox 中心与尺度;随后逐帧抽取视频帧保存为 JPG 图像;
  • 训练集还会额外生成关节坐标的均值/标准差统计文件(joint2d_stats.pkljoint3d_stats.pkl及其相对坐标版本joint*_rel_stats.pkl),供后续归一化使用。

预处理完成后,还需要将标注转换为 MMPose 兼容的 COCO 格式,运行:

python tools/dataset_converters/h36m_to_coco.py

h36m_to_coco.py 脚本默认以tests/data/h36m/test_h36m_body3d.npz为输入、tests/data/h36m/h36m_coco.json为输出(可通过--ann-file--camera-param-file--img-root--out-file参数指定),内部借助mmengine.track_parallel_progress并行处理:将相机坐标系下的 3D 关键点通过 SimpleCamera(camera_to_world)投影回世界坐标系写入keypoints_3d字段,并以_get_bbox_xywh依据 center/scale 还原出 xywh 格式的 bbox,最终输出包含categoriesimagesannotations三部分的 COCO JSON。

4.6 MPII(CVPR'2014)

对于 MPII 数据集,训练和推理时预测结果默认保存为.mat格式。仓库提供了 mat2json.py 工具将该.mat转换为更易读的.json格式:

python tools/dataset_converters/mat2json ${PRED_MAT_FILE} ${GT_JSON_FILE} ${OUTPUT_PRED_JSON_FILE}

其中三个位置参数分别为:预测结果.mat文件路径、真值 JSON 文件路径(如mpii_val.json)、输出预测 JSON 文件路径。例如:

python tools/dataset_converters/mat2json work_dirs/res50_mpii_256x256/pred.mat data/mpii/annotations/mpii_val.json pred.json

4.7 UBody2D(CVPR'2023)

UBody 是面向单阶段 3D 全身网格恢复的数据集(论文One-Stage 3D Whole-Body Mesh Recovery with Component Aware Transformer),其视频与标注可从 OSX 项目主页下载。下载并解压到$MMPOSE/data后,组织为如下结构:

mmpose ├── mmpose ├── docs ├── tests ├── tools ├── configs `── data │── UBody ├── annotations │ ├── ConductMusic │ ├── Entertainment │ ├── Fitness │ ├── Interview │ ├── LiveVlog │ ├── Magic_show │ ├── Movie │ ├── Olympic │ ├── Online_class │ ├── SignLanguage │ ├── Singing │ ├── Speech │ ├── TVShow │ ├── TalkShow │ └── VideoConference ├── splits │ ├── inter_scene_test_list.npy │ └── intra_scene_test_list.npy ├── videos │ ├── ConductMusic │ ├── Entertainment │ ├── Fitness │ ├── Interview │ ├── LiveVlog │ ├── Magic_show │ ├── Movie │ ├── Olympic │ ├── Online_class │ ├── SignLanguage │ ├── Singing │ ├── Speech │ ├── TVShow │ ├── TalkShow │ └── VideoConference

仓库提供了 ubody_kpts_to_coco.py 脚本,将视频抽帧为图像,并按splits中的 scene 划分(inter-scene 与 intra-scene 两种测试协议)将标注拆分为 train/val 集:

python tools/dataset_converters/ubody_kpts_to_coco.py --data-root ${UBODY_DATA_ROOT}

例如:

python tools/dataset_converters/ubody_kpts_to_coco.py --data-root data/UBody

此外,UBody 还提供全身关键点与 SMPL-X 参数两类标注,仓库分别提供了 ubody_kpts_to_coco.py 与 ubody_smplx_to_coco.py 进行处理,可与 configs/wholebody_2d_keypoint/ubody2d 等数据集配置配合使用。

五、数据集处理的常见工作流总结

将上述工具串联起来,一套完整的自定义数据集处理流程如下:

  1. 标注:使用任意标注工具(如 Label Studio)产出符合 COCO 规范的关键点标注,必要时通过labelstudio2coco.py转换格式;
  2. 校验:编写/复用配置文件,通过tools/misc/browse_dataset.pyoriginaltransformed两种模式可视化标注与增强结果,确认加载正确;
  3. 转换:对于公开数据集,直接调用 tools/dataset_converters/ 下对应的解析脚本(Animal-Pose、COFW、DeepPoseKit、Macaque、H36M、UBody 等),将原始标注统一为 COCO 风格 JSON;
  4. 组织:按$MMPOSE/data/<dataset>/规范组织图像与annotations/目录,在配置文件中通过ann_filedata_prefixmetainfo指向它们;
  5. 快速开始:对于平台已格式化的数据集,可直接用mim download mmpose --dataset <name>一键下载,省去人工转换。

六、进一步阅读

  • 完整的标注到 COCO 转换教程:Label Studio Annotations to COCO Script
  • 数据集准备全流程(内置数据集、自定义数据集、混合数据集训练):Prepare Datasets
  • 自定义数据集类实现细节:Customize Datasets
  • 常用数据集格式转换脚本源码:tools/dataset_converters/
  • 数据集可视化工具源码:tools/analysis_tools/browse_dataset.py

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

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

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

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

立即咨询