模式识别实验之PCA人脸识别(matlab实现)
一、实验目的
1.通过实验加深对于PCA人脸识别过程的理解。
2.通过编程进一步提高对图像、特征向量等概念的理解。
二、实验原理
PCA方法实现人脸识别,PCA的思想在这里就不详细论述了。
三、实验步骤
1.人脸识别图像库中包含40个人的头像图片,每人10幅。将400张图像分成两组,每个人的前五张照片作为训练图像,后五张作为测试图像。读入图像,并对图像数据进行处理。
2.采用PCA方法实现本征脸方法,对特征进行降维。
3.对训练图像进行重构,观察当保留特征维数不同时,重构效果的差异。
4.对测试图像进行判别。对测试图像进行预处理,根据本征脸计算重构系数,与每一幅本征脸图像的重构系数进行比较,根据最小距离进行图像类别的判别,实现人脸识别。
四、matlab编程过程详解
1、PCA人脸识别的基本流程
从上图中可以看出PCA人脸识别分为以下几个阶段:特征提取、构造特征空间、投影计算、分类器决策,我们的程序就是根据流程图所示编写。
2、读入ROL库数据
%测试数据:40人,每人10张照片。每人取前train_num张照片作为训练集,后(10-train_num)张照片作为测试集。
clear;
clc;
train_num=5;
%计算特征脸并创建特征空间
imdata=zeros(112*92,40*train_num);
for i=1:40
for j=1:train_num
addr=strcat('I:/模式识别/实验四/1107/orl_faces/s',num2str(i),'/',num2str(j),'.pgm');
a=imread(addr);%从地址中读入图像
b=a(1:112*92); %把图像a矩阵按列顺序转为行向量b
imdata(:,train_num*(i-1)+j)=b'; %把b的转置矩阵存放到imdata矩阵的第ph*(i-1)+j列
end
end
3、PCA特征提取
3.1得到训练集的平均脸。
首先我们需要计算这个训练集的平均脸。
%计算平均脸并显示
average_face=mean(imdata,2); %按行求平均mean(a,2) 按列mean(a)
Average_face=reshape(average_face,112,92);%将[112*92,1]的脸灰度数据转成[112,92]
figure;
subplot(1,1,1);
imshow(Average_face,[]);%imshow(I,[]) 显示灰度图像 I,根据 I 中的像素值范围对显示进行转换。
title(strcat('40*5张训练样本的平均脸'));
clear i j a b addr
运行后得到下图
这就是该库中的平均脸,平均脸和样本库有很大的关系,不同数据库得到的平均脸是不一样的。
3.2计算协方差矩阵并得到特征向量。
%图像预处理:减去平均均值
immin=zeros(112*92,40*train_num);
for i=1:40*train_num
immin(:,i) = imdata(:,i)-average_face;
end
clear i
%计算协方差矩阵
%W=immin*immin';%dxn*nxd =dxd,由N*N降为d*d
W=immin'*immin; %n*d x d*n= n*n 较小
%计算特征向量与特征值(向量)
[V,D]=eig(W)