基于PCA和BP神经网络的人脸识别方法 - 图文

更新时间:2023-09-10 02:43:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

基于PCA和BP神经网络的人脸识别方法

摘要:基于PCA 和BP 神经网络的人脸识别方法是针对PCA 方法中存在的问题和它对未训练过的样本识别率低的缺点而提出的。该方法在预处理的基础上,利用PCA处理人脸特征,提取其中分类能力强的特征,实现在识别精度不变的情况下,有效的去除冗余信息;然后将约简后的属性输入到神经网络进行规则提取,利用神经网络非线性映射和并行处理的特点,增强对人脸图像识别的泛化能力。实验证明,使用该方法在识别率上有一定的提高。 关键词:人类识别、BP神经网络、PCA、特征提取

引言

人脸识别特指利用分析比较人脸视觉特征信息进行身份鉴别的计算机技术。人脸识别是一项热门的计算机技术研究领域,可以将人脸明暗侦测,自动调整动态曝光补偿,人脸追踪侦测,自动调整影像放大;它属于生物特征识别技术,是对生物体(一般特指人)本身的生物特征来区分生物体个体。进行人脸图像识别研究具有很大的使用价值。如同人的指纹一样,人脸也具有唯一性,也可用来鉴别一个人的身份。现在己有实用的计算机自动指纹识别系统面世,并在安检等部门得到应用,但还没有通用成熟的人脸自动识别系统出现。人脸图像的自动识别系统较之指纹识别系统、DNA鉴定等更具方便性,因为它取样方便,可以不接触目标就进行识别,从而开发研究的实际意义更大。并且与指纹图像不同的是,人脸图像受很多因素的干扰:人脸表情的多样性;以及外在的成像过程中的光照,图像尺寸,旋转,姿势变化等。使得同一个人,在不同的环境下拍摄所得到的人脸图像不同,有时更会有很大的差别,给识别带来很大难度。因此在各种干扰条件下实现人脸图像的识别,也就更具有挑战性。

当前大多数人脸识别算法是基于统计的方法,如特征脸方法(PCA)、Fisher 脸方法、奇异值分解方法、神经网络方法和支持向量机等,这些方法中影响较大的是Turk 和Pentland 提出的特征脸(Eigen Face)方法即PCA 方法。PCA是基于主元分析的特征提取,把所有的不同人脸的样本放在一起提取,以所有人的人脸样本最优重建为目的。因此,对于人脸样本之间的差异而言它存在着明显的缺陷,从这方面讲它来描述人脸识别的特征是不充分的。而且它对未训练过的样

本识别率较低,所以我们可提出一种基于PCA 和BP 神经网络的人脸识别方法。

1、系统设计的基本原理

(1) PCA的基本原理

主成分分析 ( Principal Component Analysis , PCA )或者主元分析。是一种掌握事物主要矛盾的统计分析方法,它可以从多元事物中解析出主要影响因素,揭示事物的本质,简化复杂的问题。计算主成分的目的是将高维数据投影到较低维空间。给定 n 个变量的 m 个观察值,形成一个 n ′ m 的数据矩阵, n 通常比较大。对于一个由多个变量描述的复杂事物,人们难以认识,那么是否可以抓住事物主要方面进行重点分析呢?如果事物的主要方面刚好体现在几个主要变量上,我们只需要将这几个变量分离出来,进行详细分析。但是,在一般情况下,并不能直接找出这样的关键变量。这时我们可以用原有变量的线性组合来表示事物的主要方面, PCA 就是这样一种分析方法。

举一个例子来说,对于一个训练集,100个对象模板,特征是10维,那么它可以建立一个100*10的矩阵,作为样本。求这个样本的协方差矩阵,得到一个10*10的协方差矩阵,然后求出这个协方差矩阵的特征值和特征向量,应该有10个特征值和特征向量,我们根据特征值的大小,取前四个特征值所对应的特征向量,构成一个10*4的矩阵,这个矩阵就是我们要求的特征矩阵,100*10的样本矩阵乘以这个10*4的特征矩阵,就得到了一个100*4的新的降维之后的样本矩阵,每个特征的维数下降了。当给定一个测试的特征集之后,比如1*10维的特征,乘以上面得到的10*4的特征矩阵,便可以得到一个1*4的特征,用这个特征去分类。

所以做PCA实际上是求得这个投影矩阵,用高维的特征乘以这个投影矩阵,便可以将高维特征的维数下降到指定的维数。 (2) BP神经网络基本原理

BP(Back Propagation)网络是一种按误差逆传播算法训练的多层前馈网络,是目前应用最广泛的神经网络模型之一。BP网络能学习和存贮大量的输入-输出模式映射关系,而无需事前揭示描述这种映射关系的数学方程。它的学习规则是使用最速下降法,通过反向传播来不断调整网络的权值和阈值,使网络的误差平方和最小。BP神经网络模型拓扑结构包括输入层(input)、隐层(hide layer)

和输出层(output layer)。

人工神经网络是由简单的处理单元所组成的大量并行分布的处理机,这种处理机具有存储和应用经验知识的自然特性,它与人脑的相似之处概括为两个方面:一是通过学习过程利用神经网络从外部环境中获取知识;二是内部神经元用来存储获取的知识信息。

BP 神经网络是采用有教师学习算法的典型的多层前向神经网络。它具有强大的计算能力,能通过训练掌握学习样本蕴含的输入输出映射关系,在分类和预测当中都有着广泛的应用。

图1单层前馈网络 图2多层前馈网络 2、系统设计思路

(1)采用PCA+最邻近分类器来演示一个简单的人脸识别系统。 (2)采用PCA+最邻近分类器针对ORL人脸数据库计算其识别率。

(3)采用PCA+BP神经网络针对ORL人脸数据库来探索PCA维数,BP神经

网络各参数对人脸识别率的影响。

本设计主要介绍第三种设计方法,选取影响较大的特征脸方法,即PCA 人脸识别方法进行研究,针对特征脸方法提取出的特征维数过高和姿态变化时泛化能力不强的缺点,提出一种PCA和神经网络相结合的人脸识别方法。该方法首先,运用PCA 方法对人脸图像进行特征提取;然后,对PCA 方法提取的特征按照属性重要度的大小进一步进行约简,只保留那些属性重要度比较大的属性;最后,将提取出的最终人脸特征输入神经网络进行训练和识别。

开始初始化样本矩阵给定输入向量和期望输出求出协方差矩阵求隐层输出层单元输出计算特征值期望输出与实际输出偏差e特征值从大到小排序E满足要求?yesno全部e满足yesEnd选出满足要求的前q个特征值计算隐层单元误差计算对应特征向量求误差梯度更新权值投影矩阵 图3 PCA流程图 图4 BP神经网络流程图

(1)基本流程:

1) 将原始人脸图像集A 中的每幅图像进行尺寸归一化处理,得到归一化后的人脸图像集;

2) 利用经典PCA 方法计算特征子空间以及每张人脸在特征子空间中的投影系数。其中特征子空间由按特征值大小进行降序排列的特征向量组成;

3) 按照重要度选择特征子空间中属性重要度大的特征主分量;

4) 将选择出的重要度大的特征主分量输入BP神经网络进行训练,直到神经网络收敛或满足停止训练的条件;

5) 识别过程。 (2)人脸空间的建立

假设一幅人脸图像包含N个像素点,它可以用一个N维向量PI表示。这样,训练样本库就可以用P(i=1,...,M)表示。协方差矩阵C的正交特征向量就是组成人脸空间的基向量,即特征脸。

将特征值由大到小排列:λ1≥λ2≥...≥λr,其对应的特征向量为uk。这样每一幅人脸图像都可以投影到由u1,u2,...,ur张成的子空间中。因此,每一幅人脸图像对应于子空间中的一点。同样,子空间的任意一点也对应于一幅图像。 (3)特征向量的选取

虽然协方差矩阵Ω最多有对应于非零特征值的k(k远小于M)个特征向量,但是通常情况下,k仍然很大,而事实上,根据应用的要求,并非所有的特征向量都有需要保留,而特征空间投影的计算速度是直接与创建子空间所用的特征向量的数目相关,若考虑到计算时间的因素,可以适当的减去一些信息量少的特征向量,而且,去掉这些特征向量之后不一定不利于分类结果,有的情况下反而能够提高识别性能。 (4)BP神经网络的算法

BP学习算法实际包含了两类信号不同方向的传播过程,一类是施加输入信号由输入层经隐层到输出层,产生输出响应的“输入模式正向传播”过程;另一类是希望输出与实际输出之间的误差信号由输出层返回隐层和输入层,反向逐层修正连接权值和神经元输出阈值的“误差逆传播”过程。“输入模式正向传播”和“误差逆传播”过程反复交替进行网络训练,最终达到网络的全局误差向极小值收敛(即实际输出逐渐逼近希望输出)而结束学习过程。

BP学习算法具体编程步骤: 1.初始化 ; 2.提供训练样本 ;

3.输入模式正向传播过程计算 ; 4.误差的逆传播过程计算;

5.各层网络权值和阈值的修正计算;

6.返回提供训练样本步骤重新计算直到全局误差E?? ,或者达到最大学习次数结束学习;

3、实验结果及分析

1)PCA+最邻近分类器人脸识别系统

实验中选取的图像经过简单的分类器识别后,都能进行正确的识别。在使用该系统时,只需测试者提供三张头像图片,将其压缩成与原数据库图片相同大小,然后2张放入训练数据库,1张用来测试。

数据库采用ORL人脸数据库,该数据库有400张人脸。40个人,每个人10张头像(每个人每张头像或表情不同,或倾斜度不同)。设计中,每个人选取前5张头像,共200张构成训练样本集,另外200张头像构成测试样本集。运行程序得到识别率为0.88。 2)PCA+BP神经网络识别系统

数据库仍采用ORL人脸数据库,先在400张人脸中选取一部分作为训练样本集,对其进行PCA降维,形成特征脸子空间;再将剩余的人脸作为检测集,将其投影到特征脸子空间;采用BP神经网络对训练样本集进行训练,然后再用检测集进行识别率测试

1、BP神经网络识别中存在的问题

在采用BP神经网络进行训练过程中,由于可调参数过多,会对识别率产生一定的影响,故在设计中针对可调参数反复进行测试,对比来寻找最快,最优识别的网络参数。下面列出可能影响网络性能的各个参数:

(1)BP网络训练函数的选取

(2)BP网络学习速率,迭代次数,误差,梯度的设定 (3)PCA主成分比例的选取 (4)BP网络隐层节点数的选取 (5)训练集和测试集容量的选取 2、网络训练函数的选取

当采用一般的基于梯度下降的BP网络进行训练时,由于固定的学习速率,有限的迭代次数,较小的设定误差和截止梯度,致使网路有较长的训练时间,而

且还不一定能达到要求的精度,这会大大影响识别率。

经过多次训练函数的尝试,最终选择带有动量相的自适应学习率的训练函数traingdx。下面表格显示出了三种训练函数在训练速度上的对比:

从上表可以看出:

(1)尽管采用添加动量相的BP算法,由于学习速率固定,网络的训练速度仍旧很慢。如果盲目的增加学习速率,又会造成网络在某处的波动。因此,训练函数采用带动量相的自适应学习速率的算法较为合适。

(2)修改之后,网络的训练时间均在10s钟左右,大大提供了识别速率。 3、BP网络性能参数的设定

上表中,为了缩短运行时间,通过加大截止误差和设定迭代次数的方法来加快程序运行,这样会在一定程度上降低识别率。当采用traingdx的训练函数后,网络运行速度加快,将截止误差设定为0,迭代次数仍设定为10000,发现每次促使训练停止的为默认的截止梯度。此时的网络误差已足够小。

4、维数、隐层节点数的选取

1.下面一组实验将ORL人脸数据库中每个人的前9张头像作为训练集(共360张),第10张头像作为测试集(40张);BP网络训练函数为traingdx,截止误差设为0,截止迭代次数为10000,截止梯度为默认;分别对PCA主成分为

0.7、0.8、0.9,隐层节点数为30:10:150下进行网络训练,并通过测试集计算识别率得到下表

从上表数据得出:

(1)不同隐层节点数时,识别率变化不大,大多集中在0.8到0.9之间。隐层节点数和识别率不成线性变化,当隐层节点数增加时,识别率波动变化。这说明,隐层节点数的选取在一准则下确定初值后还需要带进网络进行试凑。

(2)当PCA选择不同的主成分比例时,数据降到不同的维数,比较不同维数下的识别率,几乎还是集中在0.8到0.9之间。

(3)不同维数下相同的隐层节点数不具有可比性。

2.其他参数不变,将ORL人脸数据库中每个人的前8张头像作为训练集(共320张),后2张头像作为测试集(80张);分别对PCA主成分为0.7、0.8、0.9,隐层节点数为30:10:150下进行网络训练,并通过测试集计算识别率得到下表:

3.其他参数不变,将ORL人脸数据库中每个人的前7张头像作为训练集(共280张),后3张头像作为测试集(120张);分别对PCA主成分为0.7、0.8、0.9,隐层节点数为30:10:150下进行网络训练,并通过测试集计算识别率得到下表:

4.其他参数不变,将ORL人脸数据库中每个人的前5张头像作为训练集(共200张),后5张头像作为测试集(200张);分别对PCA主成分为0.7、0.8、0.9,

隐层节点数为30:10:150下进行网络训练,并通过测试集计算识别率得到下表:

5、训练集和测试集容量的选取

(1)比较表2到表5中数据发现:表2到表4人脸的识别率变化不大,集中在0.8到0.9之间;表5中整体识别率明显小于表2到表4,这说明识别率与训练样本集存在一定的关系,训练样本集越大,包含的信息越多,越容易识别。

(2)从表5中也观察到:PCA主成分升高,识别率有了一定程度的减小。这说明了,在某些条件下,PCA主成分的比例还是会影响到识别率的大小。

总结

本次课程设计,我们在给定人脸数据库的前提下,完成了人脸的PCA特征提取,并且会采用最邻近分类器(欧氏距离),BP神经网络分类器进行人脸的模式分类及识别。我们将主要工作集中在了PCA+BP神经网络识别系统的研究上。在不断测试过程中,我们得出:

(1)固定的学习速率会影响网络的训练速度

(2)在网络训练速度较慢时,截止误差,迭代次数都会影响识别率 (3)相同数据下,采用带动量相的自适应学习率训练函数(traingdx)可以大大加快网络训练速度

(4)PCA主成分比例的选取与隐层节点数的选择没有得到结论性成果,只能从数据中分析出它们在某些情况下影响识别率,因此,设计时,它们的选取必须结合数据来试凑出最佳的识别方案 (5)训练样本集越大,包含信息越多,越易于识别 遇到的问题及后续研究:

设计过程中,不论参数如何调整,都不能达到百分之百的识别率。在算法原

理、程序都无误的前提下,只能是遇到方法的瓶颈。后续工作中,可以从改进算法上进行入手,也可以从其他算法上进行识别率的对比研究。

致谢

在设计过程中,感谢大家从网上找到了许多资料和程序,经过我们共同讨论、研究确定了这个与我们所学课程相结合的课题;在编程过程中,大家对程序提出了许多宝贵的意见,这些对于我们课题的顺利进行至关重要;程序编制完成后,正是在大家的分工合作下,才得到这么多宝贵的数据;感谢大家这两个星期来的共同努力!

经过本次课程设计,我们组的成员对PCA降维的原理和使用以及对BP神经网络参数的调整有了更深刻的掌握;提高了自身matlab的编程能力;同时对我们模式识别的课程进行了巩固。

参考文献

[1] 龚勋 .PCA与人脸识别及其理论基础。2007年4月

[2] 蒋遂平.人脸识别技术及应用简介。北京:中国计算机世界出版社,2003年12月

[3] 司马江龙,邓长寿. 基于BP神经网络的人脸识别系统。江苏:九江学院学报(自然科学版).2011

[4] 郑明伟. 基于PCA和BP神经网络的人脸识别方法。山东:潍坊职业学院.2011年9月

附录一:组构成及分工 组长:马偃亳

组员:杜鹏飞 郑博 邢凯丽 卢亚南 张超 李亚萍 李莎莎 孙源呈 朱妍雯 王苗苗 张晓参 路亚缇 分工:

1. 查找文献、资料:张超,路亚缇 2. 文献、资料筛选:孙源呈,张晓参 3. 人脸数据库搜索及人脸图像采集:王苗苗 4. 程序编制及调试:邢凯丽,马偃亳 5. 数据采集及结果分析:卢亚南,杜鹏飞 6. ppt制作:李亚萍,郑博 7. 课程设计报告:朱妍雯,李莎莎

附录二:程序代码:

1. PCA+最邻近分类器用于简单人脸识别的演示程序: (1)主程序:example.m clear all clc

close all

% You can customize and fix initial directory paths TrainDatabasePath =

uigetdir('C:\\Users\\Administrator\\Desktop\\identify\\PCA_based Face Recognition System', 'Select training database path' ); TestDatabasePath =

uigetdir('C:\\Users\\Administrator\\Desktop\\identify\\PCA_based Face Recognition System', 'Select test database path');

prompt = {'Enter test image name (a number between 1 to 10):'}; dlg_title = 'Input of PCA-Based Face Recognition System'; num_lines= 1; def = {'1'};

TestImage = inputdlg(prompt,dlg_title,num_lines,def);

TestImage = strcat(TestDatabasePath,'\\',char(TestImage),'.jpg'); im = imread(TestImage);

T = CreateDatabase(TrainDatabasePath); [m, A, Eigenfaces] = EigenfaceCore(T);

OutputName = Recognition(TestImage, m, A, Eigenfaces);

SelectedImage = strcat(TrainDatabasePath,'\\',OutputName); SelectedImage = imread(SelectedImage);

imshow(im)

title('Test Image');

figure,imshow(SelectedImage); title('Equivalent Image');

str = strcat('Matched image is : ',OutputName); disp(str)

(2)将人脸图像读入构成人脸矩阵数据库:

function T = CreateDatabase(TrainDatabasePath) TrainFiles = dir(TrainDatabasePath); Train_Number = 0;

for i = 1:size(TrainFiles,1) if

not(strcmp(TrainFiles(i).name,'.')|strcmp(TrainFiles(i).name,'..')|strcmp(TrainFiles(i).name,'Thumbs.db'))

Train_Number = Train_Number + 1; % Number of all images in the training database end end T = [];

for i = 1 : Train_Number

% I have chosen the name of each image in databases as a corresponding % number. However, it is not mandatory! str = int2str(i);

str = strcat('\\',str,'.jpg'); str = strcat(TrainDatabasePath,str);

img = imread(str); img = rgb2gray(img);

[irow icol] = size(img);

temp = reshape(img',irow*icol,1); % Reshaping 2D images into 1D image vectors

T = [T temp]; % 'T' grows after each turn end

(3)形成特征脸子空间:

function [m, A, Eigenfaces] = EigenfaceCore(T) m = mean(T,2);

Train_Number = size(T,2); A = [];

for i = 1 : Train_Number

temp = double(T(:,i)) - m; % Computing the difference image for each image in the training set Ai = Ti - m

A = [A temp]; % Merging all centered images end

L = A'*A; % L is the surrogate of covariance matrix C=A*A'.

[V D] = eig(L); % Diagonal elements of D are the eigenvalues for both L=A'*A and C=A*A'. L_eig_vec = []; for i = 1 : size(V,2) if( D(i,i)>1 )

L_eig_vec = [L_eig_vec V(:,i)]; end end

Eigenfaces = A * L_eig_vec;

(4)识别程序:

function OutputName = Recognition(TestImage, m, A, Eigenfaces) ProjectedImages = [];

Train_Number = size(Eigenfaces,2); for i = 1 : Train_Number

temp = Eigenfaces'*A(:,i); % Projection of centered images into facespace

ProjectedImages = [ProjectedImages temp]; end

InputImage = imread(TestImage); temp = InputImage(:,:,1);

[irow icol] = size(temp);

InImage = reshape(temp',irow*icol,1);

Difference = double(InImage)-m; % Centered test image

ProjectedTestImage = Eigenfaces'*Difference; % Test image feature vector Euc_dist = [];

for i = 1 : Train_Number q = ProjectedImages(:,i);

temp = ( norm( ProjectedTestImage - q ) )^2; Euc_dist = [Euc_dist temp]; end

[Euc_dist_min , Recognized_index] = min(Euc_dist); OutputName = strcat(int2str(Recognized_index),'.jpg');

2. PCA+最邻近分类器计算人脸识别率: function FaceRec() allsamples=[]; for i=1:40 for j=1:5

a=imread(strcat('C:\\Users\\Administrator\\Desktop\\identify\\ORL\\s',num2str(i),'\\',num2str(j),'.bmp')); b=a(1:112*92); b=double(b);

allsamples=[allsamples;b]; end end

samplemean=mean(allsamples); for i=1:200

xmean(i,:)=allsamples(i,:)-samplemean; end

sigma=xmean*xmean'; [v d]=eig(sigma); d1=diag(d);

dsort=flipud(d1); vsort=fliplr(v); dsum=sum(dsort); dsum_extract=0; p=0;

while(dsum_extract/dsum<0.9) p=p+1;

dsum_extract=sum(dsort(1:p)); end i=1;

base=xmean'*vsort(:,1:p)*diag(dsort(1:p).^(-1/2));

allcoor=allsamples*base; ? accu=0; for i=1:40 for j=6:10

a=imread(strcat('C:\\Users\\Administrator\\Desktop\\è?á3ê?±e\\è?á3êy?Y?a\\ORL\\s',num2str(i),'\\',num2str(j),'.bmp')); b=a(1:10304); b=double(b); tcoor=b*base; for k=1:200

mdist(k)=norm(tcoor-allcoor(k,:)); end

[dist,index2]=sort(mdist); class1=floor((index2(1)-1)/5)+1; class2=floor((index2(2)-1)/5)+1; class3=floor((index2(3)-1)/5)+1; if class1~=class2 && class2~=class3 class=class1; elseif class1==class2 class=class1; elseif class2==class3 class=class2; end

if class==i accu=accu+1; end

end end

accuracy=accu/200

3.PCA+BP神经网络计算人脸识别率 function renlian2()

%%%%%%%%%%%%%%%%%%%%%%%%%% clc; clear;

allsamples=[]; n1=40;n2=10; testnum=3; for i=1:n1

for j=1:(n2-testnum)

a=imread(strcat('C:\\Users\\Administrator\\Desktop\\è?á3ê?±e\\è?á3êy?Y?a\\ORL\\s',num2str(i),'\\',num2str(j),'.bmp')); b=a(1:112*92); b=double(b)/255;

allsamples=[allsamples;b]; end end

samplemean=mean(allsamples); for i=1:(n1*(n2-testnum))

xmean(i,:)=allsamples(i,:)-samplemean; end

allsamples1=[]; for i=1:n1

for j=(n2-testnum+1):n2

a=imread(strcat('C:\\Users\\Administrator\\Desktop\\è?á3ê?±e\\è?á3êy?Y?a\\ORL\\s',num2str(i),'\\',num2str(j),'.bmp')); b=a(1:112*92); b=double(b)/255;

allsamples1=[allsamples1;b]; %allsamples end end

for i=1:n1*testnum

xmean1(i,:)=allsamples1(i,:)-samplemean; end

sigma=xmean*xmean'/; [v d]=eig(sigma); d1=diag(d);

dsort=flipud(d1); vsort=fliplr(v);

dsum=sum(dsort);

dsum_extract=0; p=0;

while(dsum_extract/dsum<0.8) p=p+1;

dsum_extract=sum(dsort(1:p)); end p

base=xmean'*vsort(:,1:p)*diag(dsort(1:p).^(-1/2)); allcoor1=xmean*base; allcoor1=allcoor1';

allcoor2=xmean1*base; allcoor2=allcoor2';

P=allcoor1; Ps=allcoor2;

T=zeros(n1,(n1*(n2-testnum))); for i=1:n1

for j=1:(n2-testnum)

T(i,(n2-testnum)*(i-1)+j)=1; end end

T1=zeros(n1,n1*testnum); for i=1:n1

for j=1:testnum

T1(i,testnum*(i-1)+j)=1; end end

net=newff(minmax(P),[96,40],{'tansig' 'logsig'} ,'traingdx'); net.trainParam.lr=1; net.trainParam.show=500; net.trainParam.epochs=10000; net.trainParam.goal=0;

net=train(net,P,T); YY=sim(net,Ps); error=T1-round(YY); k=0;

for j=1:n1*testnum if(sum(error(:,j))==0) k=k+1; end end

S=k/(n1*testnum)

本文来源:https://www.bwwdw.com/article/1olh.html

Top