自然场景下的人脸识别(一)——人脸检测

人脸检测技术有许多的应用场景,最常见的就是拍摄照片时检测到人脸并且做美颜。

本人本科毕业设计题目与人脸识别相关,人脸识别的第一部就是进行人脸检测,检测出人脸后再进行后续的人脸比对识别。这里总结一下我这段时间所学的知识,后面继续做人脸识别相关。

综述

人脸识别这个问题在很久之前就已经提出了。

在人脸识别领域很著名的算法是2004年 Viola and Jones 提出的,使用 Haar-like 特征和 AdaBoost算法来训练分类器,通过分类的级联来获得一个较强的人脸识别模型。这个模型能够很好的检测出正面的人脸。然而在自然场景下拍摄的照片,由于光照、面部姿态角、遮挡的原因,这个算法在漏检率十分的高。Viola and Jones 也提出了一些方法来解决面部姿态角不同所产生的人脸漏检的问题,但是模型的复杂性都是相对比较高的。

另外一个进行人脸检测的方法是使用DPM模型。DPM模型是在HOG特征基础上进行改进的,DPM使用了多个分辨率不同的HOG特征。利用了子模型和主模型空间的先验知识,在人脸面部姿态角变化、遮挡问题上有很强的鲁棒性。

但是上述的两种方法及其改良版本,训练过程比较复杂,在某些场景下漏检率比较高,所以和毕业设计老师交流的时候,老师建议使用深度学习的方法来尝试人脸检测。所以我的毕业设计也就走向了使用神经网络来实现的道路上了。这篇总结也是围绕我所看的论文所写的。

基于神经网络的人脸检测

深度学习人脸检测最早的代表论文是2015年CVPR上的 "A Convolutional Neural Network Cascade for Face Detection",保留了传统人脸检测方法中Cascade的方法。另一篇是 "Multi-view Face Detection Using Deep Convolutional Neural Networks" 亮点是使用了全卷积网络,得到图像的heatmap。

2016年kpzhang发表的"Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks"综合使用了上面两种方法。由于kpzhang在github上开源了他的测试代码和模型,所以目前我所使用的人脸检测方法也是这种方法。

其实有很多工作是将Object Detection 的方法例如RCNNFastRCNNYOLO应用到人脸检测上的。其实上面提到的方法也参考了很多Object Detection的做法。由于毕业设计是做人脸识别相关的,所以我所看的论文就都是面对人脸检测这个小一点的问题上的。

论文阅读及相关的笔记

下面是我在学习人脸检测时所看的3篇关于人脸检测相关的论文的笔记

1. A Convolutional Neural Network Cascade for Face Detection

这篇论文是将卷积神经网络运用在人脸检测任务上比较有代表性的文章。这篇论文提出的方法保留了 Detector Cascade 的结构,使用了6个CNN网路进行级联,其中3个CNN网络用来做是否存在人脸的二分类,另外3个用来作为人脸边界框框的校准(calibration)

  • 用于人脸检测的二分类网络: 12-net, 24-net, 48-net
  • 用于候选框校准的网络: 12-calibration-net, 24-calibration-net, 48-calibration-net
自然场景下的人脸识别(一)——人脸检测
(人脸检测整个流程)

三个候选框校正的网络实现的是多分类网络而不是回归网络

通过对3个维度的预定义缩放集合构成N个校准模式,校准模式可以写成\(\{[s_n,x_n,y_n]\}_{n=1}^{N}\)。给定一个检测窗口\((x,y,w,h)\)(\((x,y)\)表示检测窗口的左上角,\((w,h)\)表示大小),校准模式将会以下面的形式来校准提供的检测窗口:
\[(x-\frac{x_n w}{s_n}, y-\frac{y_n h}{s_n}, \frac{w}{s_n}, \frac{h}{s_n})\]
实际使用中\(s_n, x_n, y_n\)的取值范围:
\[\begin{array}{lll}s_n & \in & \{0.83, 0.91, 1.0, 1.10, 1.21\} \\x_n & \in & \{-0.17, 0, 0.17\} \\y_n & \in & \{-0.17, 0, 0.17\} \\\end{array}\]

所以 \(N=45\)。因为这45个校准模式之间并不是两两正交的,所以文中没有直接使用最高得分的校准模式对候选框进行校准,而是采取加权平均的方式进行的(其中\(t\)为阈值):
\[\begin{array}{ccc}[s,x,y] = \frac{1}{Z}\sum_{n=1}^{N}[s_n,x_n,y_n]I(c_n > t) \\\\Z=\sum_{n=1}^{N}I(c_n>t)\\\\I(c_n > t) = \left\{ \begin{array}{ll}1 & \textrm{if $c_n > t$} \\0 & \textrm{otherwise.}\end{array} \right.\end{array}\]
自然场景下的人脸识别(一)——人脸检测

(三个校准网络)

12-net、24-net、48-net

12-net非常浅的二分类卷积网络, 通过使用步幅为4,大小为12×12的滑窗,作为网络的输入得到的结果是该滑窗是否包含人脸的评分。要检测不同尺度的人脸,所以对输入图片进行缩放得到Image Pyramid,在将Image Pyramid中的每张图片进行处理。在实际应用中,假设可接受的最小面部尺寸为F,那Image Pyramid的缩放比例就为 \(\frac{12}{F}\)
自然场景下的人脸识别(一)——人脸检测
24-net使用12-calibration-net校正的图像作为输入,功能与12-net一样,文中采取了多分辨率的架构,将12-net的全连接层整合到24-net的全连接层中,文中说是为了发现更小的人脸。
自然场景下的人脸识别(一)——人脸检测

(24-net结构)

自然场景下的人脸识别(一)——人脸检测
(用多分辨率结构带来性能的提升)

48-net 的结构与24-net的结构类似,只不过层次更深而已
自然场景下的人脸识别(一)——人脸检测
(48-net)

2. Multi-View Face Detection Using Deep Convolutional Neural Networks

这篇网络与前面一篇相比,亮点在于,作者使用的全卷积网络代替了滑窗。图片经过全卷积网络生成了一个人脸检测的heatmap,代表了检测器在图片上的不同响应。根据响应评分获得人脸候选框。

论文中使用的是AlexNet网络,使用AlexNet在LFW数据集上进行微调得到。他们对AlexNet的全连接层测参数进行修正,使其变为卷积层,由于AlexNet具有比较好的分类能力,所以论文中没有使用像级联架构来检测人脸。网络最终的输出为图片的heatmap
自然场景下的人脸识别(一)——人脸检测

(图7)

这篇论文除了介绍他们使用全卷积网络来检测人脸外,还使用了比较大的篇幅来阐述训练样本中人脸姿态角的分布对检测器性能的影响。可以看到图7中,正面人脸的评分非常高, 99.9%。但是随着角度的旋转,在同一个平面内,其他角度的人脸的评分均小于正面人脸的评分。作者对训练集合图像进行统计,得到了训练集合中关于人脸姿态角的分布。
自然场景下的人脸识别(一)——人脸检测
由于使用交叉熵作为损失函数,分布不均的样本会使神经网络偏向于正面脸部,因为这样损失函数下降得最快,作者根据这个现象其实也做了一些数据增强。例如在训练过程中,由于负样本数量是正样本数量的100倍,如果使用随机采样的方式获得每个batch的训练数据,每个batch(128张/batch)中平均只有2张正样本。所以他们强制使训练样本正样本的数量占到\(\frac{1}{4}\)(32positive + 96negative)
作者提出了一些值得尝试的Data Augmentation:
  • 使训练样本中各个面部旋转角度出现的概率相等。
  • 对训练样本中添加遮挡,但不建议只是将部分像素置为0.因为这样网络会学到这些人为制造的数据。

3. Joint Face Detection and Alignment using Multi-task Cascaded Convolution Networks

multi-task 在2016年的时候突然火了起来,这篇论文就采用了multi-task的卷积神经网络,结合了上面两篇论文的一些做法,主要思想有一下5点:

  1. 采用cascaded multi-task 结构,3级级联结构,每一级单独训练
  2. 将face detection、 alignment 和 landmark 作为multi-task 在一个网络中同时优化,三者的相关性能够促进准确率的提高。
  3. 使用全卷积网络代替滑窗生成图片heatmap, 前期过滤大部分的背景窗口
  4. 采用Online Hard Example Mining提高准确率
  5. 使用Image Pyramid以检测不同尺度的人脸。

下图是作者论文中关于使用到的神经网络的结构图
自然场景下的人脸识别(一)——人脸检测

文中使用的三个网络结构也是从浅到深。前期使用浅层的卷积神经网络过滤掉大量的背景选框,因为此时是为了快速过滤无关紧要的背景,所以卷积网络的能力可以不是特别强。 配合multi-task,前期可以快速提取候选框。第一个阶段所采用的网络作者称为Pnet
自然场景下的人脸识别(一)——人脸检测
接下来就是两个结构相仿的卷积神经网络RnetOnet。网络能力逐步增强。输入候选图像的大小也从小到大,分别为24px和48px
自然场景下的人脸识别(一)——人脸检测
自然场景下的人脸识别(一)——人脸检测

上面的网络是kpzhang93开源出来的网络模型进行绘制出来的,眼尖的读者会发现,PnetRnet和论文中不一样,少了一个输出,这是因为作者采用的WiderFace数据集,该数据集没有landmard(人脸关键点)信息,因此Pnet和后续的Onet只做了classificationbounding box regression

multi-task 损失函数的定义

损失函数的定义由多个任务的误差进行加权求和得到

\(L_{i}^{det} = -(y_i^{det}log(p_i) + (1-y_i^{det})(1-log(p_i)))\)

\(L_i^{box} = \left \| \hat{y}_i^{box} -y_i^{box} \right \|^2_2\)

\(L_i^{landmark} = \left \| \hat{y}_i^{landmark} - y_i^{landmark} \right \|^2_2\)

得到:
\[min\sum_{i=1}^{N}\sum_{j\in\left\{det, box, landmark\right\}} \alpha_j\beta_i^jL_i^j\]
训练不同网络时使用的权重不一样。
由于是对人脸的检测,如果检测不是人脸的话就不对回归框和关键点位置计算损失。

在线困难样本挖掘(Online Hard Sample Mining)

在训练的时候使用OHSM来提高模型的准确率,每个mini-batch中计算出70%的困难样本,只是计算这些困难样本的损失来计算梯度。因为容易的样本对提高模型能力相对比较小。
自然场景下的人脸识别(一)——人脸检测

(使用困难样本挖掘对性能的提升)

-------------------

最终结果

自然场景下的人脸识别(一)——人脸检测
左图使用的是HOG+SVM的方法,右图使用的是mtcnn

自然场景下的人脸识别(一)——人脸检测
此图使用的是mtcnn的方法进行检测

可以发现上图出现了误测,但看了一下人脸的置信度为93%,误测可以在工程化时,可以通过调整阈值来弥补。比较有趣的是,连小金人的连也能识别出来。

Summary

这篇文章是本人本科毕业设计所学内容的总结。如果各位读者有什么看法和建议欢迎在评论区提出来。行文有什么纰漏的话,也请大家不吝指正。谢谢
过段时间我也会继续把人脸识别关于人脸对比的学习内容总结出来。

相关推荐