几篇人体关键点检测的论文
一、Mask R-CNN
Mask R-CNN
Mask R-CNN同时进行目标检测和实例分割,在Faster-RCNN框架基础上增加mask分支,多任务损失为:
L=Lcls+Lbox+Lmask
L
=
L
c
l
s
+
L
b
o
x
+
L
m
a
s
k
对于每个RoI,mask分支有
Km2
K
m
2
维的输出,表示K个分辨率为
m×m
m
×
m
的二值mask,对应K个类别。使用per-pixel sigmoid生成二值图,定义
Lmask
L
m
a
s
k
为平均二值交叉熵损失。对于具有真值标签k的RoI,
Lmask
L
m
a
s
k
仅对第k个mask定义,其他的mask对损失无贡献。
分类分支预测类别标记,使用这个标记选择输出的mask。这不同于FCN,使用的是per-pixel softmax 交叉熵损失,不同类间的mask有竞争。
Mask表示
Mask是输入目标的空间布局,而类别标记和box预测是将卷积特征图通过fc层折叠到短向量,而提取mask的空间结构需要对卷积特征图进行点到点的对应。论文使用FCN预测
m×m
m
×
m
的mask,而RoIPool损失了像素的空间结构,作者设计了RoIAlign层。
RoIAlign
RoIPool是提取每个RoI小的特征图的标准操作,RoIPool首先将浮点数的RoI量化为离散粒度的,量化的RoI之后划分为spatial bins(如
7×7
7
×
7
),并各自量化,之后使用max pooling累积每个bin的特征值。量化的操作为[x/16],16是步长。量化引入了RoI和特征之间的对准误差,这不影响分类,但影响mask预测。
RoIAlign层移除了量化操作,如x/16代替[x/16],使用双线性插值计算输入特征的每个之,操作如下图所示:
网络结构
backbone:ResNet-50-C4,ResNet-FPN
网络头:
训练过程中IOU>0.5的ROI作为正样本,其余为负样本。mask损失仅对正RoI定义。image-centric训练,每个mini-batch每个GPU有2个图像,每个图像有N个RoIs,正负比为1:3。测试时,proposal的数目是300,预测box并NMS,mask分支对得分最高的100个box预测,每个box有k个mask,仅使用分类分支预测的第k个mask,最后将
m×k
m
×
k
的mask resize到RoI的尺寸。
实例分割结果比对:
Mask R-CNN用于关键点检测
将关键点的位置建模为one-hot mask,使用Mask R-CNN预测K个mask,对应K个关键点类型(如,左肩、右肘)。训练的目标是一个one-hot
m×m
m
×
m
的而至mask,仅有一个像素标记为前景。训练过程中对于每个真值关键点,最小化
m2−way
m
2
−
w
a
y
softmax交叉熵损失。
关键点检测结果比对:
表中方法[6]即为第二篇论文的方法。
二、Realtime multi-person 2d pose estimation using part affinity fields
方法使用Part Affinity Fields(PAF),学习身体部件间的关联。自上而下的方法首先检测人体,然后对每个人进行姿态估计,人越多检测时间越长。自下而上的方法检测图像中所有的关节点,然后将关节点关联到每个人。论文基于Part Affinity Fields,提出的是自下而上的方法,PAF是表示肢体位置和方向的2D向量集。
方法描述
方法的结构如下图所示,系统的输入是一个
w×h
w
×
h
的彩色图,输出图像上每个行人的2D结构关键点。前向传播网络同时预测2D置信度图S,和部件亲和2D向量L,S包含J个置信度图,每个对应一个part,
L=(L1,L2,...,LC)
L
=
(
L
1
,
L
2
,
.
.
.
,
L
C
)
包含C个向量域,每个肢体一个,
Lc
L
c
中每个图像位置对应一个2D向量。置信度图和亲和字段使用双向匹配解析到所有的人。
1. 同时检测和关联
网络结构如下图3所示,同时预测置信度图和亲和字段,网络有俩个分支,图中上面的分支预测置信度图,下面的分支预测亲和字段,每个分支是一个迭代预测结构。
图像首先使用VGG-19的前10层分析,生成特征图集输入到第一阶段的两个分支。在第一阶段,网络输出置信度图
S1=ρ1(F)
S
1
=
ρ
1
(
F
)
及部件亲和字段
L1=ϕ1(F)
L
1
=
ϕ
1
(
F
)
,其中
rho1(F)
r
h
o
1
(
F
)
和
ϕ1(F)
ϕ
1
(
F
)
是第一阶段的推断。在接下来的每个极端,前一阶段两个分支的结果和原始图像特征F,串联用于生成更新的预测:
下图显示了每个阶段置信度和亲和字段的变化,每个阶段有两个损失函数,均为
L2
L
2
损失:
W是二值掩码,位置p处标记不存在时W(p)=0。梯度replenish的方法用来避免梯度消失问题。总体目标函数为:
f=∑Tt=1(ftS+ftL)
f
=
∑
t
=
1
T
(
f
S
t
+
f
L
t
)
2. 置信度图检测
由标记的2D关键点生成置信度图真值
S∗
S
∗
,置信度图是每个身体部件在每个像素出现的置信度。如果对应的身体部件可见,置信度图中应存在一个波峰,如果有多个人出现,每个人k的可见部件j应有一个波峰。
首先对每个人k生成置信度图
S∗j,k
S
j
,
k
∗
,位置p处的值为:
真值置信度图是单个置信度图的max算子累计:
S∗j(p)=maxkS∗j,k(p)
S
j
∗
(
p
)
=
m
a
x
k
S
j
,
k
∗
(
p
)
3.部件亲和字段用于部件关联
部件亲和字段如下图所示:
对于某个肢体,用2D向量表示肢体中点的方向,每个肢体有一个对应的亲和字段,用于关联两个身体部件。如果点p在肢体上,
L∗c,k(p)
L
c
,
k
∗
(
p
)
是从身体部件起点
j1
j
1
指向终点
j2
j
2
的单位向量,其他点的值为0。部件亲和字段的真值是所有亲和字段的均值。
测试时,通过计算对应PAF上的线积分测量候选部件检测的候选,及链接候选部件位置的线段。对于两个候选部件位置
dj1
d
j
1
和
dj2
d
j
2
,在线段上采样预测的PAF,测量它们关联的置信度:
(10)
4. 使用PAF进行多人解析
对于检测到的身体部件子集,需要找到将肢体连起来的部件对,寻找最优的关联即最大化加权双向图匹配问题。图的节点是部件检测结果,边是所有可能的关联。文中使用关联置信度(10)加权,目标是寻找具有最大权值边的匹配:
这里有个没有任意两条边共享节点的约束。确定Z是个K维匹配问题,是非确定性多项式问题,作者增加了两个松弛。第一个是选择最小的边数获取人体姿态生成树骨架。第二个是将批评问题划分为双向匹配问题的子集。如下图所示。树节点由PAF显示建模,而非临近节点由CNN隐式建模。
实验结果