bp神经网络数字识别matlab_MATLAB基于PCALDA模糊神经网络的人脸识别

点击上方蓝字关注“公众号”

9671f0bd4a0575c62d7602f40e47650e.gif

MATLAB基于PCA-LDA模糊神经网络的人脸识别

基于PCA-LDA和粗糙集模糊神经网络的人脸识别,一方面在应用前景上是十分广阔的,可以为IT行业创造更好的经济效益。

另一方面,它相对于其它的生物特征识别更加方便。

至于环境方面,人脸识别对环境并没有什么影响。

d24154cf70bf4c78b0031d1fc2804ddc.gif

图像获取功能:该模块的功能是从图像库中获取图片,获取的图像必须能够在开发环境中可以显示,以便进行图像的处理和识别。

图像预处理功能:该模块的功能包括图像光线强弱的补偿,图像的灰度化处理,去噪,均衡化后的直方图,以此达到图像对比后增强的目的。

d24154cf70bf4c78b0031d1fc2804ddc.gif

图像特征提取功能:改模块的功能是在处理后的图像进行训练,然后将训练后的图像的眼睛,鼻子,嘴巴等生物特征提取出来。

图像识别功能:该模块部分是将需要进行检测的图像的特征提取出来与数据库的图像的特征进行比较,以此达到人脸识别的功能。

88540b9542b3f18b81ee2c587cf2fecd.gif a453228c1fa7c66f069a03de924a47a0.png 471f17868ceacf053ab50ade3662177c.png

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

513b46884ccef1010d647b16b1e8750e.gif

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{i}(:,1:col-1);
baseclass=ncl(pset{i}(:,1:col-1),pstudy(:,1:col-1));
base{i}=baseclass;
end
%求属性disattr的取值区间集合
d1=[];
for i=1:size(base,2)
for j=1:size(base{i},2)  
if iscell(base{i})             
%判断是否是cell array
if ~isempty(base{i}{j})
%qj=calqj(disattr,base{i}{j});
%求属性disattr在每个聚类的区间
qj=[min(base{i}{j}(:,disattr)) max(base{i}{j}(:,disattr))];
end
else
%qj=calqj(disattr,base{i});
qj=[min(base{i}(:,disattr)) max(base{i}(:,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{j},nlen{j},ny{j},nstudy{j},nErrHistory{j}]=fnnlearn(A,1);
%[nm{j},nlen{j},ny{j},nstudy{j},nErrHistory{j}]=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{j},nlen{j},cluster_n,dimension);
p(j)=calout(su,ny{j});
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;

6f57a35e6774782e0da11cc68804117c.png

6dc8fb3666e7882f03b5216db79d4549.png

7343e4cde67c5dbc0a54e06fe49958fb.gif

具体仿真程序链接,微信公众号回复【人脸识别】即可获得链接。

未完待续

扫码关注

不迷路

e7dbe946e20413a0543e20d013363221.gif

现在我们回到LDA的原理上,我们在第一节说讲到了LDA希望投影后希望同一种类别数据的投影点尽可能的接近,而不同类别的数据的类别中心之间的距离尽可能的大,但是这只是一个感官的度量。现在我们首先从比较简单的二类LDA入手,严谨的分析LDA的原理。     假设我们的数据集D={(x1,y1),(x2,y2),...,((xm,ym))}D={(x1,y1),(x2,y2),...,((xm,ym))},其中任意样本xixi为n维向量,yi∈{0,1}yi∈{0,1}。我们定义Nj(j=0,1)Nj(j=0,1)为第j类样本的个数,Xj(j=0,1)Xj(j=0,1)为第j类样本的集合,而μj(j=0,1)μj(j=0,1)为第j类样本的均值向量,定义Σj(j=0,1)Σj(j=0,1)为第j类样本的协方差矩阵(严格说是缺少分母部分的协方差矩阵)。     μjμj的表达式为: μj=1Nj∑x∈Xjx(j=0,1) μj=1Nj∑x∈Xjx(j=0,1)     ΣjΣj的表达式为: Σj=∑x∈Xj(x−μj)(x−μj)T(j=0,1) Σj=∑x∈Xj(x−μj)(x−μj)T(j=0,1)     由于是两类数据,因此我们只需要将数据投影到一条直线上即可。假设我们的投影直线是向量ww,则对任意一个样本本xixi,它在直线ww的投影为wTxiwTxi,对于我们的两个类别的中心点μ0,μ1μ0,μ1,在在直线ww的投影为wTμ0wTμ0和wTμ1wTμ1。由于LDA需要让不同类别的数据的类别中心之间的距离尽可能的大,也就是我们要最大化||wTμ0−wTμ1||22||wTμ0−wTμ1||22,同时我们希望同一种类别数据的投影点尽可能的接近,也就是要同类样本投影点的协方差wTΣ0wwTΣ0w和wTΣ1wwTΣ1w尽可能的小,即最小化wTΣ0w+wTΣ1wwTΣ0w+wTΣ1w。综上所述,我们的优化目标为: argmaxwJ(w)=||wTμ0−wTμ1||22wTΣ0w+wTΣ1w=wT(μ0−μ1)(μ0−μ1)TwwT(Σ0+Σ1)w argmax⏟wJ(w)=||wTμ0−wTμ1||22wTΣ0w+wTΣ1w=wT(μ0−μ1)(μ0−μ1)TwwT(Σ0+Σ1)w     我们一般定义类内散度矩阵SwSw为: Sw=Σ0+Σ1=∑x∈X0(x−μ0)(x−μ0)T+∑x∈X1(x−μ1)(x−μ1)T Sw=Σ0+Σ1=∑x∈X0(x−μ0)(x−μ0)T+∑x∈X1(x−μ1)(x−μ1)T     同时定义类间散度矩阵SbSb为: Sb=(μ0−μ1)(μ0−μ1)T Sb=(μ0−μ1)(μ0−μ1)T     这样我们的优化目标重写为: argmaxwJ(w)=wTSbwwTSww argmax⏟wJ(w)=wTSbwwTSww     仔细一看上式,这不就是我们的广义瑞利商嘛!这就简单了,利用我们第二节讲到的广义瑞利商的性质,我们知道我们的J(w)J(w)最大值为矩阵S−12wSbS−12wSw−12SbSw−12的最大特征值,而对应的ww为S−12wSbS−12wSw−12SbSw−12的最大特征值对应的特征向量! 而S−1wSbSw−1Sb的特征值和S−12wSbS−12wSw−12SbSw−12的特征值相同,S−1wSbSw−1Sb的特征向量w′w′和S−12wSbS−12wSw−12SbSw−12的特征向量ww满足w′=S−12www′=Sw−12w的关系!     注意到对于二类的时候,SbwSbw的方向恒为μ0−μ1μ0−μ1,不妨令Sbw=λ(μ0−μ1)Sbw=λ(μ0−μ1),将其带入:(S−1wSb)w=λw(Sw−1Sb)w=λw,可以得到w=S−1w(μ0−μ1)w=Sw−1(μ0−μ1), 也就是说我们只要求出原始二类样本的均值和方差就可以确定最佳的投影方向ww了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值