SimDR(现在已经改名叫SimCC,后文还是称SimDR)将姿态估计的Heatmap方法转换为分类方法,在HRNet上实现了涨点,并且减小了显存占用。作者已经在github上开源了代码,但是在MMPose上目前还没有实现,所以本篇文章就使用HRNet在MMPose上实现SimDR。
SimDR原文:Is 2D Heatmap Representation Even Necessary for Human Pose Estimation?
SimDR开源代码:SimCC
因为在MMPose上修改的部分较多,所以文章会分为以下几个部分:
- 配置文件篇:因为MMPose使用了配置文件(.py)来进行各种参数的设置,所以我们先将会用到的参数先在配置文件中给出,方便后面修改代码时的调用与理解;
- 流水线篇(Pipeline):这部分主要是进行数据预处理,因为SimDR网络的输出分为x和y轴两个,所以需要对数据集处理的代码进行些许更改;
- 处理头篇(Head):这部分主要就是网络和损失函数的修改;
- 检测器篇(Detector):对训练和验证部分的代码进行一定的修改。
下面开始Part.4部分
1.配置检测器
拷贝mmpose\models\detectors\top_down.py并重命名为top_down_simDR.py。由于检测器修改的内容极少,故这里直接将TopDown类更名为TopDownSimDR并保存。
因为flip和shift操作的变化,修改test_forward函数中的两行;
def forward_test(self, img, img_metas, return_heatmap=False, **kwargs):
"""Defines the computation performed at every call when testing."""
assert img.size(0) == len(img_metas)
batch_size, _, img_height, img_width = img.shape
if batch_size > 1:
assert 'bbox_id' in img_metas[0]
result = {}
features = self.backbone(img)
if self.with_neck:
features = self.neck(features)
if self.with_keypoint:
output_heatmap = self.keypoint_head.inference_model(
features, flip_pairs=None)
if self.test_cfg.get('flip_test', True):
img_flipped = img.flip(3)
features_flipped = self.backbone(img_flipped)
if self.with_neck:
features_flipped = self.neck(features_flipped)
if self.with_keypoint:
output_flipped_heatmap = self.keypoint_head.inference_model(
features_flipped, img_metas[0]['flip_pairs'])
output_heatmap = (output_heatmap[0] + output_flipped_heatmap[0],output_heatmap[1] + output_flipped_heatmap[1]) #<----
if self.test_cfg.get('regression_flip_shift', False):
output_heatmap[..., 0] -= 1.0 / img_width
output_heatmap = (output_heatmap[0]*0.5,output_heatmap[1] *0.5) #<----
if self.with_keypoint:
keypoint_result = self.keypoint_head.decode(
img_metas, output_heatmap, img_size=[img_width, img_height])
result.update(keypoint_result)
if not return_heatmap:
output_heatmap = None
result['output_heatmap'] = output_heatmap
return result
这样需要修改的地方就结束了,然后在__init__中添加定义的检测器:
# Copyright (c) OpenMMLab. All rights reserved.
from .associative_embedding import AssociativeEmbedding
from .cid import CID
from .gesture_recognizer import GestureRecognizer
from .interhand_3d import Interhand3D
from .mesh import ParametricMesh
from .multi_task import MultiTask
from .multiview_pose import (DetectAndRegress, VoxelCenterDetector,
VoxelSinglePose)
from .one_stage import DisentangledKeypointRegressor
from .pose_lifter import PoseLifter
from .posewarper import PoseWarper
from .top_down import TopDown
from .top_down_simDR import TopDownSimDR
__all__ = [
'TopDown', 'AssociativeEmbedding', 'CID', 'ParametricMesh', 'MultiTask',
'PoseLifter', 'Interhand3D', 'PoseWarper', 'DetectAndRegress',
'VoxelCenterDetector', 'VoxelSinglePose', 'GestureRecognizer',
'DisentangledKeypointRegressor','TopDownSimDR'
]
因为检测器中定义的是网络训练和测试的流程,所以并没有太多需要修改的地方。
2.训练并测试
这里使用MPII进行训练,命令行输入:
python tools\train.py configs\body\2d_kpt_sview_rgb_img\topdown_heatmap\mpii\hrnet_w32_mpii_256x256_sa-simDR.py
训练完成后结果与论文中的结果相似,可以说simDR代码修改成功了。
之后会测试一下在低分辨率情况下的模型效果。
3.完整工程代码
找时间会上传到github,如果文章对你有有帮助,请动动手指点点收藏和赞,谢谢。
github代码已经上传:mmpose_simDR