参考代码:openpose
1. 概述
导读:这篇文章提出了一种bottom-up的2D图像多人关键点(躯干/手脚/面部,使用掩膜控制训练整合数据集)检测算法,这样使得整体网络的运算时间并不与图像中人数呈现显著相关的关系。在这篇文章中提出了PAFs(Part Affinity Fileds)(用于去编码关键点的位置与方向信息),用于去建模每个部位之间的相互关系,并且文章发现同时去优化PAFs和人体的部位并不是最优的选择,先去优化PAFs而不是同时去优化它们两个能带来更好的性能表现。这篇文章的方法也是涵盖了人体大致的关键点检测问题,还是很具有意义和借鉴价值的,值得细读(在1080 Ti上能跑到22FPS,VGG19)。
2D图像人体姿态估计面临的问题:
- 1)输入图像中的人数,呈现的姿态与大小都是不固定的;
- 2)人与人之间是存在接触遮挡等情况的,这就导致较为复杂的空间关系;
- 3)图像中人数的增加会使得整个算法的运算时间也增加;
现有的人体关键点的检测方法分类:
- 1)top-down:这类方法是首先运行一个人检测器,之后在每个人的基础上计算得到人体姿态,这样好处是能够很好使用现有的一些检测技术,并且效果也不错。但是由于人与人之间复杂的空间关系使得检测器是也很难准确框出每一个人,而且随着人数的增加对应的整体算法运行时间也会成比例增加;
- 2)bottom-up:这类方法是首先检测整幅图中所有人的关键点信息,之后将这些关键点组合起来从而得到一个人的关键点,这样就使得整体关键点检测与人数解耦,这样可以加快整体的速度;
而文章的方法是通过bottom-up的方式进行关键点检测的,下图中上半部分是在2D图像中多人关键点检测的结果,下半部分是文章使用PAFs得到的关键点之间的联系关系图,用于将不同位置的关键点连接起来。
2. 方法设计
文章的整体算法流程见图2所示:
对于一张输入的图像 h ∗ w h*w h∗w,首先会在其基础上预测出关键点的特征图 S = ( S 1 , S 2 , … , S J ) , S j ∈ R w ∗ h , j ∈ { 1 , … , J } S=(S_1,S_2,\dots,S_J),S_j\in R^{w*h},j\in \{1,\dots,J\} S=(S1,S2,…,SJ),Sj∈Rw∗h,j∈{
1,…,J},分别代表不同的关键点部位。之后会预测出关键点之间关系的向量 L = { L 1 , L 2 , … , L c } , L c ∈ R w ∗ h ∗ 2 , c ∈ { 1 , … , C } L=\{L_1,L_2,\dots,L_c\},L_c\in R^{w*h*2},c\in \{1,\dots,C\} L={
L1,L2,…,Lc},Lc∈Rw∗h∗2,c∈{
1,…,C},对应的就是图中b,c部分。最后在PAFs的基础上使用贪心算法得到人体关键点的连接关系。
2.1 网络结构
文章的提出的关键网络结构部分见下图所示:
这里使用迭代的形式 t ∈ [ 1 , … , T ] t\in [1,\dots,T] t∈[1,…,T]递归优化关键点间关系预测与关键点定位(在相同条件下文章的实验结果表明将关系预测放在定位之前能带来更好的性能,反过来则不能带来结论就不成立),并且在对应的部分都有设置损失函数进行监督,从而级连优化回归的目标。而且文章还将之前论文中的 7 ∗ 7 7*7 7∗7的卷积替换成为了类似DenseNet的3个 3 ∗ 3 3*3 3∗3卷积的形式,从而使得在网络的精度和速度上均有所改善。
2.2 优化关键点定位于关联性
这篇文章使用VGG-19作为其backbone,其产哼的特征图为 F F F,之后送入关键点关联性预测得到 L 1 = ϕ 1 ( F ) L^1=\phi^1(F) L1=ϕ1(F),对应的上角标代表的是不同的迭代优化轮数。之后的关键点关联性采用迭代优化的形式进行:
L t = ϕ t ( F , L t − 1 ) , ∀ 2 ≤ t ≤ T p L^t=\phi^t(F,L^{t-1}),\forall 2\le t\le T_p Lt=ϕt(F,Lt−1),∀2≤t≤Tp
而关键点的定位也是跟关键点关联性预测类似的过程,完成最后的关联性预测之后于之前的特征整合就可以用来预测关键点: S T p = ρ t ( F , L T p ) , ∀ t = T p S^{T_p}=\rho^t(F,L^{T_p}),\forall t=T_p STp=ρt(F,LT