基于PCA的图像压缩及人脸识别算法

  • 一、PCA基础知识
  • 二、 算法分析与MATLAB仿真
    • 原始图像数据的处理
    • 对原始数据进行特征值分解
    • 对图像数据降维后的各维度所占能量进行分析
    • 图像质量随维度数的变化
    • 不同人脸的特征投影
    • 投影分析与量化
    • 人脸识别
      • 单张人脸图片的测试
      • 人脸识别概率测试

一、PCA基础知识

博文最后会附上例程代码~

PCA(Principal Component Analysis) 是一种常见的数据分析方式,常用于高维数据的降维,可用于提取数据的主要特征分量。
在统计学中,主成分分析PCA是一种简化数据集的技术。它是一个线性变换。这个变换把数据变换到一个新的坐标系统中,使得任何数据投影的第一大方差在第一个坐标(称为第一主成分)上,第二大方差在第二个坐标(第二主成分)上,依次类推。主成分分析经常用于减少数据集的维数,同时保持数据集的对方差贡献最大的特征。这是通过保留低阶主成分,忽略高阶主成分做到的。这样低阶成分往往能够保留住数据的最重要方面。

如图所示,为数据在原始空间和PCA空间的表示,在原始空间,数据近似于随机分布,如果是随机数据则在每个坐标轴上都近似满足正太分布。经过PCA降维处理,将原始数据投影到新的正交子空间中,并且数据的主成分按照从大到小的顺序投影在各个正交基上,前k个大特征值对应的特征向量组成的基构成的子空间可以包含数据的绝大部分成分。仅对前k个维度数据进行处理即可近似地得到与原始数据相一致的结果,并且PCA降维后的数据因为其正交性,特征更加明显,可以应用于人脸识别中来。

近似地,有熟悉导航信号的同学可以发现,在导航信号中,对接收数据进行下变频并进行IQ分解也是一种投影技术。在这里,我们将导航信号投影到由sin和cos组成的正交基上,将接收数据的绝大部分分量投影到同相路中,而正交之路只包含有原始信号的一些相位特性。

二、 算法分析与MATLAB仿真

原始图像数据的处理

我们从数据集中获取的图像往往都是二维的,而在PCA分析中,我们需要将二维图像转换为一维列向量。
如下代码是将一个文件夹中的40个子文件夹中存放的400张人脸读取到数据矩阵A中,并将R×C大小的图片按列存储为RC×1,因为这里是400张112×92大小的图片,所以A矩阵大小为10304×400。

A = zeros(112*92,400);
for file_cnt = 1:400str = num2str(file_cnt);file_path1 = strcat('s',str);SamplePath1 = strcat('.\faces_dataset\att_faces\',file_path1,'\');  %存储图像的路径fileExt = '*.pgm';  %待读取图像的后缀名%获取所有路径files = dir(fullfile(SamplePath1,fileExt)); len1 = size(files,1);%遍历路径下每一幅图像for file_cnt2=1:len1fileName = strcat(SamplePath1,files(file_cnt2).name); image = imread(fileName); A(:,((file_cnt-1)*10)+file_cnt2) = reshape(image,10304,1);end
end

对原始数据进行特征值分解

对数据矩阵A得到特征值的方法有两种,特征值分解法和SVD分解法,二者最后的结果都是得到原始数据的特征值和特征向量。特征值分解原理方法步骤这里不再赘述,直接上算法步骤:
这里用的是SVD分解法:

%PCA
[V, L, mu] = cw_pca(A);
% Subtract the mean from data
A_ZeroMean = bsxfun(@minus, A, mu);%所有样本去掉均值脸

其中V和L是经过降序排列的特征向量和特征值,mu是均值脸,在进行投影变换前要对样本去掉均值脸。
如下图可以看到这组数据的均值脸:

对图像数据降维后的各维度所占能量进行分析

前K维的特征值及前K维空间中图像数据投影后所占能量。

eigenenergy = zeros(1,400);
for cnt = 1:400if cnt == 1eigenenergy(cnt) = L(cnt);elseeigenenergy(cnt) =  eigenenergy(cnt-1) + L(cnt);end
end
%归一化
eigenenergy = eigenenergy./eigenenergy(400);
figure(3)
plot(1:400,eigenenergy);

结果如图所示;

共400个维度,前若干个特征值即占有了绝大部分能量。

图像质量随维度数的变化

将图像投影到全维特征子空间中为下图中最后一幅图像所示,将子空间维度10等分,依次选取前若干份维度的信息进行投影变换,得到的图像重建质量如下图所示:

图像的投影与反投影函数:

A_14_z = A_ZeroMean;
% P = A'*V;%投影,两种投影均可
% A_unprj = V * P'; %反投影
P = V'* A_14_z;%投影
A_unprj = V * P; %反投影
A_unprj = A_unprj + repmat(mu,1,size(A_unprj,2)); %加上均值;

降维后截取前K个特征值的方法是:

A_14_z = A_ZeroMean;
V_i = V(:,1:K);%取其前K个特征向量
P = V_i'* A_14_z;%投影
A_unprj = V_i * P; %反投影
A_unprj = A_unprj + repmat(mu,1,size(A_unprj,2)); %加上均值;

我们还可以用RMSE(均方根误差)来作为图像重建质量的评价标准,通过将截断值K从1选到400,查看其RMSE误差:

不同人脸的特征投影

取其第1和第2个特征向量作为2维坐标系的横轴和纵轴,画出6个不同人脸在这2个维度上的坐标。每张人脸10副图像,即10个点:

随后在其前3个大特征值对应的特征向量组成的三维坐标系中观察这种分类现象:

投影分析与量化

实际应用中为了控制压缩比,经常需要对数据进行量化,我们这里对投影后的结果矩阵进行量化,首先对其进行分析。结果矩阵如下图所示,值随着维度的增大而减小。

这里比较了两种量化方法 ,一种是整体进行8bit量化,另一种是前50个点进行8bit量化,后250个点进行4bit量化,下方贴出了两种量化方法RMSE误差随压缩比(这里固定量化方式,改变维度截断系数K来改变压缩比)改变而改变的情况。

人脸识别

下边分析基于前述讨论的人脸识别方法

单张人脸图片的测试

首先进行但张人脸的识别分析,从40个人的400张图片中取出一个人的某张图片作为测试图片,将其余399张图片作为训练集进行PCA投影,这一步即训练部分,将训练集的部分特征分解投影变换到一组正交基张成的低维子空间,从而将其特征保留下来。
分别将训练集和测试图片在PCA后的基上进行投影,下图画出了5个人在基上前3个维度的坐标,红色是被测试者,红色星状点是被测试者未被训练的人脸图片。通过子空间分析可以发现,除了各个人的人脸特征进行了聚类外,与被测人脸有同样特征的未训练数据也被投影到了相近的位置。
由此进行分析,将每个人的10组投影值进行求平均,得到这个人在这个训练集下PCA投影点的质心保存下来,然后判断未被训练的新图片距离质心的距离即可判断是否是这个人的人脸,机器也就能学习到这个人脸的特征,并进行识别。

人脸识别概率测试

首先计算40个人脸投影值的质心,下方左侧图片是400张图片各自的投影值,右侧是求质心后的40个投影值。

对400张图片每个都进行人脸识别测试,统计其正确概率即可得到人脸识别正确率,检测结果成功率为87%。
通过对被测图像进行预处理,可以提高检测概率。

后边写的人脸识别的代码有点随意,所以只贴了前半部分PCA压缩和特征分析的代码,全部代码在网盘中。
网盘链接
提取码:yyy4

基于PCA的图像压缩及人脸识别算法相关推荐

  1. 基于PCA方法的ORL人脸识别及Python代码实现

    基于PCA方法的ORL人脸识别及Python代码实现 PCA算法 方案设计 代码实现 结果分析 参考文献 PCA的理论知识已经有很多博客做了清晰的解释,主要概括为找到投影的面使得类间误差最大,转化为找 ...

  2. 基于PCA和SVM的人脸识别系统的设计与实现

      基于PCA和SVM的人脸识别系统的设计与实现 1.1 题目的主要研究内容 工作的主要描述 下载人脸数据集,将其划分为训练集和测试集,对所有数据进行pca降维,将经过降维的训练集特征向量送入svm进 ...

  3. 基于深度神经网络的遮挡人脸识别算法的研究(小白初学)

    基于深度神经网络的遮挡人脸识别算法的研究(小白初学) 研究背景 在自然条件下人脸面部的光照变化.角度变化.表情变化以及存在遮挡物,使得采集到的人脸图像存在人脸特征的损失.因此研究遮挡人脸识别算法提高识 ...

  4. 基于正交拉普拉斯脸的人脸识别算法研究

    直觉上,自然存在的人脸数据可以由支持的概率分布采样生成或者近似于环绕空间的子流线型分布.据此,我们提出了一种基于外观的人脸识别算法,称为正交拉普拉斯脸(Orthogonal Laplacianface ...

  5. 【人脸识别】基于PCA和SVM的人脸识别关键技术研究与实现附matlab代码

    1 简介 人脸识别是计算机视觉和图像模式识别领域的一个重要技术.主成分分析(PCA)是人脸图像特征提取的一个重要算法.而支持向量机(SVM)有适合处理小样本问题,高维数及泛化性能强等多方面的优点.文章 ...

  6. 基于PCA和SVM的人脸识别

    svm推广到多类情况 一对多的最大响应策略(one against all) 假设有A .B.C.. D四类样本需要划分.在抽取训练集的时候,分别按照如下4种方式划分. A. 所对应的样本特征向量作为 ...

  7. 基于PCA和SVM的人脸识别系统-error修改

    ------------------------------------------------- Undefined function or variable 'W'. Error in class ...

  8. 基于PCA 人脸识别/人脸识别算法/人脸检测程序源码MATLAB ELM+PCA人脸识别 PCA人脸识别matlab代码 基于PCA算法的人脸识别

    1.基于PCA的人脸识别代码 2.MATLAB ELM+PCA人脸识别 2.基于PCA的人脸识别(matlab)(采用PCA算法进行人脸识别,通过抽取人脸的主要成 分,构成特征脸空间,识别时将测试图像 ...

  9. 基于改进的RPCA人脸识别算法

    from:http://www.chinaaet.com/article/3000011311 基于改进的RPCA人脸识别算法 作者:首照宇,杨晓帆,莫建文 2015/11/15 18:04:00 摘 ...

  10. 传统人脸识别算法及缺点

    人脸识别一直是计算机视觉领域中关注的焦点,而且这些年来围绕该研究课题产生的人脸识别算法也是层出不穷,而降维思想一直是众多经典的人脸识别算法中一个主要解决技巧,它的主要目标就是要从原始的人脸图像中发现隐 ...

最新文章

  1. highcharts加载数据库数据(java版)
  2. 三种css样式表及其优先级
  3. scanf的一些小细节
  4. 【Python】模拟面试技术面试题答
  5. jQuery多选插件
  6. android超级管理员权限作用,Android获取超级管理员权限的实现
  7. oracle迁移性能对比,SQL Server 2015与Oracle性能对比.doc
  8. php 2个时间查询差几天,PHP怎么计算2个日期差
  9. SWJTU 2208 最大覆盖
  10. poi设置excel表格边框,字体等
  11. Scale和Resolution的相互转换算法
  12. 01-探寻 JavaScript 反爬虫的根本原因
  13. 什么是银行的表内表外业务?
  14. 知识图谱(七)——事件抽取
  15. java smb删除指定文件,java 利用SMB向远道机器写文件
  16. Django使用MySQL数据库
  17. 泛微e-cology OA 系统远程代码执行漏洞
  18. SRP的一个实例(1)
  19. Python 递归函数返回值为 None 的解决办法
  20. fl21怎么换主题flstudio皮肤怎么换?

热门文章

  1. 《ArcGIS10.2》 Part1 在地图上标注地名或坐标
  2. Ubuntu 修改只读文件
  3. linux网站如何添加swf支持,linux上查看swf文件.靠谱
  4. 机器学习Class 6:分类及描述
  5. UDS(一)入门概述
  6. 熵权法stata程序
  7. linux命令中man使用不起,Linux中man命令起什么作用呢?
  8. mysql转储导入错误_将MySQL转储应用于RDS时出现“无法解析表名”错误
  9. java代码实现流程中的会签_一个简单的会签实例
  10. AppCompatActivity设置透明背景