一、MTCNN的原理
搭建人脸识别系统的第一步是人脸检测,也就是在图片中找到人脸的位置。在这个过程中,系统的输入是一张可能含有人脸的图片,输出是人脸位置的矩形框,如下图所示。一般来说,人脸检测应该可以正确检测出图片中存在的所有人脸,不能用遗漏,也不能有错检。
获得包含人脸的矩形框后,第二步要做的就是人脸对齐(Face Alignment)。原始图片中人脸的姿态、位置可能较大的区别,为了之后统一处理,要把人脸“摆正”。为此,需要检测人脸中的关键点(Landmark),如眼睛的位置、鼻子的位置、嘴巴的位置、脸的轮廓点等。根据这些关键点可以使用仿射变换将人脸统一校准,以尽量消除姿势不同带来的误差,人脸对齐的过程如下图所示。
这里介绍一种基于深度卷积神经网络的人脸检测和人脸对齐方法----MTCNN,它是基于卷积神经网络的一种高精度的实时人脸检测和对齐技术。MT是英文单词Multi-task的缩写,意思就是这种方法可以同时完成人脸检测的人脸对齐两项任务。相比于传统方法,MTCNN的性能更好,可以更精确的定位人脸,此外,MTCNN也可以做到实时的检测。
MTCNN由三个神经网络组成,分别是P-Net、R-Net、O-Net。在使用这些网络之前,首先要将原始图片缩放到不同尺度,形成一个“图像金字塔”,如下图所示。
接着会对每个尺度的图片通过神经网络计算一遍。这样做的原因在于:原始图片中的人脸存在不同的尺度,如有的人脸比较大,有的人脸比较小。对于比较小的人脸,可以在放大后的图片上检测;对于比较大的人脸,可以在缩小后的图片上进行检测。这样,就可以在统一的尺度下检测人脸了。
现在再来讨论第一个网络P-Net的结构,如下图所示
P-Net的输入是一个宽和高皆为12像素,同时是3通道的RGB图像,该网络要判断这个12x12的图像中是否含有人脸,并且给出人脸框和关键点的位置。因此对应的输出应该由3部分组成:
(1)第一个部分要判断该图像是否是人脸(上图中的face classification),输出向量的形状为1x1x2,也就是两个值,分别为该图像是人脸的概率,以及该图像不是人脸的概率。这两个值加起来应该严格等1。之所以使用两个值来表示,是为了方便定义交叉熵损失。
(2)第二个部分给出框的精确位置(上图中的bounding box regression),一般称之为框回归。P-Net输入的12x12的图像块可能并不是完美的人脸框的位置,如有的时候人脸并不正好为方形,有的时候12x12的图像块可能偏左或偏右,因此需要输出当前框位置相对于完美的人脸框位置的偏移。这个偏移由四个变量组成。一般地,对于图像中的框,可以用四个数来表示它的位置:框左上角的横坐标、框左上角的纵坐标、框的宽度、框的高度。因此,框回归输出的值是:框左上角的横坐标的相对偏移、框左上角的纵坐标的相对偏移、框的宽度的误差、框的 高度的误差。输出向量的形状就是上图中的1x1x4。
(3)第三个部分给出人脸的5个关键点的位置。5个关键点分别为:左眼的位置、右眼的位置、鼻子的位置、左嘴角的位置、右嘴角的位置。每个关键点又需要横坐标和纵坐标来表示,因此输出一共是10维(即1x1x10)
上面的介绍大致就是P-Net的结构了。在实际计算中,通过P-Net中第一层卷积的移动,会对图像中每一个12x12的区域做一次人脸检测,得到的结构如下图所示: