基于MATLAB的人脸朝向识别.docx
- 文档编号:3553105
- 上传时间:2023-05-06
- 格式:DOCX
- 页数:14
- 大小:17.35KB
基于MATLAB的人脸朝向识别.docx
《基于MATLAB的人脸朝向识别.docx》由会员分享,可在线阅读,更多相关《基于MATLAB的人脸朝向识别.docx(14页珍藏版)》请在冰点文库上搜索。
基于MATLAB的人脸朝向识别
clearall
clc;
%%人脸特征向量提取
%人数
M=10;
%人脸朝向类别数
N=5;
%特征向量提取
pixel_value=feature_extraction(M,N);
%%训练集/测试集产生
%产生图像序号的随机序列
rand_label=randperm(M*N);
%人脸朝向标号
direction_label=repmat(1:
N,1,M);
%训练集
train_label=rand_label(1:
30);
P_train=pixel_value(train_label,:
)';
Tc_train=direction_label(train_label);
T_train=ind2vec(Tc_train);
%测试集
test_label=rand_label(31:
end);
P_test=pixel_value(test_label,:
)';
Tc_test=direction_label(test_label);
%%K-fold交叉验证确定最佳神经元个数
k_fold=10;
Indices=crossvalind('Kfold',size(P_train,2),k_fold);
error_min=10e10;
best_number=1;
best_input=[];
best_output=[];
best_train_set_index=[];
best_validation_set_index=[];
h=waitbar(0,'正在寻找最佳神经元个数.....');
fori=1:
k_fold
%验证集标号
validation_set_index=(Indices==i);
%训练集标号
train_set_index=~validation_set_index;
%验证集
validation_set_input=P_train(:
validation_set_index);
validation_set_output=T_train(:
validation_set_index);
%训练集
train_set_input=P_train(:
train_set_index);
train_set_output=T_train(:
train_set_index);
fornumber=10:
30
forj=1:
5
rate{j}=length(find(Tc_train(:
train_set_index)==j))/length(find(train_set_index==1));
end
net=newlvq(minmax(train_set_input),number,cell2mat(rate));
%设置网络参数
net.trainParam.epochs=100;
net.trainParam.show=10;
net.trainParam.lr=0.1;
net.trainParam.goal=0.001;
%训练网络
net=train(net,train_set_input,train_set_output);
waitbar(((i-1)*21+number)/219,h);
%%仿真测试
T_sim=sim(net,validation_set_input);
Tc_sim=vec2ind(T_sim);
error=length(find(Tc_sim~=Tc_train(:
validation_set_index)));
iferror error_min=error; best_number=number; best_input=train_set_input; best_output=train_set_output; best_train_set_index=train_set_index; best_validation_set_index=validation_set_index; end end end disp(['经过交叉验证,得到的最佳神经元个数为: 'num2str(best_number)]); close(h); %%创建LVQ网络 fori=1: 5 rate{i}=length(find(Tc_train(: best_train_set_index)==i))/length(find(best_train_set_index==1)); end net=newlvq(minmax(best_input),best_number,cell2mat(rate),0.01); %设置训练参数 net.trainParam.epochs=100; net.trainParam.goal=0.001; net.trainParam.lr=0.1; %%训练网络 net=train(net,best_input,best_output); %%人脸识别测试 T_sim=sim(net,P_test); Tc_sim=vec2ind(T_sim); result=[Tc_test;Tc_sim] %%结果显示 %训练集人脸标号 strain_label=sort(train_label(best_train_set_index)); htrain_label=ceil(strain_label/N); %训练集人脸朝向标号 dtrain_label=strain_label-floor(strain_label/N)*N; dtrain_label(dtrain_label==0)=N; %显示训练集图像序号 disp('训练集图像为: '); fori=1: length(find(best_train_set_index==1)) str_train=[num2str(htrain_label(i))'_'... num2str(dtrain_label(i))'']; fprintf('%s',str_train) ifmod(i,5)==0 fprintf('\n'); end end %验证集人脸标号 svalidation_label=sort(train_label(best_validation_set_index)); hvalidation_label=ceil(svalidation_label/N); %验证集人脸朝向标号 dvalidation_label=svalidation_label-floor(svalidation_label/N)*N; dvalidation_label(dvalidation_label==0)=N; %显示验证集图像序号 fprintf('\n'); disp('验证集图像为: '); fori=1: length(find(best_validation_set_index==1)) str_validation=[num2str(hvalidation_label(i))'_'... num2str(dvalidation_label(i))'']; fprintf('%s',str_validation) ifmod(i,5)==0 fprintf('\n'); end end %测试集人脸标号 stest_label=sort(test_label); htest_label=ceil(stest_label/N); %测试集人脸朝向标号 dtest_label=stest_label-floor(stest_label/N)*N; dtest_label(dtest_label==0)=N; %显示测试集图像序号 fprintf('\n'); disp('测试集图像为: '); fori=1: 20 str_test=[num2str(htest_label(i))'_'... num2str(dtest_label(i))'']; fprintf('%s',str_test) ifmod(i,5)==0 fprintf('\n'); end end %显示识别出错图像 error=Tc_sim-Tc_test; location={'左方''左前方''前方''右前方''右方'}; fori=1: length(error) iferror(i)~=0 %识别出错图像人脸标号 herror_label=ceil(test_label(i)/N); %识别出错图像人脸朝向标号 derror_label=test_label(i)-floor(test_label(i)/N)*N; derror_label(derror_label==0)=N; %图像原始朝向 standard=location{Tc_test(i)}; %图像识别结果朝向 identify=location{Tc_sim(i)}; str_err=strcat(['图像'num2str(herror_label)'_'... num2str(derror_label)'识别出错.']); disp([str_err'(正确结果: 朝向'standard... ';识别结果: 朝向'identify')']); end end %显示识别率 disp(['识别率为: 'num2str(length(find(error==0))/20*100)'%']); %特征提取子函数 functionpixel_value=feature_extraction(m,n) pixel_value=zeros(50,8); sample_number=0; fori=1: m forj=1: n str=strcat('Images\',num2str(i),'_',num2str(j),'.bmp'); img=imread(str); [rowscols]=size(img); img_edge=edge(img,'Sobel'); sub_rows=floor(rows/6); sub_cols=floor(cols/8); sample_number=sample_number+1; forsubblock_i=1: 8 forii=sub_rows+1: 2*sub_rows forjj=(subblock_i-1)*sub_cols+1: subblock_i*sub_cols pixel_value(sample_number,subblock_i)=... pixel_value(sample_number,subblock_i)+img_edge(ii,jj); end end end end end function[w1,w2]=lvq1_train(P,Tc,Num_Compet,pc,lr,maxiter) %%初始化权系数矩阵 %输入层与竞争层之间权值 bound=minmax(P); w1=repmat(mean(bound,2)',Num_Compet,1); %竞争层与输出层之间权值 Num_Output=length(pc); pc=pc(: ); indices=[0;floor(cumsum(pc)*Num_Compet)]; w2=zeros(Num_Output,Num_Compet); fori=1: Num_Output w2(i,(indices(i)+1): indices(i+1))=1; end %%迭代计算 n=size(P,2); fork=1: maxiter fori=1: n d=zeros(Num_Compet,1); forj=1: Num_Compet d(j)=sqrt(sse(w1(j,: )'-P(: i))); end [min_d,index]=min(d); n1=compet(-1*d); n2=purelin(w2*n1); ifisequal(Tc(i),vec2ind(n2)); w1(index,: )=w1(index,: )+lr*(P(: i)'-w1(index,: )); else w1(index,: )=w1(index,: )-lr*(P(: i)'-w1(index,: )); end end end function[w1,w2]=lvq2_train(P,Tc,Num_Compet,lr,maxiter,w1,w2) %%迭代计算 n=size(P,2); fork=1: maxiter fori=1: n %计算各个竞争层神经元与当前输入向量的距离 d=zeros(Num_Compet,1); forj=1: Num_Compet d(j)=sqrt(sse(w1(j,: )'-P(: i))); end %寻找与当前输入向量距离最小的竞争层神经元标号,记为index1 [min_d1,index1]=min(d); %计算与index1相连接的输出神经元对应的类别 a1_1=compet(-1*d); n2_1=purelin(w2*a1_1); a2_1=vec2ind(n2_1); %寻找与当前输入向量距离次小的竞争层神经元标号,记为index2 d(index1)=inf; [min_d2,index2]=min(d); %计算与index2相连接的输出神经元对应的类别 a1_2=compet(-1*d); n2_2=purelin(w2*a1_2); a2_2=vec2ind(n2_2); %判断两个竞争层神经元对应的类别是否相等 flag1=isequal(a2_1,a2_2); flag2=min_d1/min_d2>0.6; if~flag1&&flag2 ifisequal(Tc(i),a2_1) w1(index1,: )=w1(index1,: )+lr*(P(: i)'-w1(index1,: )); w1(index2,: )=w1(index2,: )-lr*(P(: i)'-w1(index2,: )); else w1(index1,: )=w1(index1,: )-lr*(P(: i)'-w1(index1,: )); w1(index2,: )=w1(index2,: )+lr*(P(: i)'-w1(index2,: )); end else w1(index1,: )=w1(index1,: )+lr*(P(: i)'-w1(index1,: )); end end end functionresult=lvq_predict(P,Tc,Num_Compet,w1,w2) n=size(P,2); result=zeros(2,n); result(1,: )=Tc; fori=1: n d=zeros(Num_Compet,1); forj=1: Num_Compet d(j)=sqrt(sse(w1(j,: )'-P(: i))); end n1=compet(-1*d); n2=purelin(w2*n1); result(2,i)=vec2ind(n2); end Num_Correct=length(find(result(2,: )==Tc)); accuracy=Num_Correct/n; disp(['accuracy='num2str(accuracy*100)'%('num2str(Num_Correct)'/'num2str(n)')']); %%清除环境变量 clearall clc; %%人脸特征向量提取 %人数 M=10; %人脸朝向类别数 N=5; %特征向量提取 pixel_value=feature_extraction(M,N); %%训练集/测试集产生 %产生图像序号的随机序列 rand_label=randperm(M*N); %人脸朝向标号 direction_label=repmat(1: N,1,M); %训练集 train_label=rand_label(1: 30); P_train=pixel_value(train_label,: )'; Tc_train=direction_label(train_label); %测试集 test_label=rand_label(31: end); P_test=pixel_value(test_label,: )'; Tc_test=direction_label(test_label); %%计算PC fori=1: 5 rate{i}=length(find(Tc_train==i))/30; end %%LVQ1算法 [w1,w2]=lvq1_train(P_train,Tc_train,20,cell2mat(rate),0.01,5); result_1=lvq_predict(P_test,Tc_test,20,w1,w2); %%LVQ2算法 [w1,w2]=lvq2_train(P_train,Tc_train,20,0.01,5,w1,w2); result_2=lvq_predict(P_test,Tc_test,20,w1,w2); %%清除环境变量 clearall clc; %%人脸特征向量提取 %人数 M=10; %人脸朝向类别数 N=5; %特征向量提取 pixel_value=feature_extraction(M,N); %%训练集/测试集产生 %产生图像序号的随机序列 rand_label=randperm(M*N); %人脸朝向标号 direction_label=[100;110;010;011;001]; %训练集 train_label=rand_label(1: 30); P_train=pixel_value(train_label,: )'; dtrain_label=train_label-floor(train_label/N)*N; dtrain_label(dtrain_label==0)=N; T_train=direction_label(dtrain_label,: )'; %测试集 test_label=rand_label(31: end); P_test=pixel_value(test_label,: )'; dtest_label=test_label-floor(test_label/N)*N; dtest_label(dtest_label==0)=N; T_test=direction_label(dtest_label,: )' %%创建BP网络 net=newff(minmax(P_train),[10,3],{'tansig','purelin'},'trainlm'); %设置训练参数 net.trainParam.epochs=1000; net.trainParam.show=10; net.trainParam.goal=1e-3; net.trainParam.lr=0.1; %%网络训练 net=train(net,P_train,T_train); %%仿真测试 T_sim=sim(net,P_test); fori=1: 3 forj=1: 20 ifT_sim(i,j)<0.5 T_sim(i,j)=0; else T_sim(i,j)=1; end end end T_sim T_test
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 MATLAB 朝向 识别