本笔记包含了使用 MMPose 1.0 时开发者会关心的内容:
-
整体代码架构与设计逻辑
-
如何用config文件管理模块
-
如何使用自定义数据集
-
如何添加新的模块(骨干网络、模型头部、损失函数等)
总览
一般来说,开发者在项目开发过程中经常接触内容的主要有五个方面:
-
通用:环境、钩子(Hook)、模型权重存取(Checkpoint)、日志(Logger)等
-
数据:数据集、数据读取(Dataloader)、数据增强等
-
训练:优化器、学习率调整等
-
模型:主干网络、颈部模块(Neck)、预测头模块(Head)、损失函数等
-
评测:评测指标(Metric)、评测器(Evaluator)等
其中通用、训练和评测相关的模块往往由训练框架提供,开发者只需要调用和调整参数,不需要自行实现,开发者主要实现的是数据和模型部分。
Step1:配置文件
在MMPose中,我们通常 python 格式的配置文件,用于整个项目的定义、参数管理,因此我们强烈建议第一次接触 MMPose 的开发者,查阅 【用户教程 - 如何看懂配置文件】 学习配置文件的定义。
需要注意的是,所有新增的模块都需要使用注册器进行注册,并在对应目录的 __init__.py
中进行 import
,以便能够使用配置文件构建其实例。
Step2:数据
MMPose 数据的组织主要包含三个方面:
-
数据集元信息(meta info)
-
数据集(dataset)
-
数据流水线(pipeline)
数据集元信息
元信息指具体标注之外的数据集信息。姿态估计数据集的元信息通常包括:关键点和骨骼连接的定义、对称性、关键点性质(如关键点权重、标注标准差、所属上下半身)等。这些信息在数据在数据处理、模型训练和测试中有重要作用。在 MMPose 中,数据集的元信息使用 python 格式的配置文件保存,位于 $MMPOSE/configs/base/datasets 目录下。
在 MMPose 中使用自定义数据集时,你需要增加对应的元信息配置文件。以 MPII 数据集($MMPOSE/configs/_base_/datasets/mpii.py)为例:
dataset_info = dict( dataset_name='mpii', paper_info=dict( author='Mykhaylo Andriluka and Leonid Pishchulin and ' 'Peter Gehler and Schiele, Bernt', title='2D Human Pose Estimation: New Benchmark and ' 'State of the Art Analysis', container='IEEE Conference on Computer Vision and ' 'Pattern Recognition (CVPR)', year='2014', homepage='http://human-pose.mpi-inf.mpg.de/', ), keypoint_info={ 0: dict( name='right_ankle', id=0, color=[255, 128, 0], type='lower', swap='left_ankle'), ## 内容省略 }, skeleton_info={ 0: dict(link=('right_ankle', 'right_knee'), id=0, color=[255, 128, 0]), ## 内容省略 }, joint_weights=[ 1.5, 1.2, 1., 1., 1.2, 1.5, 1., 1., 1., 1., 1.5, 1.2, 1., 1., 1.2, 1.5 ], # 使用 COCO 数据集中提供的 sigmas 值 sigmas=[ 0.089, 0.083, 0.107, 0.107, 0.083, 0.089, 0.026, 0.026, 0.026, 0.026, 0.062, 0.072, 0.179, 0.179, 0.072, 0.062 ])
在这份元信息配置文件中:
-
keypoint_info
:每个关键点的信息:-
name
: 关键点名称,必须是唯一的,例如nose
、left_eye
等。 -
id
: 关键点 ID,必须是唯一的,从 0 开始。 -
color
: 关键点可视化时的颜色,以 ([B, G, R]) 格式组织起来,用于可视化。 -
type
: 关键点类型,可以是upper
、lower
或''
,用于数据增强 RandomHalfBody。 -
swap
: 关键点交换关系,用于水平翻转数据增强 RandomFlip。
-
-
skeleton_info
:骨架连接关系,用于可视化。 -
joint_weights
:每个关键点的权重,用于损失函数计算。 -
sigma
:标准差,用于计算 OKS 分数,详细信息请参考 keypoints-eval。
在模型配置文件中,你需要为自定义数据集指定对应的元信息配置文件。假如该元信息配置文件路径为 $MMPOSE/configs/_base_/datasets/{your_dataset}.py
,指定方式如下:
# dataset and dataloader settings dataset_type = 'MyCustomDataset' # or 'CocoDataset' train_dataloader = dict( batch_size=2, dataset=dict( type=dataset_type, data_root='aaa', # 标注文件路径为 {data_root}/{ann_file} # 例如: aaa/annotations/train.json ann_file='annotations/train.json', # 图片路径为 {data_root}/{img_path}/ # 例如: aaa/train/c.jpg data_prefix=dict(img='train'), # 指定对应的元信息配置文件 metainfo=dict(from_file='configs/_base_/datasets/custom.py&#