tensorflow入门教程(四十四)人体姿态检测(二)

#
#作者:韦访
#博客:https://blog.csdn.net/rookie_wei
#微信:1007895847
#添加微信的备注一下是CSDN的
#欢迎大家一起学习
#

------韦访 20190530

1、概述

上一讲,我们将人体姿态检测的代码玩起来了,但是还不知道它是个什么鬼,为何那么牛逼。都9102年了,总不能还像以前一样跑起来了就完事了,都一百多斤的人了,总得成熟点了,那么,这一讲,来说说它的原理。

原始论文(Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields.pdf)链接:https://arxiv.org/abs/1611.08050

2、思路概述

上图的解释如下,

1、(a)图为输入数据,是一张RGB图像。通过一系列CNN网络后,同时得到(b)和(c)。

2、(b)图表示关节点置信图,我们要检测多少个关节点,就有多少张相应的置信图,一张图像中有可能有多个人的同一个关节点。如上图(b)左侧的置信图就同时检测出两个人的左肘,右侧的置信图检测出两个人的左肩。

      3、(c)图表示肢干的矢量图,每个关节对应两个矢量图。

4、(b)和(c)结合起来就得到(d),即某个肢干的关节点的连接。

5、所有的(d)组合起来就得到(e),即所有我们要检测的肢干的连接结果。

 

3、网络结构

上面说到原始图像经过一系列CNN网络同时得到置信图和矢量图,现在就来看这个网络结构。

如上图所示,F是原始图像经过VGG19的前10层网络后得到的特征图。经过Branch1的网络得到的是关节点的置信图S,经过Branch2的网络得到的是肢干的矢量图L。F经过Stage1得到S1和L1 ,从Stage2开始,Stage  t网络的输入由前一个网络Stage t-1得到的置信图S和矢量图L加上特征图F组成,表达式如下,

VGG19的前10层网络如下图圈出来的部分。

3、损失函数

每个Stage网络都可以得到两个损失,Stage t网络的损失函数如下,

其中,为通过数据集数据标注的准确的置信图和矢量图,是一个二元掩码,在训练模型时,当数据集未标注某个关节点或关节点无法组成一个肢干时,令W(p)=0,从而避免本次损失“错误”的增大。总损失函数如下,

4、COCO2017数据集介绍

上面用于计算损失的置信图和矢量图是由开源数据集COCO 2017人体关键点检测标注数据和图片数据生成的,链接如下:

http://cocodataset.org/#download

该数据集由Images和Annotations组成,其中,Images是11万多张原始图片,Images又分为train2017数据集和val2017数据集(train2017的图片数量比val2017多很多),分别对应于测试集和验证集。Annotations则是对应的标签,以json文件保存,姿态检测用到的标签是person_keypoints_train2017.json和person_keypoints_val2017.json。

keypoints标签有4个信息组成:info、licenses、images、annotations。我们主要用images和annotations的信息。

images格式及其注释如下,

annotations格式及其注释如下,

我们想要的关键点和连接如下图所示,

COCO数据集的人体关键点共17个,而我们算法里想要的关键点有18个,如上图所示,关键点1(即脖子的那个关键点)是根据左肩和右肩的坐标计算出来的。上面的元组(A, B)则表示以某个关键点A作为起点,关键点B作为终点组成的“肢干”。

5、通过数据集数据生成关节点置信图

模型训练中,计算损失用的置信图是我们根据COCO数据集的数据生成的,代表某个关节点j的置信图,因为我们要检测19个关节点,所以,每张图片要生成19个置信图。先来看一下效果图,

上图左图是原始图像,右图是生成的所有的关节点的置信图,为了方便比较才将原始图像的缩放图作为背景,真正的关节点(所有的关节点)置信图如下图右图所示,

关键点坐标只是一个像素点,怎么做的上图中的样子呢?我们设置一个常量th和,令,

假设关节点(x, y)为人物k的关节点j的坐标,则以A(x0, y0)为左上角坐标,以B(x1, y1)为右下角坐标,由A、B组成一个矩形Z,而关节点坐标为矩形Z的中心。令width和height为图片的宽和高,则x0, y0, x1, y1的定义如下,

示意图如下,

然后,在去遍历矩形Z中的每一个坐标点p,求点p和的高斯核函数,得到置信图中该坐标点p的值,公式如下,

所有人物k的关节点j组成的就组成了该关节点的置信图

6、通过数据集数据生成肢干矢量图

同样的,模型训练中,损失函数中矢量图也是根据COCO数据集生成。

如上图所示,假设表示数据集图片中人物k的肢干c的关节点j1和j2的坐标。如果点p在肢干上,则为j1到j2方向的单位向量,否则,为0,公式如下,

P点满足条件,

其中,是肢干的长度,是肢干的宽度,是单位向量v的垂直向量。

实际计算中,如上图所示,假设肢干两端的关节点坐标分别为(x1, y1)和(x2, y2),分别肢干两端的关节点坐标减去或加上一个阈值th,得到两个新的坐标点(x1-th, y1-th)和(x2+th, y2+th),以这两个坐标点为左上角和右下角得到一个矩阵Z,遍历该矩阵的每一个像素点p,求点p到肢干的距离dist,如果dist<th,则认为点p在属于肢干的上,点p则保存肢干c的方向余弦()和方向正弦()。每一个关节点对应的有一个关节点置信图,而每一个肢干则对应有两个矢量图,分别对应于肢干的方向余弦和方向正弦。的公式如下,

其中,表示这张图中所有人的肢干c的非0矢量个数。

下面给一张由数据集计算得到的肢干矢量图,

由上图可以看出,x轴的矢量图对水平方向的标注更明显,y轴的矢量图对垂直方向的标注更明显。

由训练好的神经网络得到的置信图和矢量图如下图所示,(请忽略图一胸前的两道光,是我后续加上去的)

HeatMap、Vectormap-x、Vectormap-y的背景图都是根据原始图像Image缩放放进去的,只是为了方便比较,预测结果中是不存在这个背景的。

7、评估两点相连的可能性

得到肢干关键点以后,怎么相连?

如上图所示,颜色相同的点表示不同人的同一种关节点,因为我们是自下而上的检测,所以并不知道哪些关键点是属于同一个人的,所以就存在很多种连接的可能。所以就要靠我们预测的矢量图来评估两点相连的可能性。

假设是检测到的两个候选连接关节点,这两个关节点连接成肢干c,现在我们在这两个关节点中间取样,然后用矢量图沿着线段去衡量它们连接的可能性,计算公式如下,

其中,是在之间插入的坐标点,一般是通过等距离抽样来近似求积分,

求得的E越大,则这两个关节点应该连接的可能性就越大。

上面大概的讲了一下人体姿态检测的算法,下一讲,我们就去分析源码咯。

 

其他的都比较好理解,直接看注释好了,后续的博客,我们先看原始论文的算法,再解析源码,这一讲就先到这里了。

如果您感觉本篇博客对您有帮助,请打开支付宝,领个红包支持一下,祝您扫到99元,谢谢~~

  • 11
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值