基于MATLAB的人脸识别

基于MATLAB主成分分析PCA算法的人脸识别系统

一、课题引言

随着社会的发展及技术的进步,社会各方面对快速高效的自动身份验证的需求可以说无处不在,并与日俱增。例如,某人是否是我国的居民,是否有权进入某安全系统,是否有权进行特定的交易等。尤其是自2001年美国“9.1l”恐怖袭击发生以来,如何在车站、机场等公共场所利用高科技手段,迅速而准确地发现并确认可疑分子成了目前世界各国在反恐斗争中普遍关注的问题。为此,各国都投入大量人力、物力研究发展各类识别技术,使得生物特征识别技术得到了极大的发展。生物特征识别技术主要包括:人脸识别、虹膜识别、指纹识别、步态识别、语音识别、笔迹识别、掌纹识别以及多生物特征融合识别等。人类通过视觉识别文字,感知外界信息。在客观世界中,有75%的信息量都来自视觉,因此让计算机或机器人具有视觉,是人工智能的重要环节。由于生物特征是人的内在属性,具有很强的稳定性和个体差异性,因此是身份验证最理想的依据。与虹膜、指纹、基因、掌纹等其他人体生物特征识别系统相比,人脸识别系统更加直接、方便、友好,易于为用户所接受,并且通过人脸的表情、姿态分析,还能获得其它识别系统难以得到的一些信息。

人脸识别技术在国家重要机关及社会安防领域具有广泛用途。例如:公安系统的罪犯识别、信用卡验证、医学、档案管理、视频会议、人机交互系统等身份识别和各类卡持有人的身份验证。同其他人体生物特征(如:指纹、掌纹、虹膜、语音等)识别技术相比,人脸识别技术的隐性最好,人脸识别系统更直接、友好,是当今国际反恐和安防最重视的科技手段和攻关标志之一。虽然人类能毫不费力地识别出人脸及表情,但对人脸的机器自动识别确实一个难度极大的课题,它涉及到模式识别、图像处理及生理、心理学等诸多方面的知识。人脸识别技术的研究虽然己经取得了一定的可喜成果,但在实际应用中仍存在着许多严峻的问题。人脸的非刚体性、姿态、表情、发型以及化妆的多样性都给正确识别带来了困难,要让计算机像人一样方便地识别出大量的人脸,尚需不同科学研究领域的科学家共同不懈的努力。

二 人脸识别技术

人脸因人而异,绝无相同,即使一对双胞胎,其面部也一定存在着某方面的差异。虽然人类在表情、年龄或发型等发生巨大变化的情况下,可以毫不困难地由脸而识别出某一个人,但要建立一个能够完全自动进行人脸识别的系统却是非常困难的,它牵涉到模式识别、图像处理、计算机视觉、生理学、心理学以及认知科学等方面的诸多知识,并与基于其他生物特征的身份鉴别方法以及计算机人机感知交互领域都有密切联系。与指纹、视网膜、虹膜、基因、掌形等其他人体生物特征识别系统相比,人脸识别系统更加直接、友好,使用者无任何心理障碍,并且通过人脸的表情和姿态分析,还能获得其他识别系统难以得到的一些信息。20世纪90年代以来,随着需要的剧增,人脸识别技术成为一个热门的研究话题。

2.1人脸识别的研究内容

人脸识别(Face Recognition)是利用计算机对人脸图像进行特征提取和识别的模式识别技术。在二十世纪七十年代初,对人脸识别的研究涉及心理学神经科学。其直接目的是要搞清楚人是如何对人脸进行识别的。七十年代中期以后,开展了用数学、物理和技术的方法对人脸自动识别的研究。

人脸识别一般可描述为:给定静止图像或动态图像序列,利用已有的人脸图像数据库来确认图像中的一个或多个人。从广义上来说,计算机人脸识别的研究内容大概可以分为以下五个方面。

2.1.1人脸检测(Face Detection)

此过程包括人脸检测(Detection)、人脸定位(Location)和人脸跟踪(Tracking)。所谓人脸检测,就是给定任意图像,确定其中是否存在人脸,如果有,给出人脸的位置、大小等状态信息。人脸跟踪指在一纽连续静态图像所构成的动态视频中实时地检测人脸。人脸检测主要受到光照、噪声、姿念以及遮挡等因素的影响,人脸检测的结果直接关系到后面两个过程的准确性。近年来,人脸检测和跟踪开始成为独立的研究课题受到关注。

2.1.2人脸表征(Face Representation)

人脸表征就是提取人脸的特征,是将现实空间的图像映射到机器空间的过程。人脸的表示具有多样性和唯一性,这其实就是人脸共性和特性之间的关系问题:只有保持这种多样性和唯一性,才能保证人脸图像的准确描述和识别。

人脸图像信息数据量巨大,为提高检测和识别的运算速度以及提高图像传输和匹配检索速度,必须对图像进行数据压缩,降低向量维数,即用尽可能少的数据表示尽可能多的信息。人脸的表征在提取人脸特征的同时,也实现了对原始图像数据的降维。

三 人脸特征提取与识别

PCA方法将包含人脸的图像区域看作随机向量,因此可采用K-L变换得到正交K—L基,对应其中较大特征值的基具有与人脸相似的形状,因此又被称为特征脸。利用这些基的线性组合可以描述、表达和逼近人脸图像,所以可进行人脸识别与合成。识别过程就是将人脸图像映射到由特征脸组成的子空间上,并比较其在特征脸空间中的位置。PCA方法认为图像的全局结构信息对于识别最重要,将图像看作一个矩阵,计算矩阵的特征值和对应特征向量进行识别。这种方法利用图像的总体信息,不从图像中提取出眼、嘴、鼻等几何特征,算法较简单且具有较高的识别率。

主成分分析法(PCA)是模式识别判别分析中最常用的一种线性映射方法,该方法是根据样本点在多维模式空间的位置分布,以样本点在空间中变化最大方向,即方差最大的方向,作为判别矢量来实现数据的特征提取与数据压缩的。从概率统计观点可知,一个随机变量的方差越大,该随机变量所包含的信息就越多,如当一个变量的方差为零时,该变量为一常数,不含任何信息。

3.1利用PCA进行特征提取的经典算法——Eigenface算法

在利用PCA进行特征提取的算法中,特征脸方法(Eigenface)是其中的一个经典算法。特征脸方法是从主成分分析导出的一种人脸识别和描述技术。特征脸方法就是将包含人脸的图像区域看作是一种随机向量,因此可以采用K-L变换获得其正交K-L基底。对应其中较大特征值的基底具有与人脸相似的形状,因此又称为特征脸。利用这些基底的线性组合可以描述、表达和逼近人脸图像,因此可以进行人脸识别与合成。识别过程就是将人脸图像映射到由特征脸张成的子空间上,比较其与己知人脸在特征空间中的位置,具体步骤如下:

(1)初始化,获得人脸图像的训练集并计算特征脸,定义为人脸空间,存储在模板库中,以便系统进行识别;

(2)输入新的人脸图像,将其映射到特征脸空间,得到一组关于该人脸的特征数据;

(3)通过检查图像与人脸空间的距离判断它是否是人脸;

(4)若为人脸,根据权值模式判断它是否为数据库中的某个人,并做出具体的操作。

3.2 PCA人脸识别流程

完整的PCA人脸识别应该包括以下四个步骤:人脸图像预处理;读入人脸库,训练成特征子空间;把训练图像和测试图像投影到上一步骤得到的子空间上;选择一定的距离函数进行识别。下面详细描述整个过程:

(1)读入人脸库

归一化人脸库后,将库中的每人选择一定数量的图像构成训练集,其余构成测试集。设归一化后的图像是N×N的,按列相连就构成维向量,可看作是维空间中的一个点,可以通过K-L变换用一个低维子空间描述这个图像。

(2)计算K-L变换的生成矩阵,并求取图像的特征值和特征向量

假设人脸图像库中有N幅人脸图像,用向量表示为(向量维数设为L),其人脸平均图像如式(2-1)所示:

(2-1)

由此可得到每幅图像的均差,如式(2-2)所示:

v2-e3537ce72ed2c80c2bacc026e76e38c7_b.jpg

, (2-2)

这样可计算协方差矩阵,如式(2-3)所示:

(2-3)

计算矩阵C的特征值和对应特征向量。

但是在实际计算中,矩阵C的大小是,即使对尺寸较小的图像计算量还是很大。为了减小运算量,现将每幅图像的均差形成一个矩阵,如式(2-4)所示:

(2-4)

则式(2-3)可以写成式(2-5):

(2-5)

因此,根据线性代数理论,将计算的特征值和对应特征向量的问题转化为求的特征值和对应的特征向量的问题。的大小仅为N×N远远小于,故简化了计算。在求出后,可以通过式(2-6)得到:

(2-6)

(3)把训练图像和测试图像投影到特征空间

由特征向量所形成的向量空间可表示人脸图像的主要特征信息,将人脸图像库中所有N个图像的均差向此空间投影,得到各自的投影向量,如式(2-7)和(2-8)所示:

(2-7)

(2-8)

对于待识别人脸图像I,计算其与k差的投影向量,如式(2-9)所示:

(2-9)

再与人脸图像库中N个人脸图像对应的投影向量比较,按照一定的距离准则完成识别。

(4)比较测试图像和训练图像,确定待识别样本类别

这里可以采用多种不同的分类器进行分类:范式、范式、最小距离、角度以及Mahalanobis距离等。


MATLAB特征脸程序实现

m = mean(T,2); %求样本的平均向量

Train_Number = size(T,2);

%%%%计算每个样本与平均向量的差向量

A = [];

for i = 1 : Train_Number

temp = double(T(:,i)) - m; %计算训练集中每幅图像的均差 Ai = Ti - m

A = [A temp];

end

L = A'*A; %计算协方差矩阵

[V D] = eig(L); % 求特征向量和特征值

3.3特征向量选取

上面所创建的用于投影的特征脸子空间使用的是所有r个非零的特征值对应的特征向量。虽然协方差矩阵C最多有对应于非零特征值的N个特征向量,且r≤N,但是通常情况下,r仍然会太大,而根据应用的需求,并非所有的,都有保留意义。而特征空间投影的计算速度是直接与创建子空间所用的特征向量的数目相关,若考虑到计算时间等因素,可以适当减去一些信息量少的特征向量,且去掉这些特征向量之后不一定不利于分类结果,有的情况下反而能够提高识别性能。下面将讨论几种不同的特征值选择方法:

(1)标准的特征空间投影:所有r个对应于非零特征值的特征向量均被用于创建特征脸子空间。但是该方法在r值较大时,计算速度会较慢,且不利于分类。

(2)为进一步压缩特征向量和减小运算量,将特征值按大小顺序排序,忽略小特征值所对应的特征向量,即由下式得到。设,r为的秩,rN,,则压缩后的特征向量集如式(2-10)所示:

,M<r (2-10)

经过实验证明当M的取值为M=[r*20%]的时候识别率最佳。

(3)保持前面的z—1个特征向量:将特征值按照降序排列,同时保留最前面的z一1个特征向量,其中z为训练图像的类别数。

(4)按照计算信息量来确定维数:不同于前面固定的丢弃一些特征向量,该方法采用保证剩余的特征向量所包含的信息与总的信息量相比大于一定的阈值e,e的值通常取为0.9,可依照式(2-11)计算:

(2-11)

MATLAB分类和提取特征值程序实现

% 按照特征值>1来提取特征向量

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; % A: centered image vectors

3.4距离函数的选择

图像被投影到特征空间中,剩下的任务就是如何判别这些图像的相似性。通常有两种方法来判别:一种是计算在N维空间中图像间的距离,另一种是测量图像间的相似性。当测量距离时,我们希望距离尽可能地小,一般选择与测试图像最近的训练图像作为它的所属的类别。而测量相似性的时候,则希望图像尽可能地相似,也就是说具有最大的相似性的训练图像类别是测试图像所属的类别。在此介绍几种计算方法:

(1)范式

将像素间的绝对值的差值相加,也称和范式。范式距离公式如式(2-12)所示:

(2-12)

(2)范式

将像素间的平方差异相加。也称为欧几里德距离。范式距离公式如式(2-13)所示:

(2-13)

(3)最小距离

首先计算各类训练样本的平均值,接下来的距离比较和上面的范式完全相同。这样分类时每类只需要比较一次,减少了计算量。样本x与第i类的距离定义如式(2-14)所示:

(2-14)

其中为第i类所有样本的平均值。

3.5 基于PCA的人脸识别

基于PCA算法的人脸识别过程由训练阶段和识别阶段两个阶段组成。在训练阶段,每个已知人脸X映射到特征脸组成的子空间上,得到N维向量。

距离阈值定义如式(2-15)所示:

(j,k=1,2,…,N) (2-15)

在识别的时候,首先把待识别的图像映射到特征脸空间,得出向量P及其与每个人脸集的距离(i=1,2,3,…,N),采用欧式距离法进行人脸识别,分类规则为:

(1)若>,则输入图像不是人脸图像;

(2)若<,

v2-77b4184ad99ec549f85723c1a03bc5da_b.jpg

,>,则输入图像包含未知人脸;

(3)若<,=min{},则输入图像为库中第k个人的人脸。

四 MATLAB源码

4.1.创建图片数据库

function T = CreateDatabase(TrainDatabasePath)
%%%%%%读取训练库路径,并统计样本个数
TrainFiles = dir(TrainDatabasePath);
%%%%%%%%将2维图像转化为一维向量
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);     
    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
4.2 主程序
clear all
clc
close all 
% You can customize and fix initial directory paths
TrainDatabasePath = uigetdir(strcat(matlabroot,'\work'), 'Select training database path' );%设置训练集路径
TestDatabasePath = uigetdir(strcat(matlabroot,'\work'), '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); 
[m, A, Eigenfaces] = EigenfaceCore(T);
OutputName = Recognition(TestImage, m, A, Eigenfaces); 
SelectedImage = strcat(TrainDatabasePath,'\',OutputName);
SelectedImage = imread(SelectedImage); 
figure;
subplot(1,2,1);imshow(im);
title('Test Image');
subplot(1,2,2);imshow(SelectedImage);
title('Equivalent Image');
str = strcat('Matched image is :  ',OutputName);
disp(str)
4.3最终程序结果

TrainDatabase里存放了20张图片,TestDatabase里存放了10张图片,所有图片格式和分辨率都相同。运行主程序时,先设置好TrainDatabase的路径,再设置好TestDatabase的路径,之后还会弹出你想要匹配的图片号(1-10),最终会显示出Test Image和在TrainDatabase里匹配出来Equivalent Image。如果所要匹配的图片和TrainDatabase里的图片相同,则匹配出来的图片则相同(如图4-5-1);如果所要匹配的图片在TrainDatabase里没有,则搜索出最为相近的图片(如图4-5-2)。

猜你喜欢

转载自blog.csdn.net/TuTu998/article/details/120177077