发布时间 : 星期日 文章基于BP神经网络的人脸识别更新完毕开始阅读5e4c5b6ba98271fe910ef94f
Dcsum=sum(Dcsort); Dcsum_extract=0; k=0;
while(Dcsum_extract/Dcsum<0.95) k=k+1;
Dcsum_extract=sum(Dcsort(1:k)); end
%temp是由前k个最大的非0特征值对应的特征向量组成的 i=1; temp=[]; while(i<=k)
temp(:,i)=Dcsort(i)^(-1/2)*Vcsort(:,i); i=i+1; end
whiteningmatrix=temp';%用于白化数据的白化矩阵,whiteningmatrix是8x20 %用快速ICA算法求分离矩阵w(迭代50次) whitesig=whiteningmatrix*imgsig; X=whitesig;%X是8x10304
[vectorsize,numsamples]=size(X); B=zeros(vectorsize);%B是8x8 numofic=vectorsize;%numofic是8 for r=1:numofic i=1;
maxnumiterations=50;%设置最大的迭代次数 w=rand(vectorsize,1)-.5;%随机设置初始值 w=w/norm(w);%初始化w(0),令其模为1 while i<=maxnumiterations+1 w=w-B*B'*w; w=w/norm(w);
w=(X*((X'*w).^3))/numsamples-3*w; w=w/norm(w); i=i+1; end
W(r,:)=w'*whiteningmatrix;%W(r,:)是1x20 B(:,r)=w; end
%求原信号
icaproject=W*sig*sig';%独立成分,W是8x40,icaproject是8x40,icaproject的每一列表示一幅图像的特征值 wica=W*sig;%投影空间 BP神经网络程序:
function res=bpnet(TestDatabasePath,TrainDatabasePath)
%先设置人脸图片库所在的路径,调用特征提取函数bpFeatureExtract,将所有人
脸在特征脸上的投影p提取出来
imagepath=strcat(TrainDatabasePath,'\\'); [p,wica]=bpFeatureExtract(imagepath);
%把p归一化到[-1 +1],然后作为神经网络的输入 p=premnmx(p')';
t=[1 0 0 0;1 0 0 0;1 0 0 0;1 0 0 0;1 0 0 0;0 1 0 0;0 1 0 0;0 1 0 0;0 1 0 0;0 1 0 0;
0 0 1 0;0 0 1 0;0 0 1 0;0 0 1 0;0 0 1 0;0 0 0 1;0 0 0 1;0 0 0 1;0 0 0 1;0 0 0 1]';%神经网络的理论输出值
%设计神经网路 [prow pcol]=size(p);
num=prow*pcol;%提取p中元素个数作为神经网络的输入层神经元个数
net=newff(minmax(p),[num,10,4],{'tansig','tansig','purelin'},'traingda');%隐层神经元个数为10,输出层神经元个数为4,4表示识别出两个人 net.trainParam.show=200;%显示速率为200 net.trainParam.lr=0.01;%学习率为0.01
net.trainParam.epochs=5000;%迭代次数不超过5000 net.trainParam.goal=0.001;%训练误差为0.001 [net,tr]=train(net,p,t); %用神经网络识别
imgtest=imread(strcat(TestDatabasePath,'\\test.jpg')); [row col]=size(imgtest); % 获得行数和列数 imgtest=reshape(imgtest,1,row*col); sig=double(imgtest); imgtest=sig;
%把待测试图像imgtest在子空间上投影
projectcoeftest=wica*(imgtest)';%projectcoeftest是8x1
ptest=premnmx(projectcoeftest);%把投影值projectcoeftest归一化到[-1 +1],然后作为神经网络的输入 %仿真
result=sim(net,ptest)
%显示识别出的人名信息 if result(1,1)>0.9
res='This is Edward'; elseif result(2,1)>0.9 res='This is George'; elseif result(3,1)>0.9 res='This is Frank'; elseif result(4,1)>0.9 res='This is Henry'; else res='This is strange'; end
选择训练图像库的路径
训练图像
训练结果
这是图像训练库外的人