美文网首页
【CV论文笔记】Realtime Multi-Person 2D

【CV论文笔记】Realtime Multi-Person 2D

作者: 蘑菇轰炸机 | 来源:发表于2020-02-06 22:29 被阅读0次

    本文主要用于介绍与CMU开源项目OpenPose相关的论文。本笔记主要为方便初学者快速入门,以及自我回顾。

    论文链接:http://openaccess.thecvf.com/content_cvpr_2017/papers/Cao_Realtime_Multi-Person_2D_CVPR_2017_paper.pdf

    基本目录如下:

    1. 摘要
    2. 核心思想
    3. 总结

    ------------------第一菇 - 摘要------------------

    1.1 论文摘要

    我们提出了一种高效的检测一张图片中多个人2D姿态的方法。该方法主要运用了一种非参数化的表示方法,我们称之为 PAFs(Part Affinity Fields),去建立一个个体内部关键点的关联关系。而整个框架的设计是一种贪心自下而上的运行思路,且能够考虑整体图片的信息,因此其能够达到高的实时准确率(当然其时效性和准确率肯定还是跟图片中人物的个数有关系的)。整体的架构设计是通过2个相似的序列化预测框架来一起学习关键点的位置和与其他关键点的关联信息。我们的方法在COCO 2016关键点检测大赛中获得了第一名,并且在MPII 多人识别赛上,在时效性和准确率上都远超过往的成绩。

    ------------------第二菇 - 核心思想------------------

    2.1 多人姿态识别的困难点

    多人人体姿态识别一直是一个难点,其难的地方主要有3个,

    1)一张图片中人的个数是未知的,且会以任何一种尺度出现在任何一种位置上。

    2)人与人之间经常会出现遮挡等行为,导致识别出来的关键点在一个个体上建立起联系会很困难。

    3)姿态识别的算法运行时间复杂度是个大问题,且跟人的个数有强关联关系,因此很难做到实时预测。

    最普遍的一种做法就是自上而下的思路,先将一副图中的人物都框出来,然后再在一个人体框内进行关键点的识别。但是这种思路有个先天的不足(且不论时间会随着人的个数增加而增加),那就是,一旦人体框没有识别出来,那这个人身上的关键点就不能识别出来了。并且,这种思路还有个缺陷就是没有利用到全局信息(比如,人与人之间的接触,遮挡等)。这也是本文,尝试一种新的自下而上思路的出发点。

    2.2 架构思路

    直接上一张总的流程图,

    流程图.jpg

    简单来讲整个框架就是对一张图片的输入处理有2个分支,第一个分支是提取关键点的,第二个分支是提取位置相同场(Part Affinity Fields)的,然后再根据前俩个输出的,通过某种匹配算法生成每一个个体的关键点,接下来我们逐一来看每一个步骤。

    2.2.1 Confidence Maps for Part Detection

    我们先理解一下,如何生成关键点的训练置信图。

    我们拿到的标注数据其实就是每一个关键点在图上的2维坐标。那其实我们要生成的标注就是图像上每一个像素点可能是某一个关键点的置信度,因此也是一个2维向量。具体的生成过程是,

    我们首先针对每一个人k都生成一张独立的置信图S^*_{j,k},假设x_{j,k} \in R^2是第k个人身上的第j个关键点,那么对于位置p来说,该点对于第k人为第j个关键点的置信度就是,

    S^*_{j,k}(p) = exp (- \frac{||p - x_{j,k}||^2_2}{\sigma^2})

    生成每一个单独的置信图后,我们再合并(取极大值)所有人的结果,最终生成一张图上的关键点置信图,

    S^*_{j}(p) = max_kS^*_{j,k}(p)

    而这里作者没有取均值,而是取极大值的操作,可以解释为是为了让处于峰值的更为突出明显,而不是被平滑掉~(We take the maximum of the confidence maps instead of the average so that the precision of close by peaks remains distinct),其示意图如下,

    平滑示意图.jpg

    至此,关键点检测的置信图生成算是解释清楚了。

    2.2.2 Part Affinity Fields for Part Association

    上面讲了,我们已经有了所有关键点的检测位置,我们现在还缺的就是如何将这些关键点连起来,即建立关联。PAFs就是去描绘关键点之间关联关系的一种特征表达方式。

    这里先明确一个概念,我们称之为limb,其实就是每俩个关键点之间的连接区域,如下图所示,

    关键点区域连接示意图.jpg

    现在我们来考虑一下单个的limb,如下图所示,

    单个limb示意图.jpg

    假设上面x_{j_1, k}x_{j_2, k}就是第k个人的2个关键点j_1,j_2,那么如果点p在该limb内,那就是一个单位向量的值了,而如果不在,那就是0,因此,我们在生成训练数据GT的时候,我们就定义,

    PAFs值定义.jpg

    其中,

    v = \frac{x_{j_2, k} - x_{j_1, k}}{||x_{j_2,k} - x_{j_1,k}||}

    然后对于点p是否在该limb定义如下,

    计算公式截图.jpg

    (。。。公式打得太麻烦了,直接截图了~比较简单好理解,直接过了~)

    在测试阶段会比较麻烦,对于我们预测出来的关键点,我们都会去给俩个关键点的关联关系打分,而打分的依据就是关键点之间的limb区域中我们预测出来的PAFs的置信图(In practice, we approximate the integral by sampling and summing uniformly-spaced values of u),比如现在要预测d_{j1}, d_{j2},计算的公式如下,

    PAFs预测打分公式.jpg

    至此,PAFs这一块的训练数据GT的生成和预测的打分公式算是讲明白了。

    2.2.1 Simultaneous Detection and Association

    本段我们再来看一下,整体的网络设计框架是如何来预测和训练上面讲的关键点检测和PAFs的。本质上来说仍然沿用了CPM那一套框架,只不过这一次新增了一个分支,用于PAFs的预测,整体的特征提取阶段的架构图如下所示,

    网络架构图.jpg

    在第一阶段,我们会预测目标关键点的置信图和PAF(这俩个概念如上文所述),

    S^1 = \rho^1(F)

    L^1 = \phi^1(F)

    然后在后续阶段迭代式预测中,就是把上一阶段的输出和图片的特征一起输入,表示为,

    S^t = \rho^t(F, S^{t-1}, L^{t-1}), \forall \geqslant 2

    L^t = \phi^t(F, S^{t-1}, L^{t-1}), \forall \geqslant 2

    这里也贴一张原论文中的图,用以表示序列化框架下,每一个阶段都会比上一阶段预测的更好的示意图,

    特征强化示意图.jpg

    而损失函数也十分简单,每一个阶段的损失函数表示如下,

    损失函数.jpg

    那么总的损失函数就是,

    f = \sum^{T}_{t = 1}(f^t_{S} + f^t_{L})

    接下来,我们就去深入理解一下,如何利用预测出来的PAFs最终来生成每一个人的人体关键点。

    2.2.4 Multi-Person Parsing using PAFs

    这一块应该就是整篇文章最难的点了,需要一点算法基础,最好是对图算法略知一二,不然看懂会有点吃力。先上一张示意图,以备后用。

    匹配示意图.jpg

    关键点都检测出来以后,我们可以通过非极大值抑制来获得每一个预测关键点的潜在候选位置(candidates locations)。对于每一个关键点来说,我们都有很多个候选位置,如上图a所示,蓝色的手腕,绿色的手肘,红色肩部。这些候选的区域位置点能够生成多种潜在的limb,当然上面我们也说了,对于每一个limb我们都会有一个打分。因此,这其实就是一个k维的最优匹配问题,如上图b所示,也是一个NP-Hard问题。。。而作者解题的思路就是利用了greedy relaxation(不好翻译,大家意会一下应该能明白)的思想。

    言归正传,我们首先会获取到一系列的预测的关键点(多个人的)表示为,

    D_J = \{d^m_j\ : for \ j \in \{1 ... J\}, m \in \{1 ... N_j\}\}

    其中N_j就是第j个关键点的所有潜在位置,d^m_j就是关键点j的第m个潜在位置点坐标。而我们要做的事情,其实就是把一个属于一个人体的关键点都建立起联系,或者说白了,就是把通过limb建立联系的关键点,通过某种匹配算法,最终只保留那个属于一个人体的连接配对。

    这里再定义一个变量,用来表示所有的配对关系,Z

    Z = \{z^{mn}_{j_1, j_2} : for \ j_1, j_2 \in \{1 ... J\}, m \in \{1 ... N_{j1}\}, n \in \{1 ... N_{j2}\} \}

    其中z^{mn}_{j_1, j_2}的取值范围就是0和1.

    这里分2种情况来讨论,第一种情况比较简单,

    1)我们先来考虑单一配对的情况。这里单一配对的意思就是关键点的两两配对,比如要连线所有的手腕潜在关键点和所有的手肘潜在关键点(意思就是把一个人的手腕和手肘准确连接,且不与其他人的连接)。而我们已知的就是,每一个手腕关键点和每一个手肘关键点的连线权值(其实就是limb的分值),因此问题就很容易被转为加权二分图匹配最大化的优化问题(如上图b所示)。因此,其实用公式描述整个优化问题就是,

    最优化目标公式1.jpg 最优化目标公式2.jpg

    其中E_c就是对某一个limb类型的总的置信度,而整个问题的求解用的是匈牙利算法(Hungarian algorithm,不懂的同学自行谷歌学习把)。

    2)解决了单一配对情况的问题,接下来就要解决全局配对的问题,意思就是要把全身上下的关键点都连起来。显然这是一个巨复杂的NP-Hard问题,没关系,在当前的应用场景下,我们可以做很多假设来增加relaxations。作者主要增加了2个,

    • we choose a minimal number of edges to obtain a spanning tree skeleton of human pose rather than using the complete graph

    • we further decompose the matching problem into a set of bipartite matching subproblems and determine the matching in adjacent tree nodes independently

    简单理解一下,就是用最少数量的边来获得人体姿态的生成树骨架而不是用完整图(如上图c所示),其次,将全局匹配问题转为一组组二分图匹配的子问题(如上图d所示),并独立确定相邻树节点中的匹配问题(用上面第一种情况的解法),因此,最终总的优化目标公式就是,

    最优化目标公式3.jpg

    至此,整一套本文提出的多人体关键点预测的算法框架算是讲明白了。其中涉及的细节真的是好多啊~上面讲的几乎是把整篇论文都要翻译理解一遍了哈哈哈~其他的实验过程训练细节就不多说了,直接上一张最后的效果大图用于本文压轴。

    效果图展示.jpg

    ------------------第三菇 - 总结------------------

    3.1 总结

    到这里,整篇论文的核心思想已经说清楚了。本论文主要是在CPM的基础上进一步优化,新增了PAFs这一基础概念和相对应的匹配算法,用于多人的关键点实时检测,并实验证明了其可行性,为后续发展奠定了基础

    简单总结一下本文就是先罗列了一下该论文的摘要,再具体介绍了一下本文作者的思路,也简单表述了一下,自己对整个网络架构,尤其是PAFs和后续匹配算法的理解。希望大家读完本文后能进一步加深对该论文的理解。有说的不对的地方也请大家指出,多多交流,大家一起进步~😁

    相关文章

      网友评论

          本文标题:【CV论文笔记】Realtime Multi-Person 2D

          本文链接:https://www.haomeiwen.com/subject/atrpxhtx.html