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

 更新时间:2018年03月13日 08:57:43   作者:兔死机  
这篇文章主要为大家详细介绍了人脸识别经典算法一,特征脸方法Eigenface,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

这篇文章是撸主要介绍人脸识别经典方法的第一篇,后续会有其他方法更新。特征脸方法基本是将人脸识别推向真正可用的第一种方法,了解一下还是很有必要的。特征脸用到的理论基础PCA在另一篇博客里:特征脸(Eigenface)理论基础-PCA(主成分分析法) 。本文的参考资料附在最后了^_^

步骤一:获取包含M张人脸图像的集合S。在我们的例子里有25张人脸图像(虽然是25个不同人的人脸的图像,但是看着怎么不像呢,难道我有脸盲症么),如下图所示哦。每张图像可以转换成一个N维的向量(是的,没错,一个像素一个像素的排成一行就好了,至于是横着还是竖着获取原图像的像素,随你自己,只要前后统一就可以),然后把这M个向量放到一个集合S里,如下式所示。

步骤二:在获取到人脸向量集合S后,计算得到平均图像Ψ,至于怎么计算平均图像,公式在下面。就是把集合S里面的向量遍历一遍进行累加,然后取平均值。得到的这个Ψ其实还挺有意思的,Ψ其实也是一个N维向量,如果再把它还原回图像的形式的话,可以得到如下的“平均脸”,是的没错,还他妈的挺帅啊。那如果你想看一下某计算机学院男生平均下来都长得什么样子,用上面的方法就可以了。

步骤三:计算每张图像和平均图像的差值Φ,就是用S集合里的每个元素减去步骤二中的平均值。

步骤四:找到M个正交的单位向量un,这些单位向量其实是用来描述Φ(步骤三中的差值)分布的。un里面的第k(k=1,2,3...M)个向量uk是通过下式计算的,

当这个λk(原文里取了个名字叫特征值)取最小的值时,uk基本就确定了。补充一下,刚才也说了,这M个向量是相互正交而且是单位长度的,所以啦,uk还要满足下式:

上面的等式使得uk为单位正交向量。计算上面的uk其实就是计算如下协方差矩阵的特征向量:

其中

对于一个NxN(比如100x100)维的图像来说,上述直接计算其特征向量计算量实在是太大了(协方差矩阵可以达到10000x10000),所以有了如下的简单计算。

步骤四另解:如果训练图像的数量小于图像的维数比如(M<N^2),那么起作用的特征向量只有M-1个而不是N^2个(因为其他的特征向量对应的特征值为0),所以求解特征向量我们只需要求解一个NxN的矩阵。这个矩阵就是步骤四中的AAT,我们可以设该矩阵为L,那么L的第m行n列的元素可以表示为:

一旦我们找到了L矩阵的M个特征向量vl,那么协方差矩阵的特征向量ul就可以表示为:

这些特征向量如果还原成像素排列的话,其实还蛮像人脸的,所以称之为特征脸(如下图)。图里有二十五个特征脸,数量上和训练图像相等只是巧合。有论文表明一般的应用40个特征脸已经足够了。论文Eigenface for recognition里只用了7个特征脸来表明实验。

步骤五:识别人脸。OK,终于到这步了,别绕晕啦,上面几步是为了对人脸进行降维找到表征人脸的合适向量的。首先考虑一张新的人脸,我们可以用特征脸对其进行标示:

其中k=1,2...M,对于第k个特征脸uk,上式可以计算其对应的权重,M个权重可以构成一个向量:

perfect,这就是求得的特征脸对人脸的表示了!

那如何对人脸进行识别呢,看下式:

其中Ω代表要判别的人脸,Ωk代表训练集内的某个人脸,两者都是通过特征脸的权重来表示的。式子是对两者求欧式距离,当距离小于阈值时说明要判别的脸和训练集内的第k个脸是同一个人的。当遍历所有训练集都大于阈值时,根据距离值的大小又可分为是新的人脸或者不是人脸的两种情况。根据训练集的不同,阈值设定并不是固定的。

后续会有对PCA理论的补充^_^.已补充理论:特征脸(Eigenface)理论基础-PCA(主成分分析法)

参考资料:

1、Eigenface for Recognition

2、特征脸维基百科

3、Eigenface_tutorial

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Python直接赋值及深浅拷贝原理详解

    Python直接赋值及深浅拷贝原理详解

    这篇文章主要介绍了Python直接赋值及深浅拷贝原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • python生成并处理uuid的实现方式

    python生成并处理uuid的实现方式

    这篇文章主要介绍了python生成并处理uuid的实现方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • python结束程序运行的四种方法

    python结束程序运行的四种方法

    大家好,小编为大家解答python结束程序的代码用什么符号的问题,很多人还不知道python如何结束程序运行,文中通过代码示例和图文结合的方式介绍的非常详细,现在让我们一起来看看吧
    2024-07-07
  • 关于python的bottle框架跨域请求报错问题的处理方法

    关于python的bottle框架跨域请求报错问题的处理方法

    这篇文章主要介绍了关于python的bottle框架跨域请求报错问题的处理方法,需要的朋友可以参考下
    2017-03-03
  • python super的使用方法及实例详解

    python super的使用方法及实例详解

    这篇文章主要介绍了python super的使用方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • Python pip 常用命令汇总

    Python pip 常用命令汇总

    这篇文章主要介绍了Python pip 常用命令汇总,帮助大家更好的理解和使用pip命令,感兴趣的朋友可以了解下
    2020-10-10
  • Python实现PS滤镜碎片特效功能示例

    Python实现PS滤镜碎片特效功能示例

    这篇文章主要介绍了Python实现PS滤镜碎片特效功能,结合实例形式分析了Python实现PS滤镜碎片效果的具体步骤与相关操作技巧,需要的朋友可以参考下
    2018-01-01
  • Pandas 同元素多列去重的实例

    Pandas 同元素多列去重的实例

    今天小编就为大家分享一篇Pandas 同元素多列去重的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • Python面向对象中的封装详情

    Python面向对象中的封装详情

    这篇文章主要介绍了Python面向对象中的封装详情,在python中也有对对象的封装操作,使其对外只提供固定的访问模式,不能访问其内部的私有属性和私有方法。下文详细内容,需要的小伙伴可以参考一下
    2022-03-03
  • 使用Python批量对文本文件编码互转的方法

    使用Python批量对文本文件编码互转的方法

    这篇文章主要介绍了使用Python批量对文本文件编码互转的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03

最新评论