1. 引言
人脸识别是当前计算机智能模式识别领域的一个热门的研究课题,在信息安全、访问控制、金融支付、军事等方面都有着重要的应用价值 [1] [2] [3] 。人工神经网络是模拟生物神经网络进行信息处理的一种数学模型,误差反向传播(BP)算法的提出,给多层网络训练提供了有效的方法 [1] 。采用BP神经网络进行人脸识别,主要包括特征提取和神经网络识别两大部分。其理论基础已经相当成熟,是现在进行人脸识别普遍采用的方法 [4] 。自20世纪90年代以来,国内在人脸识别领域也取得了一系列的研究成果 [3] 。清华大学、中科院计算所、自动化所、上海交通大学、北京工业大学等很多单位都在进行人脸识别的相关研究。其中北京工业大学(信号与信息处理研究室)和澳大利亚新南威尔士大学联合提出的人脸检测技术已被国际MPEG-7接受并作为标准。但是,目前国内的研究水平仍低于国际水平,研发多方向、高效率、高精度的人脸识别系统成为当务之急。
传统的人脸识别系统往往需要人脸正面对准识别仪器才能进行识别,大多数关于人脸识别的研究也是对人脸正面进行识别,在实际进行人脸识别时甚至可以通过造假来欺骗系统,因而使其检测效率和准确程度比较低。本文主要基于BP神经网络的开发 [5] ,对人脸的方向进行识别,以达到从多个方向进行人脸识别的效果。最后,MATLAB2014平台进行了人脸方向识别试验,验证了所提出的方法能够提高人脸识别时的效率和正确率 [6] 。本文提出的方法有利于研发多方向、高效率、高精度的人脸识别系统,弥补现在的人脸识别的不足。
2. BP神经网络概述
2.1. BP神经网络简介
BP算法采用的是多层感知器的误差反向传播算法,其基本思想是:学习过程由信号的正向传播与误差的反向传播两个过程组成。正向传播时,输入样本从输入层传入,经隐层逐层处理后,传向输出层。若输出层的实际输出与期望的输出不符,则转入误差的反向传输阶段。误差反传是将输出误差以某种形式通过隐层向输入层逐层反传,并将误差分摊给各层的所有单元,从而获得各层单元的误差信号,该误差信号即作为修正各单元权值的依据。信号正向传播与误差反向传播的各层权值的调整是反复进行的,直至网络输出的误差减少到可接受的程度,或是进行到预先设定的学习次数。
对于输出层,有:
(1)
对于隐层,有:
(2)
其中:
(3)
BP神经网络利用输出后的误差来估计输出层的直接前导层的误差,再用这个误差估计更前一层的误差,如此一层一层的反传下去,就获得了所有其他各层的误差估计,流程如图1所示。
神经网络以一种学习规则进行学习,然后做出相应的判断。神经网络可以用作分类、聚类、预测等。神经网络需要有一定量的历史数据,通过历史数据的训练,网络可以学习到数据中隐含的知识。这种结构被称为神经网络黑匣子,如图2所示。
2.2. BP神经网络在人脸识别中应用中的优势
1) BP神经网络实质上实现了一个从输入到输出的映射功能,数学理论证明三层的神经网络就能够以任意精度逼近任何非线性连续函数。这使得其特别适合于求解内部机制复杂的问题。
2) BP神经网络在训练时,能够通过学习自动提取输出、输出数据间的“合理规则”,并自适应的将学习内容记忆于网络的权值中。
3) BP神经网络在其局部的或者部分的神经元受到破坏后对全局的训练结果不会造成很大的影响,也就是说即使系统在受到局部损伤时还是可以正常工作的。
4) BP神经网络还具有良好的泛化能力,即网络在经过训练后能对未见过的模式或有噪声污染的模式,进行正确的分类。
正是由于BP神经网络的这些优点,我们考虑用其来进行人脸识别。
2.3. BP神经网络在人脸识别上的应用
在利用神经网络进行人脸识别时,需要建立一个如图3所示的三层神经网络,该三层神经网络包含输入层、隐藏层和输出层。BP神经网络的创建遵循以下规则:
1) 输入层为人脸的图片张数。通过将人脸图片按照各点的像素值转化为高维向量对人脸进行预处理,将得到的特征向量作为输入层输入到BP神经网络。
2) 为了使训练过程不发生“过拟合”,将收集到的数据随机分成训练样本、检验样本、测试样本这3个部分。其中训练样本占70%,检验样本占15%,测试样本占15%以尽量考虑样本模式间的平衡。
3) 选取人的面部图片作为样本,尽量减少头发等对识别的影响。
4) 为提高训练速度和灵敏性并有效避开Sigmoid函数的饱和区,输入数据的值在0~1之间,即对输入的数据归一化。为使所建立的模型具有一定的外推能力,预处理后输出的值在0.2~0.8之间。
5) 为了得到可靠的神经网络模型,训练的样本数设定为网络模型连接权数的5倍,这样样本不需要再采用“轮流训练”的方法。

Figure 1. BP neural network analysis process
图1. BP神经网络分析流程

Figure 2. BP neural network black box
图2. BP神经网络黑匣子

Figure 3. Neural network structure of face recognition
图3. 人脸识别神经网络结构
6) 学习率影响系统学习过程的稳定性。学习率过大会导致权值在修正过程中超过某个误差的极小值呈现不规则跳跃而不收敛;学习率过小导致学习时间过长,不能保证收敛于某个极小值。一般选取学习率在0.01~0.8,以保证学习过程的收敛性。
7) 模式类别决定输出层的神经元数目。在训练过程中,每个输入模式的希望输出为[0,1,0,1,0,1]。输出为1的神经元即对应着该输入模式所属的模式类别。
3. 基于BP神经网络的人脸方向识别方法构建
3.1. 试验简介
基于BP神经网络的人脸方向识别主要包括人脸特征数据的提取、数据训练、预测及检测等步骤。试验运用的编辑工具为Matlab2014平台,这种平台编程简单,图像功能完善,适合做矩阵实验,有自带的BP神经网络工具箱,方便开展本试验。
3.2. 试验过程
试验使用100张面朝不同方向的人脸图片作为样本进行BP神经网络训练,其中训练样本70张(见图4)、检验样本15张、测试样本15张。读取图片时将图片分割,提取特征值。值得注意的是:在分割图片时,人脸的眼睛部分位置变化比较大,边缘检测效果好。最后,利用BP神经网络对样本图片进行训练、预测、检验,其相关程序如下:
样本的训练的程序如下:
for j=1:N_train
for i=1:M_train
%读取图像,连接字符串形成图像的文件名。
str=strcat('Images\',num2str(i),'_',num2str(j),'.bmp');
img= imread(str);
[rows cols]= size(img);%获得图像的行和列值。
img_edge=edge(img,'Sobel');
%将图片分割,读取特征值
%由于在分割图片中,人脸的眼睛部分位置变化比较大,边缘检测效果好
sub_rows=floor(rows/6);%最接近的最小整数,分成6行
sub_cols=floor(cols/8);%最接近的最小整数,分成8列
sample_num=M_train*N_train;%前5个是第一幅人脸的5个角度
sample_number=sample_number+1;
for subblock_i=1:8 %因为这还在i,j的循环中,所以不可以用i
block_num=subblock_i;
pixel_value(sample_number,block_num)=0;
for ii=sub_rows:(2*sub_rows)
forjj=(subblock_i-1)*sub_cols+1:subblock_i*sub_cols
pixel_value(sample_number,block_num)=pixel_value(sample_number,block_num)+img_edge(ii,jj);
%因为前面求出的特征值比较大
%将特征值转换为小于1的值
max_pixel_value=max(pixel_value);
max_pixel_value_1=max(max_pixel_value);
for i=1:3
mid_value=10^i;
if(((max_pixel_value_1/mid_value)>1)&&((max_pixel_value_1/mid_value)<10))
multiple_num=1/mid_value;
pixel_value=pixel_value*multiple_num;
break;
end
相关的测试程序如下:
%读取要测试的图片
imge=imread('C:\Users\felix\Desktop\felixwang\测试\8.bmp');
imshow(imge)%将图片显示出来
%%
u1=1;
u2=420;%调右边401
w1=1;
w2=420;%调底边387
img=imge(w1:w2,u1:u2,1);
[rows cols]= size(img);%获得图像的行和列值。
img_edge=edge(img,'Sobel');
subplot(1,2,1)
imshow(img)
subplot(1,2,2)
imshow(img_edge)
%由于在分割图片中,人脸的眼睛部分位置变化比较大,边缘检测效果好
sub_rows=floor(rows/6);%最接近的最小整数,分成6行
sub_cols=floor(cols/8);%最接近的最小整数,分成8列
sample_number=1;
for subblock_i=1:8 %因为这还在i,j的循环中,所以不可以用i
block_num=subblock_i;
pixel_value(sample_number,block_num)=0;
for ii=sub_rows:(2*sub_rows)
forjj=(subblock_i-1)*sub_cols+1:subblock_i*sub_cols
pixel_value(sample_number,block_num)=pixel_value(sample_number,block_num)+img_edge(ii,jj); %加载刚才保存的数据
load max_pixel_value_1_data.mat
%特征向量比较大转化为小的数进行归一化
for i=1:3
mid_value=10^i;
if(((max_pixel_value_1/mid_value)>1)&&((max_pixel_value_1/mid_value)<10))
multiple_num=1/mid_value;
pixel_value=pixel_value*multiple_num;
break;
end
%加载保存好的神经网络
load('net_data.mat')
xx=net_1(pixel_value');
[~,x1]=max(xx);%通过神经网络分析的值进行方向判断
if x1==1
disp('朝向左边')
elseif x1==2
disp('偏向左边')
elseif x1==3
disp('正对中间')
elseif x1==4
disp('偏向右边')
elseif x1==5
disp('朝向右边')
end
经过训练后,所建立的神经网络已经具备了识别人脸方向的能力,可以调取人脸图片进行人脸方向测试,所使用的图片应尽量选取面部区域,以避免头发的影响。
3.3. 试验结果分析
统计试验的结果:神经网络训练目标为0.001,学习效率为0.01,输入层特征向量为32个、训练样本为70张图片时,人脸方向识别率高达91.05%;训练样本为100张图片时,人脸方向识别率高达94.37%;当训练样本达到150张图片时,人脸方向识别率均达到97%以上,已经达到并优于实际应用中人脸识别的要求。
由以上试验结果得:运用BP神经网络进行人脸方向预测,预测误差很小,预测的结果逼近于真实结果,而且训练所用的图片越多,面部的朝向越多,结果就越准确。因此,BP神经网络具有较好的数据预测和拟合能力。
4. 结束语
综上所述,本文构建的基于BP神经网络的人脸方向识别方法,能够有效识别人脸的任意方向。相关试验表明,该方法预测误差很小,人脸方向识别率可高达97%以上,结果接近真实值,可用于人脸方向识别。使实际应用时,不再需要从人脸正面进行识别,从而提高人脸识别时的效率和正确率,完善现有的人脸识别系统。
基金项目
2016年大学生创新创业训练计划课题(项目编号:201610361085, 201610361293)。
*通讯作者。