https://github.com/MVIG-SJTU/AlphaPose/tree/pytorch
https://arxiv.org/pdf/1812.00324.pdf
1.传统单人姿态估计loss
传统的单人姿态估计模型的loss(以MSE均方误差为例),对于每个关键点而言,传统的计算loss方式如下:
上图中,一个目标框中只对有效人体的关键点进行回归。不考虑背景中出现的其他人体关键点。正因为这种回归方式,在人体拥挤场景下,一个目标框中往往除了有效的人体前景外,背景部分也会有其他人体的关键点,而这些关键点的存在会导致拥挤场景下关键点回归出现混乱。
2.拥挤人体姿态估计loss
本文提出的CrowdPose算法中使用如下所示的loss(以MSE均方误差为例),整体计算示意图如下:
如上图所示,一个目标框中除了对前景人体关键点进行回归外,还对背景中的人体关键的进行回归。直观来说就是每张GT图中会有多个点,最终回归出来的关键点特征图也会存在多个峰值。使用该种回归方式可以有效抑制背景人体关键点对前景人体关键点的影响。在回归过程中如上图中的loss函数所示,会给背景中的人体关键点分配一个小于1的权重。很显然当权重为零时,该方法就和传统的回归方式一致了。
3.传统单人姿态估计后处理
# -------------------------
preds_hm, preds_img, preds_scores = getPrediction()
result = pose_nms(boxes, scores, preds_img, preds_scores)
如上述代码所示,传统的单人姿态估计的后处理主要包括:
- 从网络输出的特征图中提取到峰值位置,即为关键点位置
- 并以人体为单位对人体关键点进行非极大值抑制。
4.拥挤人体姿态估计后处理
# ----------------------
preds = getMultiPeakPrediction()
result = matching(boxes, scores.numpy(), preds)
如上述代码和上述对拥挤人体姿态训练过程的分析可知,与单人姿态估计不同,由于拥挤人体姿态网络输出的特征图中存在多个峰值,因此从特征图解析关键点时需要用到多峰预测的方法。得到多峰预测的结果后,通过构建Person-Joint图,图以human instance和joint node为节点,每个关键点与人体实例之间的连接为边,关键点的置信度值为边上的权重。如下图所示,最终求得的最大权重子图就是当前得到的人体关键点连接。因为在上述loss计算的时候,我们会抑制背景人体关键点,即最终我们得到的结果,背景人体关键点的响应值应该比前景人体关键点的响应值更低,即对应的边的权重更低。
Note:在match过程中,在构图之前,先把冗余的关键点剔除,具体方法就是判断两个点的欧氏距离,如果小于设定的阈值,就认为是同一个人的同一个点。
网友评论