人脸识别课程设计报告.docx
《人脸识别课程设计报告.docx》由会员分享,可在线阅读,更多相关《人脸识别课程设计报告.docx(8页珍藏版)》请在冰点文库上搜索。
人脸识别课程设计报告
用Matlab实现人脸识别
学院:
信息工程学院
班级:
计科软件普131
成员:
一、问题描述
在一个人脸库中,有15个人,每人有11幅图像。
要求选定每一个人的假设干幅图像组成样本库,由样本库取得特点库。
再任取图像库的一张图片,识别它的身份。
关于一幅图像能够看做一个由像素值组成的矩阵,也能够扩展开,看成一个矢量。
如一幅N*N象素的图像能够视为长度为N2的矢量,如此就以为这幅图像是位于N2维空间中的一个点,这种图像的矢量表示确实是原始的图像空间,可是那个空间仅是能够表示或检测图像的许多个空间中的一个。
不管子空间的具体形式如何,这种方式用于图像识别的大体思想都是一样的,第一选择一个适合的子空间,图像将被投影到那个子空间上,然后利用对图像的这种投影间的某种气宇来确信图像间的相似度,最多见的确实是各类距离气宇。
因此,本次采纳PCA算法确信一个子空间,最后利用最小距离法进行识别,并用matlab实现。
二、PCA原理和人脸识别方式
1)K-L变换
K-L变换以原始数据的协方差矩阵的归一化正交特点矢量组成的正交矩阵作为变换矩阵,对原始数据进行正交变换,在变换域上实现数据紧缩。
它具有去相关性、能量集中等特性,属于均方误差测度下,失真最小的一种变换,是最能去除原始数据之间相关性的一种变换。
PCA那么是选取协方差矩阵前k个最大的特点值的特点向量组成K-L变换矩阵。
2)主成份的数量的选取
保留多少个主成份取决于保留部份的积存方差在方差总和中所占百分比(即累计奉献率),它标志着前几个主成份归纳信息之多寡。
实践中,粗略规定一个百分比即可决定保留几个主成份;若是多留一个主成份,积存方差增加无几,便再也不多留。
3)人脸空间成立
假设一幅人脸图像包含N个像素点,它能够用一个N维向量
Γ表示。
如此,训练样本库就能够够用Γi(i=1,...,M)表示。
协方差矩阵C的正交特点向量确实是组成人脸空间的基向量,即特点脸。
将特点值由大到小排列:
λ1≥λ2≥...≥λr,其对应的特点向量为μk。
如此每一幅人脸图像都能够投影到由u1,u2,...,ur张成的子空间中。
因此,每一幅人脸图像对应于子空间中的一点。
一样,子空间的任意一点也对应于一幅图像。
4)人脸识别
有了如此一个由"特点脸"张成的降维子空间,任何一幅人脸图像都能够向其投影取得一组坐标系数,这组系数说明了该图像在子空间中的位置,从而能够作为人脸识别的依据。
计算数据库中每张图片在子空间中的坐标,取得一组坐标,作为下一步识别匹配的搜索空间。
计算新输入图片在子空间中的坐标,采纳最小距离法,遍历搜索空间,取得与其距离最小的坐标向量,该向量对应的人脸图像即为识别匹配的结果。
三、实验步骤
1)每人选取4幅共60幅作为训练样本,将每一幅图像(128*128)写成列向量形式排列成矩阵
2)求协方差矩阵
3)求协方差矩阵特点值—求特点向量(特点脸)—将特点向量排列成变换矩阵
4)计算每幅图像的投影
5)计算待识他人脸的投影
6)遍历搜索进行匹配
四、实验结果与分析
matlab界面成效如下所示
图1用户利用界面
图2选择图片
图3图片选择后
图4识别后
由于利用了标准库,而且识别的人数不是很多,也没有选择有大块左阴影和右阴影的人作为训练集和测试,因此最终的结果仍是超级不错的,识别率可达100%。
可是选择有较大阴影的人做测试,那么会显现识别错误,因此PCA算法仍是存在必然的局限性。
图5识别错误
要紧代码展现
functionpushbutton1_Callback(hObject,eventdata,handles)
%hObjecthandletopushbutton1(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
%readimagetoberecognize
%读取图片
globalim;
[filename,pathname]=uigetfile({'*.bmp'},'choosephoto');
str=[pathname,filename];
im=imread(str);
axes(;
imshow(im);
%---Executesonbuttonpressinpushbutton2.
functionpushbutton2_Callback(hObject,eventdata,handles)
%hObjecthandletopushbutton2(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
globalim
globalreference
globalW%均值向量按列排成的变换矩阵
globalimgmean%均值向量
globalcol_of_dataglobalpathname
globalimg_path_list
%预处置新数据
im=double(im(:
));
objectone=W'*(im-imgmean);%计算每幅图像的投影
distance=0;
%最小距离法,寻觅和待识别图片最为接近的训练图片
fork=1:
col_of_data
temp=norm(objectone-reference(:
k));
if(distance>temp)
aimone=k;
distance=temp;
aimpath=strcat(pathname,'/',img_path_list(aimone).name);
axes()
imshow(aimpath)
end
end
%显示测试结果
%aimpath=strcat(pathname,'/',img_path_list(aimone).name);
%axes()
%imshow(aimpath)
%---Executesonbuttonpressinpushbutton3.
functionpushbutton3_Callback(hObject,eventdata,handles)
%hObjecthandletopushbutton3(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
globalreference
globalW
globalimgmean
globalcol_of_data
globalpathname
globalimg_path_list
%批量读取指定文件夹下的图片128*128
pathname=uigetdir;
img_path_list=dir(strcat(pathname,'\*.bmp'));
img_num=length(img_path_list);
imagedata=[];ifimg_num>0
forj=1:
img_num
img_name=img_path_list(j).name;
temp=imread(strcat(pathname,'/',img_name));
temp=double(temp(:
));
imagedata=[imagedata,temp];
end
end
col_of_data=size(imagedata,2);
%中心化&计算协方差矩阵
imgmean=mean(imagedata,2);
fori=1:
col_of_data
imagedata(:
i)=imagedata(:
i)-imgmean;
end
covMat=imagedata'*imagedata;
[COEFF,latent,explained]=pcacov(covMat);
%选择组成95%能量的特点值
i=1;
proportion=0;
while(proportion<95)
proportion=proportion+explained(i);
i=i+1;
end
p=i-1;
%特点脸
W=imagedata*COEFF;%N*M阶
W=W(:
1:
p);%N*p阶
%训练样本在新座标基下的表达矩阵p*M
reference=W'*imagedata;