人脸识别课程设计报告材料文档格式.docx
《人脸识别课程设计报告材料文档格式.docx》由会员分享,可在线阅读,更多相关《人脸识别课程设计报告材料文档格式.docx(9页珍藏版)》请在冰点文库上搜索。
不管子空间的具体形式如何,这种方法用于图像识别的基本思想都是一样的,首先选择一个合适的子空间,图像将被投影到这个子空间上,然后利用对图像的这种投影间的某种度量来确定图像间的相似度,最常见的就是各种距离度量。
因此,本次采用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(handles.axes1);
imshow(im);
%---Executesonbuttonpressinpushbutton2.
functionpushbutton2_Callback(hObject,eventdata,handles)
%hObjecthandletopushbutton2(seeGCBO)
globalim
globalreference
globalW%均值向量按列排成的变换矩阵
globalimgmean%均值向量
globalcol_of_dataglobalpathname
globalimg_path_list
%预处理新数据
im=double(im(:
));
objectone=W'
*(im-imgmean);
%计算每幅图像的投影
distance=100000000;
%最小距离法,寻找和待识别图片最为接近的训练图片
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(handles.axes2)
imshow(aimpath)
end
end
%显示测试结果
%aimpath=strcat(pathname,'
%axes(handles.axes2)
%imshow(aimpath)
%---Executesonbuttonpressinpushbutton3.
functionpushbutton3_Callback(hObject,eventdata,handles)
%hObjecthandletopushbutton3(seeGCBO)
globalW
globalimgmean
globalcol_of_data
globalpathname
%批量读取指定文件夹下的图片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];
col_of_data=size(imagedata,2);
%中心化&
计算协方差矩阵
imgmean=mean(imagedata,2);
fori=1:
imagedata(:
i)=imagedata(:
i)-imgmean;
covMat=imagedata'
*imagedata;
[COEFF,latent,explained]=pcacov(covMat);
%选择构成95%能量的特征值
i=1;
proportion=0;
while(proportion<
95)
proportion=proportion+explained(i);
i=i+1;
p=i-1;
%特征脸
W=imagedata*COEFF;
%N*M阶
W=W(:
1:
p);
%N*p阶
%训练样本在新座标基下的表达矩阵p*M
reference=W'