基于BP神经网络的人脸识别 联系客服

发布时间 : 星期日 文章基于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

选择训练图像库的路径

训练图像

训练结果

这是图像训练库外的人