You are on page 1of 5

% calc xmean,sigma and its eigen decomposition

function [frobenius_dis,train_time] = u2dpca;


clear all;
cv = zeros(92/1,92/1);
train_samples = zeros(112/1,92/1,200);
d = 8;
f = randperm(10)
tic;
for i=1:40
for j=1:5
a=imread(strcat('H:\\face database\orl\orl_faces_gai\s',num2str(i),'\',num2str(f(j)),'.bmp'));
%D:\rawdata\ORL\s
%a = imresize(a,1/4,'bilinear');
%imshow(a);
%b=a(112:92); % b 1N N10304
b=double(a);
train_samples(:,:,(i-1)*5 + j)=b;
cv = cv + b'*b;
end
end
toc;
%mean_train_samples = mean(train_samples,3);
%train_samples_sub = zeros(112/1,92/1,200);
%for i = 1:200;
%

train_samples_sub(:,:,i) = train_samples(:,:,i) - mean_train_samples;

cv = cv + train_samples_sub(:,:,i)' * train_samples_sub(:,:,i);

%end
cv = cv/200;

[vv dv]=eig(cv);
d3=diag(dv);
[d4 indexv]=sort(d3); %

for i=1:92/1
vsortv(:,i) = vv(:, indexv(92/1-i+1) ); % vsort M*col(:col M),

dsortv(i) = d3( indexv(92/1-i+1) ); % dsort


end %

final_v = zeros(92/1,d);
for i = 1:d;

final_v(:,i) = vsortv(:,i);
end
toc;
frobenius_dis = 0;
u2dproject = zeros(112/1,d,200);
for i = 1:200
u2dproject(:,:,i) = train_samples(:,:,i) * final_v;
%image = u2dproject(:,:,i) * final_v';
%imwrite(uint8(image),strcat('H:\\face
database\orl\orl_faces_rename\u2dpca8\',num2str(i),'.bmp'),'bmp');
mid = train_samples(:,:,i) - u2dproject(:,:,i) * final_v';
frobenius_dis = frobenius_dis + (norm(mid,'fro'))^2;
end
train_time = toc;
%frobenius_dis
%tic;
%accu = 0;
%flag = zeros(1,200);
%test_features = zeros(112/1,d);
%mdist = zeros(1,200);
%for i=1:40
%
%

for j=6:10 % 40 x 5
a=imread(strcat('H:\\face database\orl\orl_faces_gai\s',num2str(i),'\',num2str(f(j)),'.bmp'));

%D:\rawdata\ORL\s
%

%a = imresize(a,1/4,'bilinear');

b=double(a);

test_features = b * final_v;

for k=1:200

%
%

mdist(k)= norm(test_features - u2dproject(:,:,k),'fro');


end;

%
%

[dist,index2]=sort(mdist);

class1=floor(index2(1)/5 )+1;%???

class2=floor(index2(2)/5)+1;

class3=floor(index2(3)/5)+1;

if class1~=class2 && class2~=class3

%
%
%

class=class1;
elseif class1==class2
class=class1;

elseif class2==class3

class=class2;

end;

if class==i

accu=accu+1;

flag(1,(i-1)*5 + j-5) = 1;

%
%

end;
end;

%end;
%accuracy=accu/200 %
%toc
return; ...

%filename = strcat('H:\\face
database\orl\orl_faces\s',num2str(1),'\',num2str(4),'.bmp');
%d= 3;
function accu = u2dpca_test(filename,d)
% calc xmean,sigma and its eigen decomposition
cv = zeros(92/1,92/1);
train_samples = zeros(112/1,92/1,399);
%f = randperm(10)
%tic;
for i=1:40
for j=1:10
trainame = strcat('H:\\face
database\orl\orl_faces\s',num2str(i),'\',num2str(j),'.pgm');
if strcmp(trainame,filename) == 0;
a=imread(strcat('H:\\face
database\orl\orl_faces\s',num2str(i),'\',num2str(j),'.pgm'));%D:\rawdata\ORL\s
%a = imresize(a,1/4,'bilinear');
%b=a(112:92); % b 1N N10304

b=double(a);
train_samples(:,:,(i-1)*5 + j)=b;
else
test_i = i;
test_j = j;
end
end
end
mean_train_samples = mean(train_samples,3);

train_samples_sub = zeros(112/1,92/1,399);
for i = 1:399;
train_samples_sub(:,:,i) = train_samples(:,:,i) - mean_train_samples;
cv = cv + train_samples_sub(:,:,i)' * train_samples_sub(:,:,i);
end
cv = cv/399;
[vv dv]=eig(cv);
d3=diag(dv);
[d4 indexv]=sort(d3); %
for i=1:92/1
vsortv(:,i) = vv(:, indexv(92/1-i+1) ); % vsort M*col(:col M)
,
dsortv(i) = d3( indexv(92/1-i+1) ); % dsort

end %
final_v = zeros(92/1,d);
for i = 1:d;
final_v(:,i) = vsortv(:,i);
end
u2dproject = zeros(112/1,d,200);
for i = 1:399
u2dproject(:,:,i) = train_samples(:,:,i) * final_v;
%image = u2dproject(:,:,i) * final_v';
%imwrite(uint8(image),strcat('H:\\face
database\orl\orl_faces_rename\',num2str(i),'.bmp'),'bmp');
end
accu = 0;
flag = zeros(1,399);
test_features = zeros(112/1,d);
mdist = zeros(1,399);
a=imread(filename);%D:\rawdata\ORL\s
a = imresize(a,1/1,'bilinear');
b=double(a);
test_features = b * final_v;
for k=1:399

mdist(k)= norm(test_features - u2dproject(:,:,k),'fro');


end;
%
[dist,index2]=sort(mdist);
for k = 1:399,
if index2(k) >= (test_i - 1)*10 + test_j
index2(k) = index2(k)+1;
end
end
class1=floor(index2(1)/5 )+1;
class2=floor(index2(2)/5)+1;
class3=floor(index2(3)/5)+1;
if class1~=class2 && class2~=class3
class=class1;
elseif class1==class2
class=class1;
elseif class2==class3
class=class2;
end;
if class==test_i;
accu=1
end;
%toc;
return; ...

You might also like