我们来看一下计算机人脸识别的流程,首先是获取输入图像,然后检测图像中是否有人脸,人脸的具体位置,然后判断图像的质量,比如图像是否模糊,光照度是否足够,然后检测人脸偏转的角度,旋转人脸到一个正脸位置,再然后提取人脸特征,比对人脸特征,最后输出识别结果。其中图像质量检测和人脸对齐这两步是可选的步骤,根据具体应用场景来决定。
5 人脸检测-经典方法
我们来看看经典的人脸检测方法。
OpenCV和Dlib是两个常用的算法库。
OpenCV 中使用Haar Cascade来做人脸检测,其实Haar Cascade可以检测任何对象,比如人脸和脸上眼睛的位置。
DLIB中是使用方向梯度直方图(Histogram of Oriented Gradient, HOG),即通过计算图像局部区域的梯度方向直方图来提取特征,这种方法的本质在于梯度的统计信息,而梯度主要存在于边缘的地方。
OpenCV和DLIB各自也有他们自己的基于深度学习的人脸检测方法,使用起来非常简单。从这几种方法都可以做到CPU实时或GPU实时;经典的检测方法对正脸的检测效果比较好,深度学习的方法适应性更强,可以检测各种角度的人脸。
6 MTCNN人脸检测
2016年提出来的MTCNN算法是目前公认比较好的人脸检测算法是(Multi-task Cascaded Convolutional Networks),可以同时实现face detection和alignment,也就是人脸检测和对齐。
这里的对齐指的是检测人脸眼睛、鼻子、嘴巴轮廓关键点LandMark。
MTCNN算法主要包含三个子网络:P-Net (Proposal Network)、 R-Net(Refine Network)、O-Net(Output Network),这3个网络按照由粗到细的方式处理输入照片,每个网络有3条支路用来分别做人脸分类、人脸框的回归和人脸关键点定位。
左上角,最开始对在多个尺度上对图像做了resize,构成了图像金字塔,然后这些不同尺度的图像作为P、P、O网络的输入进行训练,目的是为了可以检测不同尺度的人脸。
P-Net主要用来生成候选人脸框。 R-Net主要用来去除大量的非人脸框。O-Net和R-Net有点像,在R-NET基础上增加了landmark位置的回归,最终输出包含一个或多个人脸框的位置信息和关键点信息。
7 人脸特征提取-经典方法
接下来,我们来看一下人脸特征提取。经典的人脸特征提取方法有EigenFace和FisherFace两种。
EigenFace的思想是把人脸从像素空间变换到另一个空间,在另一个空间中做相似性的计算。EigenFace的空间变换方法是主成分分析PCA。这个方法90年代开始应用于人脸识别,因为主成分有人脸的形状,所以也称为“特征脸”。
FisherFace是一种基于线性判别分析LDA(全称Linear Discriminant Analysis,)的人脸特征提取算法, LDA和PCA都是利用特征值排序找到主元的过程。LDA强调的是不同人脸的差异而不是照明条件、人脸表情和方向的变化。所以,Fisherface对人脸光照、人脸姿态变化的影响更不敏感。
8 人脸特征提取-深度学习法
我们再来看看深度学习法。