怎样使用OpenCV进行人脸识别

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

怎样使用OpenCV进行人脸识别本文大部分来自OpenCV官网上的FaceReconitionwithOpenCV这节内容(),小弟我尝试翻译一些重要内容。这部分内容是PhilippWagner写的,他的github:,他的网站,应该是个德国人。下面应该是他的照片。友情提示,要看懂代码前,你得先知道OpenCV的安装和配置,会用C++,用过一些OpenCV函数。基本的图像处理和矩阵知识也是需要的。[gm:我是箫鸣的注释]由于我仅仅是翻译,对于六级才过的我,肯定有一些翻译错的或者不当的地方,所以请大家纠错。1.1.介绍Introduction从OpenCV2.4开始,加入了新的类FaceRecognizer,我们可以使用它便捷地进行人脸识别实验。本文既介绍代码使用,又介绍算法原理。(他写的源代码,我们可以在OpenCV的opencv\modules\contrib\doc\facerec\src下找到,当然也可以在他的github中找到,如果你想研究源码,自然可以去看看,不复杂)目前支持的算法有Eigenfaces特征脸createEigenFaceRecognizer()FisherfacescreateFisherFaceRecognizer()LocalBinaryPatternsHistograms局部二值直方图createLBPHFaceRecognizer()下面所有的例子中的代码在OpenCV安装目录下的samples/cpp下面都能找到,所有的代码商用或者学习都是免费的。1.2.人脸识别FaceRecognition对人类来说,人脸识别很容易。文献[Tu06]告诉我们,仅仅是才三天的婴儿已经可以区分周围熟悉的人脸了。那么对于计算机来说,到底有多难?其实,迄今为止,我们对于人类自己为何可以区分不同的人所知甚少。是人脸内部特征(眼睛、鼻子、嘴巴)还是外部特征(头型、发际线)对于人类识别更有效?我们怎么分析一张图像,大脑是如何对它编码的?DavidHubel和TorstenWiesel向我们展示,我们的大脑针对不同的场景,如线、边、角或者运动这些局部特征有专门的神经细胞作出反应。显然我们没有把世界看成零散的块块,我们的视觉皮层必须以某种方式把不同的信息来源转化成有用的模式。自动人脸识别就是如何从一幅图像中提取有意义的特征,把它们放入一种有用的表示方式,然后对他们进行一些分类。基于几何特征的人脸的人脸识别可能是最直观的方法来识别人脸。第一个自动人脸识别系统在[Kanade73]中又描述:标记点(眼睛、耳朵、鼻子等的位置)用来构造一个特征向量(点与点之间的距离、角度等)。通过计算测试和训练图像的特征向量的欧氏距离来进行识别。这样的方法对于光照变化很稳健,但也有巨大的缺点:标记点的确定是很复杂的,即使是使用最先进的算法。一些几何特征人脸识别近期工作在文献[Bru92]中有描述。一个22维的特征向量被用在一个大数据库上,单靠几何特征不能提供足够的信息用于人脸识别。特征脸方法在文献[TP91]中有描述,他描述了一个全面的方法来识别人脸:面部图像是一个点,这个点是从高维图像空间找到它在低维空间的表示,这样分类变得很简单。低维子空间低维是使用主元分析(PrincipalComponentAnalysis,PCA)找到的,它可以找拥有最大方差的那个轴。虽然这样的转换是从最佳重建角度考虑的,但是他没有把标签问题考虑进去。[gm:读懂这段需要一些机器学习知识]。想象一个情况,如果变化是基于外部来源,比如光照。轴的最大方差不一定包含任何有鉴别性的信息,因此此时的分类是不可能的。因此,一个使用线性鉴别(LinearDiscriminantAnalysis,LDA)的特定类投影方法被提出来解决人脸识别问题[BHK97]。其中一个基本的想法就是,使类内方差最小的同时,使类外方差最大。近年来,各种局部特征提取方法出现。为了避免输入的图像的高维数据,仅仅使用的局部特征描述图像的方法被提出,提取的特征(很有希望的)对于局部遮挡、光照变化、小样本等情况更强健。有关局部特征提取的方法有盖伯小波(GaborWaelets)([Wiskott97]),离散傅立叶变换(DiscreteCosinusTransform,DCT)([Messer06]),局部二值模式(LocalBinaryPatterns,LBP)([AHP04])。使用什么方法来提取时域空间的局部特征依旧是一个开放性的研究问题,因为空间信息是潜在有用的信息。1.3.人脸库FaceDatabase我们先获取一些数据来进行实验吧。我不想在这里做一个幼稚的例子。我们在研究人脸识别,所以我们需要一个真的人脸图像!你可以自己创建自己的数据集,也可以从这里()下载一个。AT&TFacedatabase又称ORL人脸数据库,40个人,每人10张照片。照片在不同时间、不同光照、不同表情(睁眼闭眼、笑或者不笑)、不同人脸细节(戴眼镜或者不戴眼镜)下采集。所有的图像都在一个黑暗均匀的背景下采集的,正面竖直人脸(有些有有轻微旋转)。YaleFacedatabaseAORL数据库对于初始化测试比较适合,但它是一个简单的数据库,特征脸已经可以达到97%的识别率,所以你使用其他方法很难得到更好的提升。Yale人脸数据库是一个对于初始实验更好的数据库,因为识别问题更复杂。这个数据库包括15个人(14个男人,1个女人),每一个都有11个灰度图像,大小是320*243像素。数据库中有光照变化(中心光照、左侧光照、右侧光照)、表情变化(开心、正常、悲伤、瞌睡、惊讶、眨眼)、眼镜(戴眼镜或者没戴)。坏消息是它不可以公开下载,可能因为原来的服务器坏了。但我们可以找到一些镜像(比如theMIT)但我不能保证它的完整性。如果你需要自己剪裁和校准图像,可以阅读我的笔记(bytefish.de/blog/fisherfaces)。ExtendedYaleFacedatabaseB此数据库包含38个人的2414张图片,并且是剪裁好的。这个数据库重点是测试特征提取是否对光照变化强健,因为图像的表情、遮挡等都没变化。我认为这个数据库太大,不适合这篇文章的实验,我建议使用ORL数据库。1.3.1.准备数据我们从网上下了数据,下了我们需要在程序中读取它,我决定使用CSV文件读取它。一个CSV文件包含文件名,紧跟一个标签。/path/to/image.ext;0假设/path/to/image.ext是图像,就像你在windows下的c:/faces/person0/image0.jpg。最后我们给它一个标签0。这个标签类似代表这个人的名字,所以同一个人的照片的标签都一样。我们对下载的ORL数据库进行标识,可以获取到如下结果:./at/s1/1.pgm;0./at/s1/2.pgm;0..../at/s2/1.pgm;1./at/s2/2.pgm;1..../at/s40/1.pgm;39./at/s40/2.pgm;39想象我已经把图像解压缩在D:/data/at下面,而CSV文件在D:/data/at.txt。下面你根据自己的情况修改替换即可。一旦你成功建立CSV文件,就可以像这样运行示例程序:facerec_demo.exeD:/data/at.txt1.3.2CreatingtheCSVFile你不需要手工来创建一个CSV文件,我已经写了一个Python程序来做这事。[gm:说一个我实现的方法如果你会cmd命令,或者称DOS命令,那么你打开命令控制台。假设我们的图片放在J:下的Faces文件夹下,可以输入如下语句:J:\Faces\ORLdir/b/s*.bmpat.txt然后你打开at.txt文件可能看到如下内容(后面的0,1..标签是自己加的):。。。。J:\Faces\ORL\s1\1.bmp;0J:\Faces\ORL\s1\10.bmp;0J:\Faces\ORL\s1\2.bmp;0J:\Faces\ORL\s1\3.bmp;0J:\Faces\ORL\s1\4.bmp;0J:\Faces\ORL\s1\5.bmp;0J:\Faces\ORL\s1\6.bmp;0J:\Faces\ORL\s1\7.bmp;0J:\Faces\ORL\s1\8.bmp;0J:\Faces\ORL\s1\9.bmp;0J:\Faces\ORL\s10\1.bmp;1J:\Faces\ORL\s10\10.bmp;1J:\Faces\ORL\s10\2.bmp;1J:\Faces\ORL\s10\3.bmp;1J:\Faces\ORL\s10\4.bmp;1J:\Faces\ORL\s10\5.bmp;1J:\Faces\ORL\s10\6.bmp;1。。。。自然还有c++编程等方法可以做得更好,看这篇文章反响,如果很多人需要,我就把这部分的代码写出来。(遍历多个文件夹,标上标签)]特征脸Eigenfaces我们讲过,图像表示的问题是他的高维问题。二维灰度图像p*q大小,是一个m=qp维的向量空间,所以一个100*100像素大小的图像就是10,000维的图像空间。问题是,是不是所有的维数空间对我们来说都有用?我们可以做一个决定,如果数据有任何差异,我们可以通过寻找主元来知道主要信息。主成分分析(PrincipalComponentAnalysis,PCA)是KarlPearson(1901)独立发表的,而HaroldHotelling(1933)把一些可能相关的变量转换成一个更小的不相关的子集。想法是,一个高维数据集经常被相关变量表示,因此只有一些的维上数据才是有意义的,包含最多的信息。PCA方法寻找数据中拥有最大方差的方向,被称为主成分。算法描述AlgorithmicDescription令表示一个随机特征,其中.1.计算均值向量2.计算协方差矩阵S3.计算的特征值和对应的特征向量4.对特征值进行递减排序,特征向量和它顺序一致.K个主成分也就是k个最大的特征值对应的特征向量。x的K个主成份:其中(11).PCA基的重构:其中.然后特征脸通过下面的方式进行人脸识别:A.把所有的训练数据投影到PCA子空间B.把待识别图像投影到PCA子空间C.找到训练数据投影后的向量和待识别图像投影后的向量最近的那个。还有一个问题有待解决。比如我们有400张图片,每张100*100像素大小,那么PCA需要解决协方差矩阵的求解,而X的大小是10000*400,那么我们会得到10000*10000大小的矩阵,这需要大概0.8GB的内存。解决这个问题不容易,所以我们需要另一个计策。就是转置一下再求,特征向量不变化。文献[Duda01]中有描述。[gm:这个PCA还是自己搜着看吧,这里的讲的不清楚,不适合初学者看]OpenCV中使用特征脸EigenfacesinOpenCV给出示例程序源代码#includeopencv2/core/core.hpp#includeopencv2/contrib/contrib.hpp#includeopencv2/highgui/highgui.hpp#includeiostream#includefstream#includesstreamusingnamespacecv;usingnamespacestd;staticMatnorm_0_255(InputArray_src){Matsrc=_src.getMat();//创建和返回一个归一化后的图像矩阵:Matdst;switch(src.channels()){case1:cv::normalize(_src,dst,0,255,NORM_MINMAX,CV_8

1 / 36
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功