人脸识别毕业论文.docx
《人脸识别毕业论文.docx》由会员分享,可在线阅读,更多相关《人脸识别毕业论文.docx(35页珍藏版)》请在冰豆网上搜索。
人脸识别毕业论文
毕业设计(论文)
题目名称:
基于主成分分析(PCA)的人脸识别门禁软件开发----人脸识别
院系名称:
计算机学院
班级:
计科092班
学号:
4
学生:
冠君
指导教师:
陆筱霞
2013年6月
论文编号:
200900814214
基于主成分分析(PCA)的人脸识别门禁软件开发
----人脸识别
Facerecognitionaccesscontrolsoftwaredevelopmentbasedonprincipalcomponentanalysis(PCA) ----FaceRecognition
院系名称:
计算机学院
班级:
计科092班
学号:
4
学生:
冠君
指导教师:
陆筱霞
2013年6月
中文摘要
随着安全入口控制需求的快速增长,生物统计识别技术得到了新的重视。
由于人脸的易采集、非接触等优点使得人脸特征作为人生物特征应用受到越来越多的关注,其中最主要就是人脸识别。
本文主要介绍一个人脸识别门禁系统的核心功能模块。
本文的设计是基于OpenCV库的,以VS2012软件作为开发工具,主要从需求分析,系统概要设计,关键技术、详细设计和实现几方面来介绍开发过程,最后进行运行测试。
在人脸检测基础上,提取人脸进行识别。
在人脸识别方法上,本软件主要采用主成分分析法(PCA)。
将大数据维度进行降维,投影到低维空间,利用欧氏距离计算置信度,达到阀值的训练数据作为判定识别标准。
关键词:
人脸检测;人脸识别;主成分分析法(PCA);
Abstract
Withtherapidgrowthofsecurityaccesscontrol,biometricidentificationtechnologyhasbeenanewemphasis.Easyacquisitionoftheface,thenon-contact,etc.makesfacialfeatureasbiometricapplicationsaremoreandmoreattention,ofwhichthemostimportantisfacerecognition.Thispaperdescribesafacerecognitionaccesscontrolsystemisthecorefunctionalmodules.
ThisdesignisbasedontheOpenCVlibrarytoVS2012softwareasadevelopmenttool,mainlyfromtheneedsanalysis,outlinedesign,keytechnologies,detaileddesignandimplementationaspectstointroducethedevelopmentprocess,andfinallyrunthetest.
Onthebasisoffacedetection,theextractionoffaceidentification.Facerecognitionmethods,thesoftwareusingprincipalcomponentanalysis(PCA).Thedimensionsofthebigdatadimensionalityreduction,projectedtolow-dimensionalspaceusingtheEuclideandistancetocalculatetheconfidencetoreachthethresholdoftrainingdataasthedecisiontoidentifystandards.
Keywords:
FaceDetection;Facerecognition;principalcomponentanalysis(PCA);
第一章绪论
1.1前言
人类进入21世纪,随着计算机和网络技术的日渐发达,信息安全的隐患日益突出,自911之后,各国越来越重视社会公共安全,信息识别和检测显得前所未有的重要。
现今社会中主要采用、磁卡和口令等识别方法,随着技术的发展,这些传统的身份识别方法已受到越来越多的挑战,存在的易丢失、易伪造、易遗忘等诸多问题,可靠性也大为降低,生物体征作为每个人独一无二的特征,进入人们眼界,成为新的信息识别和检测技术的载体,从而指纹、虹膜以及人脸等作为主要依据,得以发展。
相对于其它的人体生物特征,人脸存在易采集、非接触、静态等优点,比较容易被接受。
在科技发展的时代,得到很大程度的发展,应用也越来越广泛。
尤其在国家安全、军事安全和公共安全领域发挥重要作用,典型代表就是智能门禁、海关身份验证、智能视频监控等应用。
近年来,随着计算机性能提高和算法的不断成熟,人脸识别技术得到很大发展,在证件验证、出入口安全监控、信息安全、视频监控等许多应用都和人脸识别技术密切相关。
1.2课题应用背景与研究意义
本课题根据学校要求,选用实际公司项目研究,在对人脸识别技术研究分析的基础上,选定该题目。
人类进入21世纪,随着计算机和网络技术的日渐发达,信息安全的隐患日益突出,自911之后,各国越来越重视社会公共安全,信息识别和检测显得前所未有的重要。
现今社会中主要采用、磁卡和口令等识别方法,随着技术的发展,这些传统的身份识别方法已受到越来越多的挑战,存在的易丢失、易伪造、易遗忘等诸多问题,可靠性也大为降低,生物体征作为每个人独一无二的特征,进入人们眼界,成为新的信息识别和检测技术的载体,从而指纹、虹膜以及人脸等作为主要依据,得以发展。
相对于其它的人体生物特征,人脸存在易采集、非接触、静态等优点,比较容易被接受。
在科技发展的时代,得到很大程度的发展,应用也越来越广泛。
本课题主要关注就是人脸识别,主要容包括:
图像获取及人脸检测提取,人脸特征提取,人脸识别。
实现方面,可以使用C++实现相关算法,也可以利用现有的函数库。
本课题主要是基于OpenCV开发的人脸识别门禁软件。
1.3人脸识别类软件的发展现状
人脸识别系统的研究开始于20世纪60年代。
其优势在于其自然性和不被被测试个体察觉的特点。
人脸识别就是通过观察比较人脸来区分和确定人的身份的。
不被察觉的特点会使识别方法不令人反感,而且不容易引起人注意故而不易被欺骗。
相对指纹识别而言,人脸识别的非接触特点,使得其更加友好,自然,被人们接受。
随着科技的发展和安全需求的增加,人脸识别技术应用已经受到重视。
在公安刑侦领域,人脸识别技术应用十分广泛,目前还逐渐向民用市场推广,离人们的生活越来越近。
发展前景不可限量,随着数字化、信息化社会的到来,人们对人脸识别技术的了解和认识越来越多,人脸识别技术也越将越来越来成熟和完善。
1.4系统可行性研究
可行性研究是为了对问题进行研究,以最小代价在最短时间确定问题是否可解。
经过对项目详细研究,初拟系统实现报告,对可能将要遇到的问题及解决方案进行设计和安排,明确开发风险和效益。
1.4.1为什么选用OpenCV
近年来,大数据量,时势性图像处理广泛应用于各个领域。
各种各样的图像处理软件包围图像分析和处理提供便利的同时也存在许多问题。
英特尔公司提供的OpenCV类库在VC++环境下进行图像处理和计算机视觉编程的方法、和免费试用的优势,缩短相关程序开发周期,具有强大的实用价值,是指在相关软件包中占据领先,成为一种流行的图像处理软件。
选用OpenCV主要因为里面封装的类库可以直接使用,非常方便。
它不依赖与其它的外部库,拥有400多个免费的图像处理函数,涉及领域涵盖了机器视觉的大多应用。
1.4.2开发环境的配置
对于OpenCV的配置,可以使用CMake编译生成针对编辑器的工程,产生符合编译器的库。
也可以直接使用源码中本身带有的编译好的库。
在这里我们使用自带的库文件。
1)安装OpenCV:
将获取的安装文件安装到D:
\opencv2.4.4\opencv,并将对应使用的bin目录D:
\opencv2.4.4\opencv\build\x86\vc11\bin添加到环境变量PATH中;
2)配置VS2012
“项目”--〉“属性”--〉“VC++目录”中配置
包含目录:
添加D:
\opencv2.4.4\opencv\build\include
库目录:
添加D:
\opencv2.4.4\opencv\build\x86\vc11\lib
对于依赖项配置有两种方法,一种在项目属性页中“器”--〉“输入”中附加依赖项中添加需要用到的.lib文件。
第二种方法是在程序中加载,也就是本系统中使用的方法。
#ifdefWIN32
#ifdef_DEBUG
#pragmacomment(lib,"opencv_highgui244d.lib")
#pragmacomment(lib,"opencv_core244d.lib")
#pragmacomment(lib,"opencv_imgproc244d.lib")
#pragmacomment(lib,"opencv_video244d.lib")
#pragmacomment(lib,"opencv_calib3d244d.lib")
#pragmacomment(lib,"opencv_objdetect244d.lib")
#pragmacomment(lib,"opencv_legacy244d.lib")
#else
#pragmacomment(lib,"opencv_highgui244.lib")
#pragmacomment(lib,"opencv_core244.lib")
#pragmacomment(lib,"opencv_imgproc244.lib")
#pragmacomment(lib,"opencv_video244.lib")
#pragmacomment(lib,"opencv_calib3d244.lib")
#pragmacomment(lib,"opencv_objdetect244.lib")
#pragmacomment(lib,"opencv_legacy244.lib")
#endif
#endif
系统主要实现三大功能,人脸检测,特征提取和人脸识别,辅助一些功能。
具有开发可行性,因此可以开发该系统。
1.5本毕业设计工作和论文结构安排
1.5.1本毕业设计工作
本次毕业设计课题主要工作是在VS2012环境下通过OpenCV库完成人脸检测和人脸识别功能设计。
第一阶段,搜索需求技术知识,配置系统开发环及功能
这一阶段主要是准备工作。
主要是搜集图像处理人脸识别的相关资料,了解OpenCV库的相关知识,详细了解了相关函数,制定开发框架。
系统在PC上搭建开发平台。
这里我们开发平台选择Win7操作系统平台,在VS2012环境下配置使用OpenCV库。
第二阶段,实现各个功能
在开发期间,主要实现一下功能:
1)从摄像头获取图像并对图像进行一定预处理;
2)从获取图像中检测提取人脸区域;
3)提取人脸图像并保存,同时写入文件;
4)读取文件,读取图像进行训练得到特征信息;
5)保存的得到的特征信息至xml文件;
6)读取xml文件,得到特征信息;
7)识别人脸,并计算置信度。
8)辅助功能实现,包扩添加用户,重置数据,输出特征图像、平均图像等。
9)从人脸数据库中子集读取人脸数据进行训练,提取特征,并选取另一子
集人脸图像进行识别测试。
10)查看生成的平均人脸图像和特征人脸。
最后完成开发测试,测试运行良好。
1.5.2论文结构安排
第一章:
绪论:
包括前言、应用背景与研究意义、人脸检测定位及跟踪发展现状、系统可行性研究以及本文主要容;
第二章:
系统需求分析:
包括功能需求、性能需求、运行需求;
第三章:
系统概要设计:
包括设计思想、系统功能结构图;
第四章:
系统详细设计:
功能模块设计、各模块的主要函数功能;
第二章系统需求分析
随着安全要求的不断提高,人脸识别技术逐渐应用于各种场合,如门禁系统,人脸签到,人脸密码等等,因此设计一个人脸识别软件对于门禁系统可以扩展人脸识别技术的应用。
对于人脸识别门禁系统,有如下目标:
1、操作简单;2、识别精确度。
考虑到软件应用场合及主要功能,设计出操作简单快捷的软件,使得软件简单实用,符合大众需求。
2.1功能需求
系统主要实现人身份识别,功能包括以下几个方面:
摄像头操作:
包括摄像头打开与关闭,从摄像头读取图像并显示到界面上。
检测操作:
从摄像头画面中检测提取人脸。
图像保存功能:
提取的人脸图像保存为pgm图片。
文件读写功能:
读写txt文件,保存提取人脸图像信息;读写xml文件,保存读取人脸特征等信息。
添加用户重训练功能:
添加用户,重新训练得到特征脸和人脸特征,并保存。
人脸识别功能:
识别显示当前人脸身份。
重置数据功能:
清除原有训练数据,便于重新训练。
2.2非功能需求
2.2.1系统的易用性
由于此系统是面向非专业操作人员的实用性程序,因此要求此系统具有易用性。
2.2.2系统可靠性
要求系统发生错误时,通知用户错误信息,以保证系统可靠性。
2.2.3系统可扩展性
软件可扩展性是评价软件性能一个重要指标。
为了是系统具有一定可扩展性,设计过程中尽量使各个模块相对独立,为扩展留余地。
第三章系统概要设计
在人脸识别门禁软件需求分析阶段中,已经将系统需求做了详细阐述,本阶段在此需求分析基础上,对其做概要设计,意在解决实现该系统需求的模块设计问题。
3.1设计思想
3.1.1人脸数据获取方式
考虑到要进行人脸识别,首先要获取人脸图像数据,要测试识别算法,需要大量数据,因此我们采用公开的人脸图像库进行静态图像测试,再进而使用摄像头获取人脸实现系统功能,故人脸数据获取方式有两种,一种是直接从人脸数据库中获取,另一种从摄像头数据中检测提取得到。
3.1.2人脸训练识别方式
为保障可以添加用户,实现多用户使用识别,需要添加用户功能,这样就需要动态训练人脸数据,识别确认。
训练识别方法采用PCA算法处理,添加新用户时重新对新的建立的数据库进行训练得到训练数据。
3.1.3添加功能提示
为了使模块功能清晰表现,便于用户操作,添加功能提示信息引导。
3.2系统功能结构设计
本软件设计实现主要两部分:
静态人脸数据库测试验证部分和实时摄像头中提取数据实际功能实现部分。
第四章系统详细设计
此章节对人脸识别门禁系统实现功能实现进行详细分析和设计。
4.1OpenCV主要函数介绍
1)cvLoadImage从文件中读取图像
IplImage*
cvLoadImage(constchar*filename,intflags=CV_LOAD_IMAGE_COLOR);函数cvLoadImage从指定文件读入图像,返回读入图像的指针。
其中filename是要被读入的文件的文件名;flags指定读入图像的颜色和深度。
2)cvSaveImage保存图像到文件
intcvSaveImage(constchar*filename,constCvArr*image);
函数cvSaveImage保存图像到指定文件。
其中filename保存文件名。
image要保存的图像。
图像格式的的选择依赖于filename的扩展名,只有8位单通道或者3通道(通道顺序为'BGR')可以使用这个函数保存。
3)cvQueryFrame从摄像头或者文件中抓取并返回一帧
IplImage*cvQueryFrame(CvCapture*capture);
函数cvQueryFrame从摄像头或者文件中抓取一帧,然后解压并返回这一帧。
这个函数仅仅是函数cvGrabFrame和函数cvRetrieveFrame在一起调用的组合。
返回的图像不可以被用户释放或者修改。
其中capture视频获取结构。
。
4)cvCaptureFromCAM初始化摄像头
CvCapture*cvCaptureFromCAM(intindex);
函数cvCaptureFromCAM给从摄像头的视频流分配和初始化CvCapture结构。
其中index要使用的摄像头索引。
如果只有一个摄像头或者用哪个摄像头也无所谓,那使用参数-1应该便可以。
5)cvHaarDetectObjects用来检测图像中的人脸区域
CVAPI(CvSeq*)cvHaarDetectObjects(constCvArr*image,
CvHaarClassifierCascade*cascade,
CvMemStorage*storage,
doublescale_factorCV_DEFAULT(1.1),
intmin_neighborsCV_DEFAULT(3),
intflagsCV_DEFAULT(0),
CvSizemin_sizeCV_DEFAULT(cvSize(0,0)),
CvSizemax_sizeCV_DEFAULT(cvSize(0,0)));
用于快速检测人脸区域,便于提取得到人脸数据。
其中image为被检图像,cascade为haar分类器级联的部标识形式,storage为用来存储检测到的一序列候选目标矩形框的存区域,scale_factor在前后两次相继的扫描中,搜索窗口的比例系数,例如1.1指将搜索窗口依次扩大10%,min_neighbors为构成检测目标的相邻矩形的最小个数(缺省-1),flags为操作方式,min_size为检测窗口的最小尺寸。
缺省的情况下被设为分类器训练时采用的样本尺寸(人脸检测中缺省大小是~20×20)。
6)cvRectangle绘制矩形
CVAPI(void)cvRectangle(CvArr*img,CvPointpt1,CvPointpt2,
CvScalarcolor,intthicknessCV_DEFAULT
(1),
intline_typeCV_DEFAULT(8),
intshiftCV_DEFAULT(0));
绘制出检测到人脸区域并显示,便于使用者观看是否检测出人脸,。
其中img为图像,pt1--矩形的一个顶点,pt2--矩形对角线上的另一个顶点,color--线条颜色(RGB)或亮度(灰度图像)(grayscaleimage),thickness--组成矩形的线条的粗细程度,取负值时(如CV_FILLED)函数绘制填充了色彩的矩形,line_type--线条的类型。
见cvLine的描述,shift--坐标点的小数点位数。
7)cvResize重置图像大小
CVAPI(void)cvResize(constCvArr*src,CvArr*dst,
intinterpolationCV_DEFAULT(CV_INTER_LINEAR));
重置图像大小,使图像归一到同样大小。
interpolation插值方式:
选择用线性插值(CV_INTER_LINEAR)和区域插值(CV_INTER_AREA)。
8)cvOpenFileStorage打开存在或创建新的文件
CVAPI(CvFileStorage*)cvOpenFileStorage(constchar*filename,
CvMemStorage*memstorage,
intflags,
constchar*encodingCV_DEFAULT(NULL));
把训练数据保存至xml文件,通过此函数打开文件便于进行读写。
flag有10种,这里用到其中读和写二种:
CV_STORAGE_READ(打开文件读数据)和CV_STORAGE_WRITE(打开文件写数据)。
文件打开后有写操作和读操作函数:
cvWrite();cvWriteInt();cvReadByName();cvReadIntByName()。
9)cvCalcEigenObjects计算引入矩阵的eigenvector(特征向量)、eigenvalue(特征根)、imageaverage(影像平均值)。
CVAPI(void)cvCalcEigenObjects(intnObjects,void*input,void*
output,intioFlags,intioBufSize,void*userData,
CvTermCriteria*calcLimit,IplImage*avg,float*eigVals);
OpenCV已经实现PCA关键算法之一,计算出传入图像阵列的特征值、特征向量和平均值。
其中nObjects为样本个数,input为输入的影响矩阵,output为特征矩阵,calcLimit为回调结束条件,avg为平均值,eigVals特征根。
10)cvEigenDecomposite透过eigenvector和原始影像集来解析每图片降维后对应的系数coefficients。
CVAPI(void)cvEigenDecomposite(IplImage*obj,intnEigObjs,void*eigInput,
intioFlags,void*userData,IplImage*avg,
float*coeffs);
OpenCV已经实现PCA关键算法之一,对输入图像投影到子空间,计算投影各维度系数,以此表示图像。
其中obj为输入目标图像,nEigObjs为选取的特征维数,eigInput为向量组成的变换矩阵,数据结构属于IplImage队列,或者根据ioFlag参数值变化的回调函数,avg为平均值,coeffs为输入图像对应的投影。
11)cvConvertScale使用线性变换转换数组,得到可以保存显示的图像
CVAPI(void)cvConvertScale(constCvArr*src,CvArr*dst,
doublescaleCV_DEFAULT
(1),
doubleshiftCV_DEFAULT(0));
OpenCV要保存显示图像,图像数据必须是uchar格式,因此对于非uchar数据需要转换。
其中src为输入数组,dst为输出数组,scale为比例因子,shift为该加数被加到输入数组元素按比例缩放后得到的元素上,采用公式dst(I)=src(I)*scale+(shift,shift,...)进行转换。
4.2关键功能部分函数设计实现
4.2.1摄像头操作:
要实现系统功能,首要先从摄像头中读取数据,为此,需要保证摄像头开启,为保证获取画面统一便于管理,通过cvSetCaptureProperty()函数设置摄像头分辨率为常用值(320*240),读取摄像头数据,返回IplImage图像数据,该部分需要实现的是打开摄像头、设置摄像头分辨