基于LVQBPSVM神经网络算法人脸朝向识别.docx
《基于LVQBPSVM神经网络算法人脸朝向识别.docx》由会员分享,可在线阅读,更多相关《基于LVQBPSVM神经网络算法人脸朝向识别.docx(23页珍藏版)》请在冰豆网上搜索。
基于LVQBPSVM神经网络算法人脸朝向识别
人脸朝向识别
1.1案例背景
1.1.1人脸识别概述
人脸识别作为一个复杂的模式识别问题,近年来受到了广泛的关注,识别领域的各种方法在这个问题上各显所长,而且发展出了许多新方法,大大丰富和拓宽了模式识别的方向。
人脸识别、检测、跟踪、特征定位等技术近年来一直是研究的热点。
人脸识别是人脸应用研究中重要的第一步,目的是从图像中分割出不包括背景的人脸区域。
由于人脸形状的不规则性以及光线和背景条件多样性,现有的人脸研究算法都是在试图解决某些特定实验环境下的一些具体问题,对人脸位置和状态都有一定的要求。
而在实际应用中,大量图像和视频源中人脸的位置、朝向和旋转角度都不是固定的,这就大大增加了人脸识别的难度。
在人脸识别领域的众多研究方向中,人脸朝向分析一直是一个少有人涉及的领域。
在以往的研究成果中,一些研究者谈及了人脸朝向问题,但其中绝大多数都是希望在人脸识别过程中去除人脸水平旋转对识别过程的不良影响。
但是,实际问题要复杂得多,人脸朝向是一个无法回避的问题。
因此,对于人脸朝向的判断和识别,将会是一件非常有意义的工作。
1.1.2问题描述
现采集到一组人脸朝向不同角度时的图像,图像来自不同的10个人,每人5幅图像,人脸的朝向分别为:
左方、左前方、前方、右前方和右方,如图1所示。
试创建一个LVQ神经网络,对任意给出的人脸图像进行朝向预测和识别。
图1人脸识别图像
1.2模型建立
1.2.2设计思路
通过观察不难发现,当人脸面朝不同方向时,眼睛在图像中的位置差别较大。
因此,可以考虑将图片中描述眼睛位置的特征信息提取出来作为LVQ神经网络的输入,5个朝向分别用1,2,3,4,5表示,作为LVQ神经网络的输出。
通过对训练集的图像进行训练,得到具有预测功能的网络,便可以对任意给出的人脸图像进行朝向判断和识别。
1.2.3设计步骤
根据上述设计思路,设计步骤主要包括以下几个部分,如图1-2所示。
图1-2设计步骤流程图
1.人脸特征向量提取
如设计思路中所述,当人脸朝向不同时,眼睛在图像中的位置会有明显的差别。
因此,只需要将描述人眼位置信息的特征向量提取出来即可。
方法是将整幅图像划分成6行8列,人眼的位置信息可以用第2行的8个子矩阵来描述(注意:
针对不同大小的图像,划分的网格需稍作修改),边缘检测后8个子矩阵中的值为“1”的像素点个数与人脸朝向有直接关系,只要分别统计出第2行的8个子矩阵中的值为“1”的像素点个数即可。
2.训练集/测试集产生
为了保证训练集数据的随机性,随机选取图像库中的30幅人脸图像提取出的特征向量作为训练集数据,剩余的20幅人脸图像提取出来的特征向量作为测试集数据。
3.LVQ网络创建
LVQ神经网络的优点是不需要将输入向量进行归一化、正交化,利用MATLAB自带的神经网络工具箱函数newlvq()可以构建一个Lvo神经网络,关于该函数的用法及说明在第26章中已作详细说明,此处不再赘述。
4.LVQ网络训练
网络创建完毕后,便可以将训练集输入向量送入到网络中,利用Lv01或LVQ2算法对网络的权值进行调整,直到满足训练要求迭代终止。
5.人脸识别测试
网络训练收敛后,便可以对测试集数据进行预测,即对测试集的图像进行人脸朝向识别。
对于任意给出的图像,只需要将其特征向量提取出来,便可对其进行识别。
1.3MATLAB实现
利用MATLAB神经网络工具箱提供的函数可以方便地在MATLAB环境下实现上述设计步骤。
1.3.1清空环境变量
程序运行之前,清除工作空间(workspace)中的变量及命令窗口(commandwindow)中的命令。
具体程序为:
%%清空环境变量
clearall
clc
1.3.2人脸特征向量提取
如设计步骤中所述,人脸特征向量提取的任务是将图像中描述人眼位置的信息提取出来,即统计出划分网格第2行的8个子矩阵中的值为“1”的像素点个数。
具体实现程序如下:
%%人脸特征向量提取
%人数
M=10;
%人脸朝向类别数
N=5:
%特征向量提取
pixel_value=feature_extraction(M,N);
其中,feature_extraction为人脸特征向量提取子函数,feature_extraction.m的程序代码为:
functionpixel_value=feature—extraction(m,n)
pixel_value=zeros(50,8);
sample_number=0;
fori=1:
m
forj=l:
n
str=strcat(’Images’,num2str(i),'_',num2str(j),’.bmp’);
img=imread(str);
[rowscols]=size(img);
img_edge=edge(img,‘Sobel’);
subrows=floor(rows/6);
subLcols=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
说明:
①人脸图像库的图片放在文件名为Images的文件夹中,图片的命名规则为“1-J.bmp”,其中,i表示人的编号,j表示人脸朝向的编号,这里,i-l,2,…,10;j=l,2,…,5。
②函数strcat()的作用是将字符串进行水平连接,具体用法可以查看Help帮助文档。
③函数imread()用于将图片转换成对应的矩阵。
④edge()是边缘提取函数,其参数“Sobel”是边缘提取算子。
1.3.3训练集/测试集产生
图像库中所有图片的特征向量提取出来以后,随机将其分成两组,分别作为训练集和测试集。
其中,训练集包含30个不同人脸朝向的图片的特征向量,测试集为剩余的20个不同人脸朝向的图片的特征向量。
具体程序如下:
%%训练集/测试集产生
%产生图像序号的随机序列
rand-label=randperIn(M*N);
%人脸朝向标号
direction_label=repmat(l:
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);
%测试集
f:
test—label=rand.label(31:
end);
P_test=pixel_value(test_label,:
)’;
Tc_test=direction_label(test_label);
说明:
(D函数randperm(n)用于产生一个从整数1到行的随机排列。
②函数repmat()用于矩阵复制。
③函数ind2vec()。
1.3.4创建LVQ网络
利用newlvq()函数可以方便地创建一个LVQ神经网络。
这里,隐含层神经元个数设量20。
由于训练集数据是随机产生的,所以参数PC的设置需要事先计算得出,具体的程序为:
%%创建LVQ网络
fori=1:
5
rate{i)=length(find(Tc_train==i))/30;
end
net=newlvq(minraax(P_train),20,ce112mat(rate》;
%设置训练参数
net.trainParam.epochs=100;
net.trainParam.goal=0.O01;
net.trainParam.lr=O.l;
1.3.5训练LVQ网络
网络创建及相关参数设置完成后,利用MATLAB自带的网络训练函数train()可以力地对网络进行训练学习,具体程序为:
%%训练网络
net=train(net,P_train,T_train);
1.3.6人脸识别测试
利用sim()函数将测试集输人数据送人训练好的神经网络,便可以得到测试集的输出仿
真数据,即测试集图像的人脸朝向识别结果。
详细程序如下:
Tsim=sim(net,Ptest);
Tcsim=vec2ind(T_sim);
result-.=rTctestiTesiml
说明:
result第1行为测试集图像的标准人脸朝向类别,第2行为测试集图像的预测人脸朝向类别。
1.3.7结果显示
本案例将识别的结果以更加直观的形式呈现给读者,具体程序如下:
%%结果显示
%训练集人脸标号
strain_label=sort(train_label);
htrain_label=ceil(strain_label/N);
%训练集人脸朝向标号
dtrain_label=strain_label-floor(strain_label/N)*N;
dtrain_label(dtrain_label==0)=N;
%显示训练集图像序号
disp('训练集图像为;');
fori=1:
30
str_train=[num2str(htrain_label(i))'_'...
num2str(dtrain_label(i))''];
fprintf('%s',str_train)
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;
%显示测试集图像序号
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