菜鸡尝试:pytorch姿态估计hourglass模型(LSP数据集)

所有参考网址

数据集及处理

  • https://blog.csdn.net/weixin_42216109/article/details/115269420

  • https://blog.csdn.net/weixin_30387339/article/details/94832887?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_title~default-0.control&spm=1001.2101.3001.4242

模型

  • https://blog.csdn.net/qq_38308388/article/details/112554972
  • https://blog.csdn.net/shenxiaolu1984/article/details/51428392/?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_title~default-0.control&spm=1001.2101.3001.4242
  • https://blog.csdn.net/baolinq/article/details/84575381?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162678690316780261943465%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=162678690316780261943465&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v29-9-84575381.first_rank_v2_pc_rank_v29&utm_term=hourglass&spm=1018.2226.3001.4187
  • https://blog.csdn.net/weixin_52668444/article/details/116578345?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162678612816780262518435%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=162678612816780262518435&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v29-25-116578345.first_rank_v2_pc_rank_v29&utm_term=hourglass&spm=1018.2226.3001.4187
  • https://blog.csdn.net/shenxiaolu1984/article/details/51428392

可视化

  • https://zhuanlan.zhihu.com/p/225494133

GitHub参考代码

  • https://github.com/carloscz25/PytorchPoseEstimationLeedsSports
  • https://github.com/bearpaw/pytorch-pose
  • https://github.com/princeton-vl/pytorch_stacked_hourglass
  • https://github.com/Spandana-K-R/DeepPose

一、LSP数据集

LSP数据集包括如下图文件,其中images文件夹包括2000张照片,visualized文件夹则是关节点可视化后的照片,joints文件储存着关节点的坐标信息

  • 样本数:2000
  • 关节点数:14

1.1数据集处理

1.1.1关节点标签处理
  • 加载joints.mat文件可以看到,形状为(3, 14, 2000),其中3为x和y和一个二进制的值,14为14个关节点标记,2000为2000张图片。另外二进制值是标明是否被遮挡,0为未被遮挡,1为被遮挡

        self.annotationmat = scipy.io.loadmat(labelsfilepath)
        # print(self.annotationmat) #加载.mat文件的数据

        joints = self.annotationmat['joints']
        # print(joints) # 只加载'joints'键的数据
[[[ 29.74645941  28.12031897  40.51695761 ... 120.12745241  51.59369452
    44.42209685]
  [ 30.5501068   49.17944312  27.96569031 ... 136.33061847  33.44243044
    42.59402151]
  [ 28.94281202  62.60463477  50.08729892 ... 105.46744503  34.11469948
    42.59402151]
   ...

​ 第1列第1个数29.74645941是第一张图片的第1个关节点的x轴的值,同理第2列第1个数30.5501068是第1张图片的第2个关节点的x轴的值

将关节点标签处理为如下使(x,y)代表图片的一个关节点坐标(这里去掉了二进制值)

第二张图片的关节点坐标(注意对比原图区分左右,同时这些坐标是根据原始图像建立坐标轴来标记的)
tensor([[ 28.1203, 166.6551],
        [ 49.1794, 136.6458],
        [ 62.6046,  95.8438],
        [ 80.2417,  96.1070],
        [ 91.5609, 130.8546],
        [ 78.3990, 142.7003],
        [ 61.2884,  78.9965],
        [ 49.9692,  73.7317],
        [ 63.9208,  50.5667],
        [ 98.6684,  53.4623],
        [111.3039,  69.7831],
        [109.4612,  96.3703],
        [ 81.0314,  52.6726],
        [ 83.4005,  30.8238]])

14个关节点按序号分别为:(上面的坐标也对应下面的顺序)

Right ankle     右脚踝
Right knee      右膝盖 
Right hip       右臀部
Left hip        左臀部 
Left knee       左膝盖
Left ankle      左脚踝 

Right wrist     右手腕 
Right elbow     右肘 
Right shoulder  右肩 
Left shoulder   左肩 
Left elbow      左肘 
Left wrist      左手腕 

Neck            颈部 
Head top        头顶

可以分成三部分

即用序号标明为如下图:

在这里插入图片描述

  • 坐标标准化
def standardize_label(label, orim):  #保证了原图像的坐标的准确

    label_std = []
    for idx, _ in enumerate(label):
        labelX = label[idx][0] / orim.size[0] #x的值除于原始图像的宽
        labelY = label[idx][1] / orim.size[1] #y的值除于原始图像的高
        label_std.append([labelX, labelY])
    label_std = np.array(label_std)
    # print(label_std)
    return label_std

​ 处理为(x,y)后再让x除以原图像的宽,y除以原图像的高,这样可以防止缩放原图像造成的关节点坐标丢失。
(!!!注意:这个方法是参考https://github.com/carloscz25/PytorchPoseEstimationLeedsSports中的处理方法处理的,这样做也是为了方便后面可以在原始图像上对关节点坐标可视化,所以其严谨性有待考证)

1.1.2图像处理
  • 原图像的处理则采用常规处理

    image_size = 196
    
    
    transforms = Compose([
        Resize((image_size,image_size)),
        ToTensor(),  #张量化
        #ToTensor()能够把灰度范围从0-255变换到0-1之间,
        # 而transform.Normalize()则把0-1变换到(-1,1).具体地说,对每个通道而言
        Normalize((0.5,0.5,0.5),(0.5,0.5,0.5))
    ])
    

二、模型

2.1沙漏模型

沙漏模型在上面的参考网址中有很多讲得很详细,下面只是一些个人总结

  • 首先完整沙漏模型如像下图:

    可以看到,联级沙漏模型就是由多个沙漏状的hourglass模型首尾连接而成

  • 单个沙漏(hourglass)模型

    ​ 如上图就是单个沙漏模型,红色部分就是沙漏对称的两个部分,这两个部分无论是batch_size,还是图像尺寸都是对称的,蓝色部分则是残差模型的一部分,与红色部分共同组成了残差模型

    ​ 所以可以看到送进单个沙漏模型的图像经历了下采样和上采样,形状像沙漏,其中还做了残差模型

  • 联级沙漏模型

    ​ 原论文中说到相互关键点之间是有关系的,知道了一个关节点的坐标可以更好地预测其他关节点的位置,每一个hourglass模型中都做了一个热力图预测,并且输入到下一个hourglass模型,这样上一个 hourglass模型学习到的信息可以辅助下一个 hourglass模型的预测

三、检验与可视化

  • 首先上面1.1已经采取了坐标标准化,就是为了防止对原始图片放缩后关节点坐标丢失(LSP数据集每张图片大小不一样),若缩放图像并输进网络中,预测出的关节点坐标是根据缩放后的图像建立坐标轴得到的数据,所以标准化(x除以宽,y除以高)后可以保存准确信息,无论原始图像缩放到什么尺寸都不会丢失

  • 而关于检验,个人用了距离公式来进行检验,比如在以原始关节点为圆心画任意半径的圆(半径自定义),若预测的关节点坐标落在圆内则正确

  • 另外坐标标准化还可以方便检验时直接在原图像上建立坐标轴,只需将预测得到的标准化关节点坐标分别乘以对应的宽和高即可

    由于计算资源限制,下图是使用迁移学习方法,用CPU跑了1个epoch的预测效果

    至于点与点的划线可以根据上面1.1的关节点的按序号进行划线

四、代码

  • 完整代码已经上传到GitHub个人仓库https://github.com/Hopelht/PoseEstimation

最后,个人觉得沙漏模型比较复杂,无论是模型本身还是代码,我都看得云里雾里,我这个菜鸡目前能搞懂的层次只是浅层。

PS:后续会继续完善详细内容

  • 9
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Double_tin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值