tags: PCN;人脸检测; face detection
论文名称:
《Real-Time Rotation-Invariant Face Detection with Progressive Calibration Networks》
作者为中科院计算所山世光及其学生 2018
代码地址:https://github.com/Jack-CV/FaceKit
论文背景
人脸检测器通常仅仅针对正面人脸,而对于多朝向的人脸检测问题始终没有得到很好的解决。本文关注点是多朝向的人脸检测。作者提出来一个级联校正网络(progressive calibration network PCN)来完成由粗到精的人脸检测过程。算法早期首先进行粗略的方向估计,然后再进行精确的方向调整。这样,可以使网络完成端到端的多朝向人脸检测。思路和MTCNN的实现有异曲同工之处,只不过处理的细节上面有不同的差异。
解决人脸朝向问题的三种方法
- 数据增强
这种方法通过对训练数据中正面朝上的图片进行多角度旋转,从而获得各种角度的图像(如下图1)。好处是可以使用一个正面人脸检测器就完成人脸检测;但是缺点就是想要利用一个网络来完成多朝向的检测通常需要将网络设计的非常大且复杂,在实际应用的时候,有点太耗时间,不太实用。
- 分治法
对每种小范围角度的人脸各自训练一个检测器,这样可以使用很小的多个检测器进行分开检测(比如上下左右四个方向各训练一个检测器)。好处是小网络运行速度会比较快,但缺点是需要多个检测器进行检测,总体时间消耗大,而且会有更多的“虚警”。(如下图2)
如果把图像放在一个直角坐标系中看的话,人脸不同的朝向表现在图像上就是人脸与水平轴或者垂直轴之间的夹角。可想而知,如果可以很精确的估计出人脸与某一个轴的夹角,那么很容易将不同朝向的人脸转化为正面(如下图3)。之前也有人做过这样的尝试,然而,这个过程对人脸角度估计要求比较高,否则会造成检测结果的召回率比较低(检测不出)。而且所用的网络也必须足够强大,在实际使用中会引入很大的时间消耗。
分析了以上三种方法,作者提出了PCN算法(如下图4)。
算法主要分为三个阶段:(1)首先检测出人脸区域,然后将其中面部朝下的旋转至面部朝上,体现在角度上就是将原始头像与垂直面夹角[-180°, 180°] 之间的头像缩减范围至[-90°,90°]之间。从图上可以看到,经过第一阶段,人脸朝向与垂直面夹角都在 [-90°,90°]之间。(2)进一步检测人脸区域,仿照上一步,将[-90°,90°]之间的头像缩减范围至[-45°,45°]之间。从上图依然可以看出。(3)最后,网络最终判断该位置是否为脸以及脸的夹角是多少。这种级联网络可以360度无死角检测并估计人脸的朝向,而且速度很快。
PCN
PCN-1
使用划框对任意输入图像进行滑动,对于划框内的图像x,第一阶段主要有三个学习目标:
(1)
[
f
,
t
,
g
]
=
F
1
(
x
)
[f, t, g] =F_1(x)\tag{1}
[f,t,g]=F1(x)(1)
这里的
f
f
f表示预测的当前区域是人脸的置信度,
t
t
t表示预测的人脸框bbox回归值,
g
g
g表示人脸朝向值。
具体来说,对于区分当前区域是否是人脸,就是一个二分类,使用交叉熵损失。
(2)
L
c
l
s
=
y
l
o
g
f
+
(
1
−
y
)
l
o
g
(
1
−
f
)
L_{cls}=ylogf+(1-y)log(1-f)\tag{2}
Lcls=ylogf+(1−y)log(1−f)(2)
对于人脸坐标框回归采用的损失函数是:
(3)
L
r
e
g
(
t
,
t
∗
)
=
S
(
t
−
t
∗
)
L_{reg}(t,t^\ast)=S(t-t^\ast)\tag{3}
Lreg(t,t∗)=S(t−t∗)(3)
t
t
t和
t
∗
t^\ast
t∗分别表示预测值和标签值。这里的S采用的是平滑L1损失,公式为:
s
m
o
o
t
h
L
1
(
x
)
=
{
0.5
x
2
,
if |x|<1
∣
x
∣
−
0.5
,
otherwise
smooth_{L_1}(x)= \begin{cases} 0.5x^2, & \text {if |x|<1} \\ |x|-0.5, & \text{otherwise} \end{cases}
smoothL1(x)={0.5x2,∣x∣−0.5,if |x|<1otherwise
这里的回归目标为bbox的左上角坐标值和bbox的宽度。数学计算公式为:
KaTeX parse error: No such environment: split at position 7: \begin{̲s̲p̲l̲i̲t̲}̲ t_w&=w^\ast/w …
a,b,w分别表示bbox的左上角横纵坐标和bbox的宽度。
对于角度预测,这里依然采用了二分类的方式,判断人脸是否朝上或者朝下:
(5)
L
c
a
l
=
y
log
g
+
(
1
−
y
)
log
(
1
−
g
)
L_{cal}=y\log{g} +(1-y)\log(1-g)\tag{5}
Lcal=ylogg+(1−y)log(1−g)(5)
如果输入x朝上,则标签y为1,否则为0。
这三部分的损失函数最终结合成为第一阶段的共同损失:
(6)
m
i
n
L
=
L
c
l
s
+
λ
r
e
g
⋅
L
r
e
g
+
λ
c
a
l
⋅
L
c
a
l
minL=L_{cls}+\lambda_{reg}\cdot L_{reg}+\lambda_{cal}\cdot L_{cal}\tag{6}
minL=Lcls+λreg⋅Lreg+λcal⋅Lcal(6)
在对6式进行优化后,对于原先本来是正面的人脸,利用PCN-1模型可以得到,而对于非正面的人脸,则对他们的bbox进行更新,然后根据预测的角度进行旋转,获得初步的结果。这阶段的角度旋转也很容易:
(7)
θ
1
=
{
0
°
,
g
≥
0.5
180
°
,
g
<
0.5
\theta_1= \begin{cases} 0°, & \text {g$\geq$0.5} \\ 180°, & \text{g$<$0.5} \end{cases} \tag{7}
θ1={0°,180°,g≥0.5g<0.5(7)
0°意味着不需要旋转,而180°意味着面部朝下,需要进行旋转。经过这个过程,最终非正面的人脸角度就会由原来的[-180°, 180°] 缩减至 [-90°,90°]之间。
对于数据集而言,由于所有的人脸检测通常都针对正面朝上的人脸进行检测,而且数据集也大多包含这样的图像。所以为了构建数据集,作者将正面的人脸图像进行了多角度旋转,从而获得360°各种角度都包含的数据来训练。其中包含三种类型的数据:正样本、负样本、中间样本。
正样本指的是与标签的IOU大于0.7,负样本为小于0.3,中间样本介于两者之间。在训练的时候,对于是否包含人脸进行分类的时候,正负样本都参与优化;而对于bbox回归的时候,使用的是正样本和中间样本来进行校正。其中,对于正样本和中间样本,如果面部与垂直轴的夹角位于[-65°, 65°]之间,则定义其为面部朝上;而在[-180°, -115°]和[115°, 180°]之间,则定义其为面部朝下。
PCN-2
有了上面的基础,对于第二阶段,就是进一步进行优化:更加精确的人脸/非人脸分类、更加精确的bbox回归,更加精细的角度校正。但不同的是,针对角度,进行了更加细致的划分,准确来说是三分类:
i
d
=
a
r
g
m
a
x
g
i
id=argmaxg_i
id=argmaxgi
(8)
θ
2
=
{
−
90
°
,
id=0
0
°
,
id=1
90
°
,
id=2
\theta_2= \begin{cases} -90°, & \text {id=0} \\ 0°, & \text{id=1} \\ 90°,& \text{id=2}\end{cases} \tag{8}
θ2=⎩⎪⎨⎪⎧−90°,0°,90°,id=0id=1id=2(8)
其中,
g
0
,
g
1
,
g
2
g_0, g_1, g_2
g0,g1,g2是三分类的得分,对应着图像要被旋转-90°,0°,90°。经过第二阶段,非正面的人脸角度就会由原来的 [-90°,90°]缩减至[-45°, 45°] 之间。
该训练阶段采用的数据,是将原始训练数据均匀旋转[-90°,90°],并且通过PCN-1过滤掉那些非人脸样本。而正样本和中间样本则用来进行角度校正,划分方式为[-90°,-60°],[-30°,30°],[60°,90°],分别对应标签0,1,2。不在这些区间内的样本,则用来校正。
PCN-3
通过阶段2,所有人脸的朝向都被限制在了[-45°,45°]之间,本阶段就是的预测目标就是包含人脸的bbox以及人脸的偏转角度。这部分内容训练的时候,是将训练数据在[-45°,45°]之间进行旋转,利用PCN-2过滤掉非人脸的图像,最终预测bbox的回归值。
综合上面的3个阶段,最终人脸的角度是各个阶段预测角度值的和:
(9)
θ
R
I
P
=
θ
1
+
θ
2
+
θ
3
\theta_{RIP}=\theta_1+\theta_2+\theta_3\tag{9}
θRIP=θ1+θ2+θ3(9)
PCN网络结构
下图是PCN各个阶段的网络结构模型:
可以看到,到了最后一个阶段,网络在预测角度的时候,只预测一个最终值。
训练阶段,每个batch中样本的比例设置为 正样本:负样本:中间样本=2 :2 :1。
实验结果
作者在开篇的时候提到过,对于不同人脸朝向,分别有三种解决方案。那么在实验阶段,作者就提出的PCN与三种方案的其他算法进行了对比。使用的数据集为WIDER FACE和FDDB。最终结果对比如下:
从上面的结果可以看出,所提出来的PCN算法在WIDER FACE数据集上仅仅比Faster RCNN差一点点,但在某些精度上还是有一定的优势的。而在FDDB数据集上,可以看出,PCN比其他类型的检测方法效果要好很多,同样,对于Faster RCNN和SSD相比,也是在某些情况下各有优劣。
下图是运行速度对比,对于640
×
\times
× 480的标准VGA图片,最小检测人脸大小为40
×
\times
× 40像素的情况下,对比:
从上表中可以看到,PCN的速度还是比较快的,在同等条件下,召回率也比较高,同时计算速度很快,可以满足一般场景下的应用。还有一点值的注意的是,其模型大小也比较小。
下面是PCN在WIDER FACE数据集上一些检测结果,可以看下模型的效果:
总结
可以看出,PCN在一定程度上与MTCNN的想法比较类似,只不过MTCNN是用来检测人脸的五个主要的关键点,而这里是用来进行角度的校正,同样都是回归的操作,两者还是有一些共同之处的。PCN进行训练对数据集进行了一定的旋转,并且部分进行了人工标注,这里是比较费时费力的。如果能够有一套数据集同时能够有各种角度和人脸关键点的标注信息,那么可以训练一个更加全面的关键点、人脸朝向的人脸检测器,这对于后续的人脸识别等任务能够提供更加强大的基础。
作者也给出了C++源代码,并在其中加入了“美颜”效果和“瘦脸”效果,本人在本机上进行了一下实验,结果还是很不错的。代码地址:https://github.com/Jack-CV/FaceKit
参考文献
Real-Time Rotation-Invariant Face Detection with Progressive Calibration Networks