热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

**PCA主元分析法小结(人脸识别概述性)

PCA,即主元分析法,是用来做数据降维的一种方法。从思想上讲,一个高纬的数据,往往包含很多多余的信息,我们希望
PCA,即主元分析法,是用来做数据降维的一种方法。从思想上讲,一个高纬的数据,往往包含很多多余的信息,我们希望将其取出,尽可能地降到一个较低的维度,但同时又必须保证其数据失真尽可能小。PCA就是一套算法,在保证重建误差最小的情况下,提取出高维数据的主元,从而实现数据的降维。

    下面具体来说PCA算法在人脸识别中的算法流程,前提:有一个训练图集,里面放着同一个人的脸(对齐过的),并且每张图长宽的像素点都相同(比如160*120);有一个测试图集,里面放着待测图像,待测图像的长宽像素点与训练图集一样。

    PCA的算法流程是:

    一、训练流程

    S1:构筑训练图像矩阵:将每一张人脸图张开成一维行向量(也可以是列向量,但以下的计算都是用行向量),训练集中所有图像组成一个训练图像矩阵,每一个行向量代表一张图。

    S2:计算平均脸、协方差矩阵:平均脸就是将所有的行向量求平均得到的一个平均的行向量,将每张脸向量按下面公式计算得到协方差矩阵。

  

    S3:计算协方差矩阵的特征值与特征向量,取前r大的特征值对应的特征向量构成r维特征空间,r

   

    S4:按照下面公式将训练图集矩阵的每个行向量向特征空间投影,为每一张图得到投影后的r维向量,这就是降维后的每张图的特征向量了。

   

 

    二、识别流程:

    S1:保留训练流程中的平均脸与特征空间。

    S2:构筑测试图像矩阵,与训练流程中的一样。

    S3:将测试图像矩阵中的每一行按照训练流程s4中的公式向特征空间投影,得到每张图像矩阵的特征向量。

    S4:根据投影后的特征向量与特征空间重建图像,计算原图像与重建后的图像间的距离。

    S5:判断是否是人脸:设定阈值,如果原图像与重建后的图像间的距离小于阈值,则判断为人脸,继续s6,否则判否,识别结束。

    S6:识别是否是特定人:设定阈值,并计算测试图像特征向量与所有训练图像特征向量间的欧氏距离,取最小的距离,如果最小距离小于阈值,则识别接受,否者就拒绝接受。

    正如题目所示,这篇文章只是概述性的小结,说的很简单,以功能与算法流程为主,很多原理与细节没有展开,要想深入了解的,可以参考下面的文献:

 

    关于PCA算法原理理解的:

    《Eigenfaces for Recognition》——本文的公式都来自本论文,并没有仔细标明,具体参考这篇论文。

    《基于PCA针对表情变化的人脸识别技术研究》

    http://leen2010.blogbus.com/logs/124631640.html

 

    用OPENCV编程实现PCA算法的:

    http://apps.hi.baidu.com/share/detail/34585074

   附:

                                                                             OPENCV中的PCA使用(转)

对于PCA,一直都是有个概念,没有实际使用过,今天终于实际使用了一把,发现PCA还是挺神奇的。

 在OPENCV中使用PCA非常简单,只要几条语句就可以了。

1、初始化数据

//每一行表示一个样本

CvMat* pData = cvCreateMat( 总的样本数, 每个样本的维数, CV_32FC1 );

CvMat* pMean = cvCreateMat(1, 样本的维数, CV_32FC1);

//pEigVals中的每个数表示一个特征值

CvMat* pEigVals = cvCreateMat(1, min(总的样本数,样本的维数), CV_32FC1);

//每一行表示一个特征向量

CvMat* pEigVecs = cvCreateMat( min(总的样本数,样本的维数), 样本的维数, CV_32FC1);

2、PCA处理,计算出平均向量pMean,特征值pEigVals和特征向量pEigVecs

cvCalcPCA( pData, pMean, pEigVals, pEigVecs, CV_PCA_DATA_AS_ROW );

3、选出前P个特征向量(主成份),然后投影,结果保存在pResult中,pResult中包含了P个系数

CvMat* pResult = cvCreateMat( 总的样本数, PCA变换后的样本维数(即主成份的数目), CV_32FC1 );

cvProjectPCA( pData, pMean, pEigVecs, pResult );

4、 重构,结果保存在pRecon中

CvMat* pRecon = cvCreateMat( 总的样本数, 每个样本的维数, CV_32FC1 );

cvBackProjectPCA( pResult, pMean, pEigVecs, pRecon );

5、重构误差的计算

计算pRecon和pData的"差"就可以了.

使用时如果是想用PCA判断“是非”问题,则可以先用正样本计算主成分,判断时,对需要判断得数据进行投影,然后重构,计算重构出的数据与原数据的差异,如果差异在给定范围内,可以认为“是”。

如果相用PCA进行分类,例如对数字进行分类,则先用所有数据(0-9的所有样本)计算主成分,然后对每一类数据进行投影,计算投影的系数,可简单得求平均。即对每一类求出平均系数。分类时,将需要分类得数据进行投影,得到系数,与先前计算出得每一类得平均系数进行比较,可判为最接近得一类。当然这只是最简单得使用方法


推荐阅读
  • Monkey《大话移动——Android与iOS应用测试指南》的预购信息发布啦!
    Monkey《大话移动——Android与iOS应用测试指南》的预购信息已经发布,可以在京东和当当网进行预购。感谢几位大牛给出的书评,并呼吁大家的支持。明天京东的链接也将发布。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 阿里Treebased Deep Match(TDM) 学习笔记及技术发展回顾
    本文介绍了阿里Treebased Deep Match(TDM)的学习笔记,同时回顾了工业界技术发展的几代演进。从基于统计的启发式规则方法到基于内积模型的向量检索方法,再到引入复杂深度学习模型的下一代匹配技术。文章详细解释了基于统计的启发式规则方法和基于内积模型的向量检索方法的原理和应用,并介绍了TDM的背景和优势。最后,文章提到了向量距离和基于向量聚类的索引结构对于加速匹配效率的作用。本文对于理解TDM的学习过程和了解匹配技术的发展具有重要意义。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 现在学vb6还靠得住么?语言只是工具,关键是思想。程序=算法+数据结构。除了汇编,其他语言都靠不住。随着时代的进步,很多语言跟不上开发的要求。从面向过程到面向对象,与其说是思想的进步,不如说是为了适应高速开发。除了底层汇编语言,还有那些能适应高速开发的语言。每种语言都是很有趣的。 ... [详细]
  • 本文介绍了一个从入门到高手的VB.NET源代码,通过学习这些源代码,可以在21天内成为VB.NET高手。文章提供了下载地址,并提醒读者加入作者的QQ群和收藏作者的博客。 ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
author-avatar
787849993_8c653d
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有