MATLAB基于PCA-LDA模糊神经网络的人脸识别
基于PCA-LDA和粗糙集模糊神经网络的人脸识别,一方面在应用前景上是十分广阔的,可以为IT行业创造更好的经济效益。
另一方面,它相对于其它的生物特征识别更加方便。
至于环境方面,人脸识别对环境并没有什么影响。
图像获取功能:该模块的功能是从图像库中获取图片,获取的图像必须能够在开发环境中可以显示,以便进行图像的处理和识别。
图像预处理功能:该模块的功能包括图像光线强弱的补偿,图像的灰度化处理,去噪,均衡化后的直方图,以此达到图像对比后增强的目的。
图像特征提取功能:改模块的功能是在处理后的图像进行训练,然后将训练后的图像的眼睛,鼻子,嘴巴等生物特征提取出来。
图像识别功能:该模块部分是将需要进行检测的图像的特征提取出来与数据库的图像的特征进行比较,以此达到人脸识别的功能。
壹
01
先解压image-base压缩包与.m文件放在一起
然后在主窗口依次运行以下函数
saveORLimage.m将ORL人脸库分为测试集ptest和训练集pstudy存为imagedata.mat
%对28*23的ORL40类人脸库进行缩小,把它保存到imagedata.mat文件,imagedata.mat保存图形数据矩阵pstudy(学习集)
%ptest(),pclass
clear all
%load istudydata
load itestdata
nclass=40; %识别图象的类数
%num=10;%每类图象的个数
num=5;%每类图象的个数
m=1;%图象缩放比例
%这里就是原始图像大小
%将所得的图象数据保存到矩阵pclass中,pclass最后一列代表ORL人脸库每个人脸所属的类别
k=1;
if study==1
for i=1:nclass
for j=1:num
A=imread(strcat('image-base\s',int2str(i),'_',int2str(j),'.bmp'));
%连结字符串
B=take(imresize(A,m));
C=double(B);
pclass(k,:)=[C i];
k=k+1;
end
end
end
if test==1
for i=1:nclass
for j=1:num
A=imread(strcat('image-base\s',int2str(i),'_',int2str(j+5),'.bmp')); %连结字符串
B=take(imresize(A,m));
C=double(B);
pclass(k,:)=[C i];
k=k+1;
end
end
end
%学习集pstudy
k1=1;
if study==1
for i=1:nclass
for j=1:num
pstudy(k1,:)=pclass((i-1)*num+j,:);
k1=k1+1;
end
end
end
%测试集ptest
if test==1
for i=1:nclass
for j=1:num
ptest(k1,:)=pclass((i-1)*num+j,:);
k1=k1+1;
end
end
end
if study==1
savefile = 'imagepstudydata.mat';
save(savefile,'pstudy');
%将训练数据存进磁盘,pclass要不要呢
end
if test==1
savefile = 'imageptestdata.mat';
save(savefile, 'ptest') ;
%将测试数据存进磁盘,pclass要不要呢
end
贰
01
1.savelda.m将人脸库先进行pca降维,再用lda进行特征提取,得到新的测试集ldatest和训练集ldastudy存为imageldadata.mat
if study==1
load imagepstudydata;
end
if test==1
load imageptestdata;
load imageldaUUata;
end
% load imagenewdata
classnum=40;
everypersonnums=5;
pcamaxnums=60;%设定pca最大的前maxnums特征值
ldamaxnums=20;
%lda操作选取的特征数
% pstudy=newpstudy;
% ptest=newptest;
%每幅训练图象减去平均值
if study==1
[mstudy,nstudy]=size(pstudy);
pstudymean=mean(pstudy(:,1:nstudy-1));
pstudy1=pstudy(:,1:nstudy-1)-pstudymean(ones(mstudy,1),:);
end
%每幅测试图象减去平均值
if test==1
[mtest,ntest]=size(ptest);
ptestmean=mean(ptest(:,1:ntest-1))
ptest1=ptest(:,1:ntest-1)-ptestmean(ones(mtest,1),:);
end
%计算训练样本协方差矩阵及其特征值,特征向量
if study==1
f=(1/sqrt(mstudy))*pstudy1;
L=f*f';
[eignvectors,eignvalues] = eig(L);
%eignvalues是特征值,对角矩阵;eignvetors是与L同等大小的矩阵,每一列包含特征向量
%将特征值从大到小排列
% [ee,kk]=sort(diag(eignvalues),'descend');
[ee,kk]=sort(diag(eignvalues));
%diag是对角化;sort是将矩阵的每一列按升序排列,结果存进ee,kk是索引矩阵
kk=flipud(kk);
%列保持不变,行按头尾顺序对调
%取得排列后特征值对应的特征向量
eigns=eignvectors(:,kk);
%求投影矩阵
U=f'*eigns;
%把矩阵单位化
for i=1:mstudy
U(:,i)=U(:,i)/norm(U(:,i));
%norm求出U中的最大单数
end
%选maxnums个特征向量组成子空间
UU(:,1:pcamaxnums)=U(:,1:pcamaxnums);
end
%以下为LDA部分
%求pca在训练集上的投影矩阵
if study==1
pcastudy2=pstudy1*UU;
%计算类间散布矩阵SB
pcastudy2mean=mean(pcastudy2);%求在测试集上总体平均值
for i=1:classnum
k1=(i-1)*everypersonnums+1;
%从1至5,这个可以调整
k2=(i-1)*everypersonnums+5;
everypersonmean(i,:)=sum(pcastudy2(k1:k2,:))/everypersonnums;
end
SB=zeros(pcamaxnums,pcamaxnums);
for i=1:classnum
SB=SB+everypersonnums*(everypersonmean(i,:)-pcastudy2mean)'*(everypersonmean(i,:)-pcastudy2mean);
end
%计算总类内散布矩阵Sw
SW=zeros(pcamaxnums,pcamaxnums);
for i=1:classnum
for j=1:everypersonnums
SW=SW+(pcastudy2((i-1)*everypersonnums+j,:)-everypersonmean(i,:))' * (pcastudy2((i-1)*everypersonnums+j,:)-everypersonmean(i,:));
end
end
%计算投影矩阵
bb=(inv(SW))*SB;
%方形矩阵翻转
[beignvectors,beignvalues] = eig(bb);
%将特征值从大到小排列
%[bee,bkk]=sort(diag(beignvalues),'descend');
[bee,bkk]=sort(diag(beignvalues));
bkk=flipud(bkk);
%取得排列后特征值对应的特征向量
beigns=beignvectors(:,bkk);
wf(:,1:ldamaxnums)=beigns(:,1:ldamaxnums);
%求pca在训练集上的投影矩阵
pcastudy2=pstudy1*UU;
pcastudy2mean=mean(pcastudy2);
pcastudy2=pcastudy2-pcastudy2mean(ones(mstudy,1),:);
end
%求pca在测试集上的投影矩阵
if test==1
pcatest2=ptest1*UU;
%要输UU!
pcatest2mean=mean(pcatest2);
pcatest2=pcatest2-pcatest2mean(ones(mtest,1),:);
end
if study==1
learnfishstudy=pcastudy2*wf;
% 计算训练样本的PCA+FLD特征向量
end
if test==1
testfishstudy=pcatest2*wf;
% 计算测试样本的PCA+FLD特征向量
end
%对pca训练集和测试集上的矩阵进行单位化
if study==1
st1=learnfishstudy;
% for i=1:size(st1)
% st1(i,:)=st1(i,:)/norm(st1(i,:));
% end
ldastudy=[st1 double(pstudy(:,nstudy))];
end
if test==1
st2=testfishstudy;
% for i=1:size(st2)
% st2(i,:)=st2(i,:)/norm(st2(i,:));
% end
ldatest=[st2 double(ptest(:,ntest))];
end
if study==1
savefile = 'imageldastudydata.mat';
save(savefile, 'ldastudy');
savefile = 'imageldaUUata.mat';
save(savefile, 'UU','wf');
end
if test==1
savefile = 'imageldatestdata.mat';
save(savefile,'ldatest');
end
02
2.对ldastudy进行离散化(discretimage.m),得到离散化矩阵disdata,存入到imagedisdata.mat
%对整个数据集进行离散化,disattr需要离散化的属性,posattr为挑选出的属性重要度最大的属性,discretSet为离散化属性集
%disdata为离散化了的属性和决策属性组成的决策表,t为程序运行时间
t1=cputime;
load imageldastudydata;
%载入ldastudy数据
pstudy=ldastudy;
[row,col]=size(pstudy);
%初始化数据集的离散属性集
disattr=0;
discretSet=[];
ndiscretSet=size(discretSet,2);
%ndiscretSet等于discretSet向量的第二个值
lastdata=pstudy(:,col);
%为决策属性值
disdata=lastdata;
ppstudy=pstudy;
while ndiscretSet
ndiscretSet
disattr=disattr+1;
%求离散属性集属性重要度最大的属性
if isempty(discretSet)
%判断discretSet是否为空矩阵
posattr=[];
else
[posattr,tt]=calmaxpos(discretSet,disdata);
end
nd=size(disdata,2);
R= [posattr nd];
%求划分的等价类
%根据划分的等价类划分数据集
pset=partset(R,disdata,pstudy);
%用ncl聚类方法进行聚类
for i=1:size(pset,2)
Y=pset(:,1:col-1);
baseclass=ncl(pset(:,1:col-1),pstudy(:,1:col-1));
base=baseclass;
end
%求属性disattr的取值区间集合
d1=[];
for i=1:size(base,2)
for j=1:size(base,2)
if iscell(base)
%判断是否是cell array
if ~isempty(base)
%qj=calqj(disattr,base);
%求属性disattr在每个聚类的区间
qj=[min(base(:,disattr)) max(base(:,disattr))];
end
else
%qj=calqj(disattr,base);
qj=[min(base(:,disattr)) max(base(:,disattr))];
end
d1=[d1;qj];
end
end
%合并区间
d=mergeqj(d1);
%为每个区间编号
[m1,n1]=size(d);
disd=[d [1:m1]'];
%对每个区间按大小依次赋予离散化值1,2,3……
%对disattr属性进行离散化
valpca=pstudy(:,disattr);
for i=1:size(valpca)
for j=1:size(disd)
A=disd(j,:);
x=valpca(i);
if x==d(m1,2)
dispstudy(i,disattr)=m1;
%如果实值x是该属性的最大值,则把x离散化为最大值
elseif isinset(x,A)
dispstudy(i,disattr)=A(3);
%如果实值x属于区间A,则把x离散化为区间A对应的最大值
end
end
end
discretSet=[discretSet disattr];
%将属性disattr加入到离散化属性集discretSet中
ndiscretSet=size(discretSet,2);
%求属性集discretSet中属性的个数
disdata=[dispstudy(:,1:disattr) lastdata];
%将离散化的属性和决策属性组成决策表
end
%保存离散化的数据集disdata和时间t
savefile = 'imagedisdata.mat';
save(savefile, 'disdata')
t2=cputime;
t=t2-t1;
savefile1 = 'program_time.mat';
save(savefile1, 't')
03
3.将disdata组成决策表(savers.m),通过对disdata的条件属性进行约简,得到其一个约简,组成新的测试集rstest和训练集rsstudy存为imagersdata.mat
% %对决策表的条件属性进行约简(求核),得到约简后的数据集rsstudy,rstest
if study==1
load imageldastudydata; %载入ldastudy数据
end
if test==1
load imageldastudydata;
%载入ldastudy数据
load imageldatestdata;
%载入ldatest数据
end
%load imagepcadata
load imagedisdata;
%载入离散化数据
eta=0.02;
[row,col]=size(disdata);
lastdata=disdata(:,col);
[posattr,tt]=calmaxpos(1:col-1,disdata);
[T,S]=poscd(1:col-1,col,disdata);
%求条件属性相对于决策属性的属性重要度T
Y=[];
for i=1:size(tt,2)
if tt(i)~=0
Y=[Y i];
end
end
[t,s]=poscd(Y,col,disdata);
%求d的c正域
ty=setdiff(1:col-1,Y);
YY=[Y];
%将条件属性除去相对核约简集组成候选属性集,从候选属性集中挑选候选属性加入到相对核约简集,如果其组成的一个约简属性集的
%属性重要度大于相对核约简集的属性重要度,而且小于(1-eta)*T,则该属性加入,否则不加入
for j=1:size(ty,2)
YY=[YY ty(j)];
[tt,ss]=poscd(YY,col,disdata);
if tt>(1-eta)*T
YY=delattr(ty(j),YY);
end
%t=tt;
end
if study==1
rsstudy=[ldastudy(:,YY) lastdata];
end
if test==1
rstest=[ldatest(:,YY) lastdata];
end
% rsstudy=[pcastudy(:,YY) lastdata];
% rstest=[pcatest(:,YY) lastdata];
if study==1
savefile = 'imagersstudydata.mat';
save(savefile, 'rsstudy');
%'Y','YY'要不要存进去
end
if test==1
savefile = 'imagerstestdata.mat';
save(savefile,'rstest');
%'Y','YY'要不要存进去
end
04
4.对rsstudy进行模糊神经网络训练(savecul.m),对模糊神经网络的参数进行调整学习将其存入culdata.mat
%训练模糊神经网络,得到模糊神经网络的参数nm(所有类的聚类中心),nlen(所有类的聚类宽度),ny(所有类的实数后件)
load imagersstudydata %载入约简数据
rspcaclass=[rsstudy];
[row,col]=size(rspcaclass);
nclass=40;
%这个需要调整!
% nclass=30;
nm=cell(nclass,1);
nlen=cell(nclass,1);
ny=cell(nclass,1);
nstudy=cell(nclass,1);
nErrHistory=cell(nclass,1);
for j=1:nclass
A=rspcaclass(find(rspcaclass(:,col)==j), :);
%A1=rspcaclass(find(rspcaclass(:,col)~=j), :);
[nm,nlen,ny,nstudy,nErrHistory]=fnnlearn(A,1);
%[nm,nlen,ny,nstudy,nErrHistory]=fnnlearn(A1,0);
end
savefile = 'culdata.mat';
save(savefile, 'nm', 'nlen','ny','nstudy','nErrHistory');
05
5.用runfnn.m对rstest进行测试得到其识别率
%测试模糊神经网络的识别率
load culdata
%载入模糊神经网络参数数据
load imagerstestdata;
% 载入约简数据
cluster_n=2;
%聚类个数
%这个要研究!
pcaclass=[rstest];
nclass=40;
% 类别数
%这个需要调整!
[m,n]=size(pcaclass);
dimension=n-1;
count=0;
for i=1:10
x=pcaclass(i,1:n-1);
%计算40个模糊神经网络分类器的输出
for j=1:nclass
su=calu(x,nm,nlen,cluster_n,dimension);
p(j)=calout(su,ny);
end
%得到输出最大的分类器
%返回向量X中最大元素所在的位置
for index=1:size(p,2)
if p(index)==max(p)
k=index;
end
end
figure;
A=imshow(strcat('image-base\s',int2str(k),'_',int2str(1),'.bmp'));
% %如果输出最大的分类器就是期望的分类器,则识别正确,否则识别错误
%if k==pcaclass(i,n)
%count=count+1;
%else
% % p
% % [pcaclass(i,n) k]
%end
end
% % disp('在整个学习集和测试集上的识别率为:');
% shibielv=count/m;
% shibielv
% % t2=cputime;
% % t=t2-t1;
具体仿真程序链接,微信公众号回复【人脸识别】即可获得链接。
未
完
待
续
领取专属 10元无门槛券
私享最新 技术干货