基于深度学习的人脸识别研究
摘要
近年来,网络技术日新月异,我们已经进入了大数据的时代并成为其中第一员,由此带来数据量的飞跃式的增长,而如何利用这些数据产生实际的生产价值则成为了大数据时代的一个重要问题。而人脸识别技术是一份对大数据价值应用的标准答卷。传统的身份验证系统基于动态的密码和手机认证,这样的方式看似安全,实际上却非常容易产生信息暴露、信息被盗取、信息丢失等问题。假设有一天,用户丢失了手机或者身份证,如果是传统身份验证技术,那么就可能被不法之人所利用,而如果是生物特征识别技术,则不会存在这一问题。因此,人脸识别技术在未来不久也将会成为主要的信息安全技术。人脸识别是这种识别技术的和弦技术之一,同时也是最成熟的技术之一。利用一段视频或者图片,判断是否为本人,就是人脸识别技术所在做的。而人脸识别技术已经被广泛应用于入口检测之中,未来的应用只会越来越广泛。
人脸识别技术随着卷积神经网络的提出进入了飞速发展阶段,越来越多的研究人员通过改变卷积神经网络结构获得来越来越好的性能与效率。与此同时,人脸识别的数据集的数据量也越来越大、数据集的种类也越来越丰富,出现了 3D 人脸数据集和各种姿态、光照人脸数据集。人脸识别技术在目前已经发展的越来越成熟了,但是在应用过程中,人脸识别技术陷入了隐私泄露和隐私安全的困境,这种现象在国外尤其严重。
本文对基于深度学习的人脸识别做出了研究,同时也应用研究成果设计了拍照签到与网课在线检测系统。本文的人脸识别分为人脸检测、人脸对齐、人脸检验这三个过程。在人脸检测过程中,本文使用了 LFFD 算法进行快速人脸检测与活体检测以应对网课在线检测这一场景,同时也使用了 DSFD 算法进行高精度人脸识别以应对拍照签到这一场景。人脸对齐过程中,本文采用的是快速、简便的 5 关键点对齐。在最后的人脸检验过程中,本文使用了最新的 SeetaFace6 算法,支持口罩检测。本文也在最后的人脸检验过程中采用 GPU 加速了人脸距离计算过程,这不同于目前绝大部分人脸识别技术的人脸距离计算方式,非常的快速。
关键词 :人脸检测;人脸对齐;人脸识别;卷积神经网络
一、绪 论
1.1 引言
人脸识别即是人工智能领域的一项拥有非常巨大实用价值与非常良好前景的技术,也是一项亟需落地的人工智能任务。在近年来,通过国内外科技公司与高等大学的努力,人脸识别技术已经取得了非常惊人的准确率,同时应用也越来越广泛。比如最近支付宝的刷脸支付就是使用了 2D 的人脸识别技术,极大的简化了支付流程。苹果公司进一步使用了 3D 的人脸识别技术,不但获取了更为丰富的特征,也大大提高了对人脸攻击手段的防御能力,并且也革新了人脸是被设备。目前,苹果公司的人脸识别技术也已经应用于 Apple Play 的支付中。人脸识别技术早于几十年前便已被提出,当时受限于计算能力的不中,人脸识别仅限于理论。而在近年,由于硬件计算能力的飞跃提升,运算部件的革新(从 CPU 计算到 GPU 计算),在足够强大的计算力支持下人脸识别取得了重大进展,大数据技术使得对海量数据的计算成为可能,越来越多的新颖的网络结构被提出(DNN,CNN,RNN,GNN,CapesulNet),人脸识别必将乘深度学习的浪潮前行。
随着网络技术的发展,各种各样的网站与平台都越来越注重对个人身份信息的验证了。完善个人信息验证可以营造更和谐、更安全的网络环境,可以使未成年人的防沉迷系统落于实处、也可以缓解不良用户发布违法信息或者广告的情况。。像语音识别、指纹识别、 虹膜识别之类的技术虽然都有着不错的安全性与准确性,但是它们都有着巨大的使用限制。语音识别过程中用户必须将音量提高到设备能够检测到的范围,这在一些要求人们保持安静的场合极不方便。指纹识别则需要设备具有能够进行指纹识别的设备,同时用户在生活过程中很难保证自己的指纹信息完全不泄露。虹膜识别则是识别过程非常麻烦,对用户造成的困扰非常之大。现代身份验证系统中的种种问题迫使人们创造出一种验证方便、使用范围广的身份验证技术,而人脸识别就是人们所找出的一种解决方法。人脸识别技术假定每个人的人脸都是独一无二的,辨别其中的差别是容易或者可能被神经网络所学习的]。人脸识别技术使用静态图片或者一段非常短的视频来进行识别的单种类生物识别技术。人脸识别系统是采用一定的硬件设备收集信息,并根据这些信息来进行身份验证的系统。指纹识别、语音识别、虹膜识别如图 1.1 所示。
图 1.1 指纹识别(左)、语音识别(中)、虹膜识别(右)
简单来说就是系统接收一张未知人脸图片,然后用它的描述子与数据库中所存在的描述子做比比较,找出与未知人脸度量距离小于阈值的人脸,斌确认未知人脸的身份为已知人脸中的哪一个人。如果全部人脸做完比对后,都没出现度量距离小于阈值的人脸,则系统会将未知人脸标记为‘UNKNOW’。
1.2 人脸识别技术课题背景
人脸识别是通过对事先检测出并经过人脸对齐而识别出的人脸进行特征编码或者映射而得出人脸身份 ID 的一种技术。近年来,国家政府出台了一系列利于人工智能发展的政策。2017 年 3 月 5 日,在在第十二届全国人民代表大会第五次会议上,人工智能第一次被写进了政府工作报告之中,国家政府表示将鼓励做大做强人工智能产业集群。同年 12 月,工信部对人脸识别做出了规范,提出了人脸识别的需要遵循的性能指标。
人脸是被的概念早于上世纪 60 年代就以提出,当时受限于计算能力的不足及学习算法的缺失,人脸识别也仅仅是一个科幻概念而已。现在由于社会生产力的进步,人脸识别已经从机械端迁移到了互联网,识别设备由 CPU 转变为 GPU 及 GPU 集群。人脸识别的主要挑战是由于光照和姿态、甚至年龄的影响同一身份的人脸会变得很不一样。如图 1.2 所示。
图 1.2 不同姿态、光照人脸图
目前人脸识别技术在正确率上已经十分之高了,最新的人脸识别算法基本都可以达到 96% 以上的正确率。而人脸识别目前的课题研究方向便是更快的人脸验证技术、对伪造攻击更强的抵抗能力、有遮挡人脸的识别、人脸聚类等。我在 GitHub 搜索人脸识别时可以搜索出上千个 Python 项目。而以上需要研究的课题只能搜索出几十乃至几个项目,所以上述课题既是人脸识别的所需要研究的方向同时也是所缺失且不成熟的技术。
1.3 人脸识别现状
1.3.1 国外现状
目前在全球范围内,从事人脸识别系统的企业很多,国外知名的有 Aurora、IDEMI,EnterFace,Artec Group 和 Herta A 等。
相对于中国,国外的人脸识别受到了隐私泄露问题的阻碍。人脸识别技术收集的人脸数据大部分未经过授权,公众非常反对在无意识且无拒绝权力的情况下别收集人脸身份信息。同时国外研究人员更注重人脸识别的应用,而中国更倾向于研究人脸识别的数学问题,这从论文词频上是可以看分析出来的。
目前大部分人脸识别顶级会议及期刊都是国外的,例如 CVPR、ICCV、ECCV。WIDER FACE、LFW、IMDB 等人脸识别数据集均是由美欧国家所收集,而亚洲所收集的比较有名的数据库是 CASIA-FaceV5。
1.3.2 国内现状
中国是 2018 年最大的人脸识别系统市场拥有者,占据市场 37.51% 的份额,排在第二第三的分别是欧洲地区和北美地区,其市场份额为 19.66% 和 17.94%[6]。
我国在很早之前便提出了以人脸关键点为基础的人脸识别技术。随后中国的科学家们对主成分分析法作出改进并结合 SVM 用于提高人脸识别性能。到了 20 年代初期,中国已经开始大量使用机器学习方法来进行人脸识别。随后深度学习的兴起,使得研究人员开始使用深度神经网络来进行人脸识别。现今,中国主要人脸识别主力是腾讯优图、旷视、以及中科院,本文主要研究的算法主要也来源于中科院和腾讯优图。这些机构的研究人员研究新的卷积神经网络结构,并不断的改进以寻求更高的识别率与更快的识别速度。国内这些年也涌现了其他实力派,如云思图、商汤、海康威视技等。国内这些主流的人脸识别企业,技术方案各有特点。如海康威视的人脸识别技术,其人脸识别系统在识别准确率上非常不错,前端智能-深眸、分布智能-超脑 NVR、中心智能-海康脸谱,均融合深度学习算法,前后端深度智能为人脸大数据应用提供有力支撑。在数据集及顶会数量上,中国的人脸识别顶会论文数量基本与美国持平,然而在公开数据集上无论是数量还是规模都小于欧美国家。
由于人脸识别安全性与准确性的提高,人脸识别可以用于身份验证,比如入口通过、刷脸支付、身份证验证等场景之中。也可用于刑侦之中,通过摄像头的识别,确定犯人所处现的位置及时间。除此之外,人脸识别也有其他有趣的应用,比如表情分析、人脸美妆、人脸生成等。当然人脸识别也有其他不好的应用,比如美国的棱镜门、又比如通过人脸识别技术的反向不法攻击。人脸识别应用如图 1.3 所示
- 图 1.3 门禁系统(左)、刷脸支付(中)、入口通过(右)
- 同时 CVPR 的钻石赞助商为微软,而白金赞助商有三家中国企业,分别为腾讯优图、旷视、快手。
- CVPR 赞助商分级如图 1.4。
图 1.4 CVPR 赞助商分级
二、人脸识别与深度学习
2.1 深度神经网络基础
深度神经网络是最早的神经网络结构,它现在主要应用于解决一些适合用统计学习方法解决的分类与回归问题并作为大多数神经网络的最后一层。在人脸识别及其他图像识别问题中,人们在卷积神经网络的最后一层进行扁平化操作,即把高维的数据拍平成一维数据,再交由全连接层将这些数据组合起来已进行分类或者回归的预测。
扁平化操作如下图 2.1 所示。
图 2.1 对特征图进行扁平化
一个完整的神经元由上层输入、激活函数、下层输出构成。神经元接收上一层的输出在再与各个输出的权重做矩阵乘法,之后加上偏移量后送入激活函数,最后的到下一层神经元的输入。而在这过程中,非线性激活函数为神经网络把神经网络的可拟合的函数空间从线性空间扩展到了非线性空间。深度学习网络的宽度决定了可以学习到特征的数量,而网络的深度决定了网络的表达能力。一个神经元接收信号并得出输出的过程如图 2.2 所示。
图 2.2 神经元的一次前向传播
深度神经网络在大部分网络中也被称为全连接层,因为上层神经元与下层神经元之间想互连接。深度神经网络的连接非常之多,在带来强大拟合能力的同时也带来了过拟合的风险,因此深度神经网络往往也需要加入权重衰减项及使用 DropOut 方法不敏感的层。权重衰减会限制单个神经元的权重,以迫使各个神经元之间相互协同合作,而不是一个神经元输出全部的输出,Dropout 方法会根据丢弃率来删除网络中权重比较小的神经元。在大部分图像识别网络中,都会加入 Dropout 来提高模型的泛化能力,即在测试数据集中的性能。完整的深度神经网络如图 2.3 所示。
图 2.3 简单神经网络结构图
2.2 卷积神经网络基础
卷积神经网络由输入层、隐含层及输出层构成,搭建神经网络模型的重点便在于搭建隐含层。卷积神经网络隐含层由卷积层、池化层、全连接层及激活函数组成,人们在此基础上研究更好的网络结构便可以搭建更高效、更精确的模型。
神经网络中的每个神经单元接受前一层的输入并通过激活函数得到对后一层神经元的输出[6]。在多层神经网络中,各个单元之间存在着一个将上一神经元的线性输入投射到一个非线性空间的函数,这个函数称为激活函数。激活函数的意义在于为深度学习网络引入非线性。如果没有激活函数,神经网络就会退化成一个 Softmax 线性分类器。常见的激活函数有 Sigmoid 函数、Tanh 函数、ReLu 函数。
Sigmoid 函数是第一个卷积神经网络 LeNet 所使用的激活函数,在机器学习中 SVM 的输出判别函数用的也是 Sigmoid 函数。Sigmoid 函数是非线性的,可以提高网络的学习与表达能力[3]。
Sigmoid 函数曲线如下图 2.4 所示:
图 2.4 Sigmoid 函数曲线图
Sigmoid 函数可以将线性的输出变换为 0-1 的一个值,但它具有容易产生梯度消失现象的缺点,在 AlexNet 提出使用 ReLu 函数后,卷积神经网络就几乎不再使用 Sigmoid 函数作为激活函数了。目前 Sigmoid 函数更多的还是用于作为神经网络最后一层单元的输出函数。
Tanh 函数是与 sigmoid 函数曲线相似,但性能更好。在 LeNet-5 中使用的激活函数便是 Tanh 函数。Tanh 函数相对于 Sigmoid 函数来说,Tanh 函数是关于原点对称的函数,但即便如此也依然未能解决随着网络加深而产生梯度消失以及梯度运算计算量庞大的问题。现在卷积神经网络已经不常出现 Tanh 函数作为激活函数了,Tanh 函数更多的是作为循环神经网络的激活函数[5]。
Tanh 函数图 2.5 如下:
图 2.5 Tanh 函数曲线图
Relu 函数于 AlexNet 一文中提出,它解决了梯度消失和幂运算的问题,性能稳定且计算代价低,在相当长的一段时间内 Relu 都是作为深度学习中的默认激活函数使用的。Relu 在样本判别正确时可以输出一个恒定的梯度,这样便解决了梯度消失的问题,同时这样的策略会使网络趋向向于更稀疏的结构,从而泛化识别能力更加强大。但即使如此 Relu 函数也存在其问题,当判断错误时,无法输出梯度,从而导致网络停滞而得不到更新,有时甚至会导致神经元的“Dead”现象。
Relu 曲线如下图 2.7 所示:
图 2.7 Relu 函数曲线图
相对于深度神经网络,卷积神经网络在隐含层加入了卷积层和池化层。卷积运算具有平移不变性可以保留数据的空间特征,从而在图像识别领域比深度神经网络具有更好的性能。此外卷积层采用权重共享使训练速度得到极大的提升。
卷积运算如下图 2.8 所示:
图 2.8 均值滤波器卷积操作
可以看出卷积运算的本质就是图像滤波器,训练卷积神经网络相当于让神经网络学习出能提取图像重要特征的滤波器。卷积层的深度假加深会使神经网络的感受野增大,感受野通俗来讲就是当前卷积运算所涉及区域的大小。
感受野原理如图 2.9。
图 2.9 特征图对应的感受野
由于感受野随层数增加加大,因此高层卷积学习到的是宏观特征,而低层卷积学习到的是细微特征。除此之外,大部分网络也会在第一层卷积层中加入最大的卷积核,以提高后续卷积层的感受野。
手写数字识别中第一卷积层对作用后的图像如图 2.10。
图 2.10 手写数字识别中低层特征图可视化
池化层用于降维和防止过拟合,最常用的池化层便是最大池化层。最大池化层会输出卷积运算区域中的最大的值。最大池化原理如图 2.11。
图 2.11 最大池化操作
卷积神经网络中最为重要的步骤就是模型结构设计。残差网络是图像识别中应用非常广泛的一种网络结构,近年来大部分图像识别的结构都是基于残差网络而设的,本设计中所用到的 dlib 人脸识别便是基于 ResNet-34 实现的。残差网络最大的贡献是解决了随着网络加深出现的模型性能下降问题。残差网络认为拟合理想函数 H(x)的残差 F(x)=H(x)-x 比直接去拟合 H(x)要容易。残差网络通过在输入单元和输出单元之中建立一条捷径,使得网络所拟合的函数为 F((x)=H(x)-x,这解决了随着深度加深而出现的梯度消失问题。
残差网络部分的结构如图 2.12。
图 2.12 残差网络的结构
本文研究的另一个网络便是 VGG 网络,该网络的特点是参数非常多,虽然提出的时间比较早,但是至今仍被广泛使用。VGG 的思想之一是采用连续的小卷积来代替大卷积,在降低计算量的同时可以获取到同样的感受野 。VGG 所包含的另外一个思想便是使用重复的元素以搭建高性能网络,这一思想至今仍在影响人们对神经网络的设计。
经典 VGG 结构如图 2.13 所示,可以看出 VGG 是使用重复模块的网络。
图 2.13 经典 VGG 网络结构图
2.3 深度学习的参数更新
深度学习的学习本质就是参数更新,网络根据输入数据进行前向传播从而得到预测结果,预测结果与实际结果计较后经过损失函数从而得出训练的误差,最后根据误差进行反向传播以更新模型参数,便是一次参数更新过程。
定义前向传播函数上一层输入,如式所示。
再定义激活函数
及输出 h,如式所示。
继续后定义输出 ,如式所示。
最后定义损失 L,如式所示。
从而可以得到需要反向传播的误差 L,深度学习的反向传播是通过链式法则及 Jacabia 矩阵实现的。如式所示。
则有式:
最终有权重更新式。LR 为学习率
以上便是深度神经网络的参数更新。
三、人脸检测算法研究
3.1 目标检测算法
人脸检测是一种特殊的目标检测,也可以称为目标检测中的单类目标检测。人脸检测算法都是基于目标检测的,因此若要研究人脸检测算法,必须先理解目标检测算法。
目前目标检测算法可以分为使用 Anchor 检测算法与 Anchor-Free 的检测算法。Anchor 算法以选取的像素点为中心,根据指定的宽高比生成锚框,在交由神经网络做目标检测。
Anchor 生成锚框过程如图 3.1 所示。
图 锚框生成过程
假如选取了 n 个随机像素点作为中心点,而每个中心点锚框数量为 16 个,则需要采取一定的策略以降低锚框的数量。目标检测中,人们采用非极大值抑制与交并比方法作为限制锚框数量的手段。目标检测算法首先会进行非极大值抑制,即锚框进行排序,排序的依据是含有所需检测目标的概率。非极大值抑制方法会丢弃那些概率较低的锚框,并在大概率含有检测目标的锚框中选取交并比低的锚框进行预测[15]。交并比的英文缩写是 IOU,它的计算方法如式 3.1 所示。
更直观的 IOU 计算如图 3.2 所示。
图 交并比直观展示
Anchor 机制并不完美,大部分目标并不均匀也很难保证被矩形的锚框很好的框定出来,锚框中也会包含非常多不属于检测目标的干扰项。同时 Anchor 的设置依赖于人工,更多的是要凭借研究人员的经验与对检测的理解去设置锚框。甚至需要为不同的数据集需要设置不同的锚框,这并不够智能,不符合神经网络的设计的思想。Anchor 机制面临的另外一个困境是检测尺寸的分布不均,不同大小的 Anchor 被检测的频率是不一样的,中等大小的 Anchor 被检测的概率更高,而太小或者太大的 Anchor 被检测的概率就比较低,这造成了性能的不均衡。最后一个问题就是采样的策略导致采样不够均衡,而本设计所采用的人脸检测算法之一 DSFD 便解决了这一问题。由于以上种种问题,人们提出了 Anchor-Free 机制,Anchor-Free 是角点检测方法。相比于 Anchor 机制,Anchor-Free 机制是角点检测方法,它是通过调整角点的坐标来定位检测目标物体[8]。CornerNet 检测出的是左上的角点和右上角点,训练损失便是预测角点与真实角点之间的偏移。这中方法检测速度非常之快,原因是通过暴力方法去检测大量 Anchor 远不如预测两个角点并使它们它们与真实角点靠近高效。同时检测角点不和受图片尺度的大小,不论图片尺寸大小,角点检测检测出来的都是一个坐标或者像素点,由此 Anchor-Free 对极端目标的检测检测性能更好,LFFD 便是 Anchor-Free 方法,它可以在不经任何处理的情况下去检测 4K 大小的图片。其次采样不均衡的问题也得到了了解决,因为角点检测并无锚框采样这一步骤。
CornerNet 检测角点方法如图 3,3 所示。
图 CornerNet 的角点检测
单发多目标检测算法即计算机视觉所常提到的 SSD 算法,而本文所采用的高精度人脸检测算法是双发人脸检测算法,它是多了一个 shot 以进行目标检测的算法。所以研究 SSD 是理解双发人脸检测算法的前提条件。SSD 检测算法采用的网络结构是 VGG-Net,后来又更换成性能更好的 ResNet,这两张结构前文已介绍过,在此便不介绍。SSD 在每个尺度的特征图中都会产生锚框并交由检测器做类别预测和边界框预测[13]。
SSD 检测流程如图 3.4 所示。
图 SSD 目标检测流程图
3.2 种人脸检测算法
3.2.1 DSFD 人脸检测算法
DSFD 算法采用了 DualShot(双发检测框)。如图 3.5 所示
图 DSFD 结构图
DSFD 这种结构的优点:
-
DSFD 使用拓展的 VGG16backbone,在分类层之前添加辅助结构[2];使用 conv3_3、conv4_3、conv5_3、conv_fc7、conv6_2、conv7_2 作为第一个镜头的检测层,生成作为原始特征图的 of1,of2,of3,of4,of5,of6,使用 FEM 将原始特征图转换为六个增强的特征图:ef1,ef2,ef3,ef4,ef5,ef6,以此构建成第二个镜头的检测层;
-
设计上和 S3FD 以及 PyramidBox 不同,在 FEM 中利用了感受野增广以及新的 anchor 设计策略后,没有必要设计三种尺度的 stride、anchor 和 receptive field 去满足等比例间隔原则;
-
原始镜头和增强镜头使用的 loss function 不同,分别为 FSL、SSL。
DSFD 这种网络结构所需要的显存消耗是 SingleShot 结构的两倍,因此在实验过程中出现了显存不足的情况
腾讯优图开源的 DSFD(Dual Shot Face Detector)算法具有高精度与强识别能力等优点,是非常优秀的精确检测算法。该算法刷新了很多人脸检测的算法的记录,并于 2019 发布于 CVPR。但是该算法对于硬件设备有比较苛刻的要求,需要用到 NIVIDA 的 Tesla P40 GPU,受限于硬件设备的要求本文将不在实时检测采用 DSFD 算法,而是在离线检测采用 DSFD 算法。
3.2.2 LFFD 人脸检测算法
本文所使用的实时检测算法是中科院开源的 LFFD 算法,LFFD 扩展性非常之强,可应用于大部分单目标检测设计。它的结构具有优点:
- 在人脸检测等单物体领域上臻至化境,用于非常优秀的锚框准确度与推测速度。
- 采用了 Anchor-Free 思想,做出了感受野等于天然锚框这一结论。
- 实现了对高分辨率大图像的识别,即使不采取一点优化也能实现对 2K 图像输入的实时检测。
- 网络结构及其精简,即使是边缘设备也能快速部署。并且 LFFD 学习能力与泛化能力强,不仅可以用于人脸检测还可以延伸至其他的类别,如人头、行人、车辆等。
LFFD 结构如图 3.7 所示。
图 LFFD 结构图
3.2.3 HOG 检测算法
HOG 就是计算图像的梯度直方图随后再使用 SVM 线性分类器进行划分。HOG 算法是最早的一批人脸检测算法,因此采用的是机器学习方法和图像处理方法。
Hog 算法可视化如图 3.10 所示
图 HOG 的梯度操作可视化
由于 HOG 算法所采用的是垂直与水平梯度,因此几乎没有处理姿态变化的能力。对于倾斜的人脸检测效果并不好如图 3.11 所示。
图 HOG 检测倾斜人脸
这三种算法,Hog 算法落后、LFFD 高效同时不缺精确度,而 DSFD 追求检测的完美。
三种算法对同一张图片检测效果,如图 3.12 所示。
从左至右、从上往下依次为 Hog、LFFD(v2/small)、LFFD(v1/big)、DSFD。
图三种算法检测效果对比图
四、人脸对齐
4.1 FAN 网络与人脸对齐
人脸对齐就是通过所检测出的人脸关键点后对图片进行旋转与裁剪从而生成人脸验证所需要的人脸输入[10]。人脸关键点检测应用广泛,但人脸对齐一般使用的是最简单的人脸 5 关键点检测技术。人脸关键点检测技术既有 2D 也有 3D,所幸 FAN 网络同时提供 2D 及 3D 关键点定位技术,这是由它的结构所决定的。
图 4.1 为 FAN2D 到 FAN3D 的结构图。
图 4.1 FAN 结构图
2D to 3D FAN 网络架构接收的输入是原始图片,及 2D 关键点坐标,生成的是对应的 3D 关键点坐标。
- 搭建了一个强大的 2D 人脸关键点网络,这个网络之所以强大是因为采取了当时最优秀的网络结构,其次是因为对训练数据进行了清洗,数据集非常干净。
- 检测的一个问题是数据不足,而 FAN 采用了由 2D 网络导向 3D 网络的方法,并且由此建立了一个在很长一段时间都为最大数据集的 3D 人脸数据集。
- 训练了一个基于 3D 关键点检测的人脸对齐网络,并实现了大规模的测试。
- 进一步研究了影响人脸对齐性能的传统因素,像姿态、初始值以及分辨率等,并且提出了一个新的因素,就是网络的尺寸。
4.2 人脸关键点定位与人脸对齐
通过输入人脸检测所检测出的人脸,从而得到诸如鼻子、眉毛、眼睛、脸庞、嘴唇等一系列人脸各个关键点的技术便是人脸关键点定位技术。人脸关键点技术可分为 2D 人脸关键点检测技术和 3D 人脸关键点检测技术。并不是所有人脸关键点技术都可以得到很多的关键点,dlib 中的小型关键点定位器只会得到人脸的 5 个关键点。
人脸关键点检测还可以用于活体检测,有的活体检测需要的是 5 个人脸关键点,如 SeetaFace,而有的活体检测需要用到 68 个关键点,如张嘴检测和眨眼检测。如果仅仅用于人脸对齐这一简单任务,那么 5 关键点检测不但具有与 68 关键点检测相近的准确度,而且运行更加快速。
Dlib 的 5 关键点检测、68 关键点检测如图 4.2 所示:
图 4.2 人脸 5 关键点检测(左)、人脸 68 关键点检测图(右)
画图不足以看出 3D 关键点检测的效果,所以为了弄清 3D 关键点检测的准确度,应该对齐进行 3D 可视化。3D 关键点可视化代码见附录 A.3
图 4.3 为 3D 关键点检测可视化。
图 4.3 3D 关键点检测可视化
人脸对齐应用广泛,几乎所有人脸识别算法中都会加入人脸对齐这一步骤。人脸对齐不仅可以应用于人脸识别还可以用于人脸表情识别及 3D 卡通模拟,而其中的关键检测技术技术还可以用于人脸美妆。因此,人脸对齐既是关键步骤也是有趣技术。
使用 FAN-3D 网络检测出人脸关键点以后,可以通过 dlib. get_face_chip()函数得到对齐后的图片。对齐效果如图 4.4 所示。
图 4.4 人脸对齐
4.3 活体检测
做完人脸关键点检测,便可以尝试一些启发性的活体检测算法了,活体检测算法非常复杂且不成熟,故本设计所采用的活体检测技术也有不能逆光的限制条件。
单纯的离线人脸识别的应用范围是非常有限的,而要使人脸识别应用更加广泛则亟需将人脸识别变得具有实时性。具有活体检测功能的人脸检测应用广泛。应用于手机刷脸解锁,目前市面上上档次的手机都会配置人脸解锁功能,而且人脸解锁的错误率要远低于指纹解锁。但是人脸信息远比指纹信息容易获取,所以手机的刷脸开锁必须配备足够安全的活体检测功能。和支付有关的功能于应用的安全问题是重中之重,虽然刷脸支付非常快捷,但也是最需要活体检测来保证安全性的。远程身份验证中,非常容易被利用照片或者事先录制好的视频以欺骗验证系统,所以也必须建立好活体检测的防线。
在实时人脸检测中,活体检测是其中非常重要的一个环节,准确的活体检测将使人脸识别具有更高的稳定性与安全性,使得人们更加愿意且更加放心的使用人脸识别技术。然而活体检测目前的技术并不成熟,数据集的收集也不具有令人满意的广度与深度,所以活体检测虽然重要但也非常困难。目前活体检测更多的是启发性检测,常见的检测有运动检测、纹理检测、眨眼检测、张口检测等活体检测技术,而这些技术目前都有着各自的缺陷与应用场景的检测,但大多不稳定。
本打算在设计中加入活体检测,后面由于检测都不稳定故废弃。在此可以说明一下所遇到的问题及不稳定的原因。
基于光照与纹理检测会受到眼镜佩戴的影响,戴眼镜会有非常高的误判率,但不管配不配戴眼镜都会出现误判。而且光照检测的阈值并不平衡,源码中的阈值为 0.85,解释起来就是如果没有 85% 以上可能判定为假则判断为真。
基于眨眼与张嘴、头部位置的检测几乎无用。因为这些检测是启发式算法,而且计算式存疑,因此即使本文仅仅是晃动手机静止图片也会被判定为真。眨眼检测是通过对眼宽和眼高的比值来判断是否眨眼,而实际上头部偏左或偏右都会影响眼宽而不会影响眼高,而抬头或低头也都会影响眼高而不会影响眼高。因此,用鼻子高度与眼高的比值作为是否眨眼依据和用鼻子高度与嘴巴高度的比值的作为是否张嘴的依据才是比较可行的方法。然而即使本文如是修改,也不能解决检测结果不稳定的问题。归根结底是关键点检测算法的问题,然而本文所使用的关键点检测算法是高精度的 3D 关键点检测算法,因此活体检测无法使用。
活体检测如图 4.7 所示
图 4.5 活体检测效果图
五、人脸识别系统设计
5.1 开发环境
进行项目开发前必须指明开发环境,开发环境不一致或者模块版本相差过大都可能导致程序无法运行或运行错误。确认开发环境是人脸识别中先决条件,任何人脸识别系统都有其模块版本、Python 版本、操作系统型号的要求。若不能满足其要求则系统将可能无法正常运行。
人脸识别可适用的操作系统很多,比如 Linux、MacOS、Windows x86、Windos amd64。本设计所采用的操作系统为 Windows 家庭版,操作版本为 18362.778。
模块只能在 Python3.6 环境中运行,如果已经安装至 3.7 则需要创建 Python3.6 的开发环境。本设计依赖的模块见附录 B.1。
在人脸识别系统设计中还要考虑所使用的设备,所使用设备不一致可能会无法达到原项目所测试出的性能,本设计的硬件设备信息见附录 B.2
5.2 人脸识别方法综述
人脸识别方法可以大致分为 3 类:根据几何特征识别、根据模板是被、根据模型的识别。
一张人脸包括眼睛、眉毛、嘴唇、脸庞、下巴、鼻子等部分,前文提到的人脸关键点检测技术便可以将这些特征给识别出来。在没有对人脸识别进行研究前,本文本以为特征点检测是为了进行人脸识别,而在对人脸识别进行研究后才发现目前主流人脸识别算法进行关键点检测是为了进行人脸对齐。不同的人的人脸关键点所构成的特征是不一样的,采用可以对这些特征的形状与相对空间位置关系进行几何描述的算法,就可以根据这些特征识别出人脸的身份。这种方法也可以算是机器学习的方法,而机器学习的方法都比较 Naive。而根据这些特征进行度量的算法有欧里几德距离、余弦角。但这只是理论上的,实际上根据这样的算法进行人脸识别的效率与准确率都并不高。因此衍生出了另外一种方法——可变形模板法。
可变形模板是上一种方法的革新,也代表着人脸识别技术的阶段性进步。它的步骤是设计一个可调参的器官模型,并定义一个损失函数,通过对模型的调参使损失函数最小化,而该器官的特征选定为损失函数最小化时的参数。该算法的理论非常好,但是实际模型建立中存在着非常多的问题。一是损失函数的构建只能由经验确定,而不同的人脸数据集及不同研究人员都会对这种经验造成影响,这既限制了模型的推广也限制了模型的泛化。而是损失函数的优化困难,这种困难的体现是高额的时间复杂度与高额的空间复杂度。这种基于参数的编码方法能够对人脸器官进行非常准确的编码,但它需要花费巨量的时间进行预处理标注和没有尽头的调参。同时这种方法的另外一种缺陷是过于宏观,人脸除了器官以外其实还具有非常多的细小特征,比如皱纹、痣等,这种宏观的方法会丢失细微的特征,导致在识别颗粒度上并不够细致。由于可变性模板法的这种缺陷,可变性模板法只适合用于粗分类和预分类,而既不适用于高精度的人脸识别场景,也不适用对识别速度有苛刻要求的实时人脸检测。
神经网络方法也即是模型方法,同时本设计所使用的方法即是神经网络方法。神经网络方法即是先通过人脸检测检测出人脸,随后通过关键点检测来进行人脸对齐,对齐后的人脸经过尺寸放缩后便可通过使用主流的卷积神经网络来提取特征,之后再通过全连接层对人脸进行编码从而形成高维特征,最后通过对两不同高维度特征进行度量后与阈值进行比较从而完成人脸识别。这个阈值是根据机器学习方法得出来的,常用于得出此阈值的方法是 SVM 方法。
5.3 dlib 与 SeetaFace 人脸识别
dlib 曾于 2017 年 2 月刷新 LFW 的识别榜单,准确率为 0.9938 ± 0.0027。该模型是本设计实验过的人脸编码方法之一。该模型是具有 27 层的 ResNet 网络。它的实质是 ResNet-34 网络,相比于 ResNet-34 网络,它进行了简化,删除了一些网络层使模型更加精简,使用的滤波器数量减少了一半,使得模型运行起来更加的快速。该网络在拥有约 300 万张左右的人脸数据集上进行训练与调参。该数据集是许多数据集的聚合,它宝行了面部清理数据集、VGG 数据集,其次是利用网络爬虫从互联网上爬取而来的大量图像。作者通过消除标签错误来清理数据集,这也意味着作者并没有使用完整的 VGG 数据集。为此,作者反复训练人脸识别网络,然后使用了图聚类与人工检测来清理数据集。最后,数据集中一半的图像来着 VGG 和面部磨砂。值得一提的是,作者为了避免在 LFW 测试变为有效的测试,作者在训练过程中有尽力避免与 LFW 中的身份重叠。网络训练从随机初始化的权重开始,并采用了结构化的度量损失,该损失尝试将所有身份投射到半径为 0.6 的非重叠球中,并且人脸检验的阈值欧里几德距离也为 0.6[9]。
dlib 也可以非常简单的实现人脸识别,但为达到接近商业级的应用,本文将不采取 dlib 进行识别,仅用于对齐。Dlib 人脸识别步骤如下:
- 人脸检测。dlib 人脸检测是使用 Hog 算法实现的。Hog 优点是算法经典,检测稳定性高,其缺点是算法过时,检测速度慢且精度低。
- 人脸对齐。dlib 提供人脸 68 关键点检测,但对齐用的是人脸 5 关键点算法检测,优点是速度快,结果准确,本文就是采用 dlib 进行人脸对齐。
- 人脸识别。dlib 人脸识别是用当时最先进的网络结构 ResNet,优点是在公开数据集表现好。缺点是存在种族偏见。
- 人脸聚类。人脸聚类是人脸识别的扩展,dlib 的人脸聚类算法是基于检测出的 128 维描述子做的,但本文未能体现其实际价值。
ResNet-34 网络结构如下图 5.1 所示。
图 5.1 ResNet34 结构
前文写到 dlib 的识别准确率为 0.9938 ± 0.0027,但还是需要试验验证。由于本设计主要用于国内,因此验证的数据集不会使用偏向欧美国家的 Labeled Faces in the Wild Home 和 WideFace 数据集,而是使用亚洲的人脸数据集 64_CASIA-FaceV5。该数据集是含有 500 个身份,2500 张人脸的人脸数据集。每个人采集不戴眼镜(远)、不戴眼睛(近)、戴眼镜(远)、戴眼镜(近)、侧脸五种状态下的人脸。而对于不戴眼镜则为不戴眼镜(远)、不戴眼睛(近)、眯眼(远)、眯眼(近)、侧脸五种状态下的人脸。更直观的如下图 6.2 所示。
图 5.2 CISIA 数据集样本展示
测试过程中,本文采用递归的方法两两识别同一身份的全部人脸,500 个身份中只有 9 个身份出现了无法识别的问题,识别准确率为 98.2%。但实际的准确率应该要高于此值,因为一个身份只要有一张人脸与其他四张中任意一张被判定为不同的脸,则会认为错误,这有一点太苛刻了。即使如此,也依然可以得出 dlib 识别能力确实强的结论。
人脸识别不仅要考虑到识别能力,除此之外还要考虑到识别误判的次数,假如把人脸距离的阈值设定为无穷,那么同样的一个身份的任意张脸都可以识别出来,识别准确率 100%,但是只要不是同一个身份,误判率也是 100%。同理的,如果将人脸距离的阈值设定为 0,那么误判率也会变为 0,但识别率同样也会归零。所以人脸距离的阈值是对识别率与误判率的平衡,前面的实验证明了 dlib 的高识别率,却没有证明 dlib 模块的误判率。
本文随后做了 dlib 的误判率实验。Dlib 论文中的,同样也是模块中的人脸距离阈值是 0.6,如果人脸距离低于此值则可以判定为同一张人脸,反正则判定为不同的人脸。本文将阈值调至 0.5 时,误判率是 10%,高得惊人,而识别率却没有太大变化。因此本文验证了 dlib 的人脸识别是带种族偏向的,对于欧美国家人种的识别率是非常之高的,误判率也是非常之低的。然而对于亚洲人种的人脸识别率非常之高,但误判率也非常之高,算是比较过拟合了。
前文提到 dlib 在实际场景中是存在过拟合的,因此本文要调低 dlib 的人脸距离阈值,通过牺牲一定的识别能力来换取误判率的下降。最终本文所调节出的可以适用的人脸阈值为 0.45,在该阈值下,CASIA 数据集的识别率为 97%,而误判率则为 97.89%,误判率至少下降 8%,平衡了识别率与误判率。在后续人脸识别实验中,本文发现即使将阈值设定为 0.45,随着本文脸部姿态的改变,依然会发生误判的可能,但已经可以接受。
改进完 dlib,接下来就差不多完成了人脸识别。之后本文开始进行人脸在线识别的实验。实验中本文发现识别进行的非常缓慢,帧率非常之低。在前面的人脸检测和人脸关键点定位的实验中,本文程序的实时性非常好,所以可以断定性能的瓶颈是出现在新增的人脸识别模块之中。
之前本文曾经认为人脸关键点的检测与人脸识别的准确性非常相关,而在后续的研究之中,本文明白了人脸关键点定位只起到对齐的作用。因此,为了进一步提升实时识别的性能,本文将人脸关键点的检测方法从 3D-68 个关键点定位算法调整为 2D-5 关键点定位算法。同时,本文也定位到了性能瓶颈的位置,就是在进行人脸距离度量时消耗了大量的时间。为了提高瓶颈处的性能,本文将比较距离的模块由 numpy 切换为可以进行的 GPU 加速的 cupy,同时进行人脸距离度量的函数有 numpy.linalg.norm()转变为 cupy.linalg.norm()。之后性能依然提升不大,随后本文进一步发现性能瓶颈的位置是在 dllib.vector 与 cupy.array 的转化之中,于是本文在模块初始化时预先将描述子的类型由 dlib.vector 转化为 cupy.array,由此即使数据库之中存储了 500 张人脸的 2500 个描述子,也仍旧可以具备非常流畅的帧率与识别速度。
Dlib 的高精度是建立在国外数据集的,并且 dlib 训练的数据集也是采用国外人脸的数据集,因此 dlib 存在国外算法的普遍问题—人种偏见。识别算法的人种偏见指的是识别算法在进行黄黑识别时,误判率会飙升,有时甚至可以达到 100 倍以上的误判率。由此,本文又设计了一款基于 SeetaFace 的人脸识别系统。SeetaFace 算法由中科视拓开源,在黄种人识别方面远优于 dlib 算法,并且输出描述子的数量也是 dlib 的两倍。同时 SeetaFace 也是一个与时俱进的商业级人脸识别模块,目前已经出到了第六个版本,功能越来越大且准确率也越来越高。
SeetaFace 主要用于商业级的人脸识别,包含了从人脸检测到人脸对齐、人脸识别一系列的模块,这里本文仅使用它的人脸识别模块。SeetaFace 虽然主要用于人脸识别,但它也仍然具有其他强大的功能。SeetaFace 不仅可以用于人脸识别,还可用于活体检测、人脸属性获取、质量估计。以及最新的遮挡人脸识别(即口罩识别)。
5.4 人脸识别系统设计
5.4.1 教室拍照签到
本文实现了教室拍照签到功能,即拍一张包含所有学生的照片,即可得出到场的学生与缺席的学生名字。
所要拍的照片类似图 5.3。
图 5.3 拍照签到需要的图片格式
在军训照片的识别中本文提高了系统识别能力并提高了误判的可能,但即使如此未发生一例误判,因此拍照签到基本不存在误判问题。而识别能力的问题只能在疫情结束后再进行测试,不过本文已经将识别能力开放到正常水平以下,并且进行测试,2020 的照片与 2016 的军训照图片做比较依然能识别成功。相信即使即使开学后也可以通过识别能力的测试。图 5.4 为 2020 图片(为保证隐私,已做马赛克处理),图 5.5 为军训人脸。
图 5.4 人脸采样图
图 5.5 军训图中对应的人脸
5.4.2 学生网课在线检测
本设计也实现了网课在线检测功能,通过活体检测来避免学生是否使用动态视频或者固定图片来逃课。
效果如图 5.5 所示。
其中数字为人脸为活体的概率,字母为所检测人脸的身份。
图 5.6 活体检测(数字)+ 身份验证(字母)
同时该系统也支持口罩检测,但识别能力会下降。图 5.7 为口罩检测。
图 5.7 活体检测(数字)+ 身份验证(字母)
本文开放了实时检测接口,调用以后会通过 cv2 自动调用摄像机,检测出现在摄像头中的人脸身份。已经记录的会在检测框上方显示名字,名字与框体都为绿色。未记录的会在检测框上方显示“unknown”,检测框为红色。
实验时,本文为凸显性能,实验均是在数据库已经存在 500 个身份是进行的,即使如此识别过程也依然非常之流畅。除此之外的另一个接口是 write_in_database,该接口输入名字后按空格键可以生成人脸描述子,录入多个人脸描述子后按“a”键录入描述子并开始录入下一个身份的人脸描述子。录入是循环进行的,如果不想再录入人脸则按“q”键退出,非常方便。
图 5.8 是在线识别效果图。
左图为未录入身份前,右图为录入身份后。
图 5.8 人脸识别效果图
六、结论
人脸识别技术在过去几年飞速发展,到了如今识别准确率已经非常难以提升,提升空间为小数点之后后三位。人脸识别的性能也有了长足提升,模型更加精简高效,可以在移动端及 PC 端实时运行,而不是像过去一样依赖 GPU 集群了。
本文在各个环节都采用与时俱进的算法,以追求人脸识别性能与准确率的提升。本文通过搜索最新的人脸识别技术,并在 GitHub 上寻找适用的开源来加入到人脸识别系统之中。在试验过程中也安装了非常之多的类库,有些类库安装一言难尽,但最终依然还是安装完成了。
本文工作:
- 学习 Opencv,了解人脸识别之中的深度学习知识,并且阅读所用开源项目的论文以达到善用这些项目的目的。
- 学习 Python 及其深度学习框架知识。本专业未开设 Python 课程,而本设计是基于 Python 语言知识,因此在进行设计前,本文进行了 Python 与 Tensorflow 的学习。并利用这些知识解决设计中遇到的一系列问题。
- 进行系统设计。本设计设计的项目比较多,因此需要通过合理的设计来高效、准确的运行这一些项目。
参考文献
- 基于卷积神经网络的人脸表情识别(江苏科技大学·毛雨)
- 视频中人脸表情识别关键技术与应用(电子科技大学·黄弋)
- 基于关键区域增强和类关系一致性的面部表情识别研究(西安电子科技大学·石光辉)
- 基于HR和Siamese Net的人脸检测与跟踪研究(华中师范大学·袁硕)
- 基于车全脸特征的车辆身份识别的设计与实现(西安电子科技大学·杨仕琴)
- 基于深度学习的三维人脸识别研究与实现(北京交通大学·张雨梦)
- 基于元学习的少样本图像识别方法研究(中国矿业大学·储蓄)
- 面向人脸识别的加密认证技术研究与实现(贵州大学·吴俊青)
- 基于关键区域增强和类关系一致性的面部表情识别研究(西安电子科技大学·石光辉)
- 基于深度学习的三维人脸识别研究与实现(北京交通大学·张雨梦)
- 基于视觉注意机制的表情识别系统的设计与实现(东北大学·王鹏飞)
- 视频中人脸表情识别关键技术与应用(电子科技大学·黄弋)
- 基于CNN的交互式巨幅人物合照展示系统设计与实现(华中师范大学·刘燕)
- 面向人脸检测的主题网络爬虫系统(重庆大学·杨东权)
- 视频中人脸表情识别关键技术与应用(电子科技大学·黄弋)
本文内容包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主题。发布者:源码项目助手 ,原文地址:https://m.bishedaima.com/yuanma/35823.html