姿态估计之Openpose_原理部分


姿态估计中位置十分显眼的巨作:Openpose

  1. Abstract
    重点查看论文,需要看下它的abstract,本文提出了一个2D的单张图片的多人姿态估计,(现在都出3D的姿态估计了),后面主要采用了PAF的方法以及组合数学中的K分图匹配方法,很优雅的解决了CPM中的多人肢干连接的问题。本文提出的网络结构,首先对全图进行了一个encode,在达到实时性要求的情况下,同时保持了很高的accuracy。本文使用的是联合的多branch分支,一个分支负责关键点的检测,以及关键点的连接成骨架,再通过二分图匹配的匈牙利算法,这样的bottom-up的结构。在2016的coco keypoints的比赛取得了第一名,且在MPII这样的数据集中达到了sota(后续就是hrnet,以及kaiming最近的moco的无监督方法也刷到了sota,实在跟不上了。)

  2. Introduction
    在文章中,提出了pose estimation的以下挑战。
    (1). 图像中的人数位置,他们可能出现在任何位置,且大小不一。
    (2). 在相互接触,以及遮挡等不好的情况都会对关键点的检测造成困难,同时随着人数的数量增加,运行时间的复杂度,也会上升,使得实时的表示成为一个挑战。这种方法,主要采用的是检测+singel person eatimation。但是这种方法十分依赖检测的准确率,如果检测凉了,那么后面的key point还找啥呀。
    (3). 如果检测极其叼,但是有30个人,那么需要进行30重复的单人人体姿态估计,这样使这个方法在复杂场景下就会变得十分缓慢。

  3. Method
    本文,主要针对的还是bottom-up的方式,采用PAF(Part Affinity Fieilds)(咋翻译?部件亲和场?),来进行自下而上的人体姿态估计。首先借鉴的CPM的方法,检测出人关键点的位置,比如图片上人体右肩膀的位置,得到检测结果是通过预测人体关键点的heatmap,这样就可以看到每个人体关键点上都有一个高斯的峰值,代表网络预测出这里是一个人体的关键点,同样对其他所有人的关键点进行同样的结果,得到这个检测结果,在得到检测结果之后,对关键点加测结果进行连接。在进行连接的时候,主要采用的就是PAF(后续进行说明,一堆数学问题)。
    所以整个过程如下所示:

    首先输入一张图片,如图a所示,经过网络,得到b为一堆heatmap,其实每个heatmap都表示不同人的同一个关键点,如图是左手的中间轴点,以及左肩的位置,和c图的PAF这样的集合,再通过d的二分图匹配,得到e的解析后的结果,emmm。。。perfect。

  4. Simultaneous Detection and Association
    主要的网络示意图等如下。

    其中PAFs是用来描述像素点在骨架中的走向,用\(L(p)\)来进行表示,关键点的相应用\(S(p)\)来进行表示。首先网络通过VGG-19前10层进行初始化并微调,在经过pretrain-model进行骨架后,会有两个branch,来分别进行回归\(L(p\)以及\(S(p)\)。在每一个stage都算一次loss之后,将L以及S以及原始的输入F进行concatenate,送入下一个stage再进行训练。其中训练的loss采用的是l2范数。S和L的gt都是采用标注的关键点,如果某个关键点在标注中不存在,就不标注这个点。经过途中所示的网络,网络氛围上下两个分支,每个分支都是t个阶段进行不断的微调,且每个阶段都会将feature maps进行融合,其中\(\rho \varphi\)表示的是网络。

    其中上图是比较粗糙的输出结果。
    主要的L2 loss为:

\[\begin{array}{l}{f_{\mathrm{S}}^{t}=\sum_{j=1}^{J} \sum_{\mathrm{p}} \mathrm{W}(\mathrm{p}) \cdot\left\|\mathrm{S}_{j}^{t}(\mathrm{p})-\mathrm{S}_{j}^{\cdot}(\mathrm{p})\right\|_{2}^{2}} \\ {f_{\mathrm{L}}^{t}=\sum_{i=1}^{C} \sum_{\mathrm{p}} \mathrm{W}(\mathrm{p}) \cdot\left\|\mathrm{L}_{c}^{t}(\mathrm{p})-\mathrm{L}_{c}^{*}(\mathrm{p})\right\|_{2^{+}}^{2}}\end{array} \quad f=\sum_{t=1}^{T}\left(f_{\mathrm{S}}^{t}+f_{\mathrm{L}}^{t}\right) \]

  1. Confidence Maps for Part Detection
    对于部件的检测等:

    再给出标注数据计算gt \(\mathbf{S}^{*}\)的时候,每个confidence map都是一个2D的表示,理想情况下,当图像中值包含一个人时,如果一个关键点是可见的话,对应的confidence map中只会出现一个峰值,而当图像中有多个人时,对于每一个人k的每一个可见关键点j在对应的confidence map都会有一个峰值。如上图所示,首先给出每一个人k的单个confidence maps,\(x_{j, k}\in\mathbb{R}^{2}\)表示图像中人k对应的位置j对应的gt position。\(\mathbf{S}_{j, k}^{*}(\mathbf{p})=\exp \left(-\frac{\left\|\mathbf{p}-\mathbf{x}_{j, k}\right\|_{2}^{2}}{\sigma^{2}}\right)\)其中\(\sigma\)用来控制峰值在confidence map中的传播范围,对应多个人的confidence map如下所示。这里用最大值能够更加准确的将同一个feature maps中confidence map的峰值进行保存起来。网络在位置P的预测值对应的GT位置 计算是如上图所示,取最大值\(\mathbf{S}_{j}^{*}(\mathbf{p})=\max _{k} \mathbf{S}_{j, k}^{*}(\mathbf{p})\)。在预测阶段网络通过NMS来获得最终的置信度。
  2. Part Affinity Fields for Part Association

    在找到了很多关键点之后,我们怎么将它连接起来,这是一个很难的问题。特别是多人姿态估计的时候,上图中关键点之间存在的关系可能存在很多种可能。本文提出了PAFs部件亲和场同时保持了肢体区域之间的位置关系跟方向关系,每种类型的肢体都会有连
    接其两个关联部位对应的亲和场。
    以论文中图为例子:

    图像中的\(\mathbf{X}_{j_{1}}, k\)以及\(\mathbf{X}_{j_{2}}, k\)分别表示第k个人的肢体c的两个身体部件j1以及j2的gt位置,如果点p落在了肢体c上,那么\(\mathbf{L}_{c, k}^{*}(\mathbf{p})\)的值为j1指向j2的单位向量,不在这个肢体上的点p为0.
    为了在训练过程中评估\(f_{L}\),定义PAF在点p的GT值为\(\mathbf{L}_{c, k}^{*}(\mathbf{p})=\left\{\begin{array}{ll}{\mathbf{v}} & {\text { if p on } \operatorname{limb} c, k} \\ {0} & {\text { otherwise }}\end{array}\right.\),其中\(\mathbf{L}_{c, k}^{*}(\mathbf{p})=\left\{\begin{array}{ll}{\mathbf{v}} & {\text { if p on } \operatorname{limb} c, k} \\ {0} & {\text { otherwise }}\end{array}\right.\)表示的是肢体的单位向量。
    \(0\leq\mathbf{v}\cdot\left(\mathbf{p}-\mathbf{x}_{j_{1}, k}\right)\leq l_{c, k}\text{and}\left|\mathbf{v}_{\perp}\cdot\left(\mathbf{p}-\mathbf{x}_{j_{1}, k}\right)\right|\leq\sigma_{l}\)范围内的点p被定义为在肢体c上,其中\(\sigma_{l}\)代表肢体的宽度,\(l_{c, k}=\left\|\mathbf{x}_{j_{2}, k}-\mathbf{x}_{j_{1}, k}\right\|_{2}\)代表肢体的长度。
    点p在部件亲和场GT值为所有人在此点上PAF的平均值,\(\mathbf{L}_{c}^{*}(\mathbf{p})=\frac{1}{n_{c}(\mathbf{p})} \sum_{k} \mathbf{L}_{c, k}^{*}(\mathbf{p})\),其中\(n_{c}{(p)}\)表示非零向量的个数。
    而在预测的阶段中,对于两个候选的部件点\(d_{j1}\)\(d_{j2}\),我们沿着线段采样预测得到PAF \(L_{c}\),以测量两个部分之间的关联置信度,\(E=\int_{u=0}^{u=1} \mathbf{L}_{c}(\mathbf{p}(u)) \cdot \frac{\mathrm{d}_{j_{2}}-\mathbf{d}_{j_{1}}}{\left\|\mathbf{d}_{j_{2}}-\mathbf{d}_{j_{1}}\right\|_{2}} d u\),其中\(p{(u)}\)代表两个身体部件之间的位置:\(\mathbf{p}(u)=(1-u) \mathbf{d}_{j_{1}}+u \mathbf{d}_{j_{2}}\),实际预测时对u区间进行均匀间隔采样求和来求解近似的积分值。
  3. Multi-Person Parsing using PAFs
    多人的PAF解码解析工作:

    接下来就是最后将PAFs的结果进行解码了,我们对预测的置信图进行nms操作后,可以得到一组离散的候选身体部位,对于每一个部件存在多个候选,因为图像上有多个人的情况,从这些候选部件可以定义为一个很大的可能肢体结合,通过上面的积分公式,计算每一个候选肢体得到的分数。
    在本文中,提出了greedy relaxation的方法来产生高质量的匹配:
    (1). 首先根据预测置信图得到离散的候选部件\(\mathcal{D}_{\mathcal{J}}=\left\{\mathbf{d}_{j}^{m}: j \in\{1 \ldots J\}, m \in\left\{1 \ldots N_{j}\right\}\right\}\),其中\(d_{j}^{m}\)代表身体部件j的第m个候选关键点的位置,\(N_{j}\)表示j的候选点的个数。
    (2). 我们的匹配目标是要求候选部位和统一个人的其他候选部件进行连接,首先定义变量\(z_{j_{1} j_{2}}^{m n} \in \{0,1\}\)用来表示两个候选部件\(\mathbf{d}_{j_{1}}^{m}\) and \(\mathbf{d}_{p}^{n}\)之间是否有连接。所有候选部件的连线集合为
    \(\mathcal{Z}=\left\{z_{j j_{2}}^{m n}: \text { for } j_{1}, j_{2} \in\{1 \ldots J\}, m \in\left\{1 \ldots N_{j_{1}}\right\}, n \in\left\{1 \ldots N_{j_{2}}\right\}\right\}\)
    (3). 单独考虑肢体\(c\)所对应的两个身体部件\(j_{1}\)\(j_{2}\),目的是找到总亲和值最高的图匹配方式,定义总亲和值为:\(\max _{\mathcal{Z}_{c}} E_{c}=\max _{\mathcal{Z}_{c}} \sum_{m \in \mathcal{D}_{N}} \sum_{n \in \mathcal{D}_{j_{2}}} E_{m n} \cdot z_{\text {Jil }}^{m n}\), 其中\(\forall m \in \mathcal{D}_{j_{1}}, \sum_{n \in \mathcal{D}_{j_{2}}} z_{j_{1} j_{2}}^{m n} \leq 1\)
    \(\forall n \in \mathcal{D}_{j_{2}}, \sum_{m \in \mathcal{D}_{j_{1}}} z_{j_{1} j_{2}}^{m n} \leq 1\), \(E_{mn}\)代表的是\(d_{j1}^{m}\)\(d_{j2}^{n}\)之间的亲和度。注意:同类型的两个肢体没有公共点。
    (4). 当考虑多人的全身姿态估计是,就是一个K分图匹配问题了,可以简化成\(\max _{\mathcal{Z}} E=\sum_{t=1}^{T}\max _{z_{c}} E_{c}\), 人体个肢体独立优化配对,然后将享有相同身体部分的连接组装成人体的全身姿态
posted @ 2019-11-22 23:44  zonechen  阅读(13834)  评论(0编辑  收藏  举报