人脸识别学习笔记

举报
qinggedada 发表于 2020/07/06 15:12:57 2020/07/06
【摘要】 最近一段时间在学习人脸识别的内容,自己整理了相关的学习笔记构成这篇博客,大致分为以下四个部分来总结:人脸问题概述 人脸数据集人脸检测算法人脸识别算法一.人脸问题概述 1.人脸识别,指利用分析比较人脸特征信息,包括人脸图像采集、人脸定位、人脸识别以及身份确认查找。人脸识别的困难主要是以下两点: a.所有人脸的结构都相似,大家都是一个脸蛋两个眼睛一个鼻子一张嘴。使用计算机来区分人脸个体存在...

最近一段时间在学习人脸识别的内容,自己整理了相关的学习笔记构成这篇博客,大致分为以下四个部分来总结:

  • 人脸问题概述 

  • 人脸数据集

  • 人脸检测算法

  • 人脸识别算法

一.人脸问题概述 :

1. 人脸识别,指利用分析比较人脸特征信息,包括人脸图像采集、人脸定位、人脸识别以及身份确认查找。人脸识别的困难主要是以下两点:

    a. 所有人脸的结构都相似,大家都是一个脸蛋两个眼睛一个鼻子一张嘴。使用计算机来区分人脸个体存在一定难度。

    b. 人脸的外形很不稳定,人的脸部可以产生各种表情,不同角度观察人脸图像不同,举个例子我们经常说某人的侧脸很像某个明星(虽然正脸不像)


2. 人脸识别应用:这个不用多说,稍微想想我们平时使用的智能手机现在应该都有个人相册管理功能、购物消费时移动人脸支付、坐高铁时通过人脸识别进站..这些都是生活中普遍的具体应用场景。


3. 人脸识别典型流程

三个步骤:

  • 人脸检测

  • 人脸对齐

  • 人脸特征表示


二. 人脸数据集

构建模型最重要的第一步便是数据集,这里列出人脸识别与检测的两大方向常用到的数据集供参考。

1. 人脸识别数据集:

图片.png

2. 人脸检测数据集:

图片.png

三.人脸检测算法

经典人脸检测算法流程分为3个阶段:

  • 基于模板匹配的算法

  • 基于AdaBoost的框架

  • 基于深度学习


1.基于模板匹配的算法:

用一个人脸模板图像与被检测图像中的各个位置进行匹配,确定这个位置处是否有人脸,我们可以将此当作一个二分类问题,即检测图像中是否有人脸。

多角度人脸检测:整个系统由两个神经网络构成,第一个网络用于估计人脸的角度,第二个用于判断是否为人脸。角度估计器输出一个旋转角度,然后用整个角度对检测窗进行旋转,然后用第二个网络对旋转后的图像进行判断,确定是否为人脸。


2.基于AdaBoost的框架:

基于PAC学习理论建立的集成学习,Boost的核心思想是利用多个简单的弱分类器构建出高准确率的强分类器。


3.基于深度学习的人脸检测算法

CNN在精度上超越AdaBoost框架,在此之前,滑动窗口图像分类的计算量巨大,无法做到实时检测,重点介绍Cascade CNN与MTCNN。

    a. Cascade CNN

        检测流程:

        1. 构建多尺度的人脸图像金字塔,12-net密集的扫描整幅图像(不同尺寸)。快速的剔除超过90%的检测窗口。

        2. 剩下窗口送入12-calibration-net调整尺寸和位置,使得更靠近潜在的人像图像附近。接着采用非极大值抑制(NMS)合并检测窗口,保留下来的候选检测窗口将会被归一化到24*24作为24-net的输入,进一步剔除近90%的检测窗口。

        3. 通过24-calibration-net矫正检测窗口,使用NMS进一步合并减少检测窗口的数量。

        4. 通过上述所有层级的检测窗口对应的图像区域归一化到48*48送入48-net得到进一步过滤的人脸候选窗口再NMS。

        5. 送入48-calibration-net矫正检测窗口作为最后的输出

论文链接:https://arxiv.org/abs/1508.01292

github链接:https://github.com/Bkmz21/FD-Evaluation


    b. MTCNN

       检测流程:

       P-Net:

       按照不同比例缩放照片,形成图片的特征金字塔作为P-Net输入。P-Net主要获得了人脸区域的候选窗口和边界框的回归向量。并用该边界框做回归,对候选窗口进行校准,然后通过NMS来合并高度重叠的候选框。


       R-Net

       将候选框输入R-Net网络训练,利用边界框的回归值微调候选窗体,再利用NMS去除重叠窗体。


       O-Net

       类似R-Net,在去除重叠窗口的同时显示五个人脸关键点定位。

图片.png

代码链接:

https://github.com/kpzhang93/MTCNN_face_detection_alignment

MTCNN同Cascade CNN一样基于cascade的框架,但是降低了模型难度使其更好落地工业界应用。


四.人脸识别算法介绍:

1.人脸识别算法主要分为三个流程:

  • 人脸检测

  • 人脸对齐

  • 人脸特征表示

2.人脸识别研究进展

       人脸识别研究进展分为以下三个发展阶段:

       1.早期算法:基于几何特征、模板匹配、子空间

       2.人工特征+分类器

       3.基于深度学习的算法


       1.早期算法

       线性降维:

            a.子空间算法:将人脸图像当作一个高维向量,将其投影到低维空间后,期望得到的低维向量对不同的人具有区分度。

            b.PCA与LDA都是线性降维技术。

       非线性降维:

            人脸在高维空间中的分布是非线性的,我们需要用到非线性降维方法,如:流形和核方法。

            流形方法它假设向量点在高维空间中的分布具有某些几何形状,然后在保持这些几何形状约束的前提下将向量投影到低维空间中。

       线性降维的缺陷:直接降维普遍存在严重依赖训练集与测试场景问题,泛化能力不足,不具备太多实用价值。


       2.人工特征+分类器

       这个时期,算法的关键是特征工程,设计出有效区分不同人的特征。后续会有一篇计算机视觉基础知识详细讲解手工特征工程。


       3.基于深度学习的人脸识别

       CNN+海量人脸图片提取特征替代人工特征设计,介绍三个典型的:

          a.Facebook DeepFace:    

             DeepFace是深度卷积神经网络在人脸识别领域的经典,使用3D模型来解决人脸对齐问题,同时又使用了9层深度神经网络来做人脸特征表示。损失函数为softmax loss,最后通过特征嵌入得到固定长度的人脸特征向量。在LFW数据集上取得97.35%的准确率。

图片.png

          b.Google FaceNet

             Google FaceNet提出使用三元组损失函数代替softmax loss。在一个超球空间上进行优化使类内距离更紧凑,类间距离更远,最后得到了一个紧凑的128维人脸特征,使用了Inception模型,参数量较小的同时精度更高,在在LFW数据集上取得99.63%的准确率。这里稍微讲解下三元组损失,根据三张图片组成的三元组计算而来的损失。三元组由Anchor(A)、Negative(N)、Positive(P)组成,三元组损失的学习目标简单理解为靠近P,远离N。即给定一张图片,属于同一个人的图片就是它的P,不属于同一个人的为N。

图片.png

           c.DeepID

              DeepID应用于人脸验证两个人脸是否为同一个人,一次会输入两张人脸图片,输出层是sigmoid函数用于输出结果。如下图:

图片.png

                    DeepID具备特征可视化效果,可以看出不同人脸提取的特征不一样。

         图片.png

到此就是本篇博客的全部分享内容,感谢您的阅读!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。