wangdaren 2018-05-09
首先使用Adaboost方法检测到视频流中的人脸,然后将SIFT特征提取算法应用到人脸特征的提取环节中,提取出人脸的旋转、缩放、平移和光照不变性SIFT特征。通过将检测到的人脸的SIFT特征和人脸库中的人脸SIFT特征进行匹配,找出匹配程度最大的对应的类别,即为匹配结果。整个系统用Visual C++.net 2008和OPENCV开发。
人脸识别涉及图像处理、模式识别、计算机视觉等多个研究领域,是生物特征鉴别技术的一个主要方向,具有十分广泛的应用前景,其中,基于人脸视频流的身份识别是人脸识别中一个重要的分枝,在考勤和门禁系统中,该方法要求有较低的错误拒绝率(FRR)和零的错误接受率(FAR),在商业应用上尤其具有相当大的优势。
人脸识别技术中一个重要的环节是特征提取。比较常见的人脸特征提取方法有EigenFace、FisherFace和非线性流形及其改进[1]。但是,EigenFace 是基于重建误差最小,无法揭示数据的局部结构,对光照、表情等比较敏感。
FisherFace属于有监督识别方法,一般先采用PCA 降维,然后利用线性判别分析(LDA),寻找使类间距和类内距比值最大化的投影方向,识别效果好于EgienFace。非线性流形法是最近提出的研究成果,主要有:等距映射(Isomap)、局部线性嵌入(LLE)和拉普拉斯特征映射(Laplacian EigenMaps)]等。
但这些方法都没有明晰的投影矩阵,很难直接提取新样本的特征,而且会出现小样本问题,所以一般不能直接用于人脸识别领域。文献[2]利用Adaboost特征提取人脸,取得了较好的效果,但如何识别人脸确没有解决。
SIFT(Scale Invariant Feature Transform)特征提取方法用一个128维的向量来表示特征点。其基本思想是通过高斯核进行一系列的滤波来提取图像的尺度空间中的稳定点[3]。
首先,原始图像通过一系列的具有不同尺度因子的高斯核函数进行平滑滤波,并将每两个相邻尺度的平滑滤波后的图像相减来计算高斯差分图像。
其次,在尺度空间中,所有的局部极值通过比较其周围邻域的8个像素和相邻尺度对应位置的周围领域,总共26个像素而产生,见图1。最后,这些极值点被作为候选关键点,通过它们的位置和尺度度量其稳定性,过滤掉具有低对比度和处于边缘上的点,得到稳定的关键点。每一个关键点最终是一个128维的向量。
通过这种方式所获取的特征点具有旋转、缩放和平移不变性,最后,再将特征向量的长度归一化,则可以进一步去除光照变换的影响。
图1: 尺度空间表示
对于不同的人脸照片,其包含相似或相同SIFT特征的数量是非常少的,如图2所示:
图2: 人脸SIFT特征的匹配
图3中共有4对人脸,上下两张人脸进行对比,第1列到第3列的上下两张脸均不是一个人的,其中第1列无相同的SIFT特征,第2、3列只有一个SIFT特征匹配,第4列为同一个人脸的不同光照和不同拍摄角度下的照片,却包含了6个匹配的SIFT特征。
可见,相同的人脸其SIFT特征总体比较接近,不同的人脸,其SIFT特征差别较大。因此SIFT特征可以用于人脸识别。
OPENCV(Open Source Computer Vision)近年来逐渐成为一个科学研究和商业应用的基础开发平台,它由著名的Inter公司资助,对于所有的商业和非商业应用均许可,因此本文使用Visual C++.net 2008和OPENCV编写整个系统。
3.1 身份识别与考勤系统应具有的特点
员工考勤以及重要工作场合的门禁系统中,身份识别是一个必须解决的问题。基于视频流的考勤或身份识别系统采用人机对话的方式,使用方便,被认为是一种较人性化的措施,系统具有如下要求:
1)对于人脸库中存在的人脸,应该具有唯一准确性。在接受其身份的同时,又不会将其误识别为人脸库中的其他人。
2)对于人脸库中不存在的人脸,应该准确的不予识别。
3)识别的快速性。应该在相对较短的时间内识别出来人身份,方便被识别者使用。
基于以上几点,身份识别和考勤系统要求具有尽可能低的错误拒绝率(FRR)和零的错误接受率(FAR)。在传统的人脸识别方案中,无论是特征脸还是Fisher脸,还是基于非线性流形的人脸识别方法,其FAR都很难做到为零,这明显的不符合本身份识别和考勤系统的要求。而SIFT特征采用128维特征向量来表示,在不同人的脸上很难找到匹配的SIFT特征,因此,这里使用基于SIFT特征的身份识别方案。
3.2 身份识别系统的开发
要想在视频流中准确的找到并提取人脸所在的区域,需要性能良好,速度很快的人脸检测器。这里,我们使用了Adaboost特征检测器[2]5]。同其他的人脸检测算法相比, Adaboost人脸检测器的检测速度和检测率均非常高。
对Adaboost检测到的人脸图片提取出SIFT特征后,为了身份识别,需要将提取到的SIFT特征和库中的SIFT特征进行匹配,空间特征点最近邻匹配操作的一种比较实用的索引方法是KD-Tree方法[4],他不仅适用于k-NN-Search问题,而且其空间复杂度与数据集的维数成线性关系。文中为了保证匹配的速度,在开始匹配前就将这些SIFT特征加载到KD-Tree中。
身份识别与考勤系统的运行步骤如下:(1)系统启动,并以多线程方式启动识别线程。(2)加载训练样本的SIFT特征集,将所有SIFT特征集用KD-Tree建立索引。(3)开启视频捕捉。(4)使用Adaboost特征检测器进行人脸检测。(5)对检测到的人脸提取其SIFT特征,并和2)步加载的SIFT特征进行匹配。匹配方法为最近邻NN匹配。(6)最大的匹配对应的类别即为识别结果,如果最大匹配小于某个阈值T,则可认为人脸库中不存在该人脸,程序转到4)继续执行。
为了提取SIFT特征,文中还使用了令一个著名的开放源代码的GSL库。在人脸检测方面,程序直接使用了由OPENCV提供的Adaboost特征检测器[6]。
当程序检测到合法用户时,其画面及提示信息如图3所示。
图3: 身份识别成功
图3中,左图为视频捕捉窗口;右图上为在视频捕捉窗口中捕捉到的人脸,按子像素精度从左图中提取,大小固定为180×200(也是样本库中样本的大小);右图下为在人脸库中预先存储的标准人脸中的任何一个。识别和考勤系统还同时在后台记录了和考勤有关的信息。图4为非法用户企图欺骗识别系统的过程截图,截图中时间已经过去了将近10分钟,其欺骗企图仍旧没有成功。
图4: 非法用户的欺骗企图
在算法的实时性方面,这里设定工作线程每25ms从摄像头中提取一帧图片,人脸的检测和识别所花费的时间应少于25ms,系统可以在CPU1.6Hz,内存512兆的联想笔记本上的正常运行24小时以上,表明文中所用到的算法是有效的。
文中利用Visual C++.NET 2008编写系统,由于系统需要大量的图像处理知识和运算,因此使用了OPENCV库。本文创新点在于:1、首次将SIFT用于身份识别,并得到了较好的效果;2、结合Visual C++.NET 2008和OPENCV的强大功能,编写了SIFT特征提取算法和特征分类算法,Visual C++.NET 2008和OPENCV的结合,既保证系统具有良好的人机界面,又保证系统具有C++语言的运行速度。
(摘编自《电气技术》,原文标题为“基于VC++.NET和OPENCV的身份识别系统开发”,作者为崔世林、田斐。)
输入发占用快捷键。撤掉输入法的快捷键。还有系统自带快捷键也要取消。在tools工具包中找到deepin-terminal中运行启动脚本。因为途中为去下在github源码。这里下载慢的可以直接先下载下来
不管是 Android 代码还是数据结构的设计,都涉及到算法的问题,其中时间复杂度是一个Core,这篇文章我们就一起聊聊时间复杂度的原理!要想编写出能高效运行的程序,我们就需要考虑到 “算法的效率”。