Openpose最早在2017年提出来,2019年发布改良版和开源库,速度和精度分别增加了约200%和7%。 它属于多人姿态检测中bottom-up的方法,先检测躯体部位,再组成成每个人体。这类方法中最重要的就是如何组合多人画面中分散的关节点,而Openpose提出的一个重要策略就是,PAF,Part Affinity Fields 部位亲和场, 用来对分散的关节点之间建立联系。
PAF乍一听不好理解,我们拆开来一层一层看:
这是一个向量场的集合,其中每一个向量场从属于图像中某一躯体部位,向量场中的每一个向量对应躯体部位区域每一个元素在其中的一个2D向量编码指向下一个关键关节的方向。

PAF部位亲和场
整个区域所有像素的编码向量(一个像素可能对应多个躯体部位)求和平均组成了PAF。看下图,训练时如果P点在部位区域内,P点的向量的ground truth就是归一化的向量, 如果不在就是零向量。

由于多人图像中有很多个潜在的躯体部位,最终用来做判断的是所有躯体部位对应的向量场的求和平均。另外我们还需要判断关键点之间的 “亲和” 度,好进行最后的组合,用

关键点置信图
通过标记好的2D关键点生成置信图


用PAF进行多人预测

用,
表示关键点
,
的个数,用一个0到1之间的变量
表示两个关键点之间是否是相连的,那么所有可能的
组成一个集合。这个集合是一个图形结构(上图(a)),每条边用
作为权重,我们的目标就是使用匈牙利算法最大化所有边的总和。匈牙利算法在openpose的应用例子还可以参考这篇博客。


作者采用了两个松弛方法简化问题:
- 选择最小数量的边来获得人体姿势的树骨架,而不是使用完整的图,如上图(b)和(c)对比。
- 进一步将匹配问题分解为一组二分图匹配子问题,并独立地确定相邻树节点中的匹配情况。
模型
模型是基于2016年的Convolutional Pose Maschine, 下图中F是经VGG-19前10层作为主干网络处理之后的特征图,ρ 负责预测所有置信图 (所有相同部位在同一个图),Φ负责预测所有PAF (每个部位单独占一个)。2017版使用两个分支的多级CNN,19版加深了网络结构,砍掉了置信图的Refine,另外把7*7卷积核换成了3个相连的3*3卷积核,这样既保留了大的感受野又加快了速度。


目前的模型还加入了冗余的PAF连接(例如,耳朵和肩膀、手腕和肩膀等之间),特别提高了拥挤图像中的准确性。
总结
openpose 用神经网络预测所有躯体关键点的置信图,以及关键点与关键点相连躯体部位区域的PAF部位亲和向量场,再用匈牙利算法最大化两个关键点之间的亲和度总和的方法进行关键点之间的二分图匹配。
