基于LVQ神经网络的人脸朝向识别
摘要 人脸识别是当今模式识别和人工智能的一个重要的研究方向.人脸的朝向识别是一个复杂的模式识别问题。在实际应用中,大量图像和视频源中人脸的位置、朝向、旋转角度都是不固定的,这大大增加了人脸识别的难度。为了解决这些问题,本实验采用了LVQ神经网络模型对图像中的人脸朝向识别进行研究。本实验基于matlab平台设计LVQ神经网络,实现对人脸朝向的判断。实验结果表明,LVQ神经网络可以根据输入图像的二值信息,以较高的准确率判别该图像中的人脸朝向。
关键字: 人脸朝向识别; LVQ神经网络; matlab; 特征提取
人脸识别是一个活跃的研究领域。尽管相对于虹膜和指纹识别,人脸识别的准确还比较低,但人脸的易采集、非接触的优点,让人脸识别受到越来越多的关注。人脸识别对人脸位置和状态都有一定的,实际应用中,图像和视频源
中人脸的位置,朝向和旋转都不是固定的,这就为我们后续的人脸识别有了更大的难度. 在人脸识别的研究领域中,人脸朝向识别是其中的一个分支.在以往的研究中,绝大多数的研究人员希望能够消除人脸朝向在人脸识别中的不良影响,但在复杂的实际环境中,我们无法忽略人脸朝向对人脸识别的影响。因此,对人脸朝向的判定和识别是非常有必要和有意义的.
1 LVQ神经网络
学习向量量化 (Learning Vector Quantization,LVQ) 神经网络,属于前向神经网络类型,在模式识别和优化领域有着广泛的应用。LVQ神经网络由三层组成,即输入层、隐含层和输出层,网络在输入层与隐含层间为全连接,而在隐含层与输出层间为部分连接,每个输出层神经元与隐含层神经元的不同组相连接。隐含层和输出层神经元之间的连接权值固定为1。输入层和隐含层神经元间连接的权值建立参考矢量的分量(对每个隐含神经元指定一个参考矢量)。在网络训练过程中,这些权值被修改。隐含层神经元(或称为Kohnen神经元)和输出神经元都具有二进制输出值。当某个输入模式被送至网络时,参考矢量最接近输入模式的隐含神经元因获得激发而赢得竞争,因而允许它产生一个“1\",而其它隐含层神经元都被迫产生“0”。与包含获胜神经元的隐含层神经元组相连接的输出神经元也发出“1”,而其它输出神经元均发出“0”.产生“1”的输出神经元给出输入模式的类,由此可见,每个输出神经元被用于表示不同的类。
2 人脸朝向识别的设计 2。1 问题描述 现采集到一组不同人脸朝向的图像,这组图像来自于10个人,每人5张图片,人脸朝向分为:左方、左前方、正面、右前方、右方,如图2—1所示。创建一个LVQ神经网络,对给出的人脸进行朝向的判定与识别。
2—1 人脸朝向识别图
2.2 建立模型 2。2.1 设计思路 通过观察不难发现,当人脸朝向不同的方向时,眼睛在图像中的位置差别较大。所以,将眼睛位置的特征信息作为LVQ神经网络识别的输入,将5个朝向作为其输出。在对训练集进行训练之后,得到具有预测功能的神经网络,对测试集中的图片进行人脸朝向的预测。 2.2.2 设计步骤 根据上述的设计思路,可以归纳为如下步骤,如图2-2所示。
图2-2 设计步骤流程图
(1)眼部特征向量的提取
在设计思路中,可以知道人脸朝向不同时,其眼睛所在的位置也有所不同。因此,选取描述人眼位置的特征向量作为LVQ神经网络的输入。方法:将整幅图像分为6行8列,人眼的位置信息可以用第2行的8个子矩阵来描述,边缘检测后8个子矩阵中的值为“1”的像素点的个数与人脸朝向有直接关系。只要分别统计出第2行8个子矩阵中值为“1”的像素点的个数即可。 (2)生成训练集和测试集
为了保证训练集数据的随机性,我们随机选取图像库中的30张图片作为训练数据,选取20张图片作为测试数据。 (3)LVQ网络的创建
因为LVQ神经网络具有不需要将输入向量正交化、归一化的优点,利用Matlab工具中的newlvq()函数构建一个LVQ神经网络。 (4)LVQ网络的训练
将训练集中输入向量送入LVQ神经网络,之后对网络中权值进行迭代调整,达到要求。利用Matlab中的网络训练函数train()对LVQ神经网络进行训练学习。 (5)人脸朝向的识别
网络训练收敛后,对测试集的数据进行预测。对于任意给定的图像,只需将其特征向量提取出来,便可以进行识别。
3 人脸朝向识别的实现
Matlab提供了许多函数能够让我们在Matlab环境下可以实现上述步骤。
3.1 清空环境变量 在程序运行之前,需要清空工作空间中的变量和命令窗口的命令。源代码如下:
clear all clc
3.2 眼部特征向量的提取
首先将图像中描述眼部信息的特征向量提取出来,即统计出第2行8个子矩阵中值为“1”的像素点的个数,源代码如下:
%% 人脸特征向量提取 % 人数 M=10;
% 人脸朝向类别数 N=5;
% 特征向量提取
pixel_value=feature_extraction(M,N);
feature_extraction()为人脸特征向量提取子函数,函数体如下: % 特征提取子函数
function pixel_value=feature_extraction(m,n) pixel_value=zeros(50,8); sample_number=0; for i=1:m for j=1:n
str=strcat('Images\\',num2str(i),’_’,num2str(j),’。bmp'); %%将字符串进行水平连接
img= imread(str); %%将图像转换为对应的矩阵 [rows cols]= size(img);
img_edge=edge(img,'Sobel’); %%用sobel边缘提取算子来提取边缘 sub_rows=floor(rows/6); sub_cols=floor(cols/8);
sample_number=sample_number+1; for subblock_i=1:8
for ii=sub_rows+1:2*sub_rows
for jj=(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
3.3 生成训练集和测试集
将图片库中图片的眼部特征向量提取出来,随机分为两组,即训练集组和测试集组。训练集中包括30幅图像的特征向量,测试集中包括20幅图像的特征向量,具体源代码如下:
%% 训练集/测试集产生
% 产生图像序号的随机序列
rand_label=randperm(M*N); %%产生一个从1到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); 3.4 创建LVQ神经网络
利用newlvq()函数来创建LVQ神经网络,隐含层神经元个数设置为20,具体源代码如下: %% 计算PC for i=1:5
rate{i}=length(find(Tc_train==i))/30; end
%% 创建LVQ网络
net=newlvq(minmax(P_train),20,cellmat(rate)); %% 设置训练参数
net。trainParam。epoch = 100; net。trainParam。goal = 0.001; net。 trainParam。lr = 0.1 3.5 训练LVQ神经网络
用Matlab提供的train()函数对LVQ神经网络训练学习,源代码如下: net = train(net_train,T_train); 3.6 人脸朝向识别的测试
利用sim()函数将训练集中的数据送入LVQ神经网络,这样可以获得测试集的人脸朝向的识别结果,源代码如下:
%% 测试集中的人脸朝向识别 T_sim=sim(net,P_test); Tc_sim=vec2ind(T_sim); result=[Tc_test;Tc_sim];
4 实验结果分析