SimDR(现在已经改名叫SimCC,后文还是称SimDR)将姿态估计的Heatmap方法转换为分类方法,在HRNet上实现了涨点,并且减小了显存占用。作者已经在github上开源了代码,但是在MMPose上目前还没有实现,所以本篇文章就使用HRNet在MMPose上实现SimDR。
SimDR原文: Is 2D Heatmap Representation Even Necessary for Human Pose Estimation?
SimDR开源代码:SimCC
因为在MMPose上修改的部分较多,所以文章会分为以下几个部分:
下面开始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
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。
model = dict(
type='TopDownSimDR', #new
pretrained=None,
backbone=dict(
将检测器修改为我们自定义的检测器名,检测器的具体实现在检测器篇详细说明。
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'。处理头的具体实现会在处理头篇说明。
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’,并增加输入的参数。流水线的具体实现会在流水线篇说明。