这是一个对mmpose docs的中文翻译,自己在阅读的时候整理的,后续会继续翻译tutorial的内容。欢饮大佬们提建议,我也只是个学习中的小菜鸡
以下是mmpose教程链接
mmpose采用python
文件作为配置文件,将模块化和继承设计融入你的配置文件,便于进行各种实验
你可以在MMPose/configs
目录下找到所有配置文件。如果你想深入了解配置文件,可以运行命令python tools/analysis/print_config.py /PATH/TO/CONFIG
查看完整的配置文件。
当采用tools/train.py
或tools/test.py
提交任务时,你可以通过指定内置的--cfg-options
来修改配置文件。
更新字典的配置keys
可以通过以下命令指定原始配置文件的配置选项,如--cfg-options model.backbone.norm_eval=False
可以修改在train
模式下基干模型的BN(Batch Normalization)
层。
更新配置文件列表中的keys
在一些配置文件中,有些配置字典由一个列表构成。如,训练渠道data.train.pipeline
通常是个列表,比如[dict(type='LoadImageFromFile'), dict(type='TopDownRandomFlip', flip_prob=0.5), ...]
。如果你想改变渠道中的flip_prob=0.5
到 flip_prob=0.0
,可以指定如下--cfg-options data.train.pipeline.1.flip_prob=0.0
。
更新列表/元组的值
如果将要更新的值是一个列表或者元组。比如,配置文件通常设置为workflow=[('train', 1)]
。如果你想改变key
值,可以指定--cfg-options workflow="[(train,1),(val,1)]"
。
注意:对于列表/元组类型必须加入引用符号
"
,且在指定的值中,在引用符号内不能有空格
我们采用以下风格命名配置文件。建议贡献者也遵循该命名方式。
configs/{topic}/{task}/{algorithm}/{dataset}/{backbone}_[model_setting]_{dataset}_[input_size]_[technique].py
大括号{xxx}
代表必需项,中括号[yyy]
代表可选项
{topic}
:主题类型,如body
, face
, hand
, animal
,等等{task}
:任务类型,[2d | 3d]_[kpt | mesh]_[sview | mview]_[rgb | rgbd]_[img | vid]
(即[2d | 3d]、[关键点 | 网格]、[单视图 | 多视图]、[rgb | rgbd]、[图像 | 视频])。如2d_kpt_sview_rgb_img
, 3d_kpt_sview_rgb_vid
对应上面的每一项。{algorithm}
:算法类型,如associative_embedding
, deeppose
{dataset}
:数据集,如coco
{backbone}
:基干网络,如res50
(ResNet-50)等[model setting]
:模型的特定设置[input_size]
: 模型的输入尺寸[technique]
:特定技巧,包括损失函数,数据增强等技巧。如wingloss
,udp
, fp16
。
wingloss
可参考如下 [怎么理解wingloss]((https://www.zhihu.com/question/330467481/answer/729289173)一个基于2d Top-down Heatmap
的人体位姿估计
有助于使用者对配置系统的完整的配置文件结果和模型有一个基础的了解
mmpose在Github提供了一个简单注释如下。对于更多使用细节和每个模型的参数替代可以参考[API](API Documentation — MMPose 0.15.0 documentation)文档
# 运行设置
log_level = 'INFO' # 日志等级,参考https://www.ibm.com/docs/en/cognos-analytics/10.2.2?topic=SSEP7J_10.2.2/com.ibm.swg.ba.cognos.ug_rtm_wb.10.2.2.doc/c_n30e74.html
load_from = None # 从给定路径加载模型,并不会开始训练
resume_from = None # 从给定路径重新加载checkpoints,训练将会从checkpoints保存的epoch开始训练
dist_params = dict(backend='nccl') # 启动分布式训练的参数,可以设置端口
workflow = [('train', 1)] # 运行的工作流。[('train', 1)]代表只有一个工作流。该工作流命名为`train`,执行一次
checkpoint_config = dict( # 配置checkpoint,参考 https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/hooks/checkpoint.py
interval=10) # 保存checkpoint的间隔
evaluation = dict( # 训练过程中评估的配置 ##不是很懂?
interval=10, # 验证间隔
metric='mAP', # 评价指标
key_indicator='AP') # 设置 `AP`作为最后保存最佳checkpoint的指标
# 优化项
optimizer = dict(
# 建立优化器的配置 支持
# (1). PyTorch所有的优化器,语法同Pytorch
# (2). 自定义优化器,位于`constructor`
# 参考 "tutorials/4_new_modules.md"
type='Adam', # 优化器的选项,参考 https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/optimizer/default_constructor.py#L13
lr=5e-4, # 学习率,具体参考PyTorch文档
)
optimizer_config = dict(grad_clip=None) # 不要使用 gradient clip
# 学习策略
lr_config = dict( # Learning rate scheduler config used to register LrUpdater hook
policy='step', # Policy of scheduler, 也支持 CosineAnnealing, Cyclic, etc. 参考支持的 LrUpdater from https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/hooks/lr_updater.py#L9
warmup='linear', # warmup类型,可以选择None(不使用 warmup) 'constant', 'linear' or 'exp'.
warmup_iters=500, # 使用warmup的迭代或者epoch的数量
warmup_ratio=0.001, # warmup的初始学习率等于 warmup_ratio * initial_lr
step=[170, 200]) # 学习率衰减步数
total_epochs = 210 # 模型训练总的epoch
log_config = dict( # 日志配置文件
interval=50, # 打印日志间隔
hooks=[
dict(type='TextLoggerHook'), # 记录训练过程的日志
# dict(type='TensorboardLoggerHook') # 支持Tensorboard logger
])
channel_cfg = dict(
num_output_channels=17, # 关键点head的输出通道
dataset_joints=17, # 数据集
dataset_channel=[ # 数据集支持的通道
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16],
],
inference_channel=[ # 输出通道
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16
])
#########################################################################################
# 模型设置
model = dict( # 模型配置文件
type='TopDown', # Type of the model
pretrained='torchvision://resnet50', # The url/site of the pretrained model
backbone=dict( # Dict for backbone
type='ResNet', # Name of the backbone
depth=50), # Depth of ResNet model
keypoint_head=dict( # Dict for keypoint head
type='TopdownHeatmapSimpleHead', # Name of keypoint head
in_channels=2048, # The input channels of keypoint head
out_channels=channel_cfg['num_output_channels'], # The output channels of keypoint head
loss_keypoint=dict( # Dict for keypoint loss
type='JointsMSELoss', # Name of keypoint loss
use_target_weight=True)), # Whether to consider target_weight during loss calculation
train_cfg=dict(), # Config of training hyper-parameters
test_cfg=dict( # Config of testing hyper-parameters
flip_test=True, # Whether to use flip-test during inference
post_process='default', # Use 'default' post-processing approach.
shift_heatmap=True, # Shift and align the flipped heatmap to achieve higher performance
modulate_kernel=11)) # Gaussian kernel size for modulation. Only used for "post_process='unbiased'"
#########################################################################################
data_cfg = dict(
image_size=[192, 256], # 模型输入图像的分辨率
heatmap_size=[48, 64], # Size of the output heatmap
num_output_channels=channel_cfg['num_output_channels'], # 输出通道数
num_joints=channel_cfg['dataset_joints'], # joints数量
dataset_channel=channel_cfg['dataset_channel'], # 数据集支持的通道
inference_channel=channel_cfg['inference_channel'], # 输出通道
soft_nms=False, # 推理时是否使用soft-nms
nms_thr=1.0, # 非最大抑制阈值
oks_thr=0.9, #
vis_thr=0.2, # 关键点可视化阈值
use_gt_bbox=False, # 测试时是否使用真实值bounding box
det_bbox_thr=0.0, # 检测到的bounding box评分阈值,当'use_gt_bbox=True'使用
bbox_file='data/coco/person_detection_results/' # bounding box的相对路径
'COCO_val2017_detections_AP_H_56_person.json',
)
train_pipeline = [
dict(type='LoadImageFromFile'), # 从文件读取图片
dict(type='TopDownRandomFlip', # 随机翻转数据增强
flip_prob=0.5), # 翻转概率
dict(
type='TopDownHalfBodyTransform', # TopDownHalfBodyTransform 数据增强的配置
num_joints_half_body=8, # half-body transform的阈值
prob_half_body=0.3), # 翻转概率
dict(
type='TopDownGetRandomScaleRotation', # TopDownGetRandomScaleRotation配置
rot_factor=40, # 旋转因子 ``[-2*rot_factor, 2*rot_factor]``.
scale_factor=0.5), # 缩放因子 ``[1-scale_factor, 1+scale_factor]``.
dict(type='TopDownAffine', # 图像仿射变换处理
use_udp=False), # 不使用unbiased data processing.
dict(type='ToTensor'), # 其他类型转化为张量
dict(
type='NormalizeTensor', # 均一化输入张量
mean=[0.485, 0.456, 0.406], # 不同通道均一化的均值
std=[0.229, 0.224, 0.225]), # 不同通道均一化的均值
dict(type='TopDownGenerateTarget', # 生成heatmap目标,支持不同类型
sigma=2), # heatmap类型中高斯分布sigma的值
dict(
type='Collect', # 储存需要传入到检测器的pipeline
keys=['img', 'target', 'target_weight'], # 输入的Keys
meta_keys=[ # 输入的Meta keys
'image_file', 'joints_3d', 'joints_3d_visible', 'center', 'scale',
'rotation', 'bbox_score', 'flip_pairs'
]),
]
# 与上面同理
val_pipeline = [
dict(type='LoadImageFromFile'), # Loading image from file
dict(type='TopDownAffine'), # Affine transform the image to make input.
dict(type='ToTensor'), # Config of ToTensor
dict(
type='NormalizeTensor',
mean=[0.485, 0.456, 0.406], # Mean values of different channels to normalize
std=[0.229, 0.224, 0.225]), # Std values of different channels to normalize
dict(
type='Collect', # Collect pipeline that decides which keys in the data should be passed to the detector
keys=['img'], # Keys of input
meta_keys=[ # Meta keys of input
'image_file', 'center', 'scale', 'rotation', 'bbox_score',
'flip_pairs'
]),
]
test_pipeline = val_pipeline
# 数据读取
data_root = 'data/coco' # 数据配置
data = dict(
samples_per_gpu=64, # 训练模式下单显卡的Batch size
workers_per_gpu=2, # Workers to pre-fetch data for each single GPU
val_dataloader=dict(samples_per_gpu=32), # 验证模式下单显卡的Batch size
test_dataloader=dict(samples_per_gpu=32), # 测试模式下单显卡的Batch size
train=dict( # 训练数据集配置
type='TopDownCocoDataset', # 数据集名称
ann_file=f'{data_root}/annotations/person_keypoints_train2017.json', # 标注文件路径
img_prefix=f'{data_root}/train2017/',
data_cfg=data_cfg,
pipeline=train_pipeline),
val=dict( # Validation dataset config
type='TopDownCocoDataset', # Name of dataset
ann_file=f'{data_root}/annotations/person_keypoints_val2017.json', # 标注文件路径
img_prefix=f'{data_root}/val2017/',
data_cfg=data_cfg,
pipeline=val_pipeline),
test=dict( # Testing dataset config
type='TopDownCocoDataset', # Name of dataset
ann_file=f'{data_root}/annotations/person_keypoints_val2017.json', # 标注文件路径
img_prefix=f'{data_root}/val2017/',
data_cfg=data_cfg,
pipeline=val_pipeline),
)
在配置文件存在一些中间参数,如train_pipeline`/`val_pipeline`/`test_pipeline
等
如,train_pipeline
/val_pipeline
/test_pipeline
是中间变量,可以指定他们,并将其传入data