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 的keypointsPolygonLabels→ 对应 COCO 的segmentationRectangleLabels→ 对应 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里定义的关键点顺序一致;PolygonLabels与RectangleLabels的顺序可以互换,且只需标注其中一种。
需要注意: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 下载的数据集如下(列表持续更新):
| 任务类型 | 数据集 | 下载命令 |
|---|---|---|
| Body | COCO 2017 | mim download mmpose --dataset coco2017 |
| Body | MPII | mim download mmpose --dataset mpii |
| Body | AI Challenger | mim download mmpose --dataset aic |
| Body | CrowdPose | mim download mmpose --dataset crowdpose |
| Face | LaPa | mim download mmpose --dataset lapa |
| Face | 300W | mim download mmpose --dataset 300w |
| Face | WFLW | mim download mmpose --dataset wflw |
| Hand | OneHand10K | mim download mmpose --dataset onehand10k |
| Hand | FreiHand | mim download mmpose --dataset freihand |
| Hand | HaGRID | mim download mmpose --dataset hagrid |
| Whole Body | Halpe | mim download mmpose --dataset halpe |
| Animal | AP-10K | mim 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,官方也提供了预处理好的标注文件。如需自行生成标注,步骤如下:
下载原始图像与标注并解压到
$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在
$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.mat与COFW_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)。自行生成的步骤如下:
下载原始图像与标注并解压到
$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 压缩包)。
运行:
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。自行生成标注的步骤如下:
下载数据并解压到
$MMPOSE/data:mmpose ├── mmpose ├── docs ├── tests ├── tools ├── configs `── data │── macaque │-- annotations.csv │-- images │-- 01418849d54b3005.jpg │-- 0142d1d1a6904a70.jpg │-- 01ef2c4c260321b7.jpg │-- 020a1c75c8c85238.jpg │-- 020b1506eef2557d.jpg │-- ...运行:
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.pkl、joint3d_stats.pkl及其相对坐标版本joint*_rel_stats.pkl),供后续归一化使用。
预处理完成后,还需要将标注转换为 MMPose 兼容的 COCO 格式,运行:
python tools/dataset_converters/h36m_to_coco.pyh36m_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,最终输出包含categories、images、annotations三部分的 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.json4.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 等数据集配置配合使用。
五、数据集处理的常见工作流总结
将上述工具串联起来,一套完整的自定义数据集处理流程如下:
- 标注:使用任意标注工具(如 Label Studio)产出符合 COCO 规范的关键点标注,必要时通过
labelstudio2coco.py转换格式; - 校验:编写/复用配置文件,通过
tools/misc/browse_dataset.py以original与transformed两种模式可视化标注与增强结果,确认加载正确; - 转换:对于公开数据集,直接调用 tools/dataset_converters/ 下对应的解析脚本(Animal-Pose、COFW、DeepPoseKit、Macaque、H36M、UBody 等),将原始标注统一为 COCO 风格 JSON;
- 组织:按
$MMPOSE/data/<dataset>/规范组织图像与annotations/目录,在配置文件中通过ann_file、data_prefix、metainfo指向它们; - 快速开始:对于平台已格式化的数据集,可直接用
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),仅供参考