孤独明镜

菩提本无树,明镜亦非台,本来无一物,何处惹尘埃。

嗨,我是Dragon,一名全栈开发者。现居上海,就职于一家游戏开发公司。做过Linux/QT、WEB(PHP/Python)、游戏开发,目前主攻图形/图像方向,对数学、文学、哲学、摄影等非常的喜爱。


人脸识别实现–特征脸算法

OpenCV人脸识别支持三种方式:特征脸(Eigenfaces)、Fisher脸(FisherFace)、LBP直方图(LBPHFace)。我使用的是Eigenfaces,所以在这里就先让一下Eigenfaces的算法。
算法描述:
1)读入训练人脸库,X=[x1, x2…xn]
2)计算平均脸及和个训练人脸到平均脸的距离,平均脸就是各人脸图像的和的平均的向量。
平均脸图像为Y=(x1+x2…xn)/n
训练人脸到平均脸的距离为di = xi-Y
3) 计算特征脸。设矩阵A=[d1,d2,d3…dn],则AAT为训练样本的协方差矩阵,其特征向量wi即为特征脸,构成特征脸空间W=[w1, w2, w3…wi]。
但,比如我们有200张图片,每张100100像素大小,那么PCA需要解决协方差矩阵的求解,而A的大小是10000200,那么我们会得到1000010000大小的矩阵,这样会用掉很大内存,而且直接求它的特征值运算量会很大。
而我们知道矩阵的SVD分解刚好是根据AAT和ATA的特征值和特征向量来分解的,所以我们可以根SVD分解,通过求ATA的特征向量来间接求AAT 的特征向量。
公式如下
vi=A
uisqrt(1/eig) vi为AAT特征向量,ui为ATA的特征向量,eig为ATA的特征值。这样我们就得到了要求的特征向量。
4)投影。将每个人脸图像投影到特征脸空间,得到特征脸向量。
Pi=WT
di
5)把待识别的人脸图像通过4)投影到特征脸空间,将其特征脸向量与训练样本的特征脸向量进行比较(利用欧氏距离)。

转载请注明地址:孤独明镜