离线识别率高达 100% 的 Python 人脸识别系统,开源(下)

上一篇 / 下一篇  2022-05-07 13:39:50

  提取低水平特征:
  过程如下所示:
  · 预处理阶段:输入3通道的人脸,并进行3D校正,再归一化到152*152像素大小——152*152*3.
  · 通过卷积层C1:C1包含32个11*11*3的滤波器(即卷积核),得到32张特征图——32*142*142*3。
  · 通过max-polling层M2:M2的滑窗大小为3*3,滑动步长为2,3个通道上分别独立polling。
  · 通过另一个卷积层C3:C3包含16个9*9*16的3维卷积核。
  上述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向量:
  ·先每一维进行归一化,即对于结果向量中的每一维,都要除以该维度在整个训练集上的最大值。
  · 每个向量进行L2归一化。
  2. 验证
  2.1 卡方距离
  该系统中,归一化后的DeepFace特征向量与传统的基于直方图的特征(如LBP)有一下相同之处:
  ·所有值均为负
  · 非常稀疏
  · 特征元素的值都在区间 [0, 1]之间
  卡方距离计算公式如下:
  2.2 Siamese network
  文章中也提到了端到端的度量学习方法,一旦学习(训练)完成,人脸识别网络(截止到F7)在输入的两张图片上重复使用,将得到的2个特征向量直接用来预测判断这两个输入图片是否属于同一个人。这分为以下步骤:
  a. 计算两个特征之间的绝对差别;
  b,一个全连接层,映射到一个单个的逻辑单元(输出相同/不同)。
  3. 实验评估
  3.1 数据集
  ·Social Face Classification Dataset(SFC): 4.4M张人脸/4030人
  · LFW: 13323张人脸/5749人
  · restricted: 只有是/不是的标记
  · unrestricted:其他的训练对也可以拿到
  · unsupervised:不在LFW上训练
  · Youtube Face(YTF): 3425videos/1595人
  result on LFW:
  result on YTF:
  DeepFace与之后的方法的最大的不同点在于,DeepFace在训练神经网络前,使用了对齐方法。论文认为神经网络能够work的原因在于一旦人脸经过对齐后,人脸区域的特征就固定在某些像素上了,此时,可以用卷积神经网络来学习特征。
  本文的模型使用了C++工具箱dlib基于深度学习的最新人脸识别方法,基于户外脸部数据测试库Labeled Faces in the Wild 的基准水平来说,达到了99.38%的准确率。
  dlib:http://dlib.net/数据测试库Labeled Faces in the Wild:http://vis-www.cs.umass.edu/lfw/
  模型提供了一个简单的 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:https://github.com/ageitgey/face_recognition/blob/master/examples/digital_makeup.py
  识别图片中的人脸
  识别谁出现在照片里:
  安装步骤
  本方法支持Python3/python2,我们只在macOS和Linux中测试过,还不知是否适用于Windows
  使用pypi的pip3 安装此模块(或是Python 2的pip2)
  重要提示:在编译dlib时可能会出问题,你可以通过安装来自源(而不是pip)的dlib来修复错误,请见安装手册How to install dlib from source
  https://gist.github.com/ageitgey/629d75c1baac34dfa5ca2a1928a7aeaf
  通过手动安装dlib,运行pip3 install face_recognition来完成安装。
  使用方法命令行界面
  当你安装face_recognition,你能得到一个简洁的叫做face_recognition的命令行程序,它能帮你识别一张照片或是一个照片文件夹中的所有人脸。
  首先,你需要提供一个包含一张照片的文件夹,并且你已经知道照片中的人是谁,每个人都要有一张照片文件,且文件名需要以该人的姓名命名;
  然后你需要准备另外一个文件夹,里面装有你想要识别人脸照片;
  接下来你只用运行face_recognition命令,程序能够通过已知人脸的文件夹识别出未知人脸照片中的人是谁;
  针对每个人脸都要一行输出,数据是文件名加上识别到的人名,以逗号分隔。
  如果你只是想要知道每个照片中的人名而不要文件名,可以进行如下操作:
  Python模块
  你可以通过引入face_recognition就能完成人脸识别操作:
  API 文档: https://face-recognition.readthedocs.io.
  在图片中自动识别所有人脸
  请参照此案例this example: https://github.com/ageitgey/face_recognition/blob/master/examples/find_faces_in_picture.py
  识别图片中的人脸并告知姓名
  请参照此案例this example: https://github.com/ageitgey/face_recognition/blob/master/examples/recognize_faces_in_pictures.py
  Python代码案例
  ·找到照片中的人脸Find faces in a photograph?
  https://github.com/ageitgey/face_recognition/blob/master/examples/find_faces_in_picture.py
  · 识别照片中的面部特征Identify specific facial features in a photograph
  https://github.com/ageitgey/face_recognition/blob/master/examples/find_facial_features_in_picture.py
  · 使用数字美颜Apply (horribly ugly) digital make-up
  https://github.com/ageitgey/face_recognition/blob/master/examples/digital_makeup.py
  ·基于已知人名找到并识别出照片中的未知人脸Find and recognize unknown faces in a photograph based on photographs of known people
  https://github.com/ageitgey/face_recognition/blob/master/examples/recognize_faces_in_pictures.pypython人脸

  好了,今天的分享就到这里~

TAG: 软件开发 Python

 

评分:0

我来说两句

Open Toolbar