模式识别课程作业 基于PCA与SVM的人脸识别算法

来源:互联网 发布:展板排版软件 编辑:程序博客网 时间:2024/04/29 22:48

1. 实验背景

人脸识别是一种基于人的脸部特征信息进行身份识别的一种生物识别技术。

在目前情况下,是一种发展比较成熟且效果较好的识别技术,有着广泛大量的应用前景。目前已经广泛用于政府、军队、银行、社会福利保障、电子商务等领域。类似的生物识别技术包括掌纹识别、虹膜识别等。

常用的人脸识别技术包括参考模版法、人脸规则法、样品学习法、肤色模型

法、特征脸法等。在实际检测过程中,也可将组合采用多种不同的人脸识别方法。

2. 实验原理

    主成分分析(Principal ComponentAnalysis,简称PCA)是目前采用很广泛的一种代数特征提取方法,是一种基于变量协方差矩阵对样本中的信息进行处理、压缩和抽取的有效方法。主要通过K-L变换展开式从人脸数据库中提取人脸的主要特征,构成特征脸空间。在识别时将待测试的人脸图像投影到特征脸空间,从而得到一组投影系数,在与数据库中各个人脸图像进行对比识别即可。这种方法保留了原始向量与其协方差矩阵最大特征值相应的特征向量方向上的投影,即主分量。具体的PCA算法步骤如下:

1.计算所有样本的均值m和散布矩阵S,所谓散布矩阵同协方差矩阵;

2.计算S的特征值,然后由大到小排序;

3.选择前n'个特征值对应的特征矢量作成一个变换矩阵E=[e1, e2, …, en’];

4.最后,对于之前每一个n维的特征矢量x可以转换为n’维的新特征矢量y: y = transpose(E)(x-m)。

支持向量机方法(Support Vector Mechina,简称SVM)是建立在统计学习理论的VC 维理论和结构风险最小原理基础上的,根据有限的样本信息在模型的复杂性(即对特定训练样本的学习精度,Accuracy)和学习能力(即无错误地识别任意样本的能力)之间寻求最佳折衷,以期获得最好的推广能力(泛化能力)。

SVM的主要思想可以概括为两点:
(1) 它是针对线性可分情况进行分析,对于线性不可分的情况,通过使用非

线性映射算法将低维输入空间线性不可分的样本转化为高维特征空间使其线性可分,从而使得高维特征空间采用线性算法对样本的非线性特征进行线性分析成为可能;

(2) 它基于结构风险最小化理论之上在特征空间中建构最优分割超平面,使

得学习器得到全局最优化,并且在整个样本空间的期望风险以某个概率满足一定上界。

支持向量机的目标就是要根据结构风险最小化原理,构造一个目标函数将两类模式尽可能地区分开来,通常分为两类情况来讨论,线性可分和线性不可分。

3. 实验步骤

实验采用PCA结合SVM的方法进行人脸识别,整体的框架见图1所示:


图1 人脸识别整体框架图

提取训练人脸数据,将人脸图片按照从行到列的顺序进行数据提取,构成原

始的人脸特征数据。

1) 使用PCA降维方法进行人脸特征数据的降维处理。

2) 利用SVM分类器算法进行人脸特征数据的模型训练。

3) 结合训练完成的模型,对测试人脸数据进行分类识别。最后统计分类识别效果。

4. 实验数据集与结果

整个实验平台环境为MatlabR2012b,分类器采用开源的LibSVM-3.20版本。

实验数据集共采用40个人的人脸,每个人脸有10张不同位置的图片,共400张测试图片。人脸图片统一格式为jpg格式,大小为92*112。部分人脸图片见图2所示:


图2 部分人脸数据集图片

实验过程中,对于每类人脸图像,采用前8张图片作为训练集图片,后两张

作为测试集图片。即训练集40类共320张人脸图片,测试集共80张人脸图片。

    在对人脸原始特征数据进行PCA降维处理时,使用至少能表示95%的能量大小的维度。实验计算后使用160维特征数据,即每个人脸数据是使用160维的特征向量表示。具体降维后的人脸特征向量见train.feature和test.feature文件。

使用LibSVM进行分类处理时,重点需要调节其损失函数c与核函数g的取

值。损失函数c的取值表示分类器模型对于错分类别数据的惩罚值,过大的c可能会导致过拟合的情况出现,而过小会导致分类效果很差。实验过程中使用grid_search的方法进行参数的优化选取,优化选取后的c=9.53674316406e-07,

g=4.0。该参数对于训练集达到了92.5%的分类成功率。

最后对于测试集人脸数据,结合上述优化选取后的参数,达到了93.75%的分类成功率,其中错误分类5个,成功分类75个。总体来看,实验结果还是相当满意的,具体的实验结果见表1。

表1 人脸识别实验结果表



5. 总结 

通过对实验结果的分析来看,特征脸方法在人脸识别方面有着相当好的效果,而且处理起来也比较方便,整体的效率都比较快。对于原始人脸图片不是特别大的时候,计算协方差矩阵的特征向量与特征值时都比较方便,但若维数多大、或者样本数与特征维数相差巨大的时候,该方法可能需要一定的改进。

 

附件:实验代码说明

function [XY] = read_face_data(mode, file)

% 读取人脸数据

% mode :'train' 表示读取FaceData目录下的训练人脸数据,即每个文件夹下文件名从1-8的人脸图片

%        'test' 表示读取FaceData目录下的测试人脸数据,即每个文件夹下文件名从9-10的人脸图片

%        'file' 表示从读取特定文件名的人脸文件

% file :当mode='file'时可用,表示读取的人脸数据文件名

% X:每行表示一个人脸数据,数据为按照人脸图片从行到列依次排序

% Y:每个人脸数据对应的类别标签,与X的每行数据相互对应

 

function [F, S] = extract_face_feature(X, Y, ratio, scale)

% 利用PCA对人脸数据进行特征降维,并构造成LibSVM数据输入格式以及输出到特征文件

% X : 人脸数据,每行代表一个人脸

% Y :人脸数据标签,对应与X的每行

% ratio : PCA降维的能量大小,即降维后数据的最低能量大小,范围0-1 当scale矩阵存在是,无实际意义

% scale : 固定的PCA降维转换矩阵,当对于测试数据时需给定与训练数据相同的转换矩阵,默认不使用,仅当测试数据时使用

% F : 降维提取后的人脸特征并转换为LibSVM格式

% S : PCA降维转换矩阵,当训练数据时输出,测试数据与给定的scale相同

 

function face_recognition()

% 人脸识别主程序

0 0
原创粉丝点击