2.4 SSH 人脸检测算法
SSH(Single Stage Headless Face Detector)[18]人脸检测算法最大的特色是尺度不相关性(Scale-Invariant)。上述MTCNN 人脸检测算法在预测的时候,需要对不同尺度的图像分别进行预测,而SSH 仅需要处理一个尺度的图像,其实现方式是使用VGG 网络对不同层级的卷积层输出做3个分支(M1、M2、M3),每个分支都使用类似的流程进行检测和分类,通过对不同尺度特征进行分析,实现多尺度的人脸检测[17]。
SSH 使用的基础网络为VGG16[20],SSH 的headless 指的是将原始分类网络中的全连接层去掉,只保留基础网络,只使用了卷积层。这样做可以去掉大量参数,同时加速运算。相比MTCNN 算法在检测不同尺度的人脸时所采用的图像金字塔,SSH 中采用的是特征金字塔,对卷积层使用3种类型的检测模块,利用不同的卷积步长来同时检测大、中、小3种人脸[19]。
图2-5所示为SSH 人脸检测算法的网络结构,是基于VGG16神经网络[20]的改进,主要特点是使用不同尺度的卷积特征,有点类似于SSD(Single Shot multi-box Detector)神经网络。SSH 的主要特色是多尺度人脸检测,它在技术上的主要贡献在于网络结构的设计。可以看到,SSH的网络结构为全卷积网络,网络的连接方式为:①在Conv 4_3之后接了检测模块M1,用来检测小型人脸;②在Conv 5_3之后接了检测模块M2,用来检测中型人脸;③对Conv 5_3进行一次最大池化之后,接了检测模块M3,用来检测大型人脸[19]。
图2-5 SSH 人脸检测算法的网络结构[18]
(1)SSH 人脸检测算法网络的第一部分直接使用16层的VGG16神经网络[20]的前4层。如图2-6所示,VGG16共包含5层(段)卷积层和3个全连接层,共计16个隐含层(13个卷积层和3个全连接层)。整个网络都使用了同样大小的卷积核尺寸(3×3)和滑动步幅(1),以及相同的最大池化尺寸(2×2)。
图2-6 VGG16的网络结构[21-22]
VGG16的第1层(第1段卷积)Conv1包括两个连续的卷积操作Conv1_1和Conv1_2,均使用64个3×3的卷积核。VGG16的第1段卷积层之后,紧接一个2×2的最大池化层(Pool_1),将特征压缩一半。接着是VGG16的第2段卷积层Conv2,该层使用128个3×3的卷积核,该层也包含了两个连续的卷积操作Conv2_1和 Conv2_2。VGG16的第2段卷积层之后,又接上一个2×2的最大池化层(Pool_2),将特征压缩一半。下面是第3段卷积层Conv3,该层使用256个3×3的卷积核,该层包含3个连续的卷积操作Conv3_1、Conv3_2和Conv3_3。第3段卷积层后面又接上了一个2×2的池化层(Pool_3)。之后是VGG16的第4段卷积层Conv4,该层使用512个3×3的卷积核,包含3个连续的卷积操作Conv4_1、Conv4_2和Conv4_3。第4段卷积层后紧跟着一个2×2的池化层(Pool_4)。VGG16的第5段卷积层使用512个3×3的卷积核Conv5,包含3个连续的卷积操作Conv5_1、Conv5_2和Conv5_3。第5段卷积层后面紧跟着一个2×2的池化层(Pool_5)。由图2-5和图2-6可知,SSH 网络的第1部分包括了VGG16的前4层,即上述的VGG16网络的前4段卷积层和池化层:Conv1(Conv1_1和 Conv1_2),Pool_1;Conv2(Conv2_1和Conv2_2),Pool_2;Conv3(Conv3_1、Conv3_2和Conv3_3),Pool_3;Conv4(Conv4_1、Conv4_2和Conv4_3),Pool_4。
(2)SSH 网络的第2部分,包括3个分支M1、M2和M3。
如图2-5所示,M1分支仅使用了VGG16的前4层,即仅使用VGG16在Pool_4后的特征(但是也融合了Conv5_3之后的特征,下面将介绍)。而M2和M3两个分支都使用了VGG16网络的第5段卷积层Conv5(含Conv5_1、Conv5_2和Conv5_3)。M2和M3的区别在于,M2在Conv5_3之后没有接池化层,而M3后面接了一个池化层Pool_5。M2和M3得到的特征:M2的VGG16在Pool_5后得到的特征,M3的VGG16在Conv5_3后得到的特征,将分别用于人脸检测。
M1则有所不同,它包含了两部分特征的融合(上面已经提到),第1部分是直接使用VGG16网络在Pool_4后得到的特征,第2部分是M2分支(VGG16在Conv5之后得到的特征,没有接池化层)得到的特征。然后,第1部分通过1×1卷积操作,将Pool_4后得到的特征的通道数从512降到128;第2部分也将特征的通道数从512降到128,然后进行上采样(双线性插值)。之后,将两部分的特征合并/融合,再跟上一个3×3的卷积操作,得到的特征作为M1分支最终所使用的特征。因此,M1的特征融合了两种尺度的卷积特征。
通过上述网络设计,M1适用于检测较小的人脸,M2适用于检测中等大小的人脸,而M3适用于检测较大的人脸。SSH 的目标(输出)是同时进行分类(判定是否为人脸)预测和外接框(bounding box)坐标点的回归,因此损失函数是分类损失和回归损失的和。
以上是SSH 算法的网络结构的介绍。另外,SSH 也使用了难例挖掘的技术,并在每批中预留25%的数量给正样本。在GitHub 上,有开源实现的SSH 人脸检测算法的源代码,有兴趣的读者可以通过文献[23]中的源代码深入了解。