前言:

最近在开发运动计数APP,需要用到姿态估计相关的算法。于是对这一领域的算法进行了总结。如下图所示为姿态估计的一些经典论文。这其中OpenPose的影响力可以说是非常大的了,由于其开源做的好,论文,代码,教程,文档,模型都非常丰富,因此有很多项目都是基于OpenPose的。并且其bottom-up的核心算法PAF也非常值得学习。本期就对OpenPose进行一个详细的讲解,力争用最白话的语言把内容核心算法讲透彻。

网络结构

​如下图所示为OpenPose的网络结构:

首先由主干网络VGG19提取图片的特征,然后进入到stage模块,stage是一些串行的模块,每个模块的结构和功能都是一样的。分成两个branch,一个branch生成pcm,一个branch生成paf。并且每个stage的pcm和paf都会进行loss求解。最后总的loss是所有loss的和。​这里考虑一下为什么需要多个stage呢?理论上第一个stage已经可以输出完整的信息了,为什么还需要后面重复的stages呢。这是因为关键点之间有相互的语义信息,例如在stage1中,可能只检测出了眼睛,但是没有检测出鼻子,在stage2中,由于输入中带有satge1的输出,那么stage2就更有更可能根据眼睛再推测出鼻子的位置,因此后面的stage可以利用前面stage提取的信息,进一步优化检测结果,对于一些比较难检测的关键点很有作用。更直白一点的解释就是所有关键点的检测难易程度是不一样的,有一些眼睛,鼻子等视觉特征非常明显,而有一些关键点可能会随着衣着,遮挡,首饰等有非常大的变化,因此前面的stage检测一些简单的关键点,后面的stage再根据前面检测出的关键点检测更复杂一些的关键点,这是一个渐进优化的过程。

白话PCM

PCM其实就是关键点的热力图。Part confidence map。用来表征关键点的位置。假设需要输出18个人体关键点信息,那么PCM会输出19个通道,最后一个通道作为背景。理论上不输出背景也没有什么关系,但是输出背景有两个好处,一是增加了一个监督信息,有利于网络的学习,二是背景输出继续作为下一个stage的输入,有利于下一个stage获得更好的语义信息。下图是输入一张图片,输出19个PCM的示意图。

虽然说一个关键点对应的是一个pcm中的一个像素,但是一般不这么做,一般会用高斯核来创建PCM的GroundTruth。如果没有高斯核,那么gt附件的点被强制当做负样本来学习,但是实际上该点对应的感受域(黄色虚线框)其实与gt点对应的感受域(红色虚线框)非常接近,导致神经网络很迷惑,这到底是有还是没有关键点?甚至有的时候由于标注存在误差,可能标注的gt点反而没有旁边的负样本点准确,那么神经网络就更迷惑了,学个XX啊。一会跟我说圆的是苹果,一会有跟我说圆的是梨,让我怎么个学呢?因此用高斯核的PCM ground truth能够非常好的缓解这个问题。因为标签点附件的点已经不是简单的当做负样本,还是根据高斯分布同样作为正样本,只是置信度稍低一点,这更符合逻辑。

白话PAF

PCM是大部分的关键点检测网络里面都会用到的技术,相信很多朋友都已经有所了解,而PAF则是openpose的核心,是openpse区别于其他关键点检测框架的最大特性。中文可以翻译为关键点的亲和力场,用来描述不同关键点之间的亲和力。属于同一个人的不同关节,亲和力大,不同人之间的关节,亲和力小。由于openpose是一个bottom-up的姿态估计网络,也就是先不管关节是谁的,先一股脑的检测出来,然后接下来再确定哪些关节的亲和力大,那么把它们划分为同一个人。如下图所示,由于图片中有两个人的实例,检测出了两个左眼与两个左耳,那么如何进行配对呢?此时就是PAF的作用了,PAF会描述任意两个关节之间的亲和力(例如检测出2个左眼与2个左耳,那么每个左眼都能得到和所有左耳的亲和力,也就是一共有4个亲和力),如下图所示,颜色越黄,表示两个关键点之间的亲和力越强,左耳的1点与左眼的1点亲和力明显大于左眼1与左耳2,因此将左眼1与左耳1进行配对。同样的左耳2与左眼2的亲和力更大,因此将左耳2与左眼2进行配对。

以上是关于PAF作用的描述,那么究竟PAF是如何实现的呢?实际上并不复杂。为了描述方便(接地气),我这里不使用论文中的描述符号和公式,用最直白,接地气的大白话来描述。openpose首先把各个关节进行了人为的配对,如下图所示,一共19对。可以理解成19根骨骼,每一根骨骼连接了两个关节。一个PAF热图对应一根骨骼。刚开始的时候我怎么也不明白,18个关节直接怎么会连出19根骨骼,最后把所有骨骼画出来才明白。原来有的关节可以在多跟骨骼上面,而且openpose增加了耳朵和肩膀之间的虚拟骨骼。如下图红色连接所表示的虚拟骨骼,所以一共是19根骨骼,也就是19个PAF场。由于PAF是用向量来表示的,因此PAF的输出通道是19*2=38,因为一个向量需要由x和y两个标量表示,因此PAF输出通道是19的2倍。

PAF具体是怎么表达的呢?来看一根左胯到左膝盖的连接骨骼对应的PAF场,首先我们知道骨骼在真实世界中是有长度和宽度的。长度就是骨骼两端的两个关节之间的距离,那么骨骼的宽度呢?可以通过超参来设置,例如假设该骨骼的宽度为α,那么我们可以定义在骨骼内的点亲和力向量不为0,在骨骼外面的点的亲和力向量为0.

如上图所示,红色的点在骨骼内,所以在PAF场中就是非零向量,绿色的点在骨骼外面,所以在PAF场中用0向量表示。那么有意义的红色点的向量是多少呢?openpose使用了从一个关节指向另一个关节的单位向量来表示,即图中黄色向量的单位长度向量来表示。因此最终的PAF场如下图所示(蓝色部分为0向量区域):

如果某一个像素点在多个骨骼内部,那么该像素点的PAF向量取所有向量的均值向量。

亲和力的快速计算

虽然有了PAF场,那么如何计算两个关键点之间的亲和力呢?理论是需要该骨骼内的所有向量的积分。但是这样计算量代价太大了,实际上可以通过均匀采样的方式。例如将两个关节之间均匀的分为5段,然后采集4个点的paf向量作为最终的亲和力表示,因为所有骨骼都采样相同的做法,随意最后的亲和力相对大小还是得到保证的。如下图所示,这样的话,计算量可以降低很多。

关键点配对

说实话,刚开始我觉得有了PCM和PAF,那么进行配对应该不是问题,例如通过PCM得到3个左耳,3个左眼,再根据他们之间的PAF亲和力,把亲和力最大的配对就行了。例如下图这样的:

但实际上,PAF学的没有这么智能,有的时候很多亲和力是比较接近的,根本无法根据最大值来简单的配置。例如左耳点1可能与左眼1的亲和力最大,但是左眼1却与左耳2的亲和力最大。这样的话简单的最大值配对就会出现一些问题。

实际上这是图论里面的二分图查找组大匹配问题。因此直接使用匈牙利算法进行最大值匹配即可。关于匈牙利算法,其实也不难理解,网上有很多讲的很好的教程,有兴趣的朋友可以​查阅相关资料。

@end(有共同技术爱好的朋友可以加我微信,共同学习,共同进步: 15158106211)

[多图/秒懂]白话OpenPose,最受欢迎的姿态估计网络相关推荐

  1. 图匠数据等提出高精度零售货架姿态估计算法GSPN

    导语 近日,ImageDT图匠数据联合江西科技师范大学在<IEEE Transactions on Industrial informatics>(国际工业电子学会顶刊/中科院A类期刊/影 ...

  2. OpenPose 升级,CMU提出首个单网络全人体姿态估计网络,速度大幅提高

    点击我爱计算机视觉标星,更快获取CVML新技术 昨天,曾经开源OpenPose的卡内基梅隆大学(CMU)公布了ICCV 2019 论文 Single-Network Whole-Body Pose E ...

  3. Openpose+Tensorflow 这样实现人体姿态估计 | 代码干货

    作者 | 李秋键 出品 | AI科技大本营(ID:rgznai100) 人体姿态估计指从单个 RGB 图像中精确地估计出人体的位置以及检测骨骼关键点的位置.人体姿态估计是计算机视觉领域的研究热点,是诸 ...

  4. 腾讯优图刷新人体姿态估计国际权威榜单,相关论文被ECCV2020收录

    本文转载自腾讯优图. 近日,腾讯优图实验室在人体2D姿态估计任务中获得创新性技术突破,其提出的基于语义对抗的数据增强算法Adversarial Semantic Data Augmentation ( ...

  5. 一幅图秒懂LoadAverage(转载)

    转自:http://www.habadog.com/2015/02/27/what-is-load-average/ 一幅图秒懂LoadAverage(负载)   一.什么是Load Average? ...

  6. InnoDB架构,一幅图秒懂!

    InnoDB架构,一幅图秒懂! 原文作者: 58沈剑 网上写MySQL架构的文章比较多,写InnoDB架构的文章比较少,今天简单说说InnoDB架构. 画外音:一分钟,一幅图,秒懂. MySQL简要架 ...

  7. i9 9900k mysql_i9-9900K性能如何 CPU天梯图秒懂i9-9900K性能排行

    熟悉DIY市场的小伙伴都知道,那就是去年10月初,Intel正式发布了酷睿八代处理器,而刚好时隔1年时间,Intel正式发布了第九代酷睿处理器,其中首发的有三款新品,对于这发布的三款产品当中,定价和定 ...

  8. gtx1660是什么级别的_显卡天梯图秒懂GTX1660Ti性能 GTX1660Ti相当于什么显卡

    GTX1660Ti是NVIDIA二月份刚发布的一款显卡,从命名上看,它是历代英伟达显卡中,最"6"的显卡,名称中包含了3个6字.作为上一代甜品级GTX1060的继任者,而颇受关注. ...

  9. gtx1660是什么级别的_GTX1660相当于什么显卡 三月显卡天梯图秒懂GTX1660性能

    3月14日,NVIDIA新款GTX1660显卡上市,非公版显卡起售价普遍为1799元起,相比上市已久,目前售价1600元左右的GTX1060相对贵一些.GTX1660T相当于什么显卡?其大致是什么性能 ...

最新文章

  1. apigw鉴权分析(1-2)腾讯开放平台 - 鉴权分析
  2. python类的动态方法是什么_如何在python中为类动态创建类方法
  3. 如何使用ZBrush和3DMAX雕刻一个百夫长?
  4. 微信小程序wepy框架资源汇总
  5. php ajax loading图片居中显示,php-通过ajax框架加载漂亮照片
  6. XML 与动态添加控件
  7. android命名管道创建使用
  8. Kylin兼容性问题解决
  9. windows搭建yolo环境
  10. poj 3984 迷宫问题(bfs 打印路径)
  11. Klevgrand Tines for Mac(电钢琴模拟插件)
  12. 【三维路径规划】基于matlab遗传算法无人机三维路径规划【含Matlab源码 1526期】
  13. 欧拉角科普介绍 Roll Pitch Yaw
  14. win7怎么重置计算机,win7系统怎么重置网络?win7重置网络到初始状态的方法
  15. 360极速浏览器打不开国内网站的一种解决方法
  16. 如何入门Python之Python基础教程详解
  17. Android Things:外设I/O接口-UART
  18. sql脚本语言中的循环语句介绍
  19. 第1章 蓝牙降噪耳机简述
  20. Mac 截取一个视频中部分片段(命令行方法)

热门文章

  1. 第六天,字典Dictionary
  2. 1、Hive原理及查询优化
  3. 用户和组相关的配置文件总结
  4. 轻量级 Java Web 框架技术选型
  5. VC2010下Qt5的中文乱码问题
  6. ASP.NET夜话之21:asp.net网站的性能优化
  7. C#连接池的详细分析(转)
  8. --- struts数据源配置(详解)---
  9. 查询显示注释_SQL汇总--简单查询
  10. mysql sum计算效率很慢_MySQL基础之分组函数