最近玩了玩opencv里面的人脸识别模块,所以就研究了一下它的算法原理。从OpenCV2.4开始,加入了新的类FaceRecognizer,我们可以使用它便捷地进行人脸识别实验。opencv里封装了三种人脸识别算法,其中一种是 Eigenfaces算法,它使用PCA降维进行特征提取,这也是PCA最经典的应用之一。由于之前也知道有PCA这种算法,但是并没有研究过,这次接触人脸识别,正好能好好看看。看了一些博客和书籍,大概知道了点,所总结一下就当是做笔记了。
1. 为什么要用PCA对数据进行降维处理。
特征脸技术是用于人脸或者一般性刚体识别以及其它涉及到人脸处理的一种方法。首先把一批人脸图像转换成一个特征向量集称为“Eigenfaces”,即“特征脸”,它们是最初训练图像集的基本组件。识别过程是把一副新的图像投影到特征脸子空间,并通过它的投影点在子空间的位置以及投影线的长度来进行判定和识别。
一副用来训练的人脸截图一般大概为100*100,所以一幅图的特征向量为10000维,但问题是如此多维数的特征向量都有用吗,可以说其中有很多特征都是冗余的,既增加算法的空间复杂度又增加时间复杂度。所以要从其中提取出最主要的几个特征实现特征向量的降维,因此要用到主成分分析。
2.具体实现步骤和原理。
假如一副训练图片大小为M=W*H,那么其特征 x 为M维的,如果有N张图片也就是N个样本,则其特征向量构成的特征矩阵为 X =[x1 , x2 , ... , xN], 其中xi =[x1i,x2i,x3i, ... ,xMi]T (i=1, 2, 3, ... ,N)表示其中一个M维的样本,对每个特征求取平均值得到 μ=[μ1,μ2,... ,μM],计算协方差矩阵:
计算S的特征值和相应的特征向量,将特征向量按递减排列选择最大的K个,然后将其对应的K个特征向量分别作为列向量组成特征向量矩阵R,计算RTXi(RT表示R的转置,i表示第i幅图像),这样就得到了我们需要的已经降维的数据RTXi,也就是把特征向量从M维降到了K维。