人脸识别系列:人脸检测(MTCNN)与身份识别(FaceNet)

前言

本教程详细介绍了常用人脸识别模型------MTCNN与人脸比对模型------FaceNet的模型结构与实现原理,并整合两者,实现一个简单的人脸抓取与人脸比对的程序。

备注:感谢众多前辈的分享:参考一,参考二

1,人脸抓拍与识别网络模型整体架构

在这里插入图片描述通过上图,我们可以知道,在该系统中,MTCNN模型会从照片中检测到所有可能的人脸,并把人脸数据直接传输到FaceNet网络模型中,FaceNet网络模型会把人脸图片embedding成numpy能识别的二进制数据,该数据通过与人脸数据库中所有数据进行欧氏距离的计算,得到一个距离值,该值越小,代表着两张人脸相识度越高。

2,MTCNN网络模型简介

MTCNN网络结构分别由Pnet、Rnet、Onet三层小的网络结构构成。并按顺序排列,既前一层网络的输出是后一层网络的输入。这三个模型都是采用了非极大值抑制的方法,过滤掉图片中不符合要求的bbox,输出图片中人脸可能位置的bbox坐标和五个关键点。最大区别在于Pnet、Rnet网络着重于bbox的回归输出,Onet着重于五个关键点的输出。

1)图片预处理

在输入Pnet网络之前, 程序会按照一定的比例(例如:原图x0.7,原图x0.7x0.7,原图x0.7x0.7x0.7.。。。。)对图片进行resize操作,直到图片resize成12x12。在此过程中,我们会得到许多不同尺寸的图片,这些图片叠加起来,可构成一个图像金字塔。

2)数据的类别划分

MTCNN属于多任务的CNN网络模型,既在做正向推理时,会一次性处理多种任务,例如:人脸的分类、人脸bbox的偏量回归,人脸landmark回归。为了更好的让MTCNN处理这些任务,我们对训练的数据会划分成以下四类:

  • Positive face数据:图片左上和右下坐标与label的IOU大于0.65(人脸面几乎全部可见)
  • Part face数据:图片左上右下坐标与label的IOU值在(0.65,0.4)(人脸只有一半可见)
  • Negative face数据:图片左上和右下坐标label的IOU小于0.3的(人脸几乎不可见)
  • Landmark face数据:图片带有landmark label的图片

模型在执行不同任务时,会根据以上划分的数据类别,进行判断,具体逻辑如下:

  • 人脸分类:使用postives和negatives的数据,在postives和negatives做划分时,中间有0.1的IOU差值,这使得人脸分类便于区分,也便于模型收敛。
  • 人脸bbox的偏移量回归:使用positives和parts的数据,因为,这两种数据都能看到比较完整的人脸,有利于做回归
  • 人脸landmark回归:使用landmark face数据,因为这些数据有人脸的五个关键点。
3)Pnet网络

图片预处理后的所有不同尺寸的图片都会输入到Pnet网络中,最后输出一个形状为(m,n,16)的map。16包括两个二分类的得分,4个bbox的坐标偏移量,10个landmark坐标(既五个关键点坐标)。计算与label的IOU值得分,先去除一些候选框,并根据得分从高到低进行排序。然后,使用4个偏移量对bbox进行校准后,得到bbox左上和右下的坐标,从分类得分最高的bbox1开始,bbox1与剩余的bbox再次计算出一个IOU值,去除IOU值大于0.6的bbox,并根据bbox1,去对应原图中截取,结果resize成24x24,再输入到Rnet网络中,这一步是为了去除bbox重叠的候选框。一直重复这一步骤,直到剩余的bbox为0
在这里插入图片描述
如图所示,Pnet输入为12x12x3,经过conv后,输出为1x1x2的两个二分类得分,1x1x4的4个偏移量(bbox和landmark),1x1x10的5个关键点坐标。

4)Rnet网络

在截取图片时,需要按最大正方形截取,目的是为了防止resize成24x24时变形,并保留人脸周边信息。Rnet网络主要是在重复Pnet网络的功能,所以,不再赘述。
在这里插入图片描述
如图所示,Rnet网络的输入为24x24x3,输出为2个分类得分,4个偏移量,10个坐标(5个关键点)。Pnet网络输出的是方块(特征图),而Rnet输出的是长条。

5)Onet网络模型

Onet网络模型在接收到Rnet网络模型数据后,会先resize成48x48,并执行Pnet网络相同的操作。但和前两种网络不同的是,Onet网络更加关注于landmark,前两种网络更加关注bbox的位置。虽然前两种网络也会输出landmark。但由于前两种网络中候选框很多,不具有可信度,所以Pnet和Rnet会优先关注bbox的赛选。等数据到了Onet网络,候选框就具有了可信度,此时再来关注landmark的位置,便有了回归意义。
在这里插入图片描述
如图所示,Onet网络输出的结果和Rnet一致,唯一不同的是,该网络模型对5个关键点做了更多的回归,既更关注于landmark。

6)MTCNN模型损失函数

在训练MTCNN模型时,Pnet、Rnet、Onet都需要进行训练。在实际训练中,需要先训练好前置网络,才能训练后面的网络。而每一层网络都有三个损失函数,分类使用交叉熵,bbox回归和landmark回归使用的是平方差。

3,FaceNet模型简介

基于CNN的传统人脸识别方法,主要是利用CNN的siamese网络来提取人脸特征,然后利用SVM等方法进行分类,从而达到人脸识别的目的。而FaceNet则是直接利用DNN学习到从原始图片到欧式距离空间的映射关系,从而可直接使用两种图片的欧式距离来度量人脸相似度。为了更好的学习这种映射关系,FaceNet引入了一种新的损失函数------triplet损失函数(三元损失函数)。该损失函数能使得类间距离最小,类别距离最大。
备注:参考一参考二参考三

1) FeceNet网络结构

在这里插入图片描述

  1. Batch:从图片中剪切出固定尺寸的人脸图片
  2. DEEP ARCHITECTURE:深度学习架构,主要用于学习从原始图片到欧式距离空间的映射关系,可使用googlenet等网络结构
  3. L2:特征归一化,使得学习到的特征可以归一化到一个超球面
  4. Embeddings:对归一化的特征进行映射,计算出图像x通过Embeddings后,在超球面的位置
  5. Triplet Loss:通过三元组损失函数对结果进行优化
2)Triplet Loss(三元损失函数)

为了使得同类数据之间欧式距离最小,不同类别之间欧式距离最大的目的。三元损失函数的输入需要有三种数据,分别是训练数据、同类数据中最不相似的数据、不同类数据中最相似的数据。
例如:训练数据总共有A、B、C、D四类。在训练A类数据中的图片a1时,三元损失函数的输入,需要先从A类数据中找出和a1图片最不相似的数据,然后从剩余的B、C、D三类中找到和图片a1最相似的一张图片d2。然后三者一起计算损失,具体原理可参考上方给出的链接。

4,模型运行

1) 源码获取

本次人脸抓拍与比对算法所使用的代码可在这里获取。感谢作者的分享,此处附上对应博文链接
通过上面的链接,我们可以得到如下的文件列表:

在这里插入图片描述

  1. align:存放已训练好的MTCNN的网络结构
  2. dataset/emb:存放自己训练好的Embeddings特征值,以npy的方式存放
  3. dataset/faces_emore:存放使用agedb数据集训练好的Embeddings特征值
  4. dataset/image:自己待训练的数据,里面的文件夹以类别进行命名
  5. dataset/test_images:待测试图片
  6. model:存放已经训练好的两种MTCNN模型
  7. utils:存放一些工具类
2)运行环境

nmupy:1.16.0、TensorFlow:1.14.0、opencv-Python:3.4.2.16、Python:3.6.7、pandas、scipy、

3) 运行结果

在这里插入图片描述
打开predict.py,修改待测试的image_path后,点击运行即可。由于modles文件夹中提供了两种模型,所以,在引入dataset_path时,model_path对应的模型也必须一致
在这里插入图片描述
备注:在自己Embeddings的npy文件中,我们只训练了前两幅图中的人物,第三个人物没有进行训练,所以没有识别出来。图中的数字表示测试图片与数据库中特征值进行比对的结果,数值越小,代表两者欧式距离越小,相关度越大。

4)训练数据

在本系统中,MTCNN使用的是已经训练好的模型,所以不需要进行关注,我们只需要把想要识别的人物图片通过FaceNet进行Embeddings即可,具体如下:

  1. 准备待训练数据
    把待训练的数据进行分类保存到dataset/images下面,每个文件夹按类别进行命名:
    在这里插入图片描述
    备注:每一个类别都需要提供单人照片

  2. Embeddings数据
    打开create_dataset.py文件,修改模型、数据、Embeddings结果后,直接运行,可得到每一个类别的Embeddings结果,这些结果都统一存在一个npy文件中,如下图所示:
    在这里插入图片描述

  • 3
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值