人脸识别服务需要包括以下几个功能模块:
1、人脸检测和人脸校正模块
2、人脸特征提取模块
3、人脸特征匹配模块
4、人脸识别结果计算模块
这篇文章简要介绍一下人脸检测和人脸校正部分。
人脸检测
人脸检测:人脸检测顾名思义就是要准确检测出图像或者视频中的人脸区域位置。我个人常用的人脸检测方法包括MTCNN和RetinaFace,人脸检测的结果包括人脸区域在图像中的位置[x, y, w, h],x和y 表示人脸区域左上角相对图像左上角的坐标位置,w和h表示人脸区域的宽度和高度。检测结果还包括人脸特征点的位置,如5点特征点(左眼、右眼、鼻尖、最嘴角、右嘴角)坐标位置,或68点坐标位置。
人脸检测的输入:图像数据
人脸检测的输出:人脸区域坐标位置,人脸关键点的坐标位置
下面以MTCNN人脸检测方法为例来简要说明一下人脸检测:
上图是MTCNN论文中的说明图,MTCNN采用的是级联神经网络来逐步提升人脸检测的精度,最终输出人脸区域的坐标位置,以及5点人脸坐标。
为了能够检测不同大小的人脸,MTCNN采用了图像金字塔的方式来检测图像中不同大小的人脸,这也会导致检测算法的速度降低。P-Net网络训练时采用的人脸大小是12 * 12,缩放使得图像中的不同大小的人脸,在经过缩放组成的图像金字塔中,每个人脸都有与12 * 12训练样本大小相当的样本存在。PNet输出可能包含人脸的区域位置,RNet进一步修正PNet输出的人脸区域,ONet进一步修正RNet输出的人脸区域,并同步输出人脸五官坐标。
P-Net是一个全卷积网络,可以处理任意大小的输入图像,自然而然的也可以处理图像金字塔,输出可能包含人脸的区域得分及坐标位置。
R-Net对PNet得到的人脸框进一步筛选,输出仍然是区域得分和坐标位置。R-Net将P-Net预测得到的人脸区域进行缩放到24 * 24 大小作为输入:
O-Net对RNet得到的人脸框进一步筛选、修正,并同步计算特征点坐标。O-Net将R-Net预测得到的人脸区域缩放到48 * 48大小作为输入:
从上述叙述可知,人脸检测过程既包含分类(是否有人脸)又包含回归(人脸区域坐标回归,人脸关键点坐标回归)。
人脸校正
在上文中提到了人脸检测过程中会同步输出人脸关键点的坐标位置,如左眼、右眼、鼻尖、左嘴角、右嘴角的坐标位置,输出人脸关键点的主要目的是为了进行人脸校正。
什么是人脸校正?
人脸校正主要是将人脸图像调整到正常状态(即两眼连线处于水平状态)。
人脸校正的目的是什么?
人脸校正的目的是提升人脸识别的准确率。在人脸识别应用的过程中,会遇到各种各样的人脸情况,比如歪头,侧头,低头等情况,人脸校正就是将人脸图像调整到水平状态,然后在后续进行人脸识别时,所有待识别的人脸都处于相同的状态(即水平状态),降低了人脸识别时的难度,可以提升识别结果的准确性。
人脸检测代码示例:https://github.com/davidsandberg/facenet/blob/master/src/align/detect_face.py