代码下载:基于PCA(主成分分析)的人脸识别

人脸识别是一个有监督学习过程,首先利用训练集构造一个人脸模型,然后将测试集与训练集进行匹配,找到与之对应的训练集头像。最容易的方式是直接利用欧式距离计算测试集的每一幅图像与训练集的每一幅图像的距离,然后选择距离最近的图像作为识别的结果。这种直接计算距离的方式直观,但是有一个非常大的缺陷—计算量太大。如果每幅图像大小为100*100,训练集大小1000,则识别测试集中的一幅图像就需要1000*100*100的计算量,当测试集很大时,识别速度非常缓慢。

解决上述问题的一个途径是对图像进行降维,通过只保留某些关键像素可以使识别速度大大提升。降维的一个方法即是PCA(主成分分析),在此我们介绍通过PCA进行人脸识别的步骤。

1 读取训练集图像数据

读取测试集目录下指定个数的图像,然后将其保存在一个二维数组中。如果图像个数为m,图像长宽为i、j,则我们创建一个二维数组A[m][i*j=n]用来保存图像数据。数组的每一行表示一个图像的所有像素信息,每一列表示一个随机变量,也即不同图像同一位置的像素信息,降维也即用更少的列来代表图像。

2 每列减去均值

将步骤一的每列减去该列的均值,这样每列的数据均值为0。在利用matlab的函数princomp执行PCA的过程中,princomp会首先将每一列减去该列均值,不用我们自己执行。

3 计算协方差矩阵

协方差矩阵表示不同随机变量之间的相互关系,图像中也即求任意两个像素之间的关系。如果两个随机变量的协方差为正或为负,表明两个变量之间具有相关性,如果为零表示两个变量不相关。通过计算协方差矩阵,我们就可以获得不同像素之间的关系。针对人脸识别,计算的协方差矩阵大小为n*n,其中n表示图像的像素点个数。

4 计算协方差矩阵的特征值和特征向量

由于协方差矩阵是实对称阵,所以可以求得其所有的特征值和特征向量,其共有n个特征值和特征向量。

5 选择主成分

所谓主成分即是具有最大特征值的特征向量,所以我们需要将特征向量按照特征值由大到小排序,然后根据精度要求选择不同数量的特征向量,例如我们选择了前p个特征向量,通常p远小于n(在我们的人脸识别实验中,为了达到95%的精度,p只有72,而n为120*140=17040)。

6 将训练集进行降维

此步骤将原始的训练集进行降维变换,原始的图像数据是m*n的矩阵,只包含主成分的特征向量构成一个n*p的矩阵(每一列都是一个特征向量)。将两个矩阵相乘,我们即可获得降维之后的图像矩阵m*p,这个矩阵远小于原始的图像数据。

7 将测试集进行降维

同步骤6相似,读取所有的测试集图像,然后对其也进行降维操作。如果测试集有M幅图像,则降维后的矩阵为M*p。

8 人脸识别

该步骤为人脸识别的最后一步,用来对测试集进行识别,并计算识别准确率。该步骤有一个限制,测试集中的头像必须包含在训练集中,否则得出的结果将没有意义(这也就是代码一开始要求训练集大于测试集的目的)。识别的方法和最初的图像匹配方法类似:将测试集中的每一幅降维图像与降维的训练集进行匹配,然后将其分类到距离最小的训练集头像中,如果两个头像表示一个人,表示识别成功,否则表示识别失败。与原始的匹配相比,由于对图像进行了降维,所以匹配速度大大提升,在我们的实验中速度提升了200以上(120*142/72)。

基于PCA的人脸识别步骤的更多相关文章

  1. 基于MATLAB的人脸识别算法的研究

    基于MATLAB的人脸识别算法的研究 作者:lee神 现如今机器视觉越来越盛行,从智能交通系统的车辆识别,车牌识别到交通标牌的识别:从智能手机的人脸识别的性别识别:如今无人驾驶汽车更是应用了大量的机器 ...

  2. 基于node.js人脸识别之人脸对比

    基于node.js人脸识别之人脸对比 Node.js简介 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境. Node.js 使用了一个事件驱动.非阻塞式 I/O ...

  3. 【计算机视觉】基于OpenCV的人脸识别

    一点背景知识 OpenCV 是一个开源的计算机视觉和机器学习库.它包含成千上万优化过的算法,为各种计算机视觉应用提供了一个通用工具包.根据这个项目的关于页面,OpenCV 已被广泛运用在各种项目上,从 ...

  4. 基于 OpenCV 的人脸识别

    基于 OpenCV 的人脸识别 一点背景知识 OpenCV 是一个开源的计算机视觉和机器学习库.它包含成千上万优化过的算法,为各种计算机视觉应用提供了一个通用工具包.根据这个项目的关于页面,OpenC ...

  5. 基于 HTML5 的人脸识别技术

    基于 HTML5 的人脸识别技术 https://github.com/auduno/headtrackr/

  6. java基于OpenCV的人脸识别

    基于Java简单的人脸和人眼识别程序 使用这个程序之前必须先安装配置OpenCV详细教程见:https://www.cnblogs.com/prodigal-son/p/12768948.html 注 ...

  7. 知物由学 | 基于DNN的人脸识别中的反欺骗机制

    "知物由学"是网易云易盾打造的一个品牌栏目,词语出自汉·王充<论衡·实知>.人,能力有高下之分,学习才知道事物的道理,而后才有智慧,不去求问就不会知道."知物 ...

  8. 机器学习:PCA(人脸识别中的应用——特征脸)

    一.思维理解 X:原始数据集: Wk:原始数据集 X 的前 K 个主成分: Xk:n 维的原始数据降维到 k 维后的数据集: 将原始数据集降维,就是将数据集中的每一个样本降维:X(i) . WkT = ...

  9. 【笔记】特征脸(PCA在人脸识别领域的应用)

    人脸识别与特征脸(简单介绍) 什么是特征脸 特征脸(Eigenface)是指用于机器视觉领域中的人脸识别问题的一组特征向量,该方法被认为是第一种有效的人脸识别方法. PCA的具体实现思想见 [笔记]主 ...

随机推荐

  1. Javascript初级学习总结

    首先,在Html页面输出,使用document.write('内容'); <html> <head> <title></title> <scrip ...

  2. JavaScript基础(简介、语法)

    一.JavaScript简介 1.JavaScript是个什么东西? 它是个脚本语言,需要有宿主文件,它的宿主文件是HTML文件. 2.它与Java什么关系? 没有什么直接的联系,Java是Sun公司 ...

  3. Cocos2d-x基础篇C++

    1.C++类和对象 类的公有成员可以使用成员访问运算符(.)访问. (::)是范围解析运算符.调用成员函数是在对象上使用(.)运算符. 2.C++继承(C++中父类称为基类,子类称为派生类) clas ...

  4. BZOJ 1878: [SDOI2009]HH的项链( BIT )

    离线处理 , 记下询问的左右端点并排序 , 然后可以利用树状数组 , 保证查询区间时每种颜色只计算一次 ------------------------------------------------ ...

  5. 织梦dedecms|文章页通用标签

    当前位置: {dede:field name='position'/}上一页: {dede:prenext get='pre'/}下一页:    {dede:prenext get='next'/}收 ...

  6. Bootstrap Collapse使用

    参考 http://wrongwaycn.github.io/bootstrap/docs/javascript.html#collapse http://www.w3resource.com/twi ...

  7. perl unicode utf-8 \x转换

    [root@dr-mysql01 ~]# cat x5.pl use Encode; use JSON; use URI::Escape; use LWP::Simple; my $host = &q ...

  8. JAVA GUI学习 - JMenuBar菜单条、JMenu菜单、JMenuItem菜单项组件学习

    public class MenuBarKnow extends JFrame { JMenuBar jMenuBar; JMenu jMenuFile,jMenuEditor,jMenuAbout; ...

  9. Java编程思想重点笔记

    首先声明转自https://github.com/lanxuezaipiao/ReadingNotes 无意中发现,写的蛮好转过来学习下. 1. Java中的多态性理解(注意与C++区分) Java中 ...

  10. 程序中的Cookie 和Session

    这几天回家休息后,想想放假之前的几天,主要看的一些工作上的东西,发现对Session和Cookie这两个东西,我还是很陌生.恩,趁着有网,看了点相关的资料,打算整理下.一翻博客,发现已经有前辈已经对这 ...