MMpose 教程中文翻译-tutorial 0:学习配置文件

这是一个对mmpose docs的中文翻译,自己在阅读的时候整理的,后续会继续翻译tutorial的内容。欢饮大佬们提建议,我也只是个学习中的小菜鸡

以下是mmpose教程链接

教程 0:学习 配置文件

mmpose采用python文件作为配置文件,将模块化和继承设计融入你的配置文件,便于进行各种实验

你可以在MMPose/configs目录下找到所有配置文件。如果你想深入了解配置文件,可以运行命令python tools/analysis/print_config.py /PATH/TO/CONFIG查看完整的配置文件。

文章目录

  • 教程 0:学习 配置文件
    • 通过脚本参数修改配置文件
    • 配置文件命名规范
      • 配置系统实例
    • FAQ
      • 配置文件中使用中间参数

通过脚本参数修改配置文件

当采用tools/train.pytools/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.5flip_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),
)

FAQ

配置文件中使用中间参数

在配置文件存在一些中间参数,如train_pipeline`/`val_pipeline`/`test_pipeline

如,train_pipeline/val_pipeline/test_pipeline 是中间变量,可以指定他们,并将其传入data

你可能感兴趣的:(计算机视觉,mmpose,python,机器学习,pytorch)