时间:2024-05-04
钟姝娴 姜宇 余沁峰
(中国矿业大学(北京)机电与信息工程学院 北京市 100083)
随着人工智能和互联网技术的蓬勃发展,人脸识别技术得到了广泛的应用,在交通运输、公安刑侦和信息安全等方面极大地节省了人力成本和用户的时间成本,并且凭借着其非接触性、易采集性、方便性、稳定性和独特性等优点在众多生物识别技术中脱颖而出。然而传统的人脸识别技术只能捕捉到人脸的身份,却无法辨别出摄像头采集的人脸究竟来自打印出来的照片、录制好的视频还是真人,这导致了很多关于人脸识别的欺诈犯罪行为。因此提高活体检测的准确度对于维护公民的生命和财产安全具有重大意义。本文旨在基于先进的人脸检测方法,给出活体检测的方法,进一步提高活体检测的准确度。目前已有的活体检测技术根据使用的线索不同主要可以分为四类:基于微纹理的方法,基于多光谱的方法,基于运动信息的方法、基于三维场景检测方法以及几种方法的融合。
第一种思路即为本文介绍的思路。经过上述步骤,将人脸特征量化为坐标值。我们通过数值上的变化来进行活体判断。我们认为能做出一些动作的人脸即识别为活体。那么在我们的脸部,比较明显的与特征点有关的活动有眼睛的开关和嘴巴的开关。当我们的眼睛睁开时的垂直距离一定大于闭上的垂直距离,嘴巴同理。所以我们可以通过计算读取视频中连续静态帧图像眼部或嘴部的坐标纵横比与设计的阈值进行比较来判断是否进行活动。
第二种思路为基于深度计算的方法。人脸是三维的而假脸即图片是二维的,所以在真脸和假脸的不同点位的深度一定是不同的,即使是有折叠的照片,其深度也与真脸有区别。所以基于这样的原理,设法对脸部点位的深度进行研究比较。
第三种思路为基于热红外成像的方法。欺骗人脸即假脸没有稳定的热信号,其热红外图像较为黯淡,一般与真实人脸的红外图像有很大差别。基于热红外图像分析的方法具有较高的检测效率,对于光照有较强的鲁棒性,但是对设备有一定要求。
Li 等人(2004)提出了基于傅里叶谱分析的方法,主要假设为真实人脸图像比打印照片图像包含的高频成分多。该方法主要建立在设备采集制作伪造的人脸时,伪造的人脸与真实的人脸相比在肌肤纹理方面存在丢失或差异,这些细节上的差异引起了检测系统接受到的图像上微纹理的差异。真实人脸具有多样性的运动特征,如眨眼、张嘴、表情的变化等,而欺骗人脸很难模拟这样的运动,因此可以通过分析人脸区域是否存在这样的运动来判断真假。Singh 等人利用眨眼和嘴部动作来进行活体判断。依靠运动信息的人脸活体检测方法通过观察人脸某一部位特定的运动状况,比如眨眼、张嘴等面部运动,摇头、点头等头部运动,主要依靠从视频中提取人脸某区域运动的状态来达到判定是否为真实的人脸。Kim 等人首先选取685nm 和850nm 这两个近红外波段光谱采集人脸图像,然后将这两个波段下的人脸皮肤反射数据投影到二维空间,以此来判断真假人脸。该方法存在的不足是需要采集目标与采集设备之间保持一定的距离,且人脸的额头区域要被拍摄到。基于多光谱成像的方法从可见光波段之外找到更加有效的波段或其组合,使真实人脸和伪造人脸在人工识别系统接受的画面响应上的差异变大,从而达到区分两者的目的。在此方法下,人脸识别模块的精准度得到很大的提高,但是由于需要特殊的多光谱成像设备,造价昂贵,因此在日常生活中不太普及。二维人脸识别技术使用人脸的三维信息识别的一种技术。根据不同的三维成像原理,存储人脸的三维数据文件拥有不同的数据格式,常用的有三维点云、深度图像、三维网格和几何图像。较于二维人脸画面,三维人脸识别提供了更多的信息,减少了因太阳光照射、化妆、姿态等方面带来的干扰,但由于三维图像采集设备的速度与精度有待发展,三维图像采集时间较长且被采集的对象需要保持静止,微小的移动都会带来采集数据的不准确,因此难以满足日常的需求。
基于上述研究现状,本文将基于视频图像处理技术,通过从视频中提取图像,并利用dlib 库对人脸进行识别。通过对面部特征点进行提取,研究基于面部运动的活体检测方法,旨在提高活体检测的准确度。
LBP(Local Binary Pattern)指局部二值模式,是一种用来描述图像局部特征的算子,LBP 特征具有灰度不变性和旋转不变性等显著优点。在1994 年首先由T.Ojala,M.Pietikäinen,和D.Harwood 提出。由于LBP 特征计算简单、效果较好,因此在人脸识别和目标检测等计算机视觉的许多领域都得到了广泛的应用。
原始的LBP 算子定义为:将灰度图像划分为3*3 的小格子,把最中间小格子的像素作为阈值,将相邻8 个小格子的像素与中心小格子的像素值进行比较,若周围灰度大于中心像素值,则该像素点的位置被标记为1,否则为0。这样,这个3*3 的灰度图像就能表示为一个八位二进制数,这个二进制数专为十进制后的数值就是中心像素的LBP 值。其中对这八位二进制数的排列顺序并无硬性要求,只要在同一研究过程中的排列顺序相同即可。
由于用LBP 算子采集的区域是固定的,当图像的尺度发生变化时,识别就会发生错误。于是将原始LBP 算法进行优化,将最初的矩形区域改为圆形区域,这样通过比较圆上任意点的像素与圆心处的像素,得到准确的特征值。LBP特征值的计算公式如下:
因此,通过将需要识别的彩色图像转化为灰度图像并分成许多小图像,然后用LBP 算子处理这些小图像得到一系列特征值并处理为直方图,与系统训练好的人脸模型直方图进行比对从而进行人脸识别。
本文基于pycharm 深度学习框架,采用python 进行编程。Python 标准库和第三库众多,其中OpenCV、dlib 库由轻量级而且高效的C 函数和少量C++类构成,同时也提供了包括Python 在内的以及Ruby、MATLAB 等语言的接口,可以帮助我们实现图像处理和计算机视觉方面的很多通用算法。在硬件配置方面,目前日常生活中最常用的电子设备如手机、笔记本电脑的摄像头已完全满足要求。本实验采用了笔记本常见的720p 分辨率的设置,硬件配置包括Intel(R)Core(TM)i5-8300H@2.30GHz,GPU 为 NVDIA GeForce 1066,RAM为16 GB。
2.2.1 从视频中提取图片
从视频中提取图片的思路为按一定频率取一出帧影像保存下来。将现场录制的视频或者是提前下载好的视频文件保存在Project 中。由于直接从连续变化的视频来进行人脸特征点的计算进而做活体判断不易实现,应先将问题进行适当简化。由数学思想可知,从视频中按频率取图相当于将视频即连续的图像拆成了离散的图像,当频率足够大时这些离散的图片对于反应面部真实运动情况有很高的精确性。因此我们只需要设置合理阈值计算短时间内连续数帧图片的特征点点位的纵横比并比较其变化。在测试过程中,采用的摄像头为720P,将其截取时间间隔设置为十二分之一秒。实际操作过程中,猜测由于帧数限制,如果眨眼过快则摄像头来不及捕捉眨眼画面,导致眨眼信息丢失。这种情况在刻意放慢眨眼速度后得到很大程度地改善。同时,检测眨眼时必须正视摄像头,如果低头,系统可能会判断发生了眨眼。
2.2.2 人脸识别
在安装完与Python 相对应的OpenCV 第三方库和dlib库之后,我们识别活体之前的首要工作便是要确定图片里面是否存在人脸。本系统使用了dlib 库来检测图像。dlib 库中的get frontal face 能够有效地检测到人脸轮廓,并将其标识出来。如果图像中识别到了人脸,那么进行下一个步骤。识别出图片中的人脸数并标出人脸上的68 个点,若没有检测到人脸,数量显示为0,且不会有68 个特征点出现。识别效果如图1 所示。
图1: 标记出了人脸数量和68 特征点
2.2.3 提取特征点
要进行这一步工作,需要用到68 face landmarks 数据集,该数据集为已经训练好的人脸识别模型,其68 个二维坐标点基本涵盖了人体面部的主要特征点(如图2)。定位出脸部的区域包括眉毛、眼睛、耳朵、嘴巴。人脸特征点检测自身的算法实现起来比较困难,而我们研究的目的是基于已有的人脸识别技术,去研究已识别出的是否为活体,因而我们应先调用现成的人脸识别检测器提取出人脸。检测到人脸之后,便是面部特征点的识别与标识。经反复研究,我们适度延长图片提取间隔,压缩视频大小,提高了检测效率。图3我们直接调用摄像头录制了一段视频,对人脸面部特征点数据进行提取和简化,获取人脸上重要的68 个特征点数据。
图2: 人脸68 个特征点
图3: 获取视频中人脸和特征点
要最终达到活体检测的目的,我们需要通过向用户实现一些简单的动作的指令。让我们通过摄像头提取的图片中人脸特征点的点位发生变化。从图 2.2 我们可以看到,左眼以及右眼分别包含 6 个特征点,为此,我们可以引入眼睛纵横比的概念。眼睛纵横比(EAR)是构造的一个检测是否眨眼的模型指标。较于传统的眨眼检测手段,这种方式更为简单,因为只需要计算6 个眼睛特征点之中距离的比例。基于这一思想,我们对提取的视频或图片进行数据处理,得到68 个特征点中眼、嘴的点位坐标变化,计算其点位纵横比,比较其是否符合一般人张嘴、眨眼时的变化,最终实现较准确的活体检测。在计算过程中,我们利用到SciPy 库。它是Python 的一个开源科学计算库,建立在dumpy 之上,增加了众多数学、科学以及工程计算中常用的库函数,如线性代数、常微分方程数值求解、图像处理等,应用此库中的函数可以轻松准确地实现最小二乘法的拟合过程。此外,我们还利用OpenCv 库的画图功能,分别只标记出双眼的12 个特征点和嘴部的6 个特征点并连线眨眼时,眼部闭合曲线近似为一条线段;张嘴时,嘴部闭合曲线近似为一个圆。这帮助我们直观观察实验结果。综上,将从视频中按一定帧数取图、人脸识别、标记特征点与计算双眼或嘴部特征点坐标纵横比整合到一起,最终得到判断眨眼次数和张嘴次数的两个代码,进行试验。
首先录入两段视频,第一段视频中做出眨眼和张嘴的动作,第二段视频中不做面部动作。分别用两段视频进行试验,第二个视频的判断结果总是正确,因为眼部或嘴部纵横比没有发生改变,不管阈值如何设置,检测结果显示眨眼次数或张嘴次数均为零。第一段视频的判断结果与实际情况有一些出入,于是我们不断尝试改变阈值大小,最终将眨眼阈值设定为0.3,张嘴阈值设定为0.85,连续三帧超过阈值便判定为一次眨眼或张嘴。在设定好阈值后我们还用了更多的动态脸视频进行大量的试验。检测结果如图4 和图5 所示。实验结果均能正确地判断出视频中的人脸是否进行眨眼或张嘴的动作从而判断出是否为活体。试验结果稳定,方法成功。
图4: 眨眼判断结果
图5: 张嘴判断结果
本文基于人脸识别技术标记出视频图像中的68 个人脸面部特征点,根据前后帧图片中相应坐标变化来识别眼和嘴的张合,给出活体检测的方法。基于Dlib 库编写的程序,验证了所提出方法的有效性。然而,由于色彩、环境光的种种限制,在操作过程中有时也出现无法准确识别出人脸的情况。因此我们将不断修改完善,使其能够应对更加复杂的环境,做出更加智能的自主应对。
我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!