姿态估计之2D人体姿态估计 - Single-Stage Multi-Person Pose Machines

颜水成教授团队的,非官方代码:https://github.com/murdockhou/Single-Stage-Multi-person-Pose-Machines

arxivl论文https://arxiv.org/abs/1908.09220 

参见: Single-Stage Multi-Person Pose Machines_MatthewHsw的博客-CSDN博客

针对多人pose这方面,主流的方法分为两类: 

  1. Top-Down solution。先用一个detector检测出来图像上的所有行人,然后针对每一个检测的出来的human box,做单人pose预测,总共需要2步
  2. Bottom-Up solution。先用一个cnn检测出来图像上所有人的所有关键点,再通过一个聚类算法(或者其它方法)对这些点进行区分,将同一个人的点划分到一起,最后得到所有人的关键点,总共需要2步 

以上的方法都是需要经过两个步骤才可以得到最终的multi-person pose,那么有没有一种方法可以一步到位?这就是论文提出的方法,一步到位,一次就可以得到多个人的pose点,所以叫做Single-Stage,

提出的SPM算法跳出传统top-downbottom-up的思路,直接预测每个人的位置和keypoints。

感觉是将yolov3CSP行人检测的思路进行了融合。

Structured Pose Representation (SPR)

  • 将人体实例和身体关节的位置信息进行统一。
  • 人体关节分级表示。

具体看下图:
file

一、基本思路

思路类似anchor-free的Objects as Points,具体如下:

1、定义一个中心点,这个中心点就是这个人的box的中心位置,论文里把它叫作root joint

2、root joint回归出来模型需要检测的某一个人的所有pose点的offset(相对root joint)而言,这样网络只需要最后输出一个 root joint heatmap, 然后heatmap上的每一个位置再回归得到N个offset,就可以得到一个人的所有pose点坐标

3、上面2步其实就是Objects as Points里提到的关于检测pose点的方法,这篇文章对这个更进一步,因为如果直接回归一个人的所有点离root joint的offset,对于离root joint比较远的点,回归起来比较困难(称之为long range displacements),所以,论文对一个人的所有关节点做了分层,共分成4个层次:

  • root joint 为第一层
  • 脖子点、两个肩膀点、两个臀部点为第二层
  • 头部点、手肘点、膝盖点为第三层
  • 手腕点、脚踝点为第四层

4、分层之后,每个root joint同样还是回归N个点的offset,但这offset不再是直接针对root joint的offset,而是root joint直接回归第二层点的offset,然后第三层点的坐标是通过相对于第二层的点的offset得到,第四层点的坐标是通过相对于第三层点的offset得到,这样,root joint得到的N个offset都是short-range的,有利于网络去学习。形象化如下图所示:

在这里插入图片描述

 5、图c是直接通过root joint回归出来N个坐标的形象化,图d是论文改进的一个回归方式,可以看出每个offset都变得很短,这样有助于网络去学习这些offset。

二、SPR表示

想要单阶段实现多人位姿估计,就需要一个统一人体位置和关节位置的表达。

SPR旨在统一人体实例位置信息和人体关节点的信息,提供一个单阶段的多人姿态估计解决方案。SPR引入一个辅助节点(auxiiliary joint)->the root joint : 来表示人体的位置。(x_i^r,y_i^r)表示第 i 个人的root joint。那么第 i 个人的第 j 个节点的位置定义为(x_i^j,y_i^j)=(x_i^r,y_i^r)+(\delta x_i^j,\delta y_i^j)。论文使用的是人体的形心(centroid)作为root joint,(基准关节,这个基准关节就代表了人体实例的位置。)

2.1 基本SPR表示 Structured pose representation (SPR)

每个人体关键就可以表示为基于这一基准关节的偏移。在这样的表达下,检测问题就被转换为了预测每个人体对应的基准关节以及各个关节相对于基准关节的偏移量,两阶段为题就可以通过统一的关节表达而简化为单阶段问题。

 因此,网络只要预测出基准关节的位置和每个关节点相对于基准关节的偏移,即可得到所有关节点的位置。

2.2 基于分层的SPR表示 Hierarchical SPR

人在运动时,有些关节离中心的基准关节偏移太大,直接从图像中回归出这些关节的偏移量难度较大误差也大。针对这个为题,作者借鉴了人体关节自身的天然结构,将关节的位移分为了四个层级,将相对于基准关节的偏移转换为了相对于上一级关节的偏移。

改进SPR之后,减小了偏移估计的难度同时也充分利用了躯干构造的结构信息。

 三、如何实施

如何构造label和网络的输出呢?

首先从原始SPR表示来讲:

3.1 root target : Regression targets for root joint position

label的标签格式,对于root joint来讲,和centernet里的一样,把这个instance的box中心点当作root joint,并以这个点为中心打个高斯核,并在训练的时候,对root joint使用L2 loss计算

采用高斯核平滑,首先得到第  个人的 root joint map:

 回归confidence map比直接回归坐标更加准确。C^r代表根节点置信图,C_i^r代表第i个人的根节点置信图。对于给定图片 I 中的位置(x,y)。C_i^r(x,y)=exp(-\left \| (x,y)-(x_i^r,y_i^r) \right \|_2^2/\sigma ^2)(x_i^r,y_i^r)代表root joint的ground-truth。\sigma是经验选择的高斯分布的方差,论文中设置为7。根关节置信度图Cr是所有人的峰值在单一map上的集合。在这里,我们选择取置信图的最大值,而不是取它们的平均值,以保持相邻峰值之间的差异。

对于图中所有的人,若根节点离得很近,高斯区域有重叠,则该点处的值取每个人最大值:

3.2 joint target :Regression targets for body joint displacement

 对于人体的其它关节点来说,首先是根据事先划分的4个层级的顺序,第i层的点负责计算第i+1层的点的偏移,并且是负责离其语义信息最接近的那个点(举例来说,右肩点和右肘点分属第2和第3层级,那么右肘点的偏移就是从右肩点出发得到的offset。虽然右肩和左肩同属第2层级,但很自然的,左肩负责左肘的偏移而不负责右肘的偏移)这样整个人体的关节点偏移指向就和上图2(d)中表示的一样(分成表示的时候)
 

以 joint j 的 label map 为例

论文为每个关节构造了一个密集的位移图。D^j表示关节j  。 D_i^j表示 i 个人的关节 j。对于 image I 中的(x,y),D_i^j(x,y)计算如下:

D_i^j(x,y)=\begin{cases} \frac{(\delta x,\delta y)}{Z} & \text{ if } (x,y)\in N_i^r \\ 0& otherwise, \end{cases}            

其中 

表示第 i 个人的 根节点的领域。

Z=\sqrt{H^2+W^2}标准化因子,H和W是image I 的长和宽。

进一步对于图中所有人,若点(x,y)处有多个人的关节表示,则取所有人的均值:

where Mj is the number of non-zero vectors at position (x, y) across all persons。 

举个例子看一下,以图中只有一个人为例,多人同理:

设root点坐标为(5,5),joint_1坐标为(8,10),joint_2坐标为(6,7),平滑范围设为5,输出feature map大小为10*10.

则root map为: (5,5)处取值

0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0.8 0.8 0.8 0.8 0.8 0 0 0
0 0 0.8 0.9 0.9 0.9 0.8 0 0 0
0 0 0.8 0.9 1 0.9 0.8 0 0 0
0 0 0.8 0.9 0.9 0.9 0.8 0 0 0
0 0 0.8 0.8 0.8 0.8 0.8 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0

joint_1 的 x map 为(y map同理):

0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0.355 0.284 0.213 0.142 0.071 0 0 0
0 0 0.355 0.284 0.213 0.142 0.071 0 0 0
0 0 0.355 0.284 0.213 0.142 0.071 0 0 0
0 0 0.355 0.284 0.213 0.142 0.071 0 0 0
0 0 0.355 0.284 0.213 0.142 0.071 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0

joint_2 的 x map 为(y map同理):

0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0.213 0.142 0.071 0 -0.071 0 0 0
0 0 0.213 0.142 0.071 0 -0.071 0 0 0
0 0 0.213 0.142 0.071 0 -0.071 0 0 0
0 0 0.213 0.142 0.071 0 -0.071 0 0 0
0 0 0.213 0.142 0.071 0 -0.071 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0

joint_1joint_2的父节点,对于改进后的分层SPR,root map joint_1map 同上,joint_2x map 变为 (y map同理) :

0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 -0.142 -0.142 -0.142 -0.142 -0.142 0 0 0
0 0 -0.142 -0.142 -0.142 -0.142 -0.142 0 0 0
0 0 -0.142 -0.142 -0.142 -0.142 -0.142 0 0 0
0 0 -0.142 -0.142 -0.142 -0.142 -0.142 0 0 0
0 0 -0.142 -0.142 -0.142 -0.142 -0.142 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0

之所以中间5*5区域内取值全部为 -0.142 ( (6-8)/\sqrt{10^{2}*10^{2}} ),考虑到在预测时若中心点预测发生偏移,则不会影响后面关节点预测。

四、网络结构和loss

作者使用Associative Embedding中的Hourglass作为骨架网络,预测两个东西。一个是root joints的置信图,相当于预测每个人的中心在哪,另一个预测的是关节点偏移量的图,这里对每个root节点周围半径为r的圆内的每个点进行K张图的预测,预测的是这个点出发到各个关节点的offset除以一个归一化量,这样取root图中local max的点作为root,就可以算出其各个关节点的位置,所以这是一个single-stage的网络。但是,有些关节点与root会比较远,直接预测offset不太准,作者进行了改进:作者把关节点分为几个层次,root joint为第一层,脖子点、两个肩膀点、两个臀部点为第二层,头部点、手肘点、膝盖点为第三层,手腕点、脚踝点为第四层,然后在回归offset的时候,第一层回归点到第二层的offset,第二层回归到第三层的offset,以此类推,这样回归的offset都是short的,比较准确,网络学习起来也更容易。在COCO上的mAP为66.9%,不高不低吧,很多细节还能改进,这篇文章root+offset的single-stage的思想是值得去思考的。

paper中采用了多stage的Hourglass作为主干网络。SPM利用了8阶段的Hourglass沙漏网络作为基础网络,下图为其中的一个阶段的示意图。在最初的设计中,沙漏网络利用一个分支来预测人体关节置信度图,用于单人姿态估计。在本文中,SPM利用沙漏网络的置信回归分支来回归root节点的置信图。此外,SPM通过添加位移回归分支扩展了沙漏网络,以估计人体关节位移密度图。通过这种方式,SPM可以在单次向前传递中生成SPR模型结果。最终通过SPR模型,就可以进行多人姿态估计。 

Root joint:L2 Loss

Body joint:smooth L1 Loss

   第一部分用的MESLoss,第二部分就是smooth L1了,采用了每个stage都有中继监督,用于防止梯度消失。

五、效果

问题:

论文的做法在不同的数据集上都达到了速度与精度的高度平衡,非常棒,具体图表可以参照论文。但仍然有些不是很清楚的地方:

  • 模型的label怎么打?回归得到的N个offset有什么固定顺序吗?是不是右肘只负责回归右手腕的offset?
  • 论文说heatmap用l2 loss, 回归的offset用smooth l1 loss,但我尝试过用centernet的做法回归得到17个pose点,效果并不好,里面是不是还有其它trick?
  • 预测关节点偏移 map 的同时,同时再预测一个关节点存在性 heatmap

  • 人形检测姿态估计放在同一个网络中进行预测,采用CSP的方式预测人形框的宽和高?

猜你喜欢

转载自blog.csdn.net/light169/article/details/125272738