人脸识别(1)--eigenface

Eigen是MIT于1991年提出的人脸识别算法,后来与归一化协相关量方法一起成为人脸识别的性能测试基准算法。

1. 算法描述

Eigenface的基本思想非常简单:以图像像素点为原始维度单位(如320*240的图,其维度为76800*1),试图找到一种变换将其转到另一个描述空间,在目标空间里,每种人脸能得到最好的区分。

具体的算法步骤如下:
1)将所有人脸图像reshape成N*1的矩阵,假设共有K组人脸,得到的人脸矩阵M为N*K。
2)求取M中每行数据的均值,即获得平均脸(N*1);再按列减去均值获得均值为0的新的人脸矩阵(N*K)。
3)求人脸矩阵的协方差矩阵
4)求协方差矩阵C的特征值和特征向量,并按特征值从大到小将对应的特征向量按行组成矩阵P(R*N,其中R取[1,N],一般选择前R组以起到降维效果)。
5)此时P就是算法希望找到的变换,将2)中的人脸矩阵 通过映射就得到新空间的人脸描述(R*K)
6)对于预测样本,按照5)做映射,比较映射空间里与训练集哪个样本最为接近得到预测值。

由以上算法描述可以看出eigenface就是个PCA过程。关于PCA,推荐文章《PCA的数学原理》,对PCA的原理分析比较到位。

此外对于图像维度很容易变得很大,这样经过翻倍得到的协方差矩阵是非常恐怖的。
这里有个小技巧:3)里协方差矩阵改为,这样4)里求得的特征向量转置则为,左乘再转置即为P。
关于该技巧的数学推导见wiki里eigenface词条的‘computing the eigenvectors’一节。

2. 算法实现

OpenCV2.4以上版本封装的FaceRecognizer类提供了eigenface的实现,此外该类还实现了fisherface和LBPHFface方法。
文章《使用opencv实现人脸识别》使用OpenCV做了个Python版本的实现。
文章《人脸识别之特征脸方法(Eigenface)》有matlab版的实现。

从效果来看,该方法的准确率较低,使用FERET的人脸数据训练和预测全部200类人脸,只有40%左右的精度。
人脸识别(1)--eigenface_第1张图片
图2-1. OpenCV提供接口的训练结果

你可能感兴趣的:(机器学习)