1. 程式人生 > >PCA進行人臉識別

PCA進行人臉識別

clc;clear all;close all;
%測試資料:32人,每人10張照片,取前5張照片作為訓練集,後5張照片作為測試集。
ph=5;%測試訓練集樣本數
imdata=zeros(11292,32ph);
for i=1:32
for j=1:ph
addr=strcat(‘E:/模式識別/orl_faces/s’,num2str(i),’/’,num2str(j),’.pgm’);
a=imread(addr);%讀入影象
b=a(1:11292); %把影象a矩陣按列順序轉為 行向量b
imdata(:,ph
(i-1)+j)=b’; %把b的轉置矩陣存放到imdata矩陣的第ph*(i-1)+j列
end
end
%%
%第一步:計算特徵臉並建立特徵空間
%計算平均臉
imaverage=mean(imdata,2); %按行求平均mean(a,2)
out=reshape(imaverage,112,92);
figure;
imshow(out,[]);
title(‘平均 Face’);

clear i j a b addr
%%
%影象預處理
immin=zeros(11292,32ph);
for i=1:32ph
%歸一化處理,提升矩陣計算速度,但小數精度不夠,會影響匹配率
%immin(:,i) = (imdata(:,i)-imaverage)/col2medivation(imdata(:,i)-imaverage,112
92);
%僅減去平均臉,不做歸一化處理
immin(:,i) = imdata(:,i)-imaverage;
end
clear i imdata
%%
W=immin’immin;%計算協方差矩陣
%計算特徵向量與特徵值
k=32;
[V,~]=eigs(W,k);%降到32維
V=immin

V; %dn的矩陣與nk的矩陣相乘;
VT=fliplr(V); %對特徵向量進行排序
clear V W

%顯示前32個特徵臉
figure;
for i=1:32
v=VT(:,i);
%向量矩陣化
out=reshape(v,112,92); %把(112*92)1的列向量轉成11292的矩陣
subplot(4,8,i);
imshow(out,[]);
title(strcat(‘Face’,num2str(i)));
end
clear i v out
%%
%第二步:將訓練集影象對映到特徵空間

featuretrain=zeros(k,32ph);
for i=1:32
ph
%對映訓練集影象
add=VT’immin(:,i); %k

d的矩陣與d*1的矩陣相乘;
featuretrain(:,i)=add;
end
clear i add

%%
%第三步:對映測試集影象到特徵空間

%讀入測試集影象
test=zeros(11292,32(10-ph));
for i=1:32
for j=(ph+1):10 %6到10
addr=strcat(‘E:/模式識別/orl_faces/s’,num2str(i),’/’,num2str(j),’.pgm’);
a=imread(addr);
b=a(1:11292);
test(:,(10-ph)
(i-1)+(j-ph))=b’;
end
end

%影象預處理
testmin=zeros(11292,32(10-ph));
for i=1:32*(10-ph)
testmin(:,i) = test(:,i)-imaverage;
end
clear i j a b addr test

featuretest=zeros(k,k*(10-ph));
for i=1:k*(10-ph)
%對映測試集影象
add=VT’testmin(:,i);
featuretest(:,i)=add;
end
clear i add
%%
%匹配計算
count=0;
for t=1:k
(10-ph)
point=figureNum(featuretest,t,featuretrain,32ph);%計算最小距離
%計算匹配個數
if(round(point/ph+0.4)==round(t/(10-ph)+0.4))
count=count+1;
end
end
tol=count/(k
(10-ph));
display(strcat(‘匹配率:’,num2str(tol*100),’%’));

%需要建立一個function檔案
function point=figureNum(test,t1,train,num)
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