Fisherface是由Ronald Fisher发明的,想必这就是Fisherface名字由来。Fisherface所基于的LDA(Linear Discriminant Analysis,线性判别分析)理论和特征脸里用到的PCA有相似之处,都是对原有数据进行整体降维映射到低维空间的方法,LDA和PCA都是从数据整体入手而不同于LBP提取局部纹理特征。如果阅读本文有难度,可以考虑自学斯坦福公开课机器学习或者补充线代等数学知识。
同时作者要感谢cnblogs上的大牛JerryLead,本篇博文基本摘自他的线性判别分析(Linear Discriminant Analysis)[1]。
1、数据集是二类情况
通常情况下,待匹配人脸要和人脸库内的多张人脸匹配,所以这是一个多分类的情况。出于简单考虑,可以先介绍二类的情况然后拓展到多类。假设有二维平面上的两个点集x(x是包含横纵坐标的二维向量),它们的分布如下图(1)(分别以蓝点和红点表示数据):

原有数据是散布在平面上的二维数据,如果想用一维的量(比如到圆点的距离)来合理的表示而且区分开这些数据,该怎么办呢?一种有效的方法是找到一个合适的向量w(和数据相同维数),将数据投影到w上(会得到一个标量,直观的理解就是投影点到坐标原点的距离),根据投影点来表示和区分原有数据。以数学公式给出投影点到到原点的距离:y=wTx。图(1)给出了两种w方案,w以从原点出发的直线来表示,直线上的点是原数据的投影点。直观判断右侧的w更好些,其上的投影点能够合理的区分原有的两个数据集。但是计算机不知道这些,所以必须要有确定的方法来计算这个w。
首先计算每类数据的均值(中心点):

这里的i是数据的分类个数,Ni代表某个分类下的数据点数,比如u1代表红点的中心,u2代表蓝点的中心。
数据点投影到w上的中心为:

如何判断向量w最佳呢,可以从两方面考虑:1、不同的分类得到的投影点要尽量分开;2、同一个分类投影后得到的点要尽量聚合。从这两方面考虑,可以定义如下公式:

J(w)代表不同分类投影中心的距离,它的值越大越好。

上式称之为散列值(scatter matrixs),代表同一个分类投影后的散列值,也就是投影点的聚合度,它的值越小代表投影点越聚合。
结合两个公式,第一个公式做分子另一个做分母:

上式是w的函数,值越大w降维性能越好,所以下面的问题就是求解使上式取最大值的w。
把散列函数展开:

可以发现除w和w^T外,剩余部分可以定义为:

其实这就是原数据的散列矩阵了,对不对。对于固定的数据集来说,它的散列矩阵也是确定的。
另外定义:

Sw称为Within-class scatter matrix。
回到
并用上面的两个定义做替换,得到:


展开J(w)的分子并定义SB,SB称为Between-class scatter。

这样就得到了J(w)的最终表示:

上式求极大值可以利用拉格朗日乘数法,不过需要限定一下分母的值,否则分子分母都变,怎么确定最好的w呢。可以令
,利用拉格朗日乘数法得到:

其中w是矩阵,所以求导时可以把
当做
。(这点我也不懂)
上式两边同乘以
可以得到:

可以发现w其实就是矩阵
的特征向量了对不对。
通过上式求解w还是有些困难的,而且w会有多个解,考虑下式:

将其带入下式:

其中λw是以w为变量的数值,因为(u1-u2)^T和w是相同维数的,前者是行向量后者列向量。继续带入以前的公式:

由于w扩大缩小任何倍不影响结果,所以可以约去两遍的未知常数λ和λw(存疑):

到这里,w就能够比较简单的求解了。
这部分是本博文的核心。假设有C个人的人脸图像,每个人可以有多张图像,所以按人来分,可以将图像分为C类,这节就是要解决如何判别这C个类的问题。判别之前需要先处理下图像,将每张图像按照逐行逐列的形式获取像素组成一个向量,和第一节类似设该向量为x,设向量维数为n,设x为列向量(n行1列)。
和第一节简单的二维数据分类不同,这里的n有可能成千上万,比如100x100的图像得到的向量为10000维,所以第一节里将x投影到一个向量的方法可能不适用了,比如下图:

图(2)
平面内找不到一个合适的向量,能够将所有的数据投影到这个向量而且不同类间合理的分开。所以我们需要增加投影向量w的个数(当然每个向量维数和数据是相同的,不然怎么投影呢),设w为:

w1、w2等是n维的列向量,所以w是个n行k列的矩阵,这里的k其实可以按照需要随意选取,只要能合理表征原数据就好。x在w上的投影可以表示为:

所以这里的y是k维的列向量。
像上一节一样,我们将从投影后的类间散列度和类内散列度来考虑最优的w,考虑图(2)中二维数据分为三个类别的情况。与第一节类似,μi依然代表类别i的中心,而Sw定义如下:

其中:

代表类别i的类内散列度,它是一个nxn的矩阵。
所有x的中心μ定义为:

类间散列度定义和上一节有较大不同:

代表的是每个类别到μ距离的加和,注意Ni代表类别i内x的个数,也就是某个人的人脸图像个数。
上面的讨论都是投影之间的各种数据,而J(w)的计算实际是依靠投影之后数据分布的,所以有:




分别代表投影后的类别i的中心,所有数据的中心,类内散列矩阵,类间散列矩阵。与上节类似J(w)可以定义为:


回想我们上节的公式J(w),分子是两类中心距,分母是每个类自己的散列度。现在投影方向是多维了(好几条直线),分子需要做一些改变,我们不是求两两样本中心距之和(这个对描述类别间的分散程度没有用),而是求每类中心相对于全样本中心的散列度之和。得到:

最后化为:

还是求解矩阵的特征向量,然后根据需求取前k个特征值最大的特征向量。
另外还需注意:
由于SB中的(μi-μ)秩为1,所以SB的至多为C(矩阵的秩小于等于各个相加矩阵的和)。又因为知道了前C-1个μi后,最后一个μc可以用前面的μi来线性表示,因此SB的秩至多为C-1,所以矩阵的特征向量个数至多为C-1。因为C是数据集的类别,所以假设有N个人的照片,那么至多可以取到N-1个特征向量来表征原数据。(存疑)
如果你读过前面的一篇文章PCA理论分析,会知道PCA里求得的特征向量都是正交的,但是这里的
并不是对称的,所以求得的K个特征向量不一定正交,这是LDA和PCA最大的不同。
如前所述,如果在一个人脸集合上求得k个特征向量,还原为人脸图像的话就像下面这样:

得到了k个特征向量,如何匹配某人脸和数据库内人脸是否相似呢,方法是将这个人脸在k个特征向量上做投影,得到k维的列向量或者行向量,然后和已有的投影求得欧式距离,根据阈值来判断是否匹配。具体的方法在人脸识别经典算法一:特征脸方法(Eigenface)里有,可前往查看。需要说明的是,LDA和PCA两种方法对光照都是比较敏感的,如果你用光照均匀的图像作为依据去判别非均匀的,那基本就惨了。
参考文献:
[1]Jerry Lead线性判别分析(Linear
Discriminant Analysis)(一)
[2]http://docs.opencv.org/modules/contrib/doc/facerec/facerec_tutorial.html
分享到:
相关推荐
《人脸识别经典算法三:Fisherface(LDA)解析》 人脸识别技术是计算机视觉领域中的一个重要分支,Fisherface作为其中的一种经典算法,基于LDA(线性判别分析)理论,旨在通过降维处理来优化特征提取,提高人脸识别...
在本项目中,我们关注的是FisherFace方法,这是一种基于线性判别分析(LDA)的人脸识别算法。 FisherFace算法由Fisher于1936年提出,最初用于多类别的统计分类问题。在人脸识别领域,它通过最大化类间距离与类内...
"FisherFace" 是一种著名的人脸识别算法,它基于统计学习理论,由R. Fisher提出,因此得名Fisher Face。本压缩包提供的内容是关于FisherFace算法的实现,主要针对MATLAB环境,适合于对机器学习、图像处理和计算机...
本文将详细介绍几种经典的人脸识别算法,这些算法在实际应用中具有广泛的影响。 1. **Eigenface** 算法:Eigenface是一种基于PCA(主成分分析)的人脸识别方法。它通过降维处理,提取人脸图像的主要特征,形成特征...
总的来说,基于LDA的Fisherface算法和KNN结合,能够在MATLAB环境中构建一个高效的人脸识别系统。这种方法易于理解和实现,且在许多情况下表现出良好的识别性能。通过不断优化和改进,我们可以进一步提高人脸识别的...
人脸识别技术是计算机视觉领域的重要...每种方法都有其独特的优势和应用场景,随着技术的不断进步,未来的人脸识别算法将更加精准和智能。理解和掌握这些算法对于理解人脸识别的内在机制和推动该领域的发展至关重要。
Fisherface方法是LDA在人脸识别中的应用,它结合了PCA和LDA的优势。首先,PCA用于降低数据的维度,去除噪声,然后LDA在PCA得到的低维特征空间中进行操作,以最大化类间距离和最小化类内距离。通过这种方式,...
**FisherFace算法详解** ...总结,FisherFace算法是通过PCA和LDA的结合,有效地处理面部图像的复杂性,提高人脸识别的准确性和鲁棒性。MATLAB代码提供了一个直观的学习平台,可以帮助我们理解和实现这一经典算法。
**PCA人脸识别算法详解** 主成分分析(Principal Component Analysis, PCA)是一种常见的数据分析方法,用于将高维数据转换为低维空间表示,同时保留原始数据的主要信息。在人脸识别领域,PCA被广泛应用于特征提取,...
**线性判别分析(LDA)与人脸识别** 线性判别分析(LDA)是一种统计分析方法,常用于特征降维和分类问题。在人脸识别领域,LDA被广泛应用于特征提取,目的是将高维的人脸图像数据转换为低维特征向量,同时最大化...
线性辨别分析(Linear Discriminant Analysis,简称LDA)是一种经典的统计分析方法,广泛应用于机器学习和模式识别领域,特别是人脸识别技术。LDA的主要目标是找到一种线性变换,使类间距离最大化,同时保持类内距离...
在“PR_pro_Algorithms”这个文件中,我们可以期待看到各种人脸识别算法的实现,包括上述提到的PCA、LDA、HOG、SIFT等,可能还包括深度学习模型的实现。MATLAB代码的注释将帮助我们理解每一步的作用,比如如何构建...
它提供了丰富的API,用于处理图像、视频流,并实现各种计算机视觉算法,如特征检测、图像分割、物体识别、人脸识别等。 2. **C#人脸识别**:在C#中使用EmguCV进行人脸识别,首先需要安装EmguCV相关的NuGet包,这将...
本文研究了结合LBP和Fisherface的人脸识别算法,通过实验证明了这种方法在降低计算复杂度和提升识别效果方面的优势。这种融合不同特征表示方法的策略为未来人脸识别技术的发展提供了新的思路,有助于推动更高效、...
人脸识别简单实现 - Eigenface - Fisherface (Matlab) pca_face_recognize 基于PCA的Eigenface算法实验程序; fisherface_face_recognize ...fisherface_face_recognize_gui 基于Fisherface算法的人脸识别GUI程序。
3. **人脸识别算法**:常见的有人脸识别算法有Eigenface、Fisherface和LBPH(局部二值模式直方图)。近年来,深度学习的引入极大地提升了识别性能,比如Siamese网络、Triplet loss等,它们通过对比学习来优化模型,...
人脸识别算法通常分为基于模板匹配、局部特征匹配和全局特征匹配三种类型。基于深度学习的方法,如Siamese网络、Triplet损失等,能够在大规模数据集上训练,提高识别的准确性和鲁棒性。 5. **毕业设计与论文**: ...
总的来说,"基于Fisherface的人脸图像识别"项目结合了Fisherface特征提取技术和LDA算法,通过MATLAB实现了一套完整的人脸识别系统。在实际应用中,这样的系统需要充分考虑光照、角度、表情等变化因素,以及数据集的...
"做人脸识别经典的人脸库"是针对这个主题的一个资源集合,提供了学习和测试人脸识别算法的基础素材。 该资源包含200多张人脸图片,每张图片有10个不同的版本,总计约2000张。这种设计使得人脸库具有较高的多样性,...
【基于矩阵对称性的Fisherface人脸识别方法】是一种改进的人脸识别算法,旨在提升Fisherface方法的识别性能。Fisherface方法是基于线性判别分析(LDA)的人脸识别技术,它通过最大化类间散度和最小化类内散度来寻找...