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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值