📄 tpca.m
字号:
人脸识别中TesorPCA算法Matlab程序
clc;clear;
cd E:\人脸识别\ORL人脸图库\train
fdir=dir('*.bmp');
fnum1=size(fdir,1);
nbcol=255;
class=15;
for i=1:fnum1
imgname=fdir(i,1).name;
d=imread(imgname);
a=double(d);
[m,n]=size(a);
Xtran(:,:,i)=a;
end
M_Xtran=sum(Xtran(:,:,:),3);
M_X_mean=M_Xtran/fnum1;%求均值矩阵M(X)
%%计算Mv和Mu
Mv=0;
Mu=0;
for i=1:class
b=Xtran(:,:,i);
Mv=Mv+(b-M_X_mean)*(b-M_X_mean)';
Mu=Mu+(b-M_X_mean)'*(b-M_X_mean);
end
%计算U和V
[V,D]=eig(Mu);
[U,E]=eig(Mv);
% [y1 index1]=sort(diag(-D));
% [y2 index2]=sort(diag(-E));
% T1=sum(-y1,1);
% T2=sum(-y2,1);
Tr_D=trace(D);
% H=1-class/fnum1;
for i=1:n
Tr_d=trace(D(1:i,1:i));
Per_d_D=Tr_d/Tr_D;
if Per_d_D>=0.85
l=i;
break,end
end
Tr_E=trace(E);
for i=1:m
Tr_e=trace(E(1:i,1:i));
Per_e_E=Tr_e/Tr_E;
if Per_e_E>=0.85
k=i;
break,end
end
v=V(:,1:l);
u=U(:,1:k);
% % %验证U,V的正交性
% S_V=V*V';
% S_U=U*U';
% % 通过还原图像检测投影矩阵的可行性
% t1=Xtran(:,:,1);
% figure(1)
% imshow(uint8(t1));
% grid on
% figure(2)
% t2=U*U'*t1*V*V';
% imshow(uint8(t2));
% grid on
%迭代
Mv=0;
Mu=0;
for i=1:class
b=Xtran(:,:,i);
Mv=Mv+(b-M_X_mean)*v*v'*(b-M_X_mean)';
Mu=Mu+(b-M_X_mean)'*u*u'*(b-M_X_mean);
end
%二次计算U和V
[V,D]=eig(Mu);
[U,E]=eig(Mv);
%降维
% %选取占特征值综合的X%的特征值对应的特征向量组成投影矩阵
Tr_D=trace(D);
% H=1-class/fnum1;
for i=1:n
Tr_d=trace(D(1:i,1:i));
Per_d_D=Tr_d/Tr_D;
if Per_d_D>=0.85
l=i;
break,end
end
Tr_E=trace(E);
for i=1:m
Tr_e=trace(E(1:i,1:i));
Per_e_E=Tr_e/Tr_E;
if Per_e_E>=0.85
k=i;
break,end
end
v=V(:,1:l);
u=U(:,1:k);
% % % 还原图像检测投影矩阵的可行性
% figure(3)
% t3=U*U'*t1*V*V';
% imshow(uint8(t3));
% grid on
% t4=u*u'*t1*v*v';
% figure(4)
% imshow(uint8(t4));
% grid on
% figure(5)
% z=u*u'*M_X_mean*v*v';
% imshow(uint8(z));
% grid on
%把训练集图像影射到张量子空间
M_Ytran=0;
for j=1:fnum1
f=Xtran(:,:,j);
g=u'*f*v;
Ytran(:,:,j)=g;
end
% %查看投影到张量子空间后的图像形状
% t6=Ytran(:,:,1);
% figure(6)
% imshow(uint8(t6));
% grid on
M_Ytran=sum(Ytran(:,:,:),3);
M_Y_mean=M_Ytran/fnum1;%计算张量子空间的均值矩阵M(Y)
%计算投影到张量子空间中的图像类内均值
% for i=1:class
% Ytran_class_mean(:,:,i)=sum(Ytran(:,:,10*(i-1)+1:10*(i-1)+10),3)/10;
% end
% 计算|Y-M(Y)|^2
% D_Y=0;
% for j=1:fnum1
% h=Ytran(:,j);
% l=reshape(h,(m-class),(n-class));
% D_Y=D_Y+trace((l-M_Y_mean)*(l-M_Y_mean)');
% end
% %人脸识别
cd E:\人脸识别\ORL人脸图库\test
fdir=dir('*.bmp');
fnum2=size(fdir,1);
for i=1:fnum2
imgname=fdir(i,1).name;
d=imread(imgname);
a=double(d);
[m,n]=size(a);
Xtest(:,:,i)=a;
end
for i=1:fnum2
f=Xtest(:,:,i);
g=u'*f*v;
Ytest(:,:,i)=g;
end
correct=0;
error=0;
for i=1:fnum2
h=Ytest(:,:,i);
for j=1:fnum1
f=Ytran(:,:,j);
dis(i,j) = sqrt(sum(sum((f-h).^2)));
% dis(i,j) =sqrt(sum(sum((f-h)*(f-h)')));
% r=(f-h)*(f-h)';
% [P,Q]=eig(r);
% dis(i,j)=sqrt(trace(Q*Q'));
% %识别率为X%=97%, Y=166,Z=83
% dis(i,j)=sqrt(trace((f-h)*(f-h)'));
% %识别率为 X%=97%,Y=169 ,Z=84.5
end
end
for i=1:fnum2
[mind,ind] = min(dis');
if ceil(ind(i)/5) == ceil(i/5)
% [mind,ind] = min(dis');
% if ceil(ind(i)) == ceil(i/10)
correct = correct + 1;
else
error = error + 1;
end
end
correct_detection=correct/(correct+error);
fprintf('correct=%d\n',correct);
fprintf('error=%d\n',error);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -