《模式识别方法大作业实验报告.doc》由会员分享,可在线阅读,更多相关《模式识别方法大作业实验报告.doc(15页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、模式识别导论期末大作业2010-2011-2学期 第 3 组学号姓名工作量(%)08007204李双1008007205陈书瑜3508007218王健勇1008007236梁文卓3508007243仲红月10模式识别大作业人脸识别方法一- 基于PCA和欧几里得距离判据的模板匹配分类器一、 理论知识1、主成分分析主成分分析是把多个特征映射为少数几个综合特征的一种统计分析方法。在多特征的研究中,往往由于特征个数太多,且彼此之间存在着一定的相关性,因而使得所观测的数据在一定程度上有信息的重叠。当特征较多时,在高维空间中研究样本的分布规律就更麻烦。主成分分析采取一种降维的方法,找出几个综合因子来代表原
2、来众多的特征,使这些综合因子尽可能地反映原来变量的信息,而且彼此之间互不相关,从而达到简化的目的。主成分的表示相当于把原来的特征进行坐标变换(乘以一个变换矩阵),得到相关性较小(严格来说是零)的综合因子。1.1 问题的提出一般来说,如果N个样品中的每个样品有n个特征,经过主成分分析,将它们综合成n综合变量,即由下列原则决定:1、和(,i,j = 1,2,.n)相互独立;2、y的排序原则是方差从大到小。这样的综合指标因子分别是原变量的第1、第2、第n个主分量,它们的方差依次递减。1.2主成分的导出我们观察上述方程组,用我们熟知的矩阵表示,设是一个n维随机向量,是满足上式的新变量所构成的向量。于是
3、我们可以写成Y=CX,C是一个正交矩阵,满足CC=I。坐标旋转是指新坐标轴相互正交,仍构成一个直角坐标系。变换后的N个点在轴上有最大方差,而在轴上有最小方差。同时,注意上面第一条原则,由此我们要求轴和轴的协方差为零,那么要求令,则经过上面式子的变换,我们得到以下n个方程1.3主成分分析的结果我们要求解出C,即解出上述齐次方程的非零解,要求的系数行列式为0。最后得出结论是的根,的方差为。然后选取前面p个贡献率大的分量,这样就实现了降维。也就是主成分分析的目标。二、 实现方法1、 获取数据。在编程时具体是把一幅二维的图像转换成一维的;2、 减去均值。要使PCA正常工作,必须减去数据的均值。减去的均
4、值为每一维的平均,所有的x值都要减去,同样所有的y值都要减去,这样处理后的数据都具有0均值;3、 计算协方差矩阵;4、 计算协方差矩阵的特征矢量和特征值。因为协方差矩阵为方阵,我们可以计算它的特征矢量和特征值,它可以告诉我们数据的有用信息;5、选择成分组成模式矢量现在可以进行数据压缩降低维数了。如果你观察上一节中的特征矢量和特征值,会注意到那些特征值是十分不同的。事实上,可以证明对应最大特征值的特征矢量就是数据的主成分。对应大特征值的特征矢量就是那条穿过数据中间的矢量,它是数据维数之间最大的关联。一般地,从协方差矩阵找到特征矢量以后,下一步就是按照特征值由大到小进行排列,这将给出成分的重要性级
5、别。现在,如果你喜欢,可以忽略那些重要性很小的成分,当然这会丢失一些信息,但是如果对应的特征值很小,你不会丢失很多信息。如果你已经忽略了一些成分,那么最后的数据集将有更少的维数,精确地说,如果你的原始数据是n维的,你选择了前p个主要成分,那么你现在的数据将仅有p维。现在要做的是你需要组成一个模式矢量,这只是几个矢量组成的矩阵的一个有意思的名字而已,它由你保持的所有特征矢量构成,每一个特征矢量是这个矩阵的一列。6、获得新数据这是PCA最后一步,也是最容易的一步。一旦你选择了须要保留的成分(特征矢量)并组成了模式矢量,我们简单地对其进行转置,并将其左乘原始数据的转置:其中rowFeatureVec
6、tor是由特征矢量作为列组成的矩阵的转置,因此它的行就是原来的特征矢量,而且对应最大特征值的特征矢量在该矩阵的最上一行。rowdataAdjust是减去均值后的数据,即数据项目在每一列中,每一行就是一维。FinalData是最后得到的数据,数据项目在它的列中,维数沿着行。FinalData = rowFeatureVector * rowdataAdjust这将仅仅给出我们选择的数据。我们的原始数据有两个轴(x和y),所以我们的原始数据按这两个轴分布。我们可以按任何两个我们喜欢的轴表示我们的数据。如果这些轴是正交的,这种表达将是最有效的,这就是特征矢量总是正交的重要性。我们已经将我们的数据从原
7、来的xy轴表达变换为现在的单个特征矢量表达。如果我们已经忽略了一些特征矢量,则新数据将会用我们保留的矢量表达。三、 matlab编程matlab程序分为三部分。程序框图如下图所示。这个函数将源图像提取成特征脸,然后比较它们之间的欧几里得距离这个函数首先得到二维数组,包括所有的训练样本向量并且从训练样本中返回3个输出量这个函数将所有训练样本的二维图像转换成一维列向量。接着,它把这些一维列向量组合到一行里面构造出二维向量T,即每个单元的信息量是一幅图片mainEigenfaceCoreRecognitionCreatDataBase四、 总结从书里看我觉得最让人明白模板匹配分类器的一段话,就是“譬
8、如A类有10个训练样品,就有10个模板,B类有8个训练样品,就有8个模板。任何一个待测样品在分类时与这18个模板都算一算相似度,找出最相似的模板,如果该模板是B类中的一个,就确定待测样品为B类,否则为A类。”意思很简单吧,算相似度就是算距离。就是说,模板匹配就要用你想识别的样品与各类中每个样品的各个模板用距离公式计算距离,距离最短的那个就是最相似的。实验结果表明识别率达90%。这样的匹配方法明显的缺点就是在计算量大,存储量大,每个测试样品要对每个模板计算一次相似度,如果模板量大的时候,计算量就十分的大。五、 参考文献【1】 边肇其,张学工.模式识别【M】.第2版.北京.:清华大学出版社,200
9、0【2】 周杰,卢春雨,张长水,李衍达,人脸自动识别方法综述【J】.电子学报,2000,5(4):102-106六、 附录(matlab 程序代码)第一部分:CreatDatabase.mfunction T = CreatDatabase(TrainDatabasePath)%一系列人脸(训练样本T1,T2,,TM)%函数描述:这个函数将所有训练样本的二维图像转换成一维列向量。接着,它把这些一维列向量组合到一行里面构造出二维向量T,即每个单元的信息量是一幅图片%参数: TrainDatabasePath - 训练数据库的路径%返回值:T -%一个二维矩阵,包含了所有一维向量。假设所有在训练样
10、本的P幅图像拥有相同的大小(M*N)。因此,这些一维向量的长度是M*N而且T将是一个MN*P的二维%矩阵%文件处理%TrainFiles = dir(TrainDatabasePath);Train_Number = 0;for i = 1:size(TrainFiles,1) t = size(TrainFiles,1); if not(strcmp(TrainFiles(i).name,.)|strcmp(TrainFiles(i).name,.)|strcmp(TrainFiles(i).name,Thumbs.db) Train_Number = Train_Number + 1; e
11、ndend%从一维数组构造成二维数组%T = ;for i = 1: Train_Number str = int2str(i); str = strcat(,str,.pgm); str = strcat(TrainDatabasePath,str); img = imread(str); irow icol = size(img); temp = reshape(img,irow*icol,1);%将二维数组变成一维数组 T = T temp;end第二部分:EigenfaceCore.mfunction m,A,Eigenfaces = EigenfaceCore(T)%利用主成分分析(
12、PCA)的方法在各张人脸中决定最明显的特征%描述:这个方程首先得到二维数组,包括所有的训练样本向量并且从训练样本中返回3个输出量%参数:T - 一个二维矩阵,包含了所有一维向量。假设所有在训练样本的P幅图像拥有相同的大小(M*N)。因此,这些一维向量的长度是M*N而且T将是一个MN*P的二维%矩阵%返回值: m -(M*Nx1)训练样本的均值% Eigenfaces - (M*Nx(P-1)训练样本协方差矩阵的特征向量% A - (M*NxP) 中心向量的矩阵%计算均值%m = mean(T,2); %计算样本平均值 m = (1/P)*sum(Tjs)Train_Number = size(
13、T,2);%计算每个图像与均值的差%要使PCA正常工作,必须减去数据的均值。减去的均值为每一维的平均,所有的x值都要减去,同样所有的y值都要减去%这样处理后的数据都具有0均值%A = ;for i = 1 : Train_Number temp = double(T(:,i) - m; A = A temp; %再次合并矩阵end%计算协方差矩阵%计算协方差矩阵的特征矢量和特征值%L = A*A; %L代表协方差矩阵 C = A*A.V D = eig(L);%计算矩阵A的特征值D(eigenvalues)和特征矩阵V(eigenvectors)%选择成分组成模式矢量%L_eig_vec =
14、;for i = 1:size(V,2) if(D(i,i)1) L_eig_vec = L_eig_vec V(:,1); endend%计算协方差矩阵的特征向量%Eigenfaces = A * L_eig_vec;第三部分:Recognition.mfunction OutputName = Recognition(TestImage, m, A, Eigenfaces)%函数描述:这个函数将源图像提取成特征脸,然后比较它们之间的欧几里得距离%输入量: TestImage -测试样本的路径% m -(M*Nx1)训练样本的均值% Eigenfaces - (M*Nx(P-1)训练样本协方
15、差矩阵的特征向量% A - (M*NxP) 中心向量的矩阵%返回值: OutputName -在训练样本中的被识别的图像的名字%从中心向量中提取特征脸%ProjectedImages = ;Train_Number = size(Eigenfaces,2);for i = 1:Train_Number temp = Eigenfaces * A(:,i) ProjectedImages = ProjectedImages temp;end%从测试样本中提取PCA特征%InputImage = imread(TestImage);temp = InputImage(:,:,1);irow ico
16、l = size(temp);InImage = reshape(temp,irow*icol,1);Difference = double(InImage) - m;ProjectedTestImage = Eigenfaces*Difference;%计算欧几里得几何距离%Euc_dist = ;for i = 1 : Train_Number, q = ProjectedImages(:,i); temp = (norm(ProjectedTestImage - q)2; Euc_dist = Euc_dist temp;end%找出A中最小元素及其索引,把最小值返回给C,最小值索引返回
17、给I。 %如果有几个相同的最小值,那么返回第一个被发现的索引。Euc_dist_min, Recognized_index = min(Euc_dist);OutputName = strcat(int2str(Recognized_index),.pgm);主程序clear allclcclose allTrainDatabasePath = uigetdir(C:MATLAB7workPCA, Select training database path );TestDatabasePath = uigetdir(C:MATLAB7workPCA, Select test database
18、path);prompt = Enter test image name(a number between 1 to 10):;dlg_title = Input of PCA_Based Face Recognition System;num_lines = 1;def = 1;TestImage = inputdlg(prompt,dlg_title,num_lines,def);TestImage = strcat(TestDatabasePath,char(TestImage),.pgm);im = imread(TestImage);T = CreatDatabase(TrainDa
19、tabasePath);m, A, Eigenfaces = EigenfaceCore(T);OutputName = Recognition(TestImage, m, A, Eigenfaces);SelectedImage = strcat(TrainDatabasePath,OutputName);SelectedImage = imread(SelectedImage);imshow(im)title(Test Image);figure, imshow(SelectedImage);title(Equivalent Image);str = strcat(Matched imag
20、e is : , OutputName);disp(str)模式识别大作业人脸识别方法二- 基于PCA和FLD的人脸识别的线性分类器一、理论知识1、 fisher概念引出在应用统计方法解决模式识别问题时,为了解决“维数灾难”的问题,压缩特征空间的维数非常必要。fisher方法实际上涉及到维数压缩的问题。fisher分类器是一种几何分类器, 包括线性分类器和非线性分类器。线性分类器有:感知器算法、增量校正算法、LMSE分类算法、Fisher分类。若把多维特征空间的点投影到一条直线上,就能把特征空间压缩成一维。那么关键就是找到这条直线的方向,找得好,分得好,找不好,就混在一起。因此fisher方法
21、目标就是找到这个最好的直线方向以及如何实现向最好方向投影的变换。这个投影变换恰是我们所寻求的解向量,这是fisher算法的基本问题。样品训练集以及待测样品的特征数目为n。为了找到最佳投影方向,需要计算出各类均值、样品类内离散度矩阵和总类间离散度矩阵、样品类间离散度矩阵,根据Fisher准则,找到最佳投影准则,将训练集内所有样品进行投影,投影到一维Y空间,由于Y空间是一维的,则需要求出Y空间的划分边界点,找到边界点后,就可以对待测样品进行进行一维Y空间的投影,判断它的投影点与分界点的关系,将其归类。Fisher法的核心为二字:投影。二、 实现方法(1) 计算给类样品均值向量,是各个类的均值,是类
22、的样品个数。(2) 计算样品类内离散度矩阵和总类间离散度矩阵(3) 计算样品类间离散度矩阵(4) 求向量我们希望投影后,在一维Y空间各类样品尽可能地分开,也就是说我们希望两类样品均值之差()越大越好,同时希望各类样品内部尽量密集,即希望类内离散度越小越好,因此,我们可以定义Fisher准则函数:使得取得最大值的为 (5) 将训练集内所有样品进行投影如果是非奇异的,则要获得类间离散度与类内离散度的比值最大的投影方向的满足下式:其中是满足下式的和对应的m个最大特征值所对应的特征向量。注意到该矩阵最多只有C-1个非零特征值,C是类别数。2、程序中算法的应用Fisher线性判别方法(FLD)是在Fis
23、her鉴别准则函数取极值的情况下,求得一个最佳判别方向,然后从高位特征向量投影到该最佳鉴别方向,构成一个一维的判别特征空间。将Fisher线性判别推广到C-1个判决函数下,即从N维空间向C-1维空间作相应的投影。利用这个m维的投影矩阵M将训练样本n维向量空间转化为m维的MEF空间并且获得在MEF空间上的最佳描述特征,即由这N个MEF空间上的最佳描述特征可以求出的样品类内离散度矩阵和总类间离散度矩阵,取的K个最大的特征可以构成FLD投影矩阵W。将MEF空间上的最佳描述特征在FLD投影矩阵W上进行投影,将MEF空间降维到MDF空间,并获得对应的MDF空间上的最佳分类特征,即通过计算的欧氏距离,可以
24、将训练样本分为C(C等于的秩),完成对训练样本集的分类1、 matlab编程1、fisher判别法人脸检测与识别流程图2、matlab程序分为三部分。程序框图如下图所示。mainFisherfaceCoreRecognitionCreatDataBase这个函数将所有训练样本的二维图像转换成一维列向量。接着,它把这些一维列向量组合到一行里面构造出二维向量T,即每个单元的信息量是一幅图片这个函数将源图像提取成特征脸,然后比较它们之间的欧几里得距离PCA提取特征值Fisher分类器设计。从fisher线性空间中提取图像2、 总结从计算成本来看,PCA+LDA方法的好处在于对高维空间的降维,避免了类
25、内离散度矩阵不可逆的情况。然而,从识别性能来看,由于主成分只是代表图像的灰度特征,是从能量的角度衡量主成分大小的,应用PCA之后,舍弃的对应较小特征值的次要成分有可能对LDA来说重要的分类信息,有可能降低分类识别性能。而且,在实际应用中,特别是在人脸图像识别中,由于“维数灾难”的存在,FLD通常会遇到两个方面的困难:(1) 类内离散度矩阵总是奇异的。这是由于的秩最多为N-C,(N是用于训练样本的图像数目,C是人脸的类别数)。而一般情况下,用于训练的图像数目N是远小于每幅图像的像素数目,即“小样本问题“经常出现。(2) 计算的复杂度。在高维空间中,要得出一个分类向量的复杂度远远高于计算一个低维空
26、间中的分类向量。3、 参考文献【1】边肇其,张学工.模式识别【M】.第2版.北京.:清华大学出版社,2000【2】周杰,卢春雨,张长水,李衍达,人脸自动识别方法综述【J】.电子学报,2000,5(4):102-1064、 附录(matlab 程序代码)1、第一部分:CreatDatabase.mfunction T = CreatDatabase(TrainDatabasePath)TrainFiles = dir(TrainDatabasePath);Train_Number = 0;%统计文件数%for i = 1:size(TrainFiles,1) if not(strcmp(Trai
27、nFiles(i).name,.)|strcmp(TrainFiles(i).name,.)|strcmp(TrainFiles(i).name,Thumbs.db) Train_Number = Train_Number + 1; endend%二维转一维%T = ;for i = 1 : Train_Number str = int2str(i);%把文件索引转换为字符串格式 str = strcat(,str,.pgm); str = strcat(TrainDatabasePath,str); img = imread(str); irow icol = size(img); temp
28、 = reshape(img,irow*icol,1); T = T temp;endT = double(T);2、第二部分:FisherfaceCorefunction m_database V_PCA V_Fisher ProjectedImages_Fisher Class_number Class_population = FisherfaceCore(T)%返回值注释%m_database - (M*Nx1)维的训练样本均值%V_PCA - (M*Nx(P-C)训练样本协方差的特征向量%V_Fisher - (P-C)x(C-1) 最大的(C-1)维J = inv(Sw) * Sb
29、的特征矩阵%ProjectedImages_Fisher - (C-1)xP)维训练样本,这些样本从fisher线性空间中提取%基本量赋值 %Class_number=(size(T,2)/9; 类的数目,除以8取决于样本中有多少类人Class_population = 9;%每一类的图像数目P = Class_population * Class_number; %总训练样本的数目%计算均值%m_database = mean(T,2);%包含T每一行均值的列向量%计算方差%A = T - repmat(m_database,1,P);%计算特征脸的算法%L = A * A;V D = ei
30、g(L);V = fliplr(V);%筛选小的特征值%L_eig_vec = ;dig = fliplr(max(D);for i = 1 : Class_number L_eig_vec = L_eig_vec V(:,i)/sqrt(dig(i);end%计算特征矩阵的协方差矩阵C%V_PCA = A * L_eig_vec;%V_PCA就是降维后的协方差矩阵ProjectedImages_PCA = ;for i = 1 : P temp = V_PCA*A(:,i); ProjectedImages_PCA = ProjectedImages_PCA temp; end%fisher
31、分类器的设计方法%计算在特征空间里面每一个类的均值%m_PCA = mean(ProjectedImages_PCA,2) %特征空间总的均值m = zeros( Class_number, Class_number );Sw = zeros( Class_number, Class_number);Sb = zeros( Class_number, Class_number); for i = 1 : Class_number m(:,i) = mean( ( ProjectedImages_PCA(:,(i-1)*Class_population+1):i*Class_population
32、) ), 2 ); %每一类的样本分别求均值 S = zeros(Class_number, Class_number); for j = (i-1) * Class_population + 1) : ( i*Class_population ) S = S + ( ProjectedImages_PCA(:,j) - m(:,i) * (ProjectedImages_PCA(:,j) - m(:,i); end Sw = Sw + S;Sb = Sb + (m(:,i) - m_PCA) * (m(:,i) - m_PCA)end %计算fisher判别准则,目标是获取最大类间离散度和最
33、小类内离散度%J_eig_vec, J_eig_val = eig(Sb,Sw);J_eig_val = max(J_eig_val); J_eig_vec = fliplr(J_eig_vec); %去除0特征根和排序for i = 1 : Class_number - 1 V_Fisher(:,i) = J_eig_vec(:,i);%fisher判别法将N维映射到C-1维end %从fisher线性空间中提取图像%Yi = V_Fisher * V_PCA * (Ti - m_database)for i = 1: Class_number * Class_population Proj
34、ectedImages_Fisher(:,i) = V_Fisher * ProjectedImages_PCA(:,i); end%由PCA过渡到FLD%img_fisher = w_fisher * pca_img;%ProjectedImages_Fisher = V_Fisher * ProjectedImages_PCA; 3、第三部分:Recognition.mfunction OutputName = Recognition(TestImage, m_database, V_PCA, V_Fisher, ProjectedImages_Fisher, Class_number,
35、Class_population)%函数描述:这个函数将源图像提取成特征脸,然后比较它们之间的欧几里得距离%输入量: TestImage -测试样本的路径%V_PCA - (M*Nx(P-C)训练样本协方差的特征向量%V_Fisher - (P-C)x(C-1) 最大的(C-1)维J = inv(Sw) * Sb的特征矩阵%ProjectedImages_Fisher - (C-1)xP)维训练样本,这些样本从fisher线性空间中提取%Class_number-类的数目%Class_population-每一类图像的数目%返回值: OutputName -在训练样本中的被识别的图像的名字Tr
36、ain_Number = size(ProjectedImages_Fisher,2);%从测试样本中提取PCA特征%InputImage = imread(TestImage);temp = InputImage(:,:,1); irow icol = size(temp);InImage = reshape(temp,irow*icol,1);Difference = double(InImage)-m_database; ProjectedTestImage = V_Fisher * V_PCA * Difference; %计算欧几里得几何距离%Euc_dist = ;for i =
37、1 : Train_Number q = ProjectedImages_Fisher(:,i); temp = ( norm( ProjectedTestImage - q )2 ; Euc_dist = Euc_dist temp;end Euc_dist2 = ;for i=1 : Class_number dist = mean(Euc_dist(i-1)*Class_population+1):(i*Class_population); Euc_dist2 = Euc_dist2 dist;endEuc_dist_min ,Recognized_index = min(Euc_dist2);Recognized_index = (Recognized_index - 1) * Class_population + 1;OutputName = strcat(int2str(Recognized_index),.pgm);XV