原论文地址:《Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks》
代码:参考资料:MTCNN(Multi-task convolutional neural networks)人脸对齐(这篇文章有结构图,很清晰)
文中引用的这篇论文也用了CNN的层级结构:《H. Li, Z. Lin, X. Shen, J. Brandt, and G. Hua, “A convolutional neural network cascade for face detection,” in IEEE Conference on Computer Vision and Pattern Recognition, 2015, pp. 5325-5334.》,地址在:http://openaccess.thecvf.com/content_cvpr_2015/papers/Li_A_Convolutional_Neural_2015_CVPR_paper.pdf
这个模型利用多任务层级卷积网络(Multi-task Cascaded Convolutional Networks)将人脸检测与人脸对齐结合在一起。
基本框架
- 先用一个轻量级的CNN生成候选窗口。这一步的候选窗口会被边界框回归向量进行校准,也会用NMS算法合并IoU值较高的候选区域;
- 再用一个相对复杂的网络对上一步的到的候选框进行提炼(或者说是过滤),并进一步用NMS算法进行合并;
- 最后用一个更复杂且更高效的网络对候选框进行进一步提炼,并输出人脸关键点(Facial Landmarks Position)。这一步相对于前两步加入了更多的监督信息。
这几步中的CNN依次被称为P-Net(Proposal Network)、R-Net(Refinement Network)、O-Net(Output Network)。
下面是上面几个步骤的示例图,取自原论文。
下面是论文中给出的MTCNN架构图。其中,MP是Max Pooling,Conv是卷积,Conv与Pooling的stride分别是1和2。
训练
1. 人脸分类
L
I
d
e
t
=
−
(
y
i
d
e
t
l
o
g
(
p
i
)
+
(
1
−
y
i
d
e
t
)
l
o
g
(
1
−
p
i
)
)
L_I^{det}=-(y_i^{det}log(p_i)+(1-y_i^{det})log(1-p_i))
LIdet=−(yidetlog(pi)+(1−yidet)log(1−pi))
其中,
p
i
p_i
pi为
x
i
x_i
xi是人脸的概率,
y
i
d
e
t
∈
{
0
,
1
}
y_i^{det}\in \{0,1\}
yidet∈{0,1}表示
x
i
x_i
xi是否是人脸。
2. 边界框回归
L
i
b
o
x
=
∣
∣
y
^
i
b
o
x
−
y
i
b
o
x
∣
∣
2
2
L_i^{box}=||\hat{\pmb{y}}_i^{box}-\pmb{y}_i^{box}||_2^2
Libox=∣∣yyy^ibox−yyyibox∣∣22
其中,
y
^
i
b
o
x
\hat{\pmb{y}}_i^{box}
yyy^ibox为通过网络预测得到,
y
i
b
o
x
\pmb{y}_i^{box}
yyyibox为实际的真实的背景坐标,且
y
i
b
o
x
\pmb{y}_i^{box}
yyyibox为
(
x
,
y
,
h
,
w
)
(x,y,h,w)
(x,y,h,w)组成的四元组。
3. 人脸 Landmarks 坐标回归
L
i
l
a
n
d
m
a
r
k
=
∣
∣
y
^
i
l
a
n
d
m
a
r
k
−
y
i
l
a
n
d
m
a
r
k
∣
∣
2
2
L_i^{landmark}=||\hat{\pmb{y}}_i^{landmark}-\pmb{y}_i^{landmark}||_2^2
Lilandmark=∣∣yyy^ilandmark−yyyilandmark∣∣22
其中,
y
^
i
l
a
n
d
m
a
r
k
\hat{\pmb{y}}_i^{landmark}
yyy^ilandmark与
y
i
l
a
n
d
m
a
r
k
\pmb{y}_i^{landmark}
yyyilandmark分别都有五个点:左眼、右眼、鼻子、左嘴角、右嘴角。每个向量共有10个值。
4. 多源训练
m
i
n
∑
i
=
1
N
∑
j
∈
{
d
e
t
,
b
o
x
,
l
a
n
d
m
a
r
k
}
α
j
β
i
j
L
i
j
min\sum_{i=1}^N\sum_{j\in\{det,box,landmark\}}\alpha_j\beta_i^jL_i^j
mini=1∑Nj∈{det,box,landmark}∑αjβijLij
其中,
N
N
N为训练样本数量,
α
j
\alpha_j
αj表示任务的重要性,
β
i
j
\beta_i^j
βij为样本标签,
L
i
j
L_i^j
Lij为上面的损失函数。
关于
α
\alpha
α值,论文是这么给出的:
P-Net与R-Net:
α
d
e
t
=
1
,
α
b
o
x
=
0.5
,
α
l
a
n
d
m
a
r
k
=
0.5
\alpha_{det}=1,\alpha_{box}=0.5,\alpha_{landmark}=0.5
αdet=1,αbox=0.5,αlandmark=0.5
O-Net:
α
d
e
t
=
1
,
α
b
o
x
=
0.5
,
α
l
a
n
d
m
a
r
k
=
1
\alpha_{det}=1,\alpha_{box}=0.5,\alpha_{landmark}=1
αdet=1,αbox=0.5,αlandmark=1
5. Online Hard sample mining
对每个Batch前项传播得到的loss进行排序,取前70%,只利用这70%的数据进行反向传播更新梯度。这样能让方向传播的梯度更新更有效。