人脸识别系统的研究始于20世纪60年代,80年代后随着计算机技术和光学成像技术的发展得到提高,而真正进入初级的应用阶段则在90年后期,并且以美国、德国和日本的技术实现为主。
人脸识别,是基于人的脸部特征信息进行身份识别的一种生物识别技术。用摄像机或摄像头采集含有人脸的图像或视频流,并自动在图像中检测和跟踪人脸,进而对检测到的人脸进行脸部识别的一系列相关技术,通常也叫做人像识别、面部识别。
人脸识别指的是在预先存储的人脸图像数据库中进行查询,获取身份识别的结果。其中最关键的步骤是提取人脸表示特征。
在训练的过程中,需要训练一个人脸检测的网络和一个人脸分类的网络。而下面我们所做的MTCNN项目就是做的是人脸侦测这一部分。
基于CNN的特征提取:训练一个CNN,目标函数可以定义为人脸分类或其他目标函数;将训练好的网络中最后一层(一般是fc层),提取出来作为特征向量。如果有多个子区域patch,就训练多个CNN网络,并且把所有CNN获取的特征向量串接,获得一个超长的特征向量一般几万到几十万维。
对超长特征向量进行降维操作,压缩到低维特征向量(例如160维向量),利用低维向量训练对比模型,判断两个向量是否属于同一类,即同一个人。
1.不同人脸类别之间的界限不是很明显,
2.脸与脸之间相似度很高,有时候人类都难以区分。
如何解决人脸特征分类困难的问题,可以使用分类神经网络进行识别。主要的分类神经网络有mobilenet-v2、shufflenet-v2. 损失函数有softmax-loss、centerloss、arcloss.
在弄清楚人脸检测原理之前,先思考下面这个问题。
问题:传统方法能否做多个人脸的检测?
单目标检测网络输出五个值,四个坐标点一个置信度。三个目标网络输出15个值,取置信度好的框,因此三个框很有可能都框到一个目标上。所以传统方法不能做多个人脸的检测。
原理:我们先以一个固定大小的框在原图上去滑动,假设这个框的大小为224*224。我们的目标是通过移动框来找到人脸目标。我们现在训练一个能够识别单个人脸的网络,滑动框就相当于识别是否是人脸的网络。这个滑动框一般是比较大的,我们就可以考虑把这个网络里面的大卷积核用多个小的卷积核代替,这样参数量会减少,运行速度变快。
将滑动框看做判断是否是人脸的网络,每走一步,网络都会输出2个值来进行判断是否是人脸。这个网络层数比较浅,就会把稍微把可能是人脸的都给框中。将框中的人脸都给裁剪下来传给下一个网络(类似R网络),筛选掉部分人脸,然后再把拿到的人脸图片传给下个网络(类似O网络),再筛掉大部分人脸,最终拿到所需要的人脸框图片。
对于多类多目标检测中,模型一般使用YOLO网络结构。从最早的RCNN以两阶段开始去做的,并不是端到端的模型,所以后面演化成YOLO系列了,YOLO同时把检测(回归)和识别(分类)都做了。而MTCNN只做了人脸检测,因为人脸特征通过网络后面接softmax分不开,所以MTCNN想要检测和识别目标类别,就需要两个网络,一个做检测,另一个做识别。
为什么YOLO能同时检测和识别物体呢?因为在检测的过程中,不同类别之间的差异是比较大的,所以可以这么做。因此如果类别之间差异比较大,比如识别公交车和小轿车,这种情况就可以使用YOLO同时检测和分类。此时的分类是一个大概的分类,用到的输出函数就是softmax。如果YOLO识别不同类别差异小的目标,就容易认错。
如果目标之间相似度很大,差异小。就可以考虑使用MTCNN+ Centerloss (Arcloss). 后面一般使用arcloss, 速度更快,精度更高,而且能够把很细微的特征进行分开。因此当我们把目标都检测出来以后,就可以考虑使用arcloss进行分类。
总结:目标类别之间差异小,就使用MTCNN+arcloss, 否则使用YOLO系列网络结构。
检测: haar特征和Adaboost算法、OpenCV提取: LBP…
OpenCV有三种人脸识别的方法,它们分别基于不同的三种算法,Eigenfaces, Fisherfaces和Local Binary Pattern Histogram。
●Rcnn+svm系列
●Yolo+centerloss (arcfaceloss )
●Mtcnn+centerloss ( arcfaceloss )
●其他深度学习模型: PCN、 RetinaFace 、version-slim、version- -RFB。
人脸特征定位好处是能够让模型更加的准确。应用是在人体上的针灸。MTCNN方法可以输出人脸上5个特征点的位置,即:左眼、右眼、鼻子、左嘴角、右嘴角。实际上根据不同应用,特征点的数量定义各不相同,少则几个,多则上百个,通常分布的区域包括眼睛、眉毛、鼻子、嘴巴、脸部外轮廓等。
基于深度学习的特征点定位算法,在2013年开始取得突破,香港中文大学的Tang Xiaoou教授研究组提出了DCNN的级联结构(Deep Convolutional Network Cascade for Facial Point Detection), 在特征点定位上取得了不错的效果。在此基础上,Zhou Erjin等提出了一个从粗到精的人脸特征点定位方法 (Extensive Facial Landmark Localization with Coarse-to- fine Convolutional Network Cascade),首次利用卷积神经网络,实现了68个人脸特征点的高精度定位。该算法将人脸特征点分为内部特征点和轮廓特征点,内部特征点包含眉毛、眼睛、鼻子、嘴巴共计51个位置,轮廓特征点包含17个特征点。
1.支付宝刷脸支付
2.上班刷脸打卡机
3.火车站刷脸确认身份
4.天网系统
5. 后台图像管理
MTCNN论文标题全称为《Joint Face Detection and Alignment using Multi-task cascaded convolutional Networks》
MTCNN使用多任务级联卷积神经网络进行联合人脸检测和对齐。类似三次面试。多任务指的是检测和关键点对齐,级联是使用三个网络串行使用(P网络的输出为R网络的输入,R网络的输出为O网络的输入)。
1.广泛性:目前MTCNN在各行业的图像目标检测方面的应用最广泛。
2.代表性:MTCNN是图像检测方面的代表性模型。
3.兴趣性:理解MTCNN图像原理的有助于培养对AI的兴趣。
1.人脸检测追踪。
2.其它同一类物体的检测追踪,比如车流量。
3.联合其它网络做高要求的目标检测追踪。
4. 联合centerloss做人脸识别。
1.P-Net
Proposal Network: 建议框1212, 类似人事部。P网络一般输出一个置信度,四个坐标值,五个关键点。输出两个值输出函数可以使用softmax,一个值输出函数使用sigmoid。
2.R-Net
Refinement Network: 建议框2424, (精细化建议框),类似技术主管。
3.O-Net
Output Network: 输入图片48*48输出最终的结果,类似总经理。使用时,O网络对于背景的学习不够,就会造成高召回率,高误检率的情况。所以训练时负样本一般比正样本多三倍。
人脸模糊程度大、人脸角度、人脸遮掩程度、光线的明暗程度、眼睛闭上。
根据三个网络的设计,可以分别得到三个网络输入图像的大小尺寸: 12x12, 24x24, 48x48。
网络在学习的过程中,主要学习了两个参数,一个是置信度,表示窗口滑动到当前位置时,检测到人脸的概率值。另一个是学习到的坐标偏移值,用来回归真实坐标。
根据需求,模型不仅仅要学习是否有人脸,还要学习人脸的具体位置。所以我们将每种尺寸下的样本都做了正样本(全人脸)、部分样本(部分人脸)、负样本(非人脸)。用正样本和负样本来训练是否有人脸的置信度,用正样本和部分样本训练人脸的坐标位置。
MTCNN的样本数据集可以选择CelebA, Wider_ Face。样本数量20w, 基础样本多,生成的样本更具多样性,训练的网络参数泛化能力更强。样本质量中数据是否包含噪声,是否多样化,坐标是否标注准确,分类是否准确。
在原人脸框附近随机偏移、缩放人脸框,就可以得到和原人脸的I0U值。I0U值可以作为置信度的标签,根据置信度的大小,可以分成三种样本。
按照论文中的推荐:
正样本: I0U>0.65,
部分样本: 0.4
正样本、部分样本、负样本的比例是1:1:3 (O网络在训练过程中负样本比较少, 需要多加负样本,降低误检率)神经网络学习的是真实框周围的偏移框的位置。然后通过偏移量反算回原来的真实框。(偏移框只要有一个学习正确就可反算出正确的真实框,这种做法容错率较高。)
根据样本的置信度分类[负,正,部分]: [0,1,2]) ,对样本进行分类训练。
1、将类别小于2的正、负样本用来做置信度的训练,损失函数选择BCE
2、将类别大于0的正、部分样本用来做坐标偏移量的训练,损失函数选择MSE。
MTCNN的(P,R,0) 三个网络在训练中是可以并行训练的,由于三个网络的样本都是各自独立的,所以可以同时训练三个网络。而实际使用MTCNN模型的时候,三个网络是串行使用的,级联的思想也在此体现。
MTCNN中的三个网络在侦测过程中是串行使用的,也就是每一张图像都是先经过P网络处理输出之后,R网络才会进行第二次处理,接着o网络进行第三次处理。
优点:
1、设备要求低:使用了级联思想,将复杂问题分解,使得模型能够在小型设备上运行。
2、容易训练:三个级联网络都较小,训练模型时容易收敛。
3、精度较高:使用了级联思想,逐步提高精度。
缺点:
1.误检率较高。
2.原论文模型还有优化空间。
1.加大训练时的数据量来提高测试精度
2.加关键点
3.视频版本的人脸识别
4.将P网络的池化层改成全卷积,观察速度和精度的变化。
人脸分类分为两种,人脸确认和人脸辨认。
人脸确认:这是人脸图像与数据库中已存的该人图像比对的过程,回答你是不是你的问题( 即通常所说的1:1比对) 。
人脸辨认:这是人脸图像与数据库中已存的所有图像匹配的过程,回答你是谁的问题( 即通常所说的1:N比对)。
●对于人脸的图像预处理是基于人脸检测结果,对图像进行处理并最终服务于特征提取的过程。
●系统获取的原始图像由于受到各种条件的限制和随机干扰,往往不能直接使用,必须在图像处理的早期阶段对它进行灰度校正、噪声过滤等图像预处理。
●对于人脸图像而言,其预处理过程主要包括人脸图像的光线补偿、灰度变换、直方图均衡化、归一化、几何校正、滤波以及锐化等。
1.训练一个特征提取器
创建特征提取网络(ResNet, MobileNet, )准备训练数据集(开源,收费,自制)设计合理的目标函数(centerloss , arcfaceloss, )训练网络使网络获得人脸特征提取的能力。
2.创建人脸特征库
通过MTCNN网络获取当前图像中的人脸框。将获取的人脸框传入特征提取器提取人脸特征,将每个人脸标签和人脸特征作为一组特征值保存到人脸库中。
3.获取目标人脸特征
通过mtcnn网络获取当前画面中的所有人脸框。将获取的所有人脸框传入特征提取器提取人脸特征。
4.对比人脸特征
将从当前画面获取到的每个人脸特征和人脸特征库里的人脸特征一一对比。如果当前画面中的某个人脸特征和人脸特征库里的某个人脸特征的差异小于所设阈值,则认为当前画面中的这个人脸和人脸库中正在对比的人脸是同一个人脸。如果当前画面中的人脸特征和人脸特征库中最大的人脸特征差异大于所设阈值,则认为当前画面中的人脸和人脸库中对比的人脸不是同一个人脸。
1.训练数据
VGG-Face 2数据集包含一个具有8,631个身份(3,141,890个图像)的训练集和一个具有500个身份(169,396个图像) 的测试集。VGG-Face 2在姿态、年龄、光照、种族和职业方面有很大差异。
MS-Celeb-1M数据集包含大约10万个身份的1000万张图像。为了降低MS-Celeb-1M的噪声并获得高质量的训练数据,需要按照与身份中心的距离对每个身份的所有人脸图像进行排序。
2.验证数据
LFW数据集包含13,233张来自5749个不同身份的网络收集图像,其姿势、表情和照明有很大差异。
CFP数据集由500个科目组成,每个科目有10个正面图像和4个档案图像。评估协议包括正面-正面(FF)和正面-档案(FP)人脸验证,每个人脸验证具有10个文件夹,其具有350个同一人对和350个不同人对。
1.MobileNet
2.ResNet
3.DenseNet
4.shuffleNet
公式里第一个m是批次,第二个m是超参数.
根据cos的性质,优化角度距离比优化余弦距离更有效果,因为余弦距离相对更密集。增大角度比减小相似度距离对分类的影响更加直接所以可以改为直接增加角度的方式,
注意:反三角余弦计算出来的是弧度,而非角度。所以实际增加的m也是增加的弧度。
关于视频人脸识别在实际使用过程中,对于人脸特征的对比是基于连续帧画面的目标特征提取和对比得出的结果。所以实际应用中,只要某一帧画面中的目标被认为是人脸库的某个人脸,就可以认为完成对这个人的识别。
作为标签的人脸采集不只是一张人脸的图像特征,而是在相同的光度下对每个标签人脸的各个方位不同表情都进行采集,这样就相当于采集了一个人的各个角度的不同表情的人脸特征,从而提高了对这个人的识别率。
采集大量的人脸作为识别对象同样也增大了对比的时间长度,因为当前画面里的人脸框需要和人脸特征库中每个人的每张人脸特征一一对比。
附github地址:https://github.com/liu1073811240/Face_Recognition