FaceBoxes:A CPU Real-time Face Detector with High Accuracy 解读。若博文有不妥之处,望加以指点,笔者一定及时修正。
文章目录
① 论文相关
1、概要
在检测中,寻求实时性和准确性的折中不是一个简单的问题,因为高准确率的网络往往有大量的计算,速度较慢。传统的检测算法可以实时,但是准确度不够;基于 C N N CNN CNN 的方法虽精度高但是速度慢,而且检测的速度与一张图片里面人脸的数目密切联系,如果人脸数过多,整体速度下降。而 F a c e B o x e s FaceBoxes FaceBoxes 可以在 C P U CPU CPU 环境下实时的保持一个高准确率,且不需要关心一张图片中有多少个人脸。
人脸检测主要存在两个问题:
①背景多样,如何有效进行人脸二分类;
②有效时间内,搜索人脸可能存在的位置和人脸的尺度;
2、引言
本文类似于 S S D SSD SSD,主要的贡献:
a)设计了 R D C L : R a p i d l y D i g e s t e d C o n v o l u t i o n a l L a y e r s RDCL:Rapidly \ Digested \ Convolutional \ Layers RDCL:Rapidly Digested Convolutional Layers来进行加速,确保实时性;
b)引入了 M S C L : M u l t i p l e S c a l e C o n v o l u t i o n a l L a y e r s MSCL:Multiple \ Scale \ Convolutional \ Layers MSCL:Multiple Scale Convolutional Layers 来丰富感受野和得到更多的框从而处理多尺度的人脸;
c)提出了一个新的锚框增加密度策略,目的是提高小尺度人脸的召回率。
3、网络结构
整体的网络结构图:
分两部分,
R
D
C
L
、
M
S
C
L
RDCL、MSCL
RDCL、MSCL:
3.1 快速消融卷积层(Rapidly Digested Convolutional Layers)
目的:将图像尺寸快速的下降下去,减少网络的通道数,减少信息损失,保证实时。
策略:
- 快速降低图像尺寸:卷积层 C o n v 1 Conv1 Conv1 与 C o n v 2 Conv2 Conv2 的步长为 4 和 2,池化层的步长为 2和 2。这样到 I n c e p t i o n Inception Inception 网络前面尺寸就缩小了 32 倍(4 x 2 x 2 x 2)(这边只涉及到步长哦!)。
- 减少信息损失:一开始的卷积应该设置尽量小,这样才能加速,但是设置小了,得到的信息又不足。因此,作者将 C o n v 1 Conv1 Conv1 的卷积核大小设置为 7 ∗ 7 7*7 7∗7, P o o l 1 Pool1 Pool1 的卷积核大小设置为 3 ∗ 3 3*3 3∗3, C o n v 2 Conv2 Conv2 的卷积核大小设置为 5 ∗ 5 5*5 5∗5, P o o l 2 Pool2 Pool2 的卷积核大小设置为 3 ∗ 3 3*3 3∗3。
- 减少网络的通道数:利用 C R e L U CReLU CReLU 来减少卷积层输出的通道数,因为卷积层输出通道数减少了,所需的卷积核数量就减少了。而为什么可以用 C R e L u CReLu CReLu 呢?因为研究表明: C N N CNN CNN的较低层中的滤波器会形成对(滤波器具有相反的效应)。这样 C R e L U CReLU CReLU 可以通过在 R e L U ReLU ReLU 之前简单地 C o n c a t Concat Concat 否定的输出来使输出通道的数量加倍。 使用 C R e L U CReLU CReLU 可显着提高速度,而且精度基本无下降。
3.2 多尺度卷积层(Multiple Scale Convolutional Layers)
MSCL遵循两个角度:深度和宽度。
- 深度
网络结构有上面8部分组成,前3部分是 I n c e p t i o n Inception Inception 网络。 I n c e p t i o n 1 , 2 , 3 Inception 1,2,3 Inception1,2,3 输出的特征图尺寸是 32 ∗ 32 32*32 32∗32,尺寸不变,但是丰富了感受野和锚框!怎么会有这种效果,下面会介绍的,不要着急哈! I n c e p t i o n 3 Inception3 Inception3 那边会有一个输出1(32 x 32), C o n v 3 − 2 Conv3-2 Conv3−2 有一个输出2(16 x 16),和 C o n v 4 − 2 Conv4-2 Conv4−2 有一个输出3(8 x 8)。类似于SSD,锚框关联多尺度的特征图的,也就是基于不同尺寸的特征图去得到不同大小的锚框去处理不同尺度的人脸。 - 宽度
这边使用了 i n c e p t i o n inception inception 丰富了感受野。下面着重介绍 I n c e p t i o n Inception Inception 网络,及如何计算感受野,和论文中 I n c e p t i o n 3 Inception3 Inception3 那边锚框的尺寸有3种和7个感受野的由来。
3.2.1 Inception 网络
I
n
c
e
p
t
i
o
n
Inception
Inception 网络的设计思路:
- i n c e p t i o n inception inception 多尺度卷积核去卷积同一个输入,再相加,增加特征表达能力的同时减少计算。
- 模型更精巧复杂了,增加 B N BN BN 和 g r a d i e n t c l i p p i n g gradient \ clipping gradient clipping去稳定训练。
3.2.2 感受野
感受野:某一层特征图的像素点映射到原图的区域大小。简单的来说,就是目标检测里面的在某一特征图上画小框,映射到原图上这个框会变得相对于原图的所包含的大框区域,所以感受野只与特征图到原图的映射关系有关,与原图大小无关! 这非常有用,因为高分辨率的特征图感受野小,适合检测小目标;低分辨率的特征图感受野大,适合检测大目标。
那如何计算感受野呢?推荐一个网站:https://fomoro.com/projects/project/receptive-field-calculator。
普通卷积感受野的计算:
F
(
i
,
j
−
1
)
=
(
(
F
(
i
,
j
)
−
1
)
)
∗
s
t
r
i
d
e
+
k
e
r
n
e
l
−
s
i
z
e
F(i,j-1)=((F(i,j)-1))*stride+kernel-size
F(i,j−1)=((F(i,j)−1))∗stride+kernel−size
其中
F
(
i
,
j
)
F(i,j)
F(i,j) 表示第
i
i
i 层对第
j
j
j 层的局部感受野。
因为 I n c e p t i o n Inception Inception 网络是用多个卷积核卷积同一个输入代替单一层卷积,然后进行拼接,所以上式中的 k e r n e l − s i z e kernel-size kernel−size就有多个。以此类推,感受野一共有7个。
3、锚框的致密策略
I
n
c
e
p
t
i
o
n
Inception
Inception 的
a
n
c
h
o
r
anchor
anchor 尺度为
32
∗
32
,
64
∗
64
,
128
∗
128
32*32, 64*64 ,128*128
32∗32,64∗64,128∗128,
C
o
n
v
3
−
2
、
C
o
n
v
4
−
2
Conv3-2、Conv4-2
Conv3−2、Conv4−2 的尺度分别为
256
∗
256
256*256
256∗256 和
512
∗
512
512*512
512∗512。这边我们需要注意的是:一个特征图上预测的框映射到原图上的间隔与该层的感受野相同。比如
C
o
n
4
−
2
Con4-2
Con4−2 的感受野是128,表示输入图片上每隔 128 个像素点就会有一个
512
∗
512
512*512
512∗512尺寸的框。
论文中定义个框密度的计算公式:
A
d
e
n
s
i
t
y
=
A
s
c
a
l
e
/
A
i
n
t
e
r
v
a
l
A_{density} = A_{scale}/A_{interval}
Adensity=Ascale/Ainterval
我们可以看出
A
s
c
a
l
e
A_{scale}
Ascale 分别为32,64,128,256,512。而对应的
A
i
n
t
e
r
v
a
l
A_{interval}
Ainterval 分别为 32,32,32,64,128。根据上面公式我们可以计算出对应框的密度分别为:1,2,4,4,4。我们可以看出 32 x 32 和 64 x 64 的框过于稀疏,所以我们进行扩增密度。
方法很容易理解。32 x 32 的扩增4倍,64 x 64 的扩增两倍。
4、损失函数
和Faster R-CNN中的RPN用同样的 l o s s loss loss,一个2分类的 s o f t m a x l o s s softmax \ loss softmax loss用来做分类, s m o o t h L 1 smooth \ L1 smooth L1 用来做回归。
② 参考博客
这几位的博客十分好,隆重推荐!