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.m
function [m,A,Eigenfaces] = EigenfaceCore(T)
%利用主成分分析(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(Tj's)
Train_Number = size(T,2);
%%%%%%%%%计算每个图像与均值的差%%%%%%%%%
%%%要使PCA正常工作,必须减去数据的均值。减去的均值为每一维的平均,所有的x值都要减去,同样所有的y值都要减去%%% %%%这样处理后的数据都具有0均值%%% A = [];
for i = 1 : Train_Number
temp = double(T(:,i)) - m; A = [A temp]; %再次合并矩阵 end
%%%%%%%计算协方差矩阵%%%%%%%%%%
%%%%%%%计算协方差矩阵的特征矢量和特征值%%%%%%%%
VI
L = A'*A; %L代表协方差矩阵 C = A*A'.
[V D] = eig(L);%计算矩阵A的特征值D(eigenvalues)和特征矩阵V(eigenvectors)
%%%%%%选择成分组成模式矢量%%%%%%%%%%%
L_eig_vec = []; for i = 1:size(V,2) if(D(i,i)>1)
L_eig_vec = [L_eig_vec V(:,1)]; end end
%%%%%%计算协方差矩阵的特征向量%%%%%%%%%% Eigenfaces = A * L_eig_vec;
第三部分:Recognition.m
function OutputName = Recognition(TestImage, m, A, Eigenfaces)
%函数描述:这个函数将源图像提取成特征脸,然后比较它们之间的欧几里得距离
%输入量: TestImage ---测试样本的路径
% m ---(M*Nx1)训练样本的均值
% Eigenfaces --- (M*Nx(P-1))训练样本协方差矩阵的特征向量 % 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 icol] = size(temp);
InImage = reshape(temp',irow*icol,1); Difference = double(InImage) - m;
VII
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,最小值索引返回给I。 %如果有几个相同的最小值,那么返回第一个被发现的索引。 [Euc_dist_min, Recognized_index] = min(Euc_dist); OutputName = strcat(int2str(Recognized_index),'.pgm');
主程序
clear all clc
close all
TrainDatabasePath = uigetdir('C:\\MATLAB7\\work\\PCA', 'Select training database path' ); TestDatabasePath = uigetdir('C:\\MATLAB7\\work\\PCA', 'Select test database 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(TrainDatabasePath);
[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 image is : ', OutputName); disp(str)
VIII
《模式识别》大作业人脸识别方法二 ---- 基于PCA和FLD的人脸识别的线性分类器
一、理论知识
1、 fisher概念引出
在应用统计方法解决模式识别问题时,为了解决“维数灾难”的问题,压缩特征空间的维数非常必要。fisher方法实际上涉及到维数压缩的问题。fisher分类器是一种几何分类器, 包括线性分类器和非线性分类器。线性分类器有:感知器算法、增量校正算法、LMSE分类算法、Fisher分类。
若把多维特征空间的点投影到一条直线上,就能把特征空间压缩成一维。那么关键就是找到这条直线的方向,找得好,分得好,找不好,就混在一起。因此fisher方法目标就是找到这个最好的直线方向以及如何实现向最好方向投影的变换。这个投影变换恰是我们所寻求的解向量W*,这是fisher算法的基本问题。
样品训练集以及待测样品的特征数目为n。为了找到最佳投影方向,需要计算出各类均值、样品类内离散度矩阵Si和总类间离散度矩阵Sw、样品类间离散度矩阵Sb,根据Fisher准则,找到最佳投影准则,将训练集内所有样品进行投影,投影到一维Y空间,由于Y空间是一维的,则需要求出Y空间的划分边界点,找到边界点后,就可以对待测样品进行进行一维Y空间的投影,判断它的投影点与分界点的关系,将其归类。
Fisher法的核心为二字:投影。
二、 实现方法
(1) 计算给类样品均值向量mi,mi是各个类的均值,Ni是?i类的样品个数。
mi?1Ni?X??iXi?1,2,...,n
Sw(2) 计算样品类内离散度矩阵
Si?Sw?Si和总类间离散度矩阵
T
i?1,2,...,n?X??ii?1(X?mi)(X?mi)i?S
(3) 计算样品类间离散度矩阵Sb
Sb?(m1?m2)(m1?m2)T
IX
(4) 求向量W*
我们希望投影后,在一维Y空间各类样品尽可能地分开,也就是说我们希望两类样品均值之差(m1?m2)越大越好,同时希望各类样品内部尽量密集,即希望类内离散度越小越好,因此,我们可以定义Fisher准则函数:JF(W)?W*WSbWWSwWTT
使得JF(W)取得最大值的W为 (5) 将训练集内所有样品进行投影
*?Sw(m1?m2)?1
y?(W)X*T
如果Sw是非奇异的,则要获得类间离散度与类内离散度的比值最大的投影方向JF(W)的满足下式:
JF(W)?arcmaxWSbWWSwWTT?[w1,w2,?wm]
其中[w1,w2,?wm]是满足下式的Sb和Sw对应的m个最大特征值所对应的特征向量。
注意到该矩阵最多只有C-1个非零特征值,C是类别数。
2、程序中算法的应用
Fisher线性判别方法(FLD)是在Fisher鉴别准则函数取极值的情况下,求得一个最佳判别方向,然后从高位特征向量投影到该最佳鉴别方向,构成一个一维的判别特征空间。
将Fisher线性判别推广到C-1个判决函数下,即从N维空间向C-1维空间作相应的投影。利用这个m维的投影矩阵M将训练样本n维向量空间转化为m维的MEF空间并且获得在MEF空间上的最佳描述特征,即
?iiiTy1?y1,y2,?ym?M(xi?mi?m0)i?1,2,?,N
由这N个MEF空间上的最佳描述特征可以求出y1,y2,?yN的样品类内离散度矩阵Sw?1和总类间离散度矩阵Sb,取SwSb的K个最大的特征可以构成FLD投影矩阵W。将MEF
空间上的最佳描述特征y1,y2,?yN在FLD投影矩阵W上进行投影,将MEF空间降维到MDF空间,并获得对应的MDF空间上的最佳分类特征,即
X