opencv中人脸识别算法的基本原理(一)
使用opencv中自带的三种人脸识别算法进行实验后,特意去了解学习了一下其基本原理,在这里记录下。
opencv人脸识别
关于如何使用opencv实现人脸识别的过程可以参考:
http://blog.csdn.net/wanghz999/article/details/78773643、
http://blog.csdn.net/wanghz999/article/details/78776240
这两篇博客。这里不再赘述。opencv支持3种人脸识别的算法,分别是:
- Eigen Faces
- Fisher Faces
- Local Binary Pattern Histograms(局部二值模式直方图)
本文对三种算法的基本原理进行介绍。
Eigenfaces的原理
Eigenfaces就是特征脸的意思,是一种从主成分分析(Principal Component Analysis,PCA)中导出的人脸识别和描述技术。特征脸方法的主要思路就是将输入的人脸图像看作一个个矩阵,通过在人脸空间中一组正交向量,并选择最重要的正交向量,作为“主成分”来描述原来的人脸空间。为了更好地理解特征脸方法,需要先了解PCA的主要过程。
PCA主要过程
在很多应用中,需要对大量数据进行分析计算并寻找其内在的规律,但是数据量巨大造成了问题分析的复杂性,因此我们需要一些合理的方法来减少分析的数据和变量同时尽量不破坏数据之间的关联性。于是这就有了主成分分析方法,PCA作用:
- 数据降维。减少变量个数;确保变量独立;提供一个合理的框架解释。
- 去除噪声,发现数据背后的固有模式。
PCA的主要过程:
- 特征中心化:将每一维的数据(矩阵A)都减去该维的均值,使得变换后(矩阵B)每一维均值为0;
- 计算变换后矩阵B的协方差矩阵C;
- 计算协方差矩阵C的特征值和特征向量;
- 选取大的特征值对应的特征向量作为”主成分”,并构成新的数据集;
特征脸方法
特征脸方法就是将PCA方法应用到人脸识别中,将人脸图像看成是原始数据集,使用PCA方法对其进行处理和降维,得到“主成分”——即特征脸,然后每个人脸都可以用特征脸的组合进行表示。这种方法的核心思路是认为同一类事物必然存在相同特性(主成分),通过将同一目标(人脸图像)的特性寻在出来,就可以用来区分不同的事物了。人脸识别嘛,就是一个分类的问题,将不同的人脸区分开来。特征脸方法的过程(先计算特征脸,然后识别人脸):
- 将训练集中的N个人脸拉成一列(
reshape(1,1)
),然后组合在一起形成一个大矩阵A。若人脸图像大小为m * m,则矩阵A的维度是m * m * N; - 将N个人脸在对应的维度求平均,得到一个“平均脸”;
- 将矩阵A中N个图像都减去“平均脸”,得到新矩阵B;
- 计算B的协方差矩阵;
- 计算协方差矩阵的特征值和特征向量(特征脸);
- 将训练集图像和测试集图像都投影到特征向量空间中,再使用聚类方法(最近邻或k近邻等)得到里测试集中的每个图像最近的图像,进行分类即可。
在opencv中void EigenFaceRecognizer::train();
就是对训练集进行处理最终得到特征向量和阈值的过程,其中的阈值用于后面对测试图像的识别。int EigenFaceRecognizer:: predict(InputArray src) const;
是对测试图像进行识别。
特征脸识别的局限性
要让系统准确识别需要保证人脸图像满足:
- 待识别图像中人脸尺寸接近特征脸中人脸的尺寸;
- 待识别人脸图像必须为正面人脸图像。
若不满足此条件,识别错误率很高。从PCA方法的过程可以看出,特征脸识别的方法是以每张人脸的一个维度(可以看出是矩阵的一列)为单位进行处理的,求得的特征向量(特征脸)中包含训练集每个纬度的绝大部分信息。但是若测试集中人脸尺寸不同,那么与特征脸中维度的也就没法对应起来。
Fisherfaces
在将Fisherfaces之前需要对线性判别进行一定的说明。
Fisher线性判别分析(linear discriminant analysis,LDA)
线性判别分析是由Fisher提出的线性判别方法,可以用来处理两类的线性判别问题。两类的线性判别问题可以看做所有的样本投影到一个方向(或者说是一个维度空间中),然后再这个空间中确定一个分类的阈值。过这个阈值点且与投影方向垂直的超平面就是分类面。判别思路是选择投影方向,使得投影后两类相隔尽可能远,类内又尽可能聚集(类间方差最大,类内方差最小)。
它的过程分为:
- 确定最优的投影方向:
- 在这个方向上确定分类阈值;
Fisherfaces方法
Fisherfaces方法结合了PCA和LDA的优点,其具体过程如下:
- PCA降维:对原始样本进行PCA处理,获取PCA处理之后的新样本;
- LDA特征提取:对降维后的样本使用Fisher线性判别方法,确定一个最优的投影方向,构造一个一维的特征空间(这就被称为Fisherfaces),将多维的人脸图像投影到Fisherfaces特征空间,利用类内样本数据形成一组特征向量,这组特征向量就代表了人脸的特征。
在opencv中void FisherFaceRecognizer::train();
就是对训练集进行处理最终得到特征向量和阈值的过程,其中的阈值用于后面对测试图像的识别。int FisherFaceRecognizer:: predict(InputArray src) const;
是对测试图像进行识别。