paper title: Human Pose Estimation with Iterative Error Feedback
paper link: https://arxiv.org/abs/1507.06550
oral or demo video:https://www.youtube.com/watch?v=dQ5Fa5IFaJ4
https://www.youtube.com/watch?v=p5n_apqyIwQ(网友测评)
project: -
github:https:https://github.com/pulkitag/ief
conf & anthor: CVPR 16,Joao Carreira et al
arXiv submit v1: 2015.07 google citation:286(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
主要内容:
前馈结构(如卷积神经网络)通常能够学习到输入空间的良好表达,但是无法在输出空间中对依赖关系进行显式的建模,例如人体姿态估计和物体分割任务中的结构化关系。这篇文章主要内容是提出了一个通用的框架,通过从输入和输出的联合空间学习特征提取器,对输入和输出空间中丰富的结构化信息进行建模。文章引入了自顶向下的反馈机制,不直接预测目标输出,而是在前馈过程中,预测当前估计的偏差并反馈迭代修正预测值,文中称之为IEF(Iterative Error Feedback)。
网络结构:
IEF的基本结构如下图所示:
其中:
- I I I表示输入的图像;
- ϵ t \epsilon_t ϵt表示预测输出与真实值的偏差(可以看做是一个坐标的offset);
- y t y_t yt表示第t次迭代后的预测输出输出,由上一次的 y t − 1 y_{t-1} yt−1和当前预测的 ϵ t \epsilon_t ϵt得到,可以是直接相加,也可以是其他的非线性函数;
- x t = I ⨁ y t x_t=I\bigoplus{y_t} xt=I⨁yt为卷积网络的输入, ⨁ \bigoplus ⨁表示concat;
- f ( ) f() f()表示前馈网络;
-
g
(
)
g()
g()表示从预测输出到视觉表示的一个映射,比如从输出的关节点位置到使用高斯分布模拟的heat map的映射;
整个过程可以用数学表达式表示为:
ϵ t = f ( x t ) ( 1 ) y t + 1 = y t + ϵ t ( 2 ) x t + 1 = I ⨁ y t ( 3 ) \epsilon_t=f(x_t) \ \ \ (1) \\ y_{t+1}=y_t+\epsilon_t \ \ \ (2)\\ x_{t+1}=I\bigoplus{y_t} \ \ \ (3) ϵt=f(xt) (1)yt+1=yt+ϵt (2)xt+1=I⨁yt (3)
损失函数:
L
o
s
s
=
∑
t
T
∣
∣
ϵ
t
,
e
(
y
,
y
t
)
∣
∣
2
(
4
)
Loss=\sum_t^T||\epsilon_t,e(y,y_t)||^2 \ \ \ (4)
Loss=t∑T∣∣ϵt,e(y,yt)∣∣2 (4)
在人体姿态估计中,
e
(
)
e()
e()表示的是人体各关节点之间的误差。具体来说,人体关节点可表示为:
P
:
p
k
∈
R
2
,
k
∈
[
1
,
K
]
(
5
)
P:{p^k\in R^2,k\in [1,K]} \ \ \ (5)
P:pk∈R2,k∈[1,K] (5)
y
k
y^k
yk表示第k个关节点的位置,一共有K个关节点,第t次迭代中的t关节点的预测位置信息表示为
y
t
k
y_t^k
ytk,那么真实值与预测值之间的向量为:
u
k
=
y
k
−
y
t
k
(
6
)
u^k=y^k-y_t^k \ \ \ (6)
uk=yk−ytk (6)
现在可以写出
e
(
)
e()
e()的具体形式:
e
(
y
,
y
t
)
=
∑
k
=
1
K
m
i
n
(
B
,
∣
∣
u
k
∣
∣
)
∗
u
k
∣
∣
u
k
∣
∣
2
(
7
)
e(y,y_t)=\sum_{k=1}^Kmin(B,||u^k||)*\frac{u^k}{||u^k||_2} \ \ \ (7)
e(y,yt)=k=1∑Kmin(B,∣∣uk∣∣)∗∣∣uk∣∣2uk (7)
其中B表示每个关节点的偏移的最大范围,文章中设为20个像素点。
关于模型的训练
:迭代初始的时候,
y
0
y_0
y0设定一个初始值,经过
g
(
y
0
)
g(y_0)
g(y0)映射为heatmap,然后和图像一起送入
f
(
)
f()
f(),得到预测的校正值
ϵ
t
\epsilon_t
ϵt,然后根据式(4)计算损失并反向传播更新网络参数,
e
(
⋅
)
e(·)
e(⋅)的形式在式(7)中给出。当距离回归目标较远的时候,由B确定了最大的目标回归偏移量;当距离目标较近的时候,回归的偏移是B的一个缩放,但方向仍然是一致的。
这里有一个关键的地方,文章中提到,文章中只假设在训练过程中只有人体关节点的真实值
y
y
y,但是不知道每次迭代过程中的
y
1
,
y
2
,
y
3
,
.
.
.
y_1,y_2,y3,...
y1,y2,y3,...是多少。文章给出的一个简单的解决方法是,预先定义好这些值,由于
y
0
y_0
y0是已知的,则
y
1
y_1
y1可以根据
e
(
y
,
y
0
)
+
y
0
e(y,y_0)+y_0
e(y,y0)+y0计算得到,同理可以计算出其他值。这样在训练的时候,当进入第2个step时,使用的
y
1
y_1
y1直接是上述计算出来的值,而不是用
y
0
y_0
y0加上网络输出的偏移。
按照上面的处理,实际上每个迭代的step中,都是在回归一小步,做一个局部的优化。当距离目标较远时,每一步的优化的偏移都是固定的,接近真实目标的时候(偏移量小于B),优化的的偏移是之前的一个缩放量。这样的处理简化了学习问题,给定一张图片和初始的关节点位置,模型需要做的是预测一个固定方向的偏移量来移动关节点,并且在接近真实值的时候,减小移动的长度。
关于网络输入
:网络的输入尺寸是
W
x
H
x
(
3
+
16
+
1
)
WxHx(3+16+1)
WxHx(3+16+1),W和H分别表示图像的宽高,3为RGB图像有三个通道,16为预测16个人体关节点,这里的1是一个marking-point,这个点位于是人体区域内的某一位置。
在图像中,以marking-point为中心,以图像短边长的0.3~1.4倍为边长裁剪9个box并缩放至256x256,然后选择最接近1.2倍人体高度的3个box,然后用这些图像上的224x224大小随机裁剪的patch进行训练;在测试的时候,会用一个VGG-S网络去预测9个box中的哪一个最接近1.2倍的人体高度。
论文结果:
1.MPII数据集上,PCKh@0.5为81.3%;
2.LSP数据集上,PCP为72.5%。