⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tpca.m

📁 人脸识别中TensorPCA算法的matlab程序
💻 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 + -