开源~ 人脸识别系统 的 99% 离线识别率高达 Python
以往的人脸识别关键是包括人脸图像采集、人脸识别预处置、身份确认、身份查找等技术和系统。如今人脸识别曾经缓缓加长到了ADAS中的驾驶员检测、行人跟踪、甚至到了灵活物体的跟踪。
由此可以看出,人脸识别系统曾经由便捷的图像处置开展到了视频实时处置。而且算法曾经由以前的Adaboots、PCA等传统的统计学方法转变为CNN、RCNN等深度学习及其变形的方法。如今也有相当一部分人开局钻研3维人脸识别识别,这种名目目前也遭到了学术界、工业界和国度的支持。
首先看看如今的钻研现状。如上的开展趋向可以知道,如今的关键钻研方向是应用深度学习的方法处置视频人脸识别。
关键的钻研人员:
如下:中科院计算所的山世光传授、中科院动物识别钻研所的李子青传授、清华大学的苏光大传授、香港中文大学的汤晓鸥传授、Ross B. Girshick等等。
关键开源名目:
SeetaFace人脸识别引擎。该引擎由中科院计算所山世光钻研员率领的人脸识别钻研组研发。代码基于C++成功,且不依赖于任何第三方的库函数,开源协定为BSD-2,可供学术界和工业界无偿经常使用。
关键软件API/SDK:
关键的人脸识别图像库:
如今在中国做人脸识别的公司曾经越来越多,运行也十分的宽泛。其中市场占有率最高的是汉王科技。关键公司的钻研方向和现状如下:
人脸识别的环节
人脸识别关键分为四大块:人脸定位(face detection)、 人脸校准(face alignment)、 人脸确认(face verification)、人脸甄别(face identification)。
人脸定位(face detection):
对图像中的人脸启动检测,并将结果用矩形框框进去。在openCV中有间接能拿进去用的Harr分类器。
人脸校准(face alignment):
对检测到的人脸启动姿态的校对,使其人脸尽或许的”正”,经过校对可以提高人脸识别的精度。校对的方法有2D校对、3D校对的方法,3D校对的方法可以使侧脸获取较好的识别。
在启动人脸校对的时刻,会有检测特色点的位置这一步,这些特色点位置关键是诸如鼻子左侧,鼻孔下侧,瞳孔位置,上嘴唇下侧等等位置,知道了这些特色点的位置后,做一下位置驱动的变形,脸即可被校”正”了。如下图所示:
这里引见一种MSRA在14年的技术:Joint Cascade Face Detection and Alignment(ECCV14)。这篇文章间接在30ms的时期里把detection和alignment都给做了。
人脸确认(face verification):
Face verification,人脸校验是基于pair matching的模式,所以它获取的答案是“是”或许“不是”。在详细操作的时刻,给定一张测试图片,而后挨个启动pair matching,matching上了则说明测试图像与该张婚配上的人脸为同一团体的人脸。
普通在小型办公室人脸刷脸打卡系统中驳回的(应该)是这种方法,详细操作方法大抵是这样一个流程:离线一一录入员工的人脸照片(一个员工录入的人脸普通不止一张),员工在刷脸打卡的时刻相机捕捉到图像后,经过前面所讲的先启动人脸检测,而后启动人脸校对,再启动人脸校验,一旦match结果为“是”,说明该名刷脸的人员是属于本办公室的,人脸校验到这一步就成功了。
在离线录入员工人脸的时刻,咱们可以将人脸与人名对应,这样一旦在人脸校验成功后,就可以知道这团体是谁了。
上方所说的这样一种系统好处是开发费用昂贵,适宜小型办公场合,缺陷是在捕捉时不能有遮挡,而且还要求人脸姿态比拟正(这种系统咱们一切,不过没体验过)。下图给出了表示说明:
人脸识别(face identification/recognition):
Face identification或Face recognition,人脸识别正如下图所示的,它要回答的是“我是谁?”,相比于人脸校验驳回的pair matching,它在识别阶段更多的是驳回分类的手腕。它实践上是对启动了前面两步即人脸检测、人脸校对后做的图像(人脸)分类。
依据上方四个概念的引见,咱们可以了解到人脸识别关键包括三个大的、独立性强的模块:
咱们将上方的步骤启动详细的拆分,获取上方的环节图:
人脸识别分类
如今随着人脸识别技术的开展,人脸识别技术关键分为了三类:一是基于图像的识别方法、二是基于视频的识别方法、三是三维人脸识别方法。
基于图像的识别方法:
这个环节是一个静态的图像识别环节,关键应用图像处置。关键的算法有PCA、EP、kernel method、 Bayesian Framwork、SVM 、HMM、Adaboot等等算法。但在2014年,人脸识别应用Deep learning 技术取得了严重打破,为代表的有deepface的97.25%、face++的97.27%,但是deep face的训练集是w集的,而同时香港中文大学汤晓鸥的Gussian face的训练集为2w。
基于视频的实时识别方法:
这个环节可以看出人脸识别的追踪环节,不只仅要求在视频中找到人脸的位置和大小,还须要确定帧间不同人脸的对应相关。
参考论文(资料):
1. DeepFace论文。DeepFace:Closing the Gap to Human-level Performance in Face Verificaion
2. 卷积神经网络了解博客。
3. 卷积神经网络的推导博客。
4. Note on convolution Neural Network.
5. Neural Network for Recognition of Handwritten Digits
6. DeepFace博文:
DeepFace是FaceBook提进去的,后续有DeepID和FaceNet发生。而且在DeepID和FaceNet中都能表现DeepFace的身影,所以DeepFace可以谓之CNN在人脸识别的奠基之作,目前深度学习在人脸识别中也取得了十分好的成果。所以这里咱们先从DeepFace开局学习。
在DeepFace的学习环节中,不只将DeepFace所用的方法启动引见,也会引见该步骤的其它关键算法,对现有的图像人脸识别技术做一个便捷、片面的叙说。
DeepFace的基本框架
1. 人脸识别的基本流程
face detection -> face alignment -> face verification -> face identification
2.人脸检测(face detection)
2.1 现有技术:
haar分类器:
人脸检测(detection)在opencv中早就有间接能拿来用的haar分类器,基于Viola-Jones算法。
Adaboost算法(级联分类器):
1.参考论文:Robust Real-Time face detection 。
2. 参考中文博客:
3. 博客:
2.2 文章中所用方法
本文中驳回了基于检测点的人脸检测方法(fiducial Point Detector)。
成果如下:
3. 人脸校准(face alignment)
2D alignment:
3D alignment:
成果如下:
上方的2D alignment对应(b)图,3D alignment依次对应(c) ~ (h)。
4 人脸表示(face verification)
4.1 现有技术
LBP && joint Beyesian:
经过高维LBP跟Joint Bayesian这两个方法结合。
DeepID系列:
将七个联结贝叶斯模型经常使用SVM启动融合,精度到达99.15%
4.2 文章中的方法
论文中经过一个多类人脸识别义务来训练深度神经网络(DNN)。网络结构如上图所示。
结构参数:
经过3D对齐,构成的图像都是152×152的图像,输入到上述网络结构中,该结构的参数如下:
提取低水平特色:
环节如下所示:
上述3层网络是为了提取到低水平的特色,如便捷的边缘特色和纹理特色。Max-polling层使得卷积网络对部分的变换愈加鲁棒。假设输入是校对后的人脸,就能使网络对小的标志误差愈加鲁棒。
但是这样的polling层会使网络在面部的细节结构和庞大纹理的精准位置上失落一些消息。因此,文中只在第一个卷积层前面接了Max-polling层。这些前面的层称之为前端自顺应的预处置层级。但是关于许多计算来讲,这是很必要的,这些层的参数其实很少。它们仅仅是把输入图像扩大成一个便捷的部分特色集。
后续层:
L4,L5,L6都是部分衔接层,就像卷积层经常使用滤波器一样,在特色图像的每一个位置都训练学习一组不同的滤波器。因为校对后不同区域的有不同的统计个性,卷积网络在空间上的稳固性的假定不能成立。
比如说,相比于鼻子和嘴巴之间的区域,眼睛和眉毛之间的区域展现出十分不同的表观并且有很高的区分度。换句话说,经过应用输入的校对后的图像,定制了DNN的结构。
经常使用部分衔接层并没有影响特色提取时的运算累赘,但是影响了训练的参数数量。仅仅是因为有如此大的标志人脸库,咱们可以接受三个大型的部分衔接层。部分衔接层的输入单元遭到一个大型的输入图块的影响,可以据此调整部分衔接层的经常使用(参数)(不共享权重)
比如说,L6层的输入遭到一个74*74*3的输入图块的影响,在校对后的人脸中,这种大的图块之间很难有任何统计上的参数共享。
顶层:
最后,网络顶端的两层(F7,F8)是全衔接的:每一个输入单元都衔接到一切的输入。这两层可以捕捉到人脸图像中距离较远的区域的特色之间的关联性。比如,眼睛的位置和状态,与嘴巴的位置和状态之间的关联性(这部分也含有消息)可以由这两层获取。第一个全衔接层F7的输入就是咱们原始的人脸特色表白向量。
在特色表白方面,这个特色向量与传统的基于LBP的特色形容有很大区别。传统方法通经常常使用部分的特色形容(计算直方图)并用作分类器的输入。
最后一个全衔接层F8的输入进入了一个K-way的softmax(K是类别个数),即可发生类别标号的概率散布。用Ok表示一个输入图像经过网络后的第k个输入,即可用下式表白输入类标号k的概率:
训练的指标是最大化正确输入类别(face 的id)的概率。经过最小化每个训练样本的叉熵损属成功这一点。用k表示给定输入的正确类别的标号,则叉熵损失是:
经过计算叉熵损失L对参数的梯度以及经常使用随机梯度递减的方法来最小化叉熵损失。
梯度是经过误差的规范反向流传来计算的。十分幽默的是,本网络发生的特色十分稠密。超越75%的顶层特色元素是0。这关键是因为经常使用了ReLU激活函数造成的。这种软阈值非线性函数在一切的卷积层,部分衔接层和全衔接层(除了最后一层F8)都经常使用了,从而造成全体级联之后发生高度非线性和稠密的特色。
稠密性也与经常使用经常使用dropout正则化无关,即在训练中将随机的特色元素设置为0。咱们只在F7全衔接层经常使用了dropout.因为训练汇合很大,在训练环节中咱们没有发现严重的过拟合。
给出图像I,则其特色表白G(I)经过前馈网络计算进去,每一个L层的前馈网络,可以看作是一系列函数:
归一化:
在最后一级,咱们把特色的元素归一化成0到1,以此降落特色对光照变动的敏感度。特色向量中的每一个元素都被训练集中对应的最大值除。而后启动L2归一化。因为咱们驳回了ReLU激活函数,咱们的系统对图像的尺度不变性削弱。
关于输入的4096-d向量:
2. 验证
2.1 卡方距离
该系统中,归一化后的DeepFace特色向量与传统的基于直方图的特色(如LBP)有一下相反之处:
卡方距离计算公式如下:
2.2 Siamese network
文章中也提到了端到端的度量学习方法,一旦学习(训练)成功,人脸识别网络(截止到F7)在输入的两张图片上重复经常使用,将获取的2个特色向量间接用来预测判别这两个输入图片能否属于同一团体。这分为以下步骤:
a. 计算两个特色之间的相对差异;
b,一个全衔接层,映射到一个单个的逻辑单元(输入相反/不同)。
3. 试验评价
3.1 数据集
result on LFW:
result on YTF:
DeepFace与之后的方法的最大的不同点在于,DeepFace在训练神经网络前,经常使用了对齐方法。论文以为神经网络能够work的要素在于一旦人脸经过对齐后,人脸区域的特色就固定在某些像素上了,此时,可以用卷积神经网络来学习特色。
本文的模型经常使用了C++工具箱dlib基于深度学习的最新人脸识别方法,基于户外脸部数据测试库Labeled Faces in the Wild 的基准水平来说,到达了99.38%的准确率。
更多算法
dlib:数据测试库Labeled Faces in the Wild:
模型提供了一个便捷的 face_recognition 命令行工具让用户经过命令就能间接经常使用图片文件夹启动人脸识别操作。
在图片中捕捉人脸特色
在一张图片中捕捉到一切的人脸
找到并处置图片中人脸的特色
找到每团体眼睛、鼻子、嘴巴和下巴的位置和轮廓。
import face_recognition
image = face_recognition.load_image_file("your_file.jpg")
face_locations = face_recognition.face_locations(image)
捕捉脸部特色有很关键的用途,当然也可以用来启动图片的数字美颜digital make-up(例如美图秀秀)
digital make-up:
识别图片中的人脸
识别谁出如今照片里
装置步骤
本方法支持Python3/python2,咱们只在macOS和Linux中测试过,还不知能否实用于Windows。
经常使用pypi的pip3 装置此模块(或是Python 2的pip2)
关键提示:在编译dlib时或许会出疑问,你可以经过装置来自源(而不是pip)的dlib来修复失误,请见装置手册How to install dlib from source
经过手动装置dlib,运转pip3 install face_recognition来成功装置。
经常使用方法命令行界面
当你装置face_recognition,你能获取一个繁复的叫做face_recognition的命令行程序,它能帮你识别一张照片或是一个照片文件夹中的一切人脸。
首先,你须要提供一个蕴含一张照片的文件夹,并且你曾经知道照片中的人是谁,每团体都要有一张照片文件,且文件名须要以该人的姓名命名;
而后你须要预备另外一个文件夹,外面装有你想要识别人脸照片;
接上去你只用运转face_recognition命令,程序能够经过已知人脸的文件夹识别出未知人脸照片中的人是谁;
针对每团体脸都要一行输入,数据是文件名加上识别到的人名,以逗号分隔。
假设你只是想要知道每个照片中的人名而不要文件名,可以启动如下操作:
Python模块
你可以经过引入face_recognition就能成功人脸识别操作:
API 文档:
在图片中智能识别一切人脸
请参照此案例this example:
识别图片中的人脸并告知姓名
请参照此案例this example:
Python代码案例
一切例子在此 here.
·找到照片中的人脸Find faces in a photograph
:.. 识别照片中的面部特色Identify :.. ( ) :..·基于已知人名找到并识别出照片中的未知人脸Find :..
好了,当天的分享就到这里~