机器学习系列(8):人脸识别基本原理及Python实现

“ 众所周知,人脸识别和人脸验证已经得到大量应用,那么它们之间有什么异同呢,又是如何实现的呢?这里是机器学习系列第八篇,带你揭开它们神秘的面纱。 ”

若图片挂了,可移步:
https://mp.weixin.qq.com/s?__biz=MzU4NTY1NDM3MA==&mid=2247483843&idx=1&sn=843bfeaf2722b2983a268135ac70c41a&chksm=fd8608cecaf181d813bafd7d43941f21b9568353a8a3f242a793bf1ed2d5e34cd9064ab7594d&token=255604471&lang=zh_CN#rd

机器学习系列(8):人脸识别原理及Python实现

  • 人脸验证&识别:

  • 验证和识别

  • oneshot学习

  • siamese网络

  • Triplet损失

  • 面部验证与二分类

Python实现:

  • 见文章内容

申明
本文由LSayhi完成,可转载但需注明出处;代码实现部分的框架由Coursera提供,由LSayhi完成,详细数据及代码可在github查阅。

github: https://github.com/LSayhi/DeepLearning

CSDN博客:https://blog.csdn.net/LSayhi

微信公众号:AI有点可ai

01 本期内容

一、 人脸验证和识别原理
1.人脸验证与人脸识别:

  • 人脸验证与人脸识别。顾名思义,人脸验证举例,假设输入一张某人图片和其ID,人脸验证只需要对该ID进行验证,判断是否是该ID对应的人脸。而人脸识别则复杂得多,它只允许输入一张图片,然后系统要根据这张输入判断此人是否是公司数据库中的员工以及其ID。
    机器学习系列(8):人脸识别基本原理及Python实现_第1张图片

2.one-shot学习:

  • 假设要构造一个公司人员验证闸机,你会怎么设计这个系统呢?前面我们CNN,也许我们可以利用员工的照片训练一个卷积神经网络,然后摄像头采集员工进入闸机前的图像,再由softmax层判断这个人是否是公司员工以及是哪位员工,听起来像是一个可行的办法。仔细想想,那可能需要每个人很多张照片,而且如何公司新加入了员工,还得重新训练一个网络,那么这样也许不是一个好的做法。

  • one-shot学习就是要解决这一问题,每张员工的只需一张提供照片,然后将摄像头采集到的另一张照片与其进行比对。进而判断是否是公司员工以及是哪一位员工。具体来说,one-shot learning 是学习衡量图像之间的相似度(差异),两张图片之间的差异大小可以用distance(img1,img2)来表示,如何训练好一个学习器可以判断两张照片的差异,那我们就不需要每次都训练新的网络了。
    机器学习系列(8):人脸识别基本原理及Python实现_第2张图片
    one-shot learning

  • 现在假设公司数据库中有四张员工照片ABCD,摄像头采集到一张来访者的照片E,one-shot学习先将E与A代入distance(E,A),当差异distance的值大于某个阈值时,认为E不是A,反之则认为是A,同理,对BCD同样操作,最终获得E是否是公司的员工,以及是哪位员工。所以,问题的重心在于如何设计和优化出合适的distance(img1,img2)函数,此部分内容下节描述。

3.siamese网络:

  • siamese网络。我们经常将一张图片输入到CNN中,然后经过卷积层池化层全连接层等得到一个输出向量,如果我们将这个输出向量保留成为特征向量,它表示了图像的某些特征。siamese网络就是将两张图片分别输入同一个网络(参数也相同),然后比较特征向量间的差异,我们用特征向量的范数来表示两张图片之间的“距离”,训练这个网络,使得其对不同的人脸拥有较大的范数,对同一个人脸特征向量拥有较小的范数。
    机器学习系列(8):人脸识别基本原理及Python实现_第3张图片

4.Triplet损失:

  • 要想通过神经网络学习人脸编码的优质方法,使用Triplet损失是一种方式。Triplet损失,可以看出肯定是同时对三张图片操作。我们在siamese网络中讲到,对于相同的人脸,其范数“距离”要小,对于不同的人脸,其范数“距离”应该要大,Triplet损失很好地综合了这两点。如下图所示,Triplet损失是同时对三张图片的损失函数,三张图片分别是图片Anchor,图片positive(和Anchor属于同一个人的脸),图片negative(和anchor属于不同人的脸)。
    机器学习系列(8):人脸识别基本原理及Python实现_第4张图片
  • 我们要达到的效果是,anchor与positive之间的范数平方小(distance(A,P)小),anchor与negative之间的范数平方大(distance(A,N)小),也可表达为,distance(A,P) 在这里插入图片描述

    在这里插入图片描述

其中f()为神经网络对人脸的编码(可理解为对图片提取特征向量的方式)。

根据以上分析,我们可以定义损失函数Tripletloss了,其表达式如下:
在这里插入图片描述

  • 当满足anchor与positive距离(包括margin)小于等于anchor与negative时,TriletLoss函数第一个参数小于等于0,那么TripletLoss=0,不满足时,TripletLoss大于0。当我们对TripletLoss函数运用梯度下降等方式时,经过反向传播过程获得CNN的合适参数,从而降低loss。在实际中,为了获得更优的参数,我们对positive和negative的选择不完全随机,而是让positive不那么“positive”,negative不那么“negative”,即||f(A)-f§||^2 接近 ||f(A)-f(N)||^2,这样能加大训练的难度,从而让训练完成后的网络参数更具更好的效果,下图为一示例:
    机器学习系列(8):人脸识别基本原理及Python实现_第5张图片
    5.面部验证与二分类:

  • 面部识别也可当作二分类问题来解决。比如,通过siamese网络对两张图片进行特征提取,再经过一个sigmoid单元预测两张图片是否是同一个人,如果两张人脸相似,输出为1,否则输出为0,如下图:
    机器学习系列(8):人脸识别基本原理及Python实现_第6张图片

  • 在一些变体中,还可以将上式中的范数部分改为其它的表达式,如卡方公式等。

  • 有个小技巧可以运用在人脸验证或者识别上,那就是我们可以预先存储员工照片的特征向量,而不是仅仅存照片,避免每次的前向传播过程的重复,节省大量的运算时间以及空间,这样可以提高部署终端的效率。

02 python实现

2.1 本文相应的代码及资料已经以.ipynb文件和.pdf形式在github中给出。

  • .ipynb文件在链接/Coursera-deeplearning深度学习/课程4/week4/

  • .pdf文件在链接/Coursera-deeplearning深度学习

  • github地址:https://github.com/LSayhi/DeepLearning

点击【阅读原文】,本期代码github链接

往期精彩推荐
机器学习系列(7):目标检测YOLO算法
机器学习系列(6):ResNets、Inception网络
机器学习中的数学(2):信息熵与损失函数
机器学习中的数学(1):MIT大牛写的综述

机器学习系列(8):人脸识别基本原理及Python实现_第7张图片

你可能感兴趣的:(机器学习系列(8):人脸识别基本原理及Python实现)