OpenPose:实时多人2D姿态估计使用部分关联域(Part Affinity Fields)
摘要
实时的多人2D人体估计,对于让机器理解图像和视频中的人来说,是一个关键的组件。这篇文章里,我们一处了一个实时的2D多人检测方法。提出的方法使用一种非参数的表示——部分关联域(PAF),来学习图像中身体各部分的联系。这个自底向上的系统架构有很高的准确率,同时实施表现也很好,即使很多人在图片中亦是如此。在之前的工作中,PAFs和身体各部位位置估计在训练阶段同时改善。我将说明只用PAF与PAF+身体部位位置细化的结果对比,准确率和实时性都有很大的提高。以下还将说明结合身体、脚关键点检测检测器,基于一个我们公开release的一个关于脚的数据集。联合的检测器(并行检测?),与顺序运检测器相比,不仅仅减少了推理的时间,同时改善了各个独立组件的准确度。
1. 简介
这篇文章中,我们讨论一个用于获取视频和图片中人的详细的解释的核心组件——2D人体姿态估计,或者说是定位人体的关节关键点、身体部位。人体估计中,大多数研究都专注于独立的寻找各个身体部位。推理图片中多人的姿态问题,又提出了很多新的挑战。首先,每张图片中人得数目、位置、大小都是不确定的。其次,人与人之间的交互会产生复杂的空间干扰,例如:接触、遮挡等。此外,处理时间会随着图片中的人数增多而增长,这对于实时来说造成了一种挑战。
有一种常见的方法,使用人体检测器与单个人体姿态估计相结合。这种自顶向下的方法直接组合现有的方法,但是只要人体检测器失败了就没有办法补救了。同时,运行速度依赖于图片中人的数量。自底向上的方法,不会直接使用全局上下文中别的身体部分或别的人的身体信息。最开始自底向上的方法没有保持效率上的gians,最为最终阶段需要耗时的全局信息,每张图片要处理几分钟。
这篇文章中,提出了一个用于多人姿态估计高效的方法,可以与多个公开的benchmark媲美。我们提出第一个自底向上的通过PAF关联分数的表示方法,PAF是一组二维向量的位置,编码了图像上肢体的位置和方向。我们将展示,同时推理这个自底向上的检测和联系编码了足够的上下文信息来得到优秀的结果。这篇文章的早期版本已经发过了,现在这个版本中我们进一步添加了新的成果。首先,证明了PAF的refine对于提高准确率至关重要要。身体部分的refine则不那么重要。我们移除了身体部分的refine阶段,同时增加了网络的深度。新的网络速度提高了45%,准确度提高了7%。其次,我们提供了一个15,000张人脚的标注过的数据集,使用身体+脚的组合模型与只用身体的模型相比,保持了速度和准确率。第三,把我们的方法泛化到了车辆关键点检测的任务中。最后,我们写了OpenPose的文档,OpenPose库是第一个用于多人2D实时姿态检测的实时系统,包括身体、脚、手、脸部关键点。我们提供了与Mask-RCNN、Alpha-Pose等对比,来展示我们自底向上方法的计算速度上的优势。
2. 相关工作
pass
3. 方法
图2展示了我们方法的pipline,输入图片大小
w
∗
h
w*h
w∗h,预测图片中每个人的2D关节关键点的位置。首先,前项网络预测一组2D的置信度图S,和一组部分关联性(part affinity)的二维向量域L,L编码了两个部分之间的的关联程度。
S
=
(
S
1
,
S
2
,
.
.
.
,
S
J
)
S=(S_1, S_2, ..., S_J)
S=(S1,S2,...,SJ),
J
J
J是map的数量,每个关键点对应一个map。
L
=
(
L
1
,
L
2
,
.
.
.
,
L
C
)
L=(L_1, L_2, ...,L_C)
L=(L1,L2,...,LC),
C
C
C是向量域的个数,每段自已对应一个向量域。最终置信度map和PAF共同被greedy inference(贪心推理?)解析成图二d中的形式,来输出整个人得2D关键点。
3.1 网络结构
我们的结构在图三中展示。迭代地预测编码了一个部位到另一个部位的关系的关联域(affinity field),这部分用蓝色表示。预测检测置信度map用浅褐色表示。这个迭代预测的结构,refine预测结果通过连续的stage,
t
∈
1
,
.
.
.
,
T
t\in{1,...,T}
t∈1,...,T,每个stage都有intermediate supervision(每个stage都是损失函数的一部分)。
网络的深度比我们之前发的[3]更深。在之前的方法中,网络结构包括了一些77的卷积层。现在这个版本中,接受域被保留了,同时用3个33的卷积核代替了7*7的卷积核,这样减少了一些计算。前者的操作是
2
∗
7
2
−
1
=
97
2*7^2-1=97
2∗72−1=97,后着只需要51次。此外,3个卷积核的输出都连接起来,这里与DenseNet相似。非线性层的数量变成了3倍,网络可以同时保持低层次的特征与高层次的特征。5.2和5.3中分别分析了准确度与运行时间的提高。
同时检测和对各部分进行关联
使用神经网络分析图片(initialized 通过VGG-19的前10层,然后fine-tuned),产生一组feature map F,F输入给第一个stage。第一个stage中,网络处理一组PAFs,
L
1
=
ϕ
1
(
F
)
L^1=\phi^1(F)
L1=ϕ1(F),其中
ϕ
1
\phi^1
ϕ1是CNN在Stage 1 中的处理。在每一个subsequent stage中,使用上一个阶段和原始图片Feature Map F连接起来得到预测,这样做是为了refine预测结果。
L
t
=
ϕ
t
(
F
,
L
t
−
1
)
,
∀
2
≤
t
≤
T
P
L^t=\phi^t(F,L^{t-1}),\forall 2 \leq t \leq T_P
Lt=ϕt(F,Lt−1),∀2≤t≤TP
其中
ϕ
t
\phi^t
ϕtCNN在Stage
t
t
t中的推理,
T
P
T_P
TP是PAF stage的总数。(t为什么从2开始表示?)。在
T
P
T_P
TP个迭代之后,进入置信度map预测,从最后一个PAF预测的值开始。
S
T
P
=
ϕ
t
(
F
,
L
T
P
,
∀
t
=
T
P
)
S^{T_P}=\phi^t(F,L^{T_P},\forall t=T_P)
STP=ϕt(F,LTP,∀t=TP)
S
t
=
ϕ
t
(
F
,
L
T
P
,
S
t
−
1
)
,
∀
T
P
<
t
≤
T
P
+
T
C
S^t=\phi^t(F,L^{T_P},S^{t-1}),\forall T_P < t \leq T_P+T_C
St=ϕt(F,LTP,St−1),∀TP<t≤TP+TC
2. 为了清晰起见,我们把每个部位都作为肢体配对,不管是不是人的肢体(例如脸)。
ρ
t
\rho^t
ρt表示stage
t
t
t 的CNNs的推断,
T
C
T_C
TC是所有置信度map的总数。
这个方法与之前的[3]不用,[3]中每个关联域和置信度map分支每个阶段refine。因此,每个阶段的计算减半。实验结果放在了5.2,refine 关联域预测对置信度map的结果又提高,反之则不然。直观地,如果我们观察PAF的输出,身体部位的位置可以被预测。然而,我们可以看见一些没有别的信息的身体部位,我们不能把他们分配给不同的人。
图四展示了关联域的refine。置信度map在最后一个stage refine的PAF预测的基础上预测结果。置信度map阶段的结果几乎没有不同。为了指导网络迭代地在第一个分支预测身体部位的PAFs,以及第二个分支的置信度图,每个阶段的结尾都有一个损失函数。我们使用
L
2
L_2
L2损失函数评估预测值和真实值得距离。在这里我们基于空间来计算loss函数,来解决有些数据集没有完整的标记处所有的人这个实际问题。以下是,PAF分支第
t
i
t_i
ti stage的损失函数和置信度map 第
t
k
t_k
tk阶段的置信度map预测分支的算式函数。
f
L
t
i
=
∑
c
=
1
C
∑
W
(
p
)
⋅
∣
∣
L
c
t
i
(
p
)
−
L
C
∗
(
p
)
∣
∣
2
2
f^{t_i}_{L}=\sum_{c=1}^{C}\sum W(p) \cdot ||L_{c}^{t_i}(p)-L_C^*(p)||_2^2
fLti=c=1∑C∑W(p)⋅∣∣Lcti(p)−LC∗(p)∣∣22
f
S
t
k
=
∑
j
=
1
J
∑
W
(
p
)
⋅
∣
∣
S
j
t
k
(
p
)
−
S
j
∗
(
p
)
∣
∣
2
2
f_S^{t_k}=\sum_{j=1}^J\sum W(p)\cdot ||S^{t_k}_j(p)-S_j^*(p)||_2^2
fStk=j=1∑J∑W(p)⋅∣∣Sjtk(p)−Sj∗(p)∣∣22
其中,
L
c
∗
L_c^*
Lc∗是部位关联域的真实值,
S
j
∗
S^*_j
Sj∗是置信度map的真实值,
W
W
W是一个binary mask,在p位置没有标记时,mask中值为零。这个
W
W
W的存在是为了在训练时避免惩罚true positive。在每个stage的loss,通过定期补充梯度,解决了梯度消失的问题。总的目标函数如下。
f
=
∑
t
=
1
T
P
f
L
t
+
∑
t
=
T
P
+
1
T
P
+
T
C
f
S
t
f=\sum^{T_P}_{t=1}f^t_L+\sum^{T_P+T_C}_{t=T_P+1}f_S^t
f=t=1∑TPfLt+t=TP+1∑TP+TCfSt
3.3 置信度map和肢体检测
在训练时,使用上面第一个等式来评价,我们使用标记过的2D关键点来生成置信度map的真实值
S
∗
S^*
S∗。每个置信度图都是一个二维表示,表示相信特定的身体部位可以位于任何给定的像素中。理想中,如果一个单人出现在一张图片中,每个map中应该只存在一个单独的峰值。如果是多人的情况,每个人k的可见的部位j都有一个峰值。
我们首先生成单独的对于每个人k的置信度图
S
j
,
k
∗
S_{j,k}^*
Sj,k∗。
x
j
,
k
∈
R
2
x_{j,k}\in\mathbb{R}^2
xj,k∈R2人k的部位j在图像中的真实位置。位置
p
∈
R
2
p\in\mathbb{R}^2
p∈R2上的值,在
S
j
,
k
∗
S_{j,k}^*
Sj,k∗定义为:
S
j
,
k
∗
(
p
)
=
exp
(
−
∣
∣
p
−
x
j
,
k
∣
∣
2
2
σ
2
)
S_{j,k}^*(p)=\exp\bigg(-\frac{||p-x_{j,k}||_2^2}{\sigma^2}\bigg)
Sj,k∗(p)=exp(−σ2∣∣p−xj,k∣∣22)
σ
\sigma
σ控制峰值的扩散程度(方差?)。由网络预测的groundtruth(预测的到gt?)置信度图是通过max算子将各个置信度图聚合在一起:
S
j
∗
(
p
)
=
max
k
S
j
,
k
∗
(
p
)
S^*_{j}(p)=\max\limits_{k}S_{j,k}^*(p)
Sj∗(p)=kmaxSj,k∗(p)
我们使用最大置信度图代替平均置信度图,这样相近的峰值可以清晰的区分开来,如下图所示。测试时,我们预测置信度图,并且获取身体部位的候选位置,通过使用非极大值抑制。
3.4 表示部位之间联系的部位关联域
给定一组检测的身体部位(在图5a中用红色和蓝色的点表示),在不知道他们分别属于哪个人的情况下,怎么能把他们组合成整体位置的形式呢?我们需要一个置信度去衡量对于每一个身体部位检测的配对之间的联系。例如,是否属于同一个人。一种主动的方法去衡量这种联系失去检测配对的身体部位的一个额外的中间点,然后检测中间点在一个pair中出现的概率,如图5b。然而,如果人们挤在一起,中间点有可能出错(如图5b中的绿线)。这种错误的联系,是由于以下两个表示的限制而产生的:(1)只编码了位置没有编码方向,(2)把整个代表肢体的区域所小到了一个点。
部位关联域解决了这个问题。PAF同时保留了位置和方向信息。每个PAF是每个肢体的二维向量场,如图所示。每一个像素区域属于特定的肢体,一个2D的向量编码了从一个部位到另一个部位的方向。没有一种肢体有相应的PAF来连接端点的两个身体部位。
以下图的单个肢体举例。令
x
j
1
,
k
x_{j_1,k}
xj1,k和
x
j
2
,
k
x_{j_2,k}
xj2,k是图中人
k
k
k的身体部位
j
1
j_1
j1和
j
2
j_2
j2。
如果在肢体上的点p在肢体上,
L
c
,
k
∗
(
p
)
L^*_{c,k}(p)
Lc,k∗(p)使用一个从
j
1
j_1
j1到
j
2
j_2
j2单位向量。对于不在上肢体上的点向量值为0。
为了评估
f
L
f_L
fL,定义部位关联向量域
L
c
,
k
∗
L^*_{c,k}
Lc,k∗,图像中的点p:
L
c
,
k
∗
(
p
)
=
{
v
如果p在肢体c,k上
0
p不在
L^*_{c,k}(p)=\begin{cases} v& \text{如果p在肢体c,k上}\\ 0& \text{p不在} \end{cases}
Lc,k∗(p)={v0如果p在肢体c,k上p不在
在这里,
v
=
x
j
2
,
k
−
x
j
1
,
k
∣
∣
x
j
2
,
k
−
x
j
1
,
k
∣
∣
2
v=\frac{x_{j_2,k}-x_{j_1,k}}{||x_{j_2,k}-x_{j_1,k}||_2}
v=∣∣xj2,k−xj1,k∣∣2xj2,k−xj1,k是肢体方向的单位向量。肢体上点的集合通过一个与肢体线段距离的阈值来定义。
肢体的宽度
σ
l
\sigma_l
σl是像素上的距离,肢体的长度
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=∣∣xj2,k−xj1,k∣∣2。
PAF的真实值是所有人的PAF的平均值。
在测试过程中,我们通过计算连接候选部位位置的线段上相应PAF上的线积分来测量候选部位检测之间的关联。换句话说,我们测量预测通过连接检测到的部位形成的候选肢体的PAF的对齐。具体来说,对于两个候选零件位置dj1和dj2,我们对预测的零件亲和力场Lc沿着线段进行采样,来测量它们之间的关联的置信度:
这里p(u) 插入两个身体部位的位置
在实际中,我们通过对u的等间距值进行采样和求和来近似积分。
疑问
- 文中达到的自顶向下的方法,与自底向上的方法,如何理解。
自顶向下是指,先找到人,再去找人手,脚等关节关键点。
自底向上是指,找到一堆关节,把一堆关节拼成一个人。 - 如果loss function中没有 W W Wloss function 为什么就会对True positive惩罚?