chpter 6 人脸检测和人脸识别

人脸检测和人脸识别技术是深度学习的重要应用之一。本章主要介绍四部分内容:1)MTCNN原理;2)如何利用深度卷积神经网络提取人脸特征;3)如何利用提取的特征进行人脸识别;4)如何在tensorflow中实践上述算法;

一、MTCNN原理:基于卷积神经网络的一种高精度的实时人脸检测和对齐技术

在搭建“人脸识别系统”时,第一步要做的就是人脸检测,即:给出一张图片,将图片中的人脸框处。框出人脸后,还需要对人脸进行对齐,为实现人脸对齐,需要检测人脸中的关键点,根据这些关键点,通过“仿射变换”将人脸进行统一校准,以尽量消除姿势不同带来的误差,如下图所示:

本节中,将介绍一种人脸检测和对齐的方法:MTCNN;
MTCNN网络由3个网络构成,分别为P-Net,R-Net,O-Net。在使用这些网络之前,需要将原始图片缩放到不同尺寸大小,形成一个“图片金字塔”。然后对不同尺寸的图片分别使用MTCNN进行人脸检测和对齐。以下为“图片金字塔”示例:

假设现在要对一个1212的image进行人脸识别,首先将其用MTCNN进行人脸检测和对齐。
step1:将12
12的Image送入P-Net,输出由3部分组成:1)face classification(有人脸的概率,和,没有人脸的概率)(112);2)bounding box regression(由左上角横坐标,纵坐标,高,宽构成)(114);3)facial landmark localization(由左眼、右眼,鼻子,左嘴角,右嘴角坐标构成)(1110);
以下为P-Net的结构示意:

利用P-Net进行人脸检测和对齐后,图像中会有很多的提取框,这是由于P-Net对不同尺寸大小图片都进行了框提取的缘故,如下图所示:

step2:将P-Net中得到的提取框统一缩放为2424,然后放入R-Net中,进行人脸检测和识别,R-Net的输出与P-Net相同,以下为R-Net的结构:

经过R-Net得到的提取框消除了P-Net中的很多误判,如下图所示:

step3:将R-Net得到的提取框统一缩放到48
48,并将其送入O-Net中,O-Net输出与P-Net相同;
以下为O-Net的网络结构:

经过O-Net后,得到的提取框如下图所示:

可以看出从P-Net,到R-Net,再到O-Net,人脸检测的准确率逐渐提高。在这3种网络中,P-Net运行最快,O-Net运行最慢,因此,可以通过P-Net和R-Net,先减少部分提取框,然后在利用运行速度最慢的O-Net进行框提取。

MTCNN的损失函数由3部分构成:1)facial classification:交叉熵损失;2)bounding box regression:L2损失;3)facial landmark localization:L2损失;其中,在训练P-Net和R-Net时,更关心提取框,因此,可以降低facial landmark localization损失的权重。而在训练O-Net时,更关心关键点,因此,可适当提高facial landmark localization损失的权重。

二、使用深度卷积网络提取特征

在人脸识别中,理想的人脸特征应该具有如下特征:
1、相同的人脸,其特征之间的欧几里得距离应尽可能的小;
2、不同的人脸,其特征之间的欧几里得距离应尽可能的大;

而利用CNN得到的人脸特征往往缺乏上述特征,这是因为,在CNN中,使用的是softmax损失,softmax是类别间的损失,而对于人脸识别来说,每一类就是一个人,他无法对人脸特征之间的距离进行限制。

为保证利用“卷积神经网络”得到的人脸特征具备满足上述条件,我们可以通过定义个性化的损失函数来实现,这里介绍两种损失函数,通过优化这两种损失函数,均可以使得相同人脸特征之间距离尽可能的小,不同人脸特征之间的距离尽可能的大:

  • 三元组损失的定义
    在这个损失函数中,一个sample有3个image,假设分别为xa,xb,xc,其中xa,xb为同一个人,xb,xc为不同的人。假设通过卷积神经网络得到的三者的特征分别为:f(xa),f(xb),f(xc),则应使3者特征满足如下关系式:||f(xa) - f(xb)||2 + alpha < ||f(xa) - f(xc)||2
    其三元组损失函数为:L = ||f(xa) - f(xb)||2 + alpha - ||f(xa) - f(xc)||2;通过最优化“三元组损失函数”,获得卷积神经网络参数,从而使得得到的image_feature,相同的image,其特征之间距离尽可能小,不同的image,其特征之间距离尽可能大;
    在使用这种方法训练CNN时,有几点问题需要注意:
    1)sample的选择:随机选取的sample无法提高CNN特征提取的性能,因此,应进行一定的人为干预:(1)同一sample中,3个image的相似度较高时,可以提高CNN提取特征的性能,但是,此时,CNN往往又不能正确收敛;(2)同一sample中,3个image的相似度过低时,CNN收敛较快,但是,用CNN得到的特征其性能较低;
    2)使用“三元组损失函数”,训练CNN时,需要大量的“人脸数据”,才能取得较好的效果;
  • 中心损失的定义
    中心损失没有对image特征之间的距离进行优化,它保持了原有的分类模型(softmax),与此同时,它又为每一个类指定了一个类别中心,同一类图像对应的特征都应该尽可能的靠近自己的类别中心,不同类的类别中心应尽可能的原理。
    假设输入的图像为xi,经过CNN后的特征为f(xi),其类别中心为ci,则中心损失为:Lc = 1/2 ||f(xi) - ci ||2,通过中心损失,可以使得CNN得到的特征满足理想特征的要求。其最终的损失函数还需加入分类损失:Lsoftmax 。最终的损失函数L=lambda * Lc + Lsoftmax
    在优化损失函数时,除对CNN的参数求梯度外,也对ci求梯度,二者的初始值均为随机赋予。
    由上述损失函数求得的CNN所提取的特征具有“内聚性”,如下图所示:

    由上图可以看出,当lambda值越大时,中心损失所占权重越大,所得到的特征就越具有“内聚性”。
    与三元组损失不同的是,使用中心损失不需要特别的采样方法,且以较少量的图像就可以达到与三元组损失相近的效果。

三、使用特征设计应用

利用上述2中损失函数求得的特征可以应用于以下几个场景:
1、人脸验证:即检测A,B是否为用一个人。只需计算二者特征之间的距离,设定threshold即可。
2、人脸识别:给出一张image,判定其和数据库中哪张image最像,显然可以转换为求距离的问题;
3、人脸聚类:在数据库中对人脸进行聚类,直接用K-Means即可;

猜你喜欢

转载自blog.csdn.net/u014765410/article/details/86562815
今日推荐