PCA主成分分析人脸识别
辛辛苦苦完善的代码,使用前别忘记点赞哦~
PCA.m
%%
% 测试数据:40人,每人10张照片。每人取前ph张照片作为训练集,后(10-ph)张照片作为测试集。
% rate为照片尺寸的尺度变换系数(0<=rate<=1),rate越小计算速度越快,误差越大。
clear
close
clc
ph=8;
rate=0.8;%内存够用的可以改成1,内存小的可以适当改小rate
%%
% 第一步:计算特征脸并创建特征空间
tic
imsize=[ceil(112*rate),ceil(92*rate)];
% 申请录入数据矩阵内存
imdata=zeros(imsize(1)*imsize(2),40*ph);
for i=1:40
for j=1:ph
addr=strcat(char(pwd),'/orl_faces/s',num2str(i),'/',num2str(j),'.pgm');
image=hisequ(imresize(imread(addr),rate));
imdata(:,ph*(i-1)+j)=image(:);
end;
end;
% 计算平均脸
imaverage=mean(imdata,2);
clear i j addr
% 图像预处理
immin=zeros(imsize(1)*imsize(2),40*ph);
for i=1:40*ph
%减去平均脸
immin(:,i) = imdata(:,i)-imaverage;
end;
clear i imdata
%%
% 计算协方差矩阵
W=immin*immin';
% 计算特征向量与特征值(向量)
[V,~]=eig(W);%若此行报错则将‘~’改为‘D’
% 对特征向量进行排序
V=fliplr(V);
VT=V(:,1:40*ph);
clear V W D
%%
% 显示前32个特征脸
for i=1:32
v=VT(:,i);
%向量矩阵化
out=col2mat2(v,imsize);
subplot(4,8,i);
imshow(out,[]);
title(strcat('Face',num2str(i)));
end;
clear i v out
%%
% 第二步:映射训练集图像到特征空间
% 申请训练数据矩阵内存
featuretrain=zeros(40*ph,40*ph);
for i=1:40*ph;
%映射训练集图像
add=VT'*immin(:,i);
featuretrain(:,i)=add;
end;
clear i add
%%
% 第三步:映射测试集图像到特征空间
% 申请录入数据矩阵内存
test=zeros(imsize(1)*imsize(2),40*(10-ph));
for i=1:40
for j=(ph+1):10
addr=strcat(char(pwd),'/orl_faces/s',num2str(i),'/',num2str(j),'.pgm');
image=hisequ(imresize(imread(addr),rate));
test(:,(10-ph)*(i-1)+(j-ph))=image(:);
end;
end;
% 图像预处理
testmin=zeros(imsize(1)*imsize(2),40*(10-ph));
for i=1:40*(10-ph)
testmin(:,i) = test(:,i)-imaverage;
end;
clear i j addr image test
% 申请测试数据矩阵内存
featuretest=zeros(40*ph,40*(10-ph));
for i=1:40*(10-ph);
%映射测试集图像
add=VT'*testmin(:,i);
featuretest(:,i)=add;
end;
clear i add
%%
% 匹配计算
count=0;
for t=1:40*(10-ph)
point=figureNum(featuretest,t,featuretrain,40*ph);
%计算匹配个数
if(ceil(point/ph)==ceil(t/(10-ph)))
count=count+1;
end;
end;
tol=count/(40*(10-ph));
display(strcat('匹配率:',num2str(tol*100),'%'));
clear ph tol count point t
toc
下面是相关函数
col2mat2.m
function im2 = col2mat2( im1, imsize)
%UNTITLED Summary of this function goes here
% Detailed explanation goes here
t=0;
im2=zeros(imsize(1),imsize(2));
for col=1:imsize(2)
for row=1:imsize(1)
t=t+1;
im2(row,col)=im1(t,1);
end;
end;
end
figureNum.m
function point = figureNum( test,t1,train,num)
%UNTITLED2 Summary of this function goes here
% Detailed explanation goes here
point=1;
T=norm(test(:,t1)-train(:,1));
for t2=1:num
distance=norm(test(:,t1)-train(:,t2));
if (distance<T)
point=t2;
T=distance;
end;
end;
end
很久不用Matlab了,python版本没有CPU加速比Matlab慢,但是如果用GPU会更快
附上Github连接,包括安装、使用方法