PCA主成分分析人脸识别

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连接,包括安装、使用方法

https://github.com/SilvesterHsu/ORLFaceRecognition-PCA

PCA带图像% Face recognition by Santiago Serrano %人脸识别代码 clear all close all clc % number of images on your training set. %训练集数目 M=10; %Chosen std and mean. %It can be any number that it is close to the std and mean of most of the images. um=100; ustd=80; %read and show images(bmp); %读入M个训练图像并显示在一个窗口上 S=[]; %img matrix figure(1); for i=1:M str=strcat('C:\Documents and Settings\Administrator\桌面\6311661897288432PCA\97288432PCA\',int2str(i),'.bmp'); %concatenates two strings that form the name of the image eval('img=imread(str);'); subplot(ceil(sqrt(M)),ceil(sqrt(M)),i) imshow(img) if i==3 title('Training set','fontsize',18) end drawnow; [irow icol]=size(img); % get the number of rows (N1) and columns (N2)获得图像的大小,所有图像的大小要一致 temp=reshape(img',irow*icol,1); %creates a (N1*N2)x1 matrix一幅图像构造一个向量 向量的大小和图像大小有关 S=[S temp]; %X is a N1*N2xM matrix after finishing the sequence 生成一个向量矩阵,M个图像有M列 %this is our S end %Here we change the mean and std of all images. We normalize all images. %This is done to reduce the error due to lighting conditions. %下面是对图像规范化,更具所有图像的的平均值和方差 for i=1:size(S,2) temp=double(S(:,i)); m=mean(temp); st=std(temp); S(:,i)=(temp-m)*ustd/st+um; end %show normalized images 显示规范化后的图像 figure(2); for i=1:M str=strcat(int2str(i),'.bmp'); img=reshape(S(:,i),icol,irow); img=img'; eval('imwrite(img,str)'); subplot(ceil(sqrt(M)),ceil(sqrt(M)),i) imshow(img) drawnow; if i==3 title('Normalized Training Set','fontsize',18) end end %mean image;显示平均图像,所有图像叠加在一起 m=mean(S,2); %obtains the mean of each row instead of each column tmimg=uint8(m); %converts to unsigned 8-bit integer. Values range from 0 to 255 img=reshape(tmimg,icol,irow); %takes the N1*N2x1 vector and creates a N2xN1 matrix img=img'; %creates a N1xN2 matrix by transposing the image. figure(3); imshow(img); title('Mean Image','fontsize',18) % Change image for manipulation %对图像变换便于处理
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值