做人脸识别快3年了,从本科大三到现在研一,看了很多别人的博客,一直忙于学习和研究,今天第一次写个博客,关于“PCA人脸识别的”,打算今后把关于人脸识别的经典方法都在我的博客里面介绍一遍,有机会的话,把我自己做人脸识别方法也介绍给大家,目前主要研究压缩感知,稀疏表示相关的理论,对基于稀疏表示的人脸识别也有一段时间的研究。希望这篇博客对各位人脸识别研究的初学者提供一些帮助。下面开始介绍我的人脸识别研究之路的第一篇“PCA人脸识别”。
看了许多文章,做人脸识别研究的,PCA人脸识别应该必须了解的,这是基础,因为真正的计算机自动人脸识别的研究就是从PCA人脸识别开始的,20世纪80~90年代——经典PCA(Eigenface)和LDA(Fisherface)相继诞生。我们所研究的人脸识别,一般都基于标准人脸库进行训练、测试识别。
1. PCA人脸识别操作流程
在平时的研究中,我总结的PCA人脸识别的主要流程如下图所示:
图 1 PCA人脸识别流程图
通过上图的PCA人脸识别流程可以看出,PCA方法可以总结为以下几个阶段:训练样本、特征提取、构造特征空间、投影计算。
2. PCA人脸识别方法原理介绍
Karhunen-Loeve(K-L)变换或主要分量分析(Principal Component Analysis,PCA)是普遍使用的一种技术,这种技术的主要作用是将续信号转换为一组不相关的表示系数。主要分量分析(PCA)形成了K-L变换的基础,主要用于数据的紧凑表示。在数据挖掘的应用中,它主要应用于简化大维数的数据集合,减少特征空间维数,可以用较小的存储代价和计算复杂度获得较高的准确性。
PCA方法通过消除数据的相关性,找到一个空间,使得各个类别的数据在该空间上能够很好地分离。如下图所示:
图 2 PCA降维和分类示意图
在图2中,有一些离散的二维分布点,其中五角星表示一类集合,小圆圈表示另一类集合,假设这两个类别可以用特征X和特征Y进行描述,由图可知,在X轴和Y轴上这两个类别的投影是重叠的,表明这些点的两个特征X和Y没有表现出突出的识别性。但是两个类的投影在Z轴上区分度较大,显示出很好的识别性。PCA就是这样的一个工具,它可以产生非常好的降维效果,这种方法也可以用在图像处理的其他的一些研究中,如图像压缩、分类以及特征选择等。
接下来详细介绍一下PCA的理论原理:
通过对主成分分析方法做了简单的说明以后,接下来,我们来具体分析一下K-L变换的原理。
假设在图像集合f(m,n)中,每张图像可以用堆叠的方式表示成一个维列向量:
其表示方法为:从图像矩阵的第一列开始取,依次取到最后一列,每一列首尾相连,构成一个维列向量。将每一幅人脸图像表示
列向量以后,然后依次将每一个图像列向量转置成行向量,构成一个人脸样本矩阵,该样本矩阵即图像集合:
(2)
由式(2)可知样本矩阵有L行,其中每一行的数据就代表一张人脸样本图像,L表示训练样本的总个数。
训练样本的协方差矩阵为:
(3)
式中mf是所有训练样本的平均值向量,也即是所有样本的平均脸。(3)式中的[Cf]阵为阶实对称方阵,则其一定存在个相互正交的属于各个特征值的特征向量,即有:
(4)
将上述特征值进行降序排列,并取每个特征值对应的特征向量构成一个正交矩阵,也即是一个维的正交空间。按照文献中的说明,此处的矩阵[Cf]的维数很大,求解其特征值和特征向量比较复杂,这个时候需要对(3)式进行变形,简化求解,其变形结果如下:
此时,对(5)式中的矩阵进行特征值和特征向量的求解,将求解出的特征向量和特征值经过SVD奇异值分解,得到原训练样本的特征向量,这样就可以构造出最终的人脸投影空间。
其中vi就是(5)中协方差矩阵的特征向量,p是特征向量的个数。将特征向量转化为矩阵,矩阵就可以表示图像,也即是所谓的特征脸,如下:
图 3 PCA特征脸
到这里为止,我们就找到了PCA人脸识别需要的投影特征空间了:
(7)
接下来就可以通过K-L变换式进行投影计算了,得出各个样本在空间Wpca上的投影特征了:
(8)
其中[A]就是空间Wpca,其实(8)式中不用(f-mf)也行,直接换成f就可以,即表示将原人脸样本在空间Wpca上进行投影,将投影后的特征系数存在矩阵g中,如果没有记错的话,g中每一行表示一个人脸样本的特征系数(或者每一列表示一个人脸样本的特征稀疏,这个与个人的计算方法有关,主要是看矩阵的转置或者不转置)。
到这里PCA人脸识别的主要步骤已经介绍完了,剩下的就是识别过程了,这个比较容易理解,首先将训练样本在空间[A]上进行投影,得到投影样本的特征系数,然后将测试样本也在空间[A]上进行投影,得到每个测试杨样本的投影特征系数,此时,只需将测试某个样本的特征系数与训练样本投影特征系数进行欧式距离度量,看要测试的那个样本与训练集中哪个样本的欧式距离最近,就可以将该测试样本归为与之距离最近那个样本的类别。比如:训练样本a1属于S1类(S1类中包含很多样本,a1只是其中的一个样本),如果测试样本b1和a1的距离最近,那么就将b1归为S1类。如此下来,对所有的样本进行分类,就可以得到PCA人脸识别率了。
最后,关于PCA人脸识别的代码很多,百度一下就可以搜出很多链接,这篇博客主要简单地介绍一些PCA人脸识别的原理。
准备下一篇博客介绍基于Fisher线性判别分析人脸识别,也即是所谓的LDA人脸识别,希望能够抽出时间早点写出来。