【MMPose】在HRNet应用SimDR(SimCC)/Part.1-配置文件篇

SimDR(现在已经改名叫SimCC,后文还是称SimDR)将姿态估计的Heatmap方法转换为分类方法,在HRNet上实现了涨点,并且减小了显存占用。作者已经在github上开源了代码,但是在MMPose上目前还没有实现,所以本篇文章就使用HRNet在MMPose上实现SimDR。

SimDR原文: Is 2D Heatmap Representation Even Necessary for Human Pose Estimation?

SimDR开源代码:SimCC

【MMPose】在HRNet应用SimDR(SimCC)/Part.1-配置文件篇_第1张图片

 

因为在MMPose上修改的部分较多,所以文章会分为以下几个部分:

  1. 配置文件篇:因为MMPose使用了配置文件(.py)来进行各种参数的设置,所以我们先将会用到的参数先在配置文件中给出,方便后面修改代码时的调用与理解;
  2. 流水线篇(Pipeline):这部分主要是进行数据预处理,因为SimDR网络的输出分为x和y轴两个,所以需要对数据集处理的代码进行些许更改;
  3. 处理头篇(Head):这部分主要就是网络和损失函数的修改;
  4. 检测器篇(Detector):对训练和验证部分的代码进行一定的修改。

下面开始Part.1部分:

首先我们要找到HRnet默认的配置文件,simDR的文件要在此基础上进行修改,这里我们使用

configs\body\2d_kpt_sview_rgb_img\topdown_heatmap\mpii\hrnet_w32_mpii_256x256.py

在源路径拷贝一份并重命名为hrnet_w32_mpii_256x256_simDR.py

1.配置文件中增加的参数

evaluation = dict(interval=1, metric='PCKh', save_best='PCKh')

#new 
simdr_split_ratio=2

optimizer = dict(
    type='Adam',
    lr=5e-4,
)

simdr_split_ratio=2是新加入的参数,代表SimDR的缩放因子,不同大小的缩放因子效果不同,这里先给定一个2。

2.检测器的修改

model = dict(
    type='TopDownSimDR', #new
    pretrained=None,
    backbone=dict(

将检测器修改为我们自定义的检测器名,检测器的具体实现在检测器篇详细说明。

3.处理头的修改

keypoint_head=dict(
        type='simDRHead',  #new
        in_channels=32,
        out_channels=channel_cfg['num_output_channels'],
        num_deconv_layers=0,
        extra=dict(
            final_conv_kernel=1, 
            HEAD_INPUT=data_cfg['heatmap_size'][0]*data_cfg['heatmap_size'][1], #new
            image_size=data_cfg['image_size'],   #new
            SIMDR_SPLIT_RATIO=simdr_split_ratio,    #new
            coord_representation='sa-simdr',    #new
            NUM_JOINTS=channel_cfg['dataset_joints']), #new
        loss_keypoint=dict(type='KLDiscretLoss'))     #new

首先将检测头修改为自定义的检测头’simDRHead‘,在extra中增加新检测头的输入参数,具体含义看变量名应该能够理解,最后将损失函数更换为自定义的'KLDiscretLoss'。处理头的具体实现会在处理头篇说明。

4.流水线的修改

train_pipeline = [
    dict(type='LoadImageFromFile'),
    dict(type='TopDownGetBboxCenterScale', padding=1.25),
    dict(type='TopDownRandomFlip', flip_prob=0.5),
    dict(
        type='TopDownGetRandomScaleRotation', rot_factor=40, scale_factor=0.5),
    dict(type='TopDownAffine'),
    dict(type='ToTensor'),
    dict(
        type='NormalizeTensor',
        mean=[0.485, 0.456, 0.406],
        std=[0.229, 0.224, 0.225]),
    dict(type='simDR', sigma=2,encoding='sa-simdr',simdr_split_ratio=simdr_split_ratio), #new
    dict(
        type='Collect',
        keys=['img', 'target', 'target_weight'],
        meta_keys=[
            'image_file', 'joints_3d', 'joints_3d_visible', 'center', 'scale',
            'rotation', 'flip_pairs'
        ]),
]

将train_pipeline中的'TopDownGenerateTarget'替换为自定义的‘simDR’,并增加输入的参数。流水线的具体实现会在流水线篇说明。

你可能感兴趣的:(姿态估计,人工智能,python,深度学习,人工智能)