上篇推送介绍了人脸检测技术的基本概念,人脸检测与人脸识别的区别,以及通过代码向读者直观地展示了人脸检测技术;这篇文章,将主要介绍人脸检测技术的算法原理。
人脸检测指的是检测出图片中的人脸,并能够标示出人脸的位置。人脸检测技术主要完成了两件工作:第一,判断图片中是否包含人脸区域;第二,如果图片中存在人脸,将人脸的位置预测出来。
人脸检测分为前深度学习时期和深度学习时期:前深度学习时期,人们主要将传统的计算机视觉算法运用于人脸检测,传统的计算机视觉算法,依赖于人工提取特征,然后使用这些人工特征来训练一个检测器;在深度学习时期,人们尝试将卷积神经网络应用于人脸检测这一问题,一般有两种方式:一种是将适用于多种任务的目标检测网络(如faster-rcnn网络,yolo网络)应用于人脸检测任务;另一种是研究专门的人脸检测网络。
本文接下来将主要简述基于深度学习技术的人脸检测算法原理:首先,讲述faster-rcnn网络的基本原理,以及如何将faster-rcnn应用于人脸检测;接着,讲述专门用于人脸检测的卷积神经网络。
通用目标检测网络有faster-rcnn,yolo,ssd以及最新的基于点检测的等网络。只要有相应的数据集,这些网络一般可用来检测任意目标,比如皮卡丘、车辆、人脸等。
faster-rcnn[1]是一种通用的目标检测网络。faster-rcnn网络结构大体上可以分为三个部分。第一部分是用来提取图片特征,生成feature maps的卷积层。第二部分是候选区域生成网络——RPN。第三部分是对候选区域进行分类和调整的网络。其网络结构如下图所示。
这幅图应按照从下往上看。最下面是image,这是整个网络的输入。image的上面是卷积层conv layers。在这里,卷积层主要是用来提取图片特征,生成feature maps。提取特征的卷积层,可以使用Vgg Net网络结构,也可以使用Res Net网络结构。image数据经过conv layers后得到feature maps。faster rcnn网络的后几层,便是基于feature maps来计算的。
真正使faster-rcnn具备检测能力的是RPN层和Roi Pooling层。其中,RPN层用于生成候选区域。Roi Pooling层使用RPN层生成的候选区域,以及conv layers最后一层的输出,来生成固定大小的proposal feature map。
classifier层以Roi Pooling层的输出作为输入,进行全连接运算,并使用Softmax来预测候选区域所属的类别。
将faster-rcnn应用于人脸检测,需要在训练这个网络的时候,使用人脸检测数据集。github上有基于caffe的faster rcnn的实现[2]。读者可以基于这个工程,使用一些开源或者自己标注的人脸检测数据集,训练出一个用于人脸检测的模型。
自深度学习在计算机视觉领域大放异彩后,人们设计了一些专门应用于人脸检测的网络结构。级联卷积神经网络,常被人们应用在人脸检测任务。例如,cascadeCNN,MTCNN等。在专门用于人脸检测的卷积神经网络中,最经典的网络当属MTCNN。MTCNN在github上有一些源码,以及一些已经训练好的模型。读者可以下载到本地机器上运行。
cascadeCNN[3]是一种比较快速的人脸检测网络。该网络在FDDB数据集上可以达到85.1%以上的准确率。
cascadeCNN的网络结构如下图所示。
calibration-net的网络结构如下图所示。该网络用于校正人脸框。
MTCNN全称是Multitask Cascaded Convolutional Networks,是2016年中国科学院深圳先进技术研究院的研究成果。MTCNN将人脸检测与人脸关键点检测放在了一起,大体上可以分为三层网络结构:PNet、RNet和ONet。
该网络的结构如下图所示。
第一步:P-Net是一个全卷积网络,通过浅层的CNN用来生成候选区域。使用Bounding box regression和非极大值抑制(NMS)来过滤并校正候区域。
第二步:N-Net对候选区域进行调整。将通过P-Net的候选窗输入R-Net中,拒绝掉大部分效果比较差的候选区域,使用Bounding box regression和NMS进一步优化候选区域。
第三步:O-Net是一个较为复杂的卷积神经网络。O-Net输出最终的人脸框和特征点位置。这个网络最终输出人脸框的位置,以及五个人脸关键点。
以上的成果是17年之前的,这些经典的网络有的在工业界取得非常成熟的应用。下面推荐两篇18年的论文以及一篇19年的文章,有兴趣的同学,可以细读并复现一下这些文章,三篇文章分别是Face Detection Using Improved Faster RCNN[6]、Hoi Feature Agglomeration Networks for Single Stage Face Detection[7]、Single-Shot Scale-Aware Network for Real-Time Face Detection[8]。这三篇文章均在一些开源的人脸数据集如WIDER FACE上均取得不错的效果;其中,最后一篇文章在VGA分辨率下对人脸的检测速度可以达到82.1 FPS。
本文简单介绍了人脸检测的发展历程。主要阐述了可以应用于人脸检测的通用目标检测网络faster rcnn,以及专门用于人脸检测的级联卷积神经网络cascadeCNN和MTCNN;这些网络是比较经典的人脸检测网络,是跟进最新人脸检测的基础,有兴趣的读者可以通过阅读原文来加深理解。
下一篇文章,将基于一个网络结构和一个数据集,来讲述如何训练一个人脸检测模型。敬请关注!
[1] Ren S, He K, Girshick R, et al. Faster r-cnn: Towards real-time object detection with region proposal networks[C]//Advances in neural information processing systems. 2015: 91-99.
[2] faster rcnn实现 https://github.com/rbgirshick/py-faster-rcnn
[3] Li H, Lin Z, Shen X, et al. A convolutional neural network cascade for face detection[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2015: 5325-5334.
[4] Zhang K , Zhang Z , Li Z , et al. Joint Face Detection and Alignment Using Multitask Cascaded Convolutional Networks[J]. IEEE Signal Processing Letters, 2016, 23(10):1499-1503.
[5] MTCNN代码 https://github.com/kpzhang93/MTCNN_face_detection_alignment
[6] C. Zhang, X. Xu, D. Tu Face Detection Using Improved Faster RCNN. arXiv preprint arXiv:1802.02142, 2018.
[7] J. Zhang, X. Wu, J. Zhu, Steven C.H. Hoi Feature Agglomeration Networks for Single Stage Face Detection. arXiv preprint arXiv:1712.00721, 2018.
[8] S. Zhang, L. Wen, H. Shi, Z. Lei, S. Lyu, Stan Z. Li Single-Shot Scale-Aware Network for Real-Time Face Detection. International Journal of Computer Vision (IJCV), 2019.
关注微信公众号“机器学习和人工智能”,干货多多~
我们会定期推送Python编程,人工智能基础算法,学术界、工业界最新动态,让更多的人了解人工智能~
欢迎扫描下方二维码关注哈~