#
#作者:韦访
#博客: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元,谢谢~~

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

  1. tensorflow入门教程(三十四)疲劳检测之开眼闭眼识别

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

  2. 【OpenCV入门教程之十四】OpenCV霍夫变换:霍夫线变换,霍夫圆变换合辑

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/26977557 作者:毛星云(浅墨) ...

  3. WPF入门教程系列十四——依赖属性(四)

    六.依赖属性回调.验证及强制值 我们通过下面的这幅图,简单介绍一下WPF属性系统对依赖属性操作的基本步骤: 借用一个常见的图例,介绍一下WPF属性系统对依赖属性操作的基本步骤: 第一步,确定Base ...

  4. jdbctemplate mysql 配置_Spring Boot 初级入门教程(十四) —— 配置 MySQL 数据库和使用 JdbcTemplate 测试...

    经过前面几篇文章,包已经可以打了,不管是 jar 包还是 war 包都已测试通过,jsp 页面也可以访问了,但页面上的数据都是在配置文件中写死的,不爽 ~ 到目前为止,最重要的配置还没做,那就是连数据 ...

  5. Spring Boot入门教程(五十四): ETL kettle

    分享一个朋友的人工智能教程.比较通俗易懂,风趣幽默,感兴趣的朋友可以去看看. 一:简介 ETL,是英文Extract-Transform-Load的缩写,用来描述将数据从来源端经过萃取(extract ...

  6. Maven入门教程(十四)-Nexus3.X私服下载资源

    本章节主要讲解如何将私服的资源下载到本地仓库. 从图中我们可以看到,当我们设置了私服后,系统会先在私服中查找是否有需要的资源,如果没有则去远程仓库查找. 具体如何设置私服呢?步骤如下 首先我们需要在m ...

  7. Packet Tracer 思科模拟器入门教程 之十四 路由器综合路由配置

    实验目标 掌握综合路由器的配置方法: 掌握查看通过路由重分布学习产生的路由: 熟悉广域网线缆的链接方式: 实验背景 假设某公司通过一台三层交换机连到公司出口路由器R1上,路由器R1再和公司外的另一台路 ...

  8. 项目管理工具dhtmlxGantt甘特图入门教程(十四):导出/导入 Excel到 iCal

    这篇文章给大家讲解利用dhtmlxgantt导入/导出Excel到iCal的操作方法. dhtmlxGantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表,可满足应用程序的所有需求,是完善 ...

  9. Linux小小白入门教程(十四):查看进程ID

    以下操作在Linux终端进行.Linux因为权限非常严格,所以暂时所有的命令操作全部是在/home文件夹下的/yangjw文件夹下进行./yangjw文件夹就是登录用户名所在的文件夹,出了此文件夹,命 ...

最新文章

  1. matlab shortest函数,MATLAB函數graphallshortestpaths不返回對稱矩陣
  2. Ice “Hello World”的实现
  3. CircleDisplay
  4. [转帖] 世间什么才是最珍贵的?
  5. 安装好Pycharm后如何配置Python解释器简易教程
  6. CORS 跨域-同源策略
  7. Apple 低延迟HLS分析
  8. inotify+rsync
  9. xss攻击中受影响的是服务器还是客户端,安全测试基础之 XSS
  10. Java高级语法笔记-库的使用(jar)
  11. Python filecmp库
  12. python itertools combination_Python itertools.combinations 和 itertools.permutations 等价代码实现...
  13. ConcurrentHashMap 和 Collections.synchronizedMap(map) 比较
  14. 很累很失败,发奋学英语
  15. JavaEE学习10--Ajax
  16. 『信息安全技术』 标准系列合集(467个)
  17. 简述er图的作用_ER图的理解
  18. 【MATLAB航空航天工具箱】学习笔记--闰秒
  19. Linux内核ncsi驱动源码分析(二)
  20. git 修改commit内容(--amend)

热门文章

  1. iOS 开发者账号申请以及发布
  2. VB之比较三个数的大小
  3. python - dict.__reversed__() 无效吗?
  4. android studio TCP客户端通讯
  5. Centos7 防火墙配置
  6. 功能测试之后台会员测试方法
  7. python能做word和excel吗_Python 操作Word(Excel、PPT等通用)
  8. 8路编码器脉冲计数器或16路DI高速计数器,Modbus RTU模块 WJ69
  9. Your branch is up to date with 'origin/master'.但是本地代码却不是最新的
  10. mysql表分段删除_SQL删除数据(分段实现大量数据的删除操作)