您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 基于BP神经网络的人脸识别
基于BP神经网络的人脸识别学生:林仙土学号:S071954摘要:人脸自动识别技术有着广阔的应用领域,本文提出用主成分分析和BP神经网络进行人脸识别。人脸识别包括两个部分:第一,特征提取;第二,神经网络进行识别。关键词:BP神经网络人脸识别主成分分析本系统采用20幅图像(4个人每人5幅)作为训练图像,应用主成分分析对训练图像进行二阶相关和降维,提取训练图像的独立基成分构造人脸子空间,并将训练集中的人脸图像向独立基上投影得到的系数输入改进的BP神经网络进行训练。然后将待识别的人脸图像向独立基上投影得到投影系数,再将其输入已训练过的BP神经网络进行识别。此方法对人脸库图像进行测试,识别率达到90%以上。本系统采用MATLAB编程,并运用了其中的GUI编程实现人机交互。为在不同机子下顺利运行,本系统用uigetdir函数让用户选择训练图像库和待识别图像,使得待识别图像可在不同位置皆可让软件识别。注意:待识别图像的名字必须是test.jpg。系统界面:程序:functionvarargout=BP(varargin)gui_Singleton=1;gui_State=struct('gui_Name',mfilename,...'gui_Singleton',gui_Singleton,...'gui_OpeningFcn',@BP_OpeningFcn,...'gui_OutputFcn',@BP_OutputFcn,...'gui_LayoutFcn',[],...'gui_Callback',[]);ifnargin&&ischar(varargin{1})gui_State.gui_Callback=str2func(varargin{1});endifnargout[varargout{1:nargout}]=gui_mainfcn(gui_State,varargin{:});elsegui_mainfcn(gui_State,varargin{:});endfunctionBP_OpeningFcn(hObject,eventdata,handles,varargin)handles.output=hObject;guidata(hObject,handles);%UIWAITmakesBPwaitforuserresponse(seeUIRESUME)%uiwait(handles.figure1);%---Outputsfromthisfunctionarereturnedtothecommandline.functionvarargout=BP_OutputFcn(hObject,eventdata,handles)%varargoutcellarrayforreturningoutputargs(seeVARARGOUT);%hObjecthandletofigure%eventdatareserved-tobedefinedinafutureversionofMATLAB%handlesstructurewithhandlesanduserdata(seeGUIDATA)%Getdefaultcommandlineoutputfromhandlesstructurevarargout{1}=handles.output;%---Executesonbuttonpressininput.functioninput_Callback(hObject,eventdata,handles)%hObjecthandletoinput(seeGCBO)%eventdatareserved-tobedefinedinafutureversionofMATLAB%handlesstructurewithhandlesanduserdata(seeGUIDATA)globalTestDatabasePathTestDatabasePath=uigetdir('D:\','Selecttestdatabasepath');axes(handles.axes1);a=imread(strcat(TestDatabasePath,'\test.jpg'));imshow(a)set(handles.text1,'string','imageforrecognition')%---Executesonbuttonpressinrecognise.functionrecognise_Callback(hObject,eventdata,handles)%hObjecthandletorecognise(seeGCBO)%eventdatareserved-tobedefinedinafutureversionofMATLAB%handlesstructurewithhandlesanduserdata(seeGUIDATA)TrainDatabasePath=uigetdir('D:\','Selecttrainingdatabasepath');globalTestDatabasePathvalue=bpnet(TestDatabasePath,TrainDatabasePath)set(handles.text2,'string',value)载入选择图像路径载入图像特征提取程序:function[icaproject,wica]=bpFeatureExtract(imagepath)%用于训练的图片数量Count=20;%图像格式为.jpg;S=[];%用于存储20幅图像的矩阵fori=1:Countstr=strcat(imagepath,int2str(i),'.jpg');%把两个字符串连接起来组成图像名eval('img=imread(str);');[rowcol]=size(img);%获得一幅图像的行数N1和列数N2temp=reshape(img,row*col,1);%产生一个(N1*N2)x1matrixS=[Stemp];%SisaN1*N2xMmatrixendsig=double(S');%sig是MxN1*N2matrix%对sig矩阵去均值处理sigmean=mean(sig);%对每一列取均值,imgsig是20x10304fori=1:size(sig)imgsig(i,:)=sig(i,:)-sigmean;end%对去均值的数据进行白化处理covariancematrix=cov(imgsig',1);%covariancematrix是20x20矩阵[E,D]=eig(covariancematrix);%E和D是20x20矩阵%去掉值为0的特征值v=[];d=[];fori=1:size(E,2)if(D(i,i)0)v=[vE(:,i)];d=[dD(i,i)];endend%将特征值由大到小排序,特征值对应的特征向量也作相应的排序Dccol=d;Vc=v;%从小到大排序[DcsortDcindex]=sort(Dccol);%Vc的列数DcCols=size(Vc,2);%反序fori=1:DcColsVcsort(:,i)=Vc(:,Dcindex(DcCols-i+1));Dcsort(i)=Dccol(Dcindex(DcCols-i+1));end%取前k个最大特征值对应的特征向量,保留95%的能量,此时k=8Dcsum=sum(Dcsort);Dcsum_extract=0;k=0;while(Dcsum_extract/Dcsum0.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;endwhiteningmatrix=temp';%用于白化数据的白化矩阵,whiteningmatrix是8x20%用快速ICA算法求分离矩阵w(迭代50次)whitesig=whiteningmatrix*imgsig;X=whitesig;%X是8x10304[vectorsize,numsamples]=size(X);B=zeros(vectorsize);%B是8x8numofic=vectorsize;%numofic是8forr=1:numofici=1;maxnumiterations=50;%设置最大的迭代次数w=rand(vectorsize,1)-.5;%随机设置初始值w=w/norm(w);%初始化w(0),令其模为1whilei=maxnumiterations+1w=w-B*B'*w;w=w/norm(w);w=(X*((X'*w).^3))/numsamples-3*w;w=w/norm(w);i=i+1;endW(r,:)=w'*whiteningmatrix;%W(r,:)是1x20B(:,r)=w;end%求原信号icaproject=W*sig*sig';%独立成分,W是8x40,icaproject是8x40,icaproject的每一列表示一幅图像的特征值wica=W*sig;%投影空间BP神经网络程序:functionres=bpnet(TestDatabasePath,TrainDatabasePath)%先设置人脸图片库所在的路径,调用特征提取函数bpFeatureExtract,将所有人脸在特征脸上的投影p提取出来imagepath=strcat(TrainDatabasePath,'\');[p,wica]=bpFeatureExtract(imagepath);%把p归一化到[-1+1],然后作为神经网络的输入p=premnmx(p')';t=[1000;1000;1000;1000;1000;0100;0100;0100;0100;0100;0010;0010;0010;0010;0010;0001;0001;0001;0001;0001]';%神经网络的理论输出值%设计神经网路[prowpcol]=size(p);num=prow*pcol;%提取p中元素个数作为神经网络的输入层神经元个数net=newff(minmax(p),[num,10,4],{'tansig','tansig','purelin'},'traingda');%隐层神经元个数为10,输出层神经元个数为4,4表示识别出两个人net.trainParam.show=200;%显示速率为200net.trainParam.lr=0.01;%学习率为0.01net.trainParam.epochs=5000;%迭代次数不超过5000net.trainParam.goal=0.001;%训练误差为0.001[net,tr]=train(net,p,t);%用神经网络识别imgtest=imread(strcat(TestDatabasePath,'\test.jpg'));[rowcol]=size(imgtest);%获得行数和列数imgtest=reshape(imgtest,1,row*col);sig=double(imgtest);imgtest=sig;%把待测试图像imgtest在子空间上投影projectcoeftest=wica*(imgtest)';%projectcoeftest是8x1ptest=premnmx(projectcoeftest);%把投影值projectcoeftest归一化到[-1+1],然后作为神经网络的输入%仿真result=sim(net,ptest)%显示识别出的人名信息ifresult(1,1)0.9res='ThisisEdward';elseifresult(2,1)0.9res='ThisisGeorge';elseifresult(3,1)0.9res='This
本文标题:基于BP神经网络的人脸识别
链接地址:https://www.777doc.com/doc-4221861 .html