这篇文章在pose machines基础上应用了卷积网络,还用中继监督的方法避免了级数很多的情况下梯度消失的状况。用于预测图像中的关节位置,pose estimate.
几个特点:
- 应用卷积。
- 将图像特征(经过卷积网络提取出来的)和上一级输出的belief map作为本级的输入,belief map表示每个关节落在每个坐标点的置信值(分数),这样学习既考虑了图像的特征,也考虑了各部分之间的关联。整个结构都使用卷积,所以都可微分,能够用backropagation进行点对点的训练。
- 通过逐渐增大receptive field(感受野)来考虑空间背景信息。级数越大,每个像素点代表的空间特征信息越多,这样就可充分考虑各部分之间的空间联系,提高准确度。
- 中继监督。在结构的每一级都计算loss,避免梯度消失。
- center map.起到一个定位的作用,即这个人在哪里。
原理与结构
Pose Machines
Z–图像中的所有位置(坐标)
Y
p
Y_{p}
Yp–第p个关节在图像上的位置,我们的目标就是得到
Y
=
(
Y
1
,
.
.
.
Y
P
)
Y=(Y_{1},...Y_{P})
Y=(Y1,...YP),即所有关节的坐标
g
t
(
⋅
)
g_{t}(\cdot )
gt(⋅)–预测器,
t
∈
1...
T
t\in {1...T}
t∈1...T,为结构的级数,
g
t
(
⋅
)
g_{t}(\cdot )
gt(⋅)的输出为belief map,从belief map中提取出
Y
p
Y_{p}
Yp
x
z
x_{z}
xz–提取出的特征x在位置z上的值
第一级:
g
1
(
x
z
)
→
b
1
p
(
Y
p
=
z
)
p
∈
0...
P
g_{1}(x_{z})\rightarrow {b_{1}^{p}(Y_{p}=z)}_{p\in {0...P}}
g1(xz)→b1p(Yp=z)p∈0...P
表示:z位置的特征图输入第一级预测器,输出是第一级所有关节点落在z位置的置信值。z代表图像上的所有位置。所以belief map的维度为
w
×
h
×
(
P
+
1
)
w\times h\times (P+1)
w×h×(P+1),
w
×
h
w\times h
w×h为图像的大小,P加一是包含了背景。belief map表示每个关节落在每个坐标的置信值。
第二级及以后:
g
t
(
x
z
′
,
ψ
t
(
z
,
b
t
−
1
)
)
→
b
1
p
(
Y
p
=
z
)
p
∈
0...
P
+
1
g_{t}(x_{z}^{'},\psi _{t}(z,b_{t-1}))\rightarrow {b_{1}^{p}(Y_{p}=z)}_{p\in {0...P+1}}
gt(xz′,ψt(z,bt−1))→b1p(Yp=z)p∈0...P+1
x
z
′
x_{z}^{'}
xz′表示提取出的特征x在位置z上的值,可以与
x
z
x_{z}
xz不同
ψ
t
(
⋅
)
\psi _{t}(\cdot)
ψt(⋅)将前一级的belief map映射成背景特征,然后与图像特征一起输出预测器。
Convolutional Pose Machines
-
应用卷积:特征提取与预测器都用卷积网络。
-
省略 ψ t ( ⋅ ) \psi _{t}(\cdot) ψt(⋅),因为卷积已经起到了提取特征的作用。
-
通过卷积不断扩大receptive field,使每个像素代表的特征信息越来越丰富,从而考虑到足够充足的背景信息。
-
center map:(作用是用Gaussian map定位人的位置,经过处理已经在中心了。)与feature map和上级的belief map进行concatenate然后输入本级的,用公式来表示就是: g t ( c o n c a t e n a t e ( x z ′ , z , b t − 1 ) ) g_{t}(concatenate(x_{z}^{'},z,b_{t-1})) gt(concatenate(xz′,z,bt−1))
-
Loss Function.每一级的loss function为:
f t = ∑ p = 1 P + 1 ∑ z ∈ Z ∥ b t p ( z ) − b ∗ p ( z ) ∥ 2 2 f_{t}=\sum_{p=1}^{P+1}\sum_{z\in Z}^{ }\left \| b_{t}^{p}(z)-b_{*}^{p}(z) \right \|_{2}^{2} ft=∑p=1P+1∑z∈Z∥btp(z)−b∗p(z)∥22,即每一个关节点,每一个坐标点,预测出的置信值与ground truth置信值的L2差距。
总的loss function为: F = ∑ t = 1 T f t F=\sum_{t=1}^{T}f_{t} F=∑t=1Tft,即每一级的loss的和。 -
测试的准确度的计算用PCK方法。即若预测位置与正确位置的距离在 α ∗ m a x ( w , h ) \alpha *max(w,h) α∗max(w,h)的范围内,就算时正确。w,h为bounding box的尺寸。
CPM模型:
(没在这个电脑上,下次记得上传)
数据增强
训练时将数据用随机缩放(scaling with factors in [0.7 1.3]),旋转(
[
−
4
0
∘
4
0
∘
]
[-40^{\circ} 40^{\circ}]
[−40∘40∘]),水平镜像的方式增强。
测试时随机缩放的尺度应在训练时缩放尺度的范围内。
在多尺度下(multi-scales)下,计算最后的预测位置的方法时将所有尺度下的belief map进行累加或平均,如最大值大于阈值,则确定该位置为预测位置。
关于center map
Gaussian map的作用是定位某个人的位置,然后方便找到这个人的各个关节。从代码中可以看出,若是多人图像,则先通过一个CPM结构预测到每个人的位置(center),在每个位置放一个Gaussian map。预测关节位置时,以各个center为中心分别进行裁剪,裁剪成固定大小(
368
×
368
368\times 368
368×368),然后送入CPM结构。所以若单人图像中人不在中心,或是多人图像,实际上就要通过两个CPM结构,一个定位人的center,一个定位关节。
另外生成
368
×
368
368\times 368
368×368大小的Gaussian map送入每一级,与feature map和上一级的belief map进行concatenate(简单堆叠),送入预测器。
既然训练输入的图像放置了Gaussian map,那么ground truth的正确位置也要放置Gaussian map,如此计算loss function时才统一。
其他自己的体会
-
看完论文,不懂的地方再看看代码就好了,代码主要看模型和testing里面的demo,下完caffemodel可以导出为图片更方便看,testing里面的demo有python版和matlab版,不难懂。
-
CPM处理多人image还可以,准确度很高。但因为用了两个CPM结构的原因,处理多人video就很慢很慢了,我跑出来基本1秒1帧,离线下来也不大准确。