人脸识别经典算法三:Fisherface(LDA)

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就能够比较简单的求解了。

2、数据集是多类的情况

这部分是本博文的核心。假设有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

转载 http://blog.csdn.net/smartempire/article/details/23377385

时间: 2024-10-14 23:30:26

人脸识别经典算法三:Fisherface(LDA)的相关文章

人脸识别经典算法一:特征脸方法(Eigenface)

这篇文章是撸主要介绍人脸识别经典方法的第一篇,后续会有其他方法更新.特征脸方法基本是将人脸识别推向真正可用的第一种方法,了解一下还是很有必要的.特征脸用到的理论基础PCA在另一篇博客里:特征脸(Eigenface)理论基础-PCA(主成分分析法) .本文的参考资料附在最后了^_^ 步骤一:获取包含M张人脸图像的集合S.在我们的例子里有25张人脸图像(虽然是25个不同人的人脸的图像,但是看着怎么不像呢,难道我有脸盲症么),如下图所示哦.每张图像可以转换成一个N维的向量(是的,没错,一个像素一个像素

OpenCV人脸识别Eigen算法源码分析

1 理论基础 学习Eigen人脸识别算法需要了解一下它用到的几个理论基础,现总结如下: 1.1 协方差矩阵 首先需要了解一下公式: 共公式可以看出:均值描述的是样本集合的平均值,而标准差描述的则是样本集合的各个样本点到均值的距离之平均.以一个国家国民收入为例,均值反映了平均收入,而均方差/方差则反映了贫富差距,如果两个国家国民收入均值相等,则标准差越大说明国家的国民收入越不均衡,贫富差距较大.以上公式都是用来描述一维数据量的,把方差公式推广到二维,则可得到协方差公式: 协方差表明了两个随机变量之

OpenCV人脸识别LBPH算法源码分析

1 背景及理论基础 人脸识别是指将一个需要识别的人脸和人脸库中的某个人脸对应起来(类似于指纹识别),目的是完成识别功能,该术语需要和人脸检测进行区分,人脸检测是在一张图片中把人脸定位出来,完成的是搜寻的功能.从OpenCV2.4开始,加入了新的类FaceRecognizer,该类用于人脸识别,使用它可以方便地进行相关识别实验. 原始的LBP算子定义为在3*3的窗口内,以窗口中心像素为阈值,将相邻的8个像素的灰度值与其进行比较,若周围像素值大于或等于中心像素值,则该像素点的位置被标记为1,否则为0

人脸识别算法初次了解

这是转载别人的帖子,认为好,大家一块学习http://www.cnblogs.com/guoyiqi/archive/2011/07/28/2129300.html 前言 在写此文之前,先扯点东西.我一直在找一个东西,让我思考,让我久久的深陷当中,永久的,不断的思考.现在,我意识到,这个东西即是算法.我一直在找一家合适的公司,能让我的兴趣无比放肆的,自由驰骋. ok,由于在一家公司的面试过程中,面试官提到过这个人脸识别算法,由于在此之前,未曾有过了解,所以,特作此番学习与研究.有不论什么问题,欢

人脸识别(基于OpenCV)

描述 人脸识别包括四个步骤 人脸检测:定位人脸区域,只关心是不是脸: 人脸预处理:对人脸检测出来的图片进行调整优化: 收集和学习人脸:收集要识别的人的预处理过的人脸,然后通过一些算法去学习如何识别: 人脸识别:识别当前人脸与数据库里的哪个人脸最相似. 人脸检测 OpenCV集成了基于PCA LDA 和LBP的人脸检测器,源文件自带很多各种训练好的检测器.下表是常用的XML文件 上面的XML文件可以检测正面人脸.眼睛或鼻子.检测人脸我采用的是第一个或第二个Harr人脸检测器.识别率比较好. 第一步

人脸识别(face recognition)

一.前述 1. 发展 以往的人脸识别主要是包括人脸图像采集.人脸识别预处理.身份确认.身份查找等技术和系统.现在人脸识别已经慢慢延伸到了ADAS中的驾驶员检测.行人跟踪.甚至到了动态物体的跟踪.由此可以看出,人脸识别系统已经由简单的图像处理发展到了视频实时处理.而且算法已经由以前的Adaboots.PCA等传统的统计学方法转变为CNN.RCNN等深度学习及其变形的方法.现在也有相当一部分人开始研究3维人脸识别识别,这种项目目前也受到了学术界.工业界和国家的支持. 之后的内容主要参考了下面的链接,

反人脸识别的思路和实现

反人脸识别的思路和实现 一.基本知识和背景      ?人脸识别是非常经典的机器识别运用,目前已经在许多地方得到了使用.相关的算法原理和实现发展的都很发达,Opencv中就有不错的实现.这是现状. 但是,也正因为此,和人相关的隐私变得令人关注.应用sigvc上面的一个概念叫做“反人脸识别”http://www.sigvc.org/bbs/forum.php?mod=viewthread&tid=3348&highlight=%B7%B4%C8%CB%C1%B3,就是关注用户隐私的一种技术实

人脸识别相关分享

人脸识别源代码 ※人脸检测(文章+程序)---技术文档及代码非常全『 人脸检测(文章+程序).rar (1.27 MB) 人脸检测(文章+程序).rar (1.27 MB) 下载次数: 12502 2010-12-21 12:26 』 ※完整的Matlab下人脸检测及识别系统源代码『 Face-Recognition-Detection.rar (393.19 KB) Face-Recognition-Detection.rar (393.19 KB) 下载次数: 11604 2010-12-2

多维活体检测,让人脸识别更安全

今年的315晚会提到人脸识别领域的安全风险,主持人用现场合成的视频通过了活体检测和人脸验证,因此人脸识别的安全性引起大众关注.对于活体检测的安全隐患,腾讯优图团队一直保持高度关注,并依托多年积累的技术能力和业务运营经验,已经对人脸识别技术手段进行过多次安全升级,让人脸识别更安全. 一.目前人脸识别常见攻击手段有什么? 1 .纸片翻拍,通过打印用户的照片进行攻击: 2. 屏幕翻拍,一些3D建模技术可以驱动用户的单张照片或视频做出系统要求的摇头.张嘴.眨眼等动作: 3. 用户戴面具: 二.如何应对人