【MMPose】在HRNet应用SimDR(SimCC)/Part.4-检测器篇(Detector)

本文详细介绍了如何在MMPose框架中将SimDR(现称为SimCC)的Heatmap方法转换为分类方法,通过修改HRNet的配置文件、数据预处理流水线、网络头部结构以及检测器,实现性能提升和显存占用减少。作者已开源代码,且在MPII数据集上进行了训练和测试,取得了与论文相似的结果。
摘要由CSDN通过智能技术生成

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

SimDR开源代码:SimCC

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

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

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值