paper title: Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields
paper link: https://arxiv.org/abs/1611.08050
oral or demo video:https://www.youtube.com/watch?v=OgQLDEAjAZ8
https://www.youtube.com/watch?v=vTC0QKR_uM0
slides:http://posefs1.perception.cs.cmu.edu/Users/ZheCao/Multi-person%20pose%20estimation-CMU.pdf
project:
github:https://github.com/CMU-Perceptual-Computing-Lab/openpose
conf & anthor: CVPR 17,Cao Zhe et al
arXiv submit v1: 2016.12 google citation:1176(2019.07.12)
姿态估计系列:
- DeepPose - human pose estimation via deep nerual networks
- Efficient Object Localization Using Convolutional Networks
- Convolutional Pose Machines
- Human Pose Estimation with Iterative Error Feedback
- Hourglass Network - stacked hourglass network for human pose estimation
- OpenPose - Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields
- RMPE: Regional Multi-person Pose Estimation
- Pose flow: Efficient Online Pose Tracking
- CrowdPose: Efficient Crowded Scenes Pose Estimation and A New Benchmark
主要内容:
文章提出了一种从单张RGB图像中进行多人2D人体关节点检测的方法。多人关节点检测主要需要解决两个问题,一是图像关节点位置的确定,二是各个关节点相互连接关系的确定。这篇文章继承CPM论文中的多级CNN人体检测框架,并使用两个分支分别进行关节点检测和关节点连接关系预测,分别输出confidence map和part affinity fields(PAFs)。文章的主要创新点是PAFs和关节点连接方案,另一特色是极高的运行效率。
(1)关于confidence map
confidence map比较好理解,就是网络的最后输出的各个位置上的存在关节点的概率图。groundtruth confidence map的生成方式如下,对于图片中第k个人的第j个关节点(可见关节点),根据实际的关节点位置,使用一个高斯分布对其进行表示:
S
j
,
k
∗
(
P
)
=
e
x
p
(
−
∣
∣
P
−
X
j
,
k
∣
∣
2
2
σ
2
)
S_{j,k}^*(P)=exp(-\frac{||P-X_{j,k}||_2^2}{\sigma^2})
Sj,k∗(P)=exp(−σ2∣∣P−Xj,k∣∣22)
其中:
- X j , k X_{j,k} Xj,k表示第k个人的第j个关节点在图像中的真实位置;
- σ \sigma σ决定了高斯分布的形状;
图像中多个人的同一个关节点的位置表示高斯分布可能会出现重叠,可以去平均或最大值。论文中是取最大值,以保证较近的两个点的两个尖峰不会因为平均而成为一个尖峰。
S
j
∗
(
P
)
=
M
A
X
k
(
S
j
,
k
∗
(
P
)
)
S_{j}^*(P)=MAX_k(S_{j,k}^*(P))
Sj∗(P)=MAXk(Sj,k∗(P))
在预测的时候,会使用NMS得到候选关节点。
(2)关于PAFs
confidence map可以表示关节点的位置,但是却无法表示关节点之间的关系;特别图像中的人数很多时候,各个关节点之间的关系是一个重要的信息。文章提出PAFs对关节点之间的关系进行建模,PAFs实际上就是一个2维的向量场,同时包含了位置和反向的信息,用来表示关节点之间的关系。如下图:
第k个人的手臂关节点肘部
X
j
1
k
X_{j_1}^k
Xj1k和手腕
X
j
2
k
X_{j_2}^k
Xj2k,点P为手臂上的一点,点P处的PAF的值为:
P
A
F
c
,
k
∗
(
P
)
=
{
V
P
i
f
P
i
n
l
i
m
b
c
0
o
t
h
e
r
w
i
s
e
PAF_{c,k}^*(P)=\left\{ \begin{aligned} V_P & & if\ P\ in\ limb\ c \\ 0 & & otherwise \\ \end{aligned} \right.
PAFc,k∗(P)={VP0if P in limb cotherwise
其中
c
c
c表示关节
j
1
j_1
j1和
j
2
j_2
j2之间的肢干,在上面的图中是前臂部分;
V
P
V_P
VP是P点处的PAF的值,是一个与
j
1
j_1
j1关节点指向
j
2
j_2
j2关节点方向一致的单位向量:
V
P
=
(
X
j
2
k
−
X
j
1
k
)
∣
∣
X
j
2
k
−
X
j
1
k
∣
∣
2
V_P=\frac{(X_{j_2}^k-X_{j_1}^k)}{||X_{j_2}^k-X_{j_1}^k||_2}
VP=∣∣Xj2k−Xj1k∣∣2(Xj2k−Xj1k)
"P in limb c"定义为P在图中蓝色框内,蓝色框的具体范围为:
0
<
u
P
⋅
u
h
<
∣
∣
X
j
2
k
−
X
j
1
k
∣
∣
2
∣
u
P
⋅
u
h
∣
<
σ
l
0<u_P·u_h<||X_{j_2}^k-X_{j_1}^k||_2 \\ |u_P·u_h|<\sigma_l
0<uP⋅uh<∣∣Xj2k−Xj1k∣∣2∣uP⋅uh∣<σl
其中:
- u P u_P uP表示由点 X j 1 , k X_{j_1,k} Xj1,k连接点 P P P的向量;
- u h u_h uh和 u v u_v uv分别表示 u P u_P uP的两个相互垂直的分量;
- l c , k = ∣ ∣ X j 2 k − X j 1 k ∣ ∣ 2 l_{c,k}=||X_{j_2}^k-X_{j_1}^k||_2 lc,k=∣∣Xj2k−Xj1k∣∣2, σ l \sigma_l σl是关于 l l l的函数;
在包含多个人的图像中,PAF的ground truth是图像中所有人各自的PAF的平均值,即:
P
A
F
c
∗
(
P
)
=
1
N
c
(
P
)
P
A
F
c
,
k
∗
(
P
)
PAF_{c}^*(P)=\frac{1}{N_c(P)}PAF_{c,k}^*(P)
PAFc∗(P)=Nc(P)1PAFc,k∗(P)
其中
N
c
(
P
)
N_c(P)
Nc(P)表示所有人的肢干
c
c
c的非零PAF向量的平均值。在测试阶段,通过计算预测的两个关节点连线上的PAF值的积分来衡量这两个关节点之间的连接关系。实际计算的时候,是从两个关节点的连线上以均等距离采样若干个点累加计算PAF向量值。
(3)使用PAFs描述关节点之间的连接关系
得到关节点的位置之后,需要进行关节点的连接。对于两类关节点(如手肘和手腕),由于图像中存在多个人或者误检的情况,可能会检测到多个候选的关节点,所以需要对这些关节点进行一个合适的匹配,如下图所示。这个问题可以看做是一个最大权重二分图匹配问题,边的权重就是关节点之间的PAFs值,可以通过Hungarian算法求解。
上面说的是两个关节的情况,对于多个人的全身关节连接问题,就称为K维的匹配问题。文中对这个问题做了两个简化,(1)使用最少的关节来获得人体骨骼的生成树,也就是对实际中没有连接关节,直接认为无连接关系,如上图c;(2)将人体关节点连接问题转化为多个二分匹配问题,也就是对于各个肢干上的两个关节分别进行匹配,如上图d。
网络结构:
网络的主要结构可以描述为两条分支,多个stage连接而成。输入的图片首先经过一段卷积网络(VGG-19前10层)处理后,得到的feature map送入两个分支网络,分别预测confidence map和part affinity fields。网络由多个stage级联而成,每个stage结束后会将两个分支的数据合并到一起,送入下一个stage;每个stage都会输出一个中间监督的结果,计算损失(stage级联、中间监督都和CPM一致)。具体如下图:
损失函数:
损失函数由t个stage的所有损失相加得到。在每一个stage中,损失函数包括两部分,confidence map损失和PAF损失,分别如下:
L
S
t
=
∑
j
=
1
J
∑
P
∣
∣
S
(
P
)
j
t
−
S
(
P
)
j
∗
∣
∣
2
2
L
P
A
F
s
t
=
∑
c
=
1
C
∑
P
∣
∣
P
A
F
(
P
)
c
t
−
P
A
F
(
P
)
c
∗
∣
∣
2
2
L_S^t=\sum_{j=1}^J\sum_{P}||S(P)_j^t-S(P)_j^*||_2^2 \\ L_{PAFs}^t=\sum_{c=1}^C\sum_{P}||PAF(P)_c^t-PAF(P)_c^*||_2^2
LSt=j=1∑JP∑∣∣S(P)jt−S(P)j∗∣∣22LPAFst=c=1∑CP∑∣∣PAF(P)ct−PAF(P)c∗∣∣22
其中:
- P P P表示预测的confidence maps或PAFs上的某一位置;
- j j j表示第 j j j个关节点;
- t t t网络的第 t t t个stage;
- c c c表示第c个肢干(有两个关节点连接的一段);
- S ( P ) j t S(P)_j^t S(P)jt表示预测的confidence map中P处的值, S ( P ) j ∗ S(P)_j^* S(P)j∗表示对应的ground truth值;
- P A F ( P ) c t PAF(P)_c^t PAF(P)ct表示预测的PAFs中P处的值, P A F ( P ) c ∗ PAF(P)_c^* PAF(P)c∗表示对应的ground truth值;
综上损失函数为:
L
=
∑
t
=
1
T
(
L
S
t
+
L
P
A
F
s
t
)
L = \sum_{t=1}^T(L_S^t+L_{PAFs}^t)
L=t=1∑T(LSt+LPAFst)
论文结果:
(1) MPII full testing set 上mAP为76.5;
(2) COCO Test-chanllege 上AP为60.5;
(3) 运行效率:
- GTX 1080, 9个人:parsing 0.58ms + CNN reference 99.6ms
- GTX 1080,16个人 视频:8.8fps