基于PCA的人脸识别研究报告.docx
《基于PCA的人脸识别研究报告.docx》由会员分享,可在线阅读,更多相关《基于PCA的人脸识别研究报告.docx(19页珍藏版)》请在冰豆网上搜索。
基于PCA的人脸识别研究报告
基于PCA的人脸识别研究报告
————————————————————————————————作者:
———————————————————————————————— 日期:
课程设计
设计课程:
模式识别
题 目基于PCA方法的人脸识别
学生姓名
学 号ﻩ
学 院ﻩ
专 业ﻩ
指导教师
2013年 12月25日
目录
摘要
一、课程设计目的…………………..………………….…………3
二、课程设计要求………………….………………………….….3
三、题目分析…………………………………………….………..3
四、总体设计……………….…………………………….……….3
五、具体设计……………………………………………..…….…4
6.1、创建数据库…………………………..…………………………4
6.2、计算特征脸…………………………………..…………………5
6.3、人脸识别......................................................................................6
六、结果分析………………….……………………....................9
七、心得体会…………………………….………………………9
八、参考文献…………………………….………………………10
摘要
随着人类社会的进步,以及科技水平的提高,一些传统的身份认证的方法逐渐暴露出各种问题,因此人们需要采用一种更加可靠安全的身份认证方法。
毫无疑问人体的生物特征的独一无二的,特别是其不容易丢失及复制的特性很好满足了身份识别的需要。
并且随着计算机科学技术和生物医学的发展使得利用生物特征识别成为了可能。
因此基于指纹、人脸、视网膜等生物特征的识别方法也越来越多。
由于人脸识别的操作快速简单,结果直观,准确可靠,不需要人的配合等优点已成为人们关注的焦点。
主成分分析(PCA)法通过提取高维度的人脸图像的主元,使得图像在低维度空间中被处理来降低了图像处理的难度。
由于其有效的解决了图像空间维数过高的问题,已经成为人脸识别领域非常重要的理论。
此次研究的就是基于PCA的人脸识别算法的实现。
本文按照完整人脸识别流程来分析基于PCA的人脸识别算法实现的性能。
首先使用常用的人脸图像的获取方法获取人脸图像。
本文为了更好的分析基于PCA人脸识别系统的性能分别选用了Essex人脸数据库和ORL人脸库,并在后期采用了自建的人脸库。
接下来是人脸图像预处理方法。
由于采用的人脸图像质量较好,而且已经做过相应的预处理,所以本文试验中只使用灰度处理。
接着使用PCA提取人脸特征,使用奇异值分解定理计算协方差矩阵的特征值和特征向量以及使用最近邻法分类器欧几里得距离来进行人脸判别分类。
在实验中我们发现基于PCA的人脸识别系统的识别率很高,而且具有一定鲁棒性,所以基于PCA的人脸识别算法的实现的研究还是有意义。
【关键词】人脸识别 PCA算法欧几里得
1、课程设计的目的
介绍基于PCA的人脸识别算法的实现,先介绍PCA算法的理论基础,其次介绍了其在数字图像领域的应用,最后结合具体研究详述了研究过程。
2、课程设计的要求
1:
一张新的图片也表示为d的向量,记为D,D的大小1×n
2:
D乘以上面训练得到的T, 得到这个图片向量D在T下的投影向量P,p的大小1×k。
3:
计算p与上面所有的pn的向量距离,与p最小的那个向量所对应的人脸图片跟这张新人脸图片最像。
3、题目分析
应用程序的功能需求分析
该软件最主要的功能就是要能识别出人脸,首先该系统需要对通过摄像头拍照而获取到的原始的人脸图片进行一系列处理才可进行下一步的工作,该处理过程也称图像预处理。
预处理这个模块在整个人脸识别系统的开发过程中占有很重要的地位,只有预处理模块做的好,才可能很好的完成后面的人脸定位和特征提取这两大关键模块。
因此本设计中所要完成的主要功能如下所述:
1)图像获取功能:
该模块主要是从摄像头拍照后进行获取图片,也可以从图片库中获取,获取后的图片可以在软件的界面中显示出来以便进行识别。
2)图像预处理功能:
该模块主要包括图像光线补偿、图像变成灰色、高斯平滑、均衡直方图、实现图像对比度增强、二值化变换等。
3)人脸定位功能:
该模块主要是将处理后的人脸图片进行定位,将眼睛、鼻子、嘴巴标记出来,以便进行特征提取。
4)特征提取功能:
该模块是在定位后的人脸图片中将眼睛、鼻子、嘴巴的特征值提取出来。
5)识别功能:
该模块是将从图片中提取的特征值和后台数据库中的值进行比较来完成识别功能。
四、总体设计
主成分分析为一种统计学中特征提取方法,在实际中应用的非常广泛。
PCA是通过提取原始数据的主元来减少数据的冗余,使数据在低维度的空间中被处理,同时它还能很好保持了原始数据的绝大部分信息,有效的解决了由于空间维数过高而导致的一系列问题。
如下将详细介绍如何使用PCA算法进行人脸识别。
五、具体设计
1、创建数据库
在本环节中主要分为两个阶段,分别为:
(1)读入系统人脸数据库,并将图像变换为相应的灰度图像
(a) (b)
图(a)图像为系统人脸数据库中的原始人脸图像,(b)图像为经过灰度转换后的人脸图像
(2)同时将变换后的二维人脸灰度图像变换为一维人脸向量矩阵
一个大小为M*N的二维人脸图像可以看成长度为MN的人脸图像列向量。
为了将二维人脸图像变为以为列向量,我们采取的措施为:
首先计算出人脸图像的大小,然后将人脸图像经行转置,最后按列依次取出取出所有灰度值形成大小为MN的一维向量,其实整个阶段的效果相当于将图像的灰度值按行取出依次连接成一维图像向量。
本环节完成后将会产生由一维图像向量组成的矩阵T。
2、计算特征脸
本环节主要包括三个阶段,分别为:
1)对图像矩阵T进行规范化
首先计算出图像矩阵中一维列向量的平均值m,然后对图像矩阵的每一列都减去平均值形成规范化的图像矩阵A。
2)计算特征脸
人脸训练图像的协方差矩阵为
,其中人脸训练样本为
,维度为
则协方差矩阵C的维度为
。
这就出现问题,C的维度过高,在实际中直接计算它的特征值和特征向量非常困难。
因此,本文使用奇异值分解定理来解决这个问题。
奇异值分解定理:
假设B为
维秩为p的矩阵,则存在两个正交矩阵和一个对角矩阵:
正交矩阵为
ﻩ
ﻩ (4.23)
ﻩ
ﻩ (4.24)
其中
(4.25)
ﻩ
ﻩ (4.26)
对角矩阵为
则可以得到
而且
和
有共同的非零特征值,
和
分别为
和
对应特征值的正交特征向量。
由上述定理可以得到
ﻩ (4.27)
则可以由协方差矩阵
,构造出矩阵
,从而容易求出L的特征值和特征向量,再根据上述(4-27)式可以求得协方差C的特征值和特征向量。
实际上我们并不需要协方差所有的特征值和特征向量, m个(m<M,M为特征值的数目)个特征值足够用于人脸识别。
所以,实际操作中,只取L的前m个最大特征值对应的特征向量用于计算特征脸。
在本环节,本文通过直接构造
,来计算出L的特征值,再挑选L特征值大于100的作为C的特征值,最后通过C的特征值计算出它的特征向量,从而形成特征脸。
3、人脸识别
人脸识别过程分为训练和测试两个阶段。
在训练阶段,主要是提取数据库人脸图像的特征,并形成特征库。
在测试阶段,主要是提取待识别图像的特征和计算提取的特征和特征库中特征之间的距离测度,并输出最小距离测度对应的人脸图像作为结果。
具体步骤如下:
1)训练阶段
将规范化的图像矩阵A中的每一列向量投影到特征子空间,形成特征库。
2)测试阶段
假设测试人脸图像为Y,在人脸识别前,先对其进行标准化,即
。
把标准化后的人脸图像向特征子空间进行投影得到向量
。
本文使用最近邻法分类器欧几里德距离[14,15]进行判决分类。
测试图像与每个人脸图像间的距离为
(k=1,2,…,P),并将最小距离对应的训练图像作为测试图像的匹配图像。
可以看出,在人脸姿态、表情有略微变化的情况下依旧可以成功识别出正确的人脸。
人脸姿态发生变化下的人脸识别结果
人脸表情变化下的人脸识别结果
之后我们利用ORL人脸库和自建人脸库分别进行了测试。
在ORL人脸库的识别过程中,我们选取了20个人,每人4张照片作为训练样本。
并对这20个人每人另取了一张照片作为测试样本。
每个人测试后最终统计成功识别17个人,识别失败3人。
因为我们采用的是最近邻法分类器欧几里德距离进行判决分类,因此对于识别失败的人同样会显示与其距离最小的照片。
为了解决这个问题,我们决定在该判决分类的基础上加上阈值限制,当最小欧几里德距离高于某个值时,不再显示最近邻的照片,而是显示“无法识别”的提示。
成功识别如下:
当用训练集以外的人的图像进行测试时,欧几里德距离大于阈值,显示无法识别。
接下来我们对欧几里得距离的阈值进行了一定的选取测试。
如下图所示当阈值选取较大时(阈值取9*10^15),图像可以更好的识别出来,
但是此时不可避免的就是降低人脸识别的准确率,因此个别测试图像因为不标准而与训练库中某些图像的距离更小,就造成了识别错误。
如下图所示,此时由于两幅图像的欧几里得距离更小,因而系统显示识别正确,其实是错误的。
以测试图像3.jpg为例。
而当阈值设定比较小时(阈值取4.5*10^15),可以看到上面的测试图像3.jpg无法再识别成功,因为没有足够近距离的训练样本。
尽管17.jpg训练样本与3.jpg测试图像欧几里得距离最小,但因不在阈值范围内故表明不是匹配的图像。
同样当阈值减小后,之前成功识别的11.jpg图像无法再成功识别出来。
六、结果分析
在选定欧几里得最近距离判定距离时要考虑不能选取过大,降低成功率。
因此我认为在建立人脸库时,尽量使所有的图像在相同的背景下进行采样,这样可以时每个人的测试图像和训练图像间的欧几里得距离均处在较小的范围内,可以提高准确率。
此外,我们尝试用稍微侧斜和表情夸张的样本照片进行人脸识别。
当侧脸和表情夸张照片作为测试样本时,程序依旧可以成功识别出对应的人脸照片,然而当这些侧脸和表情夸张的照片作为训练样本中的图像时,可能会影响其他测试图像的识别成功率,因为我们没有对侧脸进行研究,因此将问题放在后续工作中解决。
七、心得体会
本文研究的是基于PCA的人脸识别算法的实现。
在试验中采用的人脸数据库为Essexfaces94人脸数据库和自建的人脸数据库,人脸特征提取算法为PCA算法,分类方法采用的是最小距离分类法。
通过实验发现在无光照变换,正面姿态,少量遮挡情况下,基于PCA的人脸识别系统的识别率很高,而且反应很迅速。
当然也存在着一些问题,例如本文对图像的光照变化,其他姿态没有进行考虑,但实际中这是无法忽略的问题,有可能会导致人脸识别识别率减小。
为了进一步提高基于PCA的人脸识别系统的性能和适应性,我们可以通过以下几个方面进行改进:
改进图像获取方法:
我们可以通过使用人脸检测和跟踪算法,在图像获取的时候,动态跟踪和检测人脸,只采集最佳姿态下的人脸图像。
这在一定程度可以解决姿态所引起的问题,但也同时对系统的检测和跟踪人脸的反应时间提出较严格的要求。
如果反应时间较长,对于快速移动的人脸可能错过采集最佳姿态的图像,而导致系统无法识别人脸。
改进人脸识别的分类器:
最近邻法分类器属于一种线性分类器。
在实际中可以利用神经网络这类学习能力强的非线性分类器对高维人脸识别可能会取得更好的效果。
综合不同的人脸识别方法:
在目前,仅仅单独采用一种现有的人脸识别方法一般都不会取得很好的识别效果。
各种技术和方法都有自己不同的适应环境和各自的特点。
如果我们想进一步提高人脸识别系统的识别率,可以考虑使用数据融合理论,将不同的方法综合起来,相互补充,来取得很好的人脸识别效果。
这也是为人脸识别的研究趋势之一。
八、参考文献
[1]程自龙,雷秀玉.基于K-L变换(PCA)的特征脸人脸识别方法综述[J].中国图像图形学报,2010,20(22):
15-18.
[2]倪世贵,白宝刚.基于PCA的人脸识别研究[J].现代计算机,2011,23(42):
20-22.
[3]徐飞.Matlab应用图像处理[M].西安:
西安电子科技大学出版社,2005.
[4]王映辉.人脸识别:
原理,方法与技术[M].北京:
科学出版社,2010.
[5]田印中,董志学,黄建伟.基于PCA的人脸识别算法研究及实现[J].内蒙古科技与经济,2010,4(208):
15-18.
[6]刘学胜.基于PCA和SVM算法的人脸识别[J].计算机与数字工程,2011,14(3):
56-58.
[7]陈惠明.图像欧氏距离在人脸识别中的应用研究[J].计算机工程与设计,2008,3(14):
22-25.
附程序代码:
main.m
clearall
clc
closeall
TrainDatabasePath =('E:
\train');
TestDatabasePath = ('E:
\test');
prompt= {'Entertestimagename:
'};
dlg_title='InputofPCA-Based FaceRecognitionSystem';
num_lines= 1;
def={'1'};
TestImage =inputdlg(prompt,dlg_title,num_lines,def);
TestImage= strcat(TestDatabasePath,'\',char(TestImage),'.jpg');
im = imread(TestImage);
T = CreateDatabase(TrainDatabasePath);
[m,A,Eigenfaces]=EigenfaceCore(T);
[OutputName,Euc_dist_min]=Recognition(TestImage, m,A,Eigenfaces);
SelectedImage =strcat(TrainDatabasePath,'\',OutputName);
SelectedImage=imread(SelectedImage);
if(Euc_dist_min<=4.5*10^15)
imshow(im)
title('TestImage');
figure,imshow(SelectedImage);
title('EquivalentImage');
str=strcat('Matched imageis:
',OutputName);
disp(str)
Euc_dist_min
end
if(Euc_dist_min>4.5*10^15)
str =strcat('ÎÞ·¨Ê¶±ð.×î½Ó½üµÄÊÇ£º',OutputName);
disp(str)
Euc_dist_min
End
CreateDatabase.m
functionT=CreateDatabase(TrainDatabasePath)
TrainFiles = dir(TrainDatabasePath);
Train_Number= 0;
fori=1:
size(Train)
ifnot(strcmp(TrainFiles(i).name,'.')|strcmp(TrainFiles(i).name,'..')|strcmp(TrainFiles(i).name,'Thumbs.db'))
Train_Number=Train_Number+1;
end
end
T=[];
fori= 1:
Train_Number
str=int2str(i);
str=strcat('\',str,'.jpg');
str=strcat(TrainDatabasePath,str);
img=imread(str);
img=rgb2gray(img);
[irowicol]=size(img);
temp=reshape(img',irow*icol,1);
T=[Ttemp];
end
EigenfaceCore.m
function[m,A, Eigenfaces]=EigenfaceCore(T)
m =mean(T,2);
Train_Number=size(T,2);
A=[];
fori=1:
Train_Number
temp=double(T(:
i)) -m;
A= [Atemp];
end
L =A'*A;
[V D] =eig(L);
L_eig_vec =[];
fori =1:
size(V,2)
if( D(i,i)>1)
L_eig_vec=[L_eig_vecV(:
i)];
end
end
Eigenfaces=A*L_eig_vec;
Recognition.m
function[OutputName,Euc_dist_min]= Recognition(TestImage,m,A,Eigenfaces)
ProjectedImages=[];
Train_Number=size(Eigenfaces,2);
for i=1 :
Train_Number
temp=Eigenfaces'*A(:
i);
ProjectedImages =[ProjectedImages temp];
end
InputImage =imread(TestImage);
%temp =InputImage;
temp= rgb2gray(InputImage);
%temp= InputImage(:
:
1);
[irowicol]=size(temp);
InImage= reshape(temp',irow*icol,1);
Difference=double(InImage)-m;
ProjectedTestImage = Eigenfaces'*Difference;
Euc_dist= [];
fori=1:
Train_Number
q = ProjectedImages(:
,i);
temp=( norm(ProjectedTestImage-q))^2;
Euc_dist =[Euc_disttemp];
end
[Euc_dist_min ,Recognized_index]=min(Euc_dist);
OutputName=strcat(int2str(Recognized_index),'.jpg');