基于PCA的人脸识别算法

--Matlab

Face recognition

Based on PCA

目录

人脸识别技术是基于人的脸部特征,对输入的人脸图象或者视频流 . 首先判断其是否存在人脸 , 如果存在人脸,则进一步的给出每个脸的位置、大小和各个主要面部器官的位置信息。并依据这些信息,进一步提取每个人脸中所蕴涵的身份特征,并将其与已知的人脸进行对比,从而识别每个人脸的身份。

广义的人脸识别实际包括构建人脸识别系统的一系列相关技术,包括人脸图像采集、人脸定位、人脸识别预处理、身份确认以及身份查找等;而狭义的人脸识别特指通过人脸进行身份确认或者身份查找的技术或系统。

主成分分析 ( Principal Component Analysis , PCA )或者主元分析。是一种掌握事物主要矛盾的统计分析方法,它可以从多元事物中解析出主要影响因素,揭示事物的本质,简化复杂的问题。计算主成分的目的是将高维数据投影到较低维空间。给定 n 个变量的 m 个观察值,形成一个 n′m 的数据矩阵,n 通常比较大。对于一个由多个变量描述的复杂事物,人们难以认识,那么是否可以抓住事物主要方面进行重点分析呢?如果事物的主要方面刚好体现在几个主要变量上,我们只需要将这几个变量分离出来,进行详细分析。但是,在一般情况下,并不能直接找出这样的关键变量。这时我们可以用原有变量的线性组合来表示事物的主要方面, PCA 就是这样一种分析方法。

根据Kyungnam Kim在其论文 Face Recognition using Principle Component Analysis 中所陈述,PCA人脸识别的基本思想是“…express the large 1-D vector of pixelsconstructed from 2-D facial image into the compact principal components of thefeature space(eigenspace projection).” 也就是从人脸图像中找出最能代表人脸的特征空间。一个单个的人脸图片映射到这个特征空间得到这个特征空间的一组系数(这张人脸图片的特征脸特征)。如果两张人脸图片映射到这个特征空间的系数差不多,就表示这两张人脸是同一个人。从论文中我们也知道了特征空间的计算方法“Eigenspace is calculated byidentifying the eigenvectors of the covariance matrix derived from a set offacial images(vectors). ”

测试数据库为ORL_92x112,其中含40个人,每人10张图片,共400张图片。

下图为40个人的第一张图片。

6.1训练阶段

6.1.1 一张人脸图片在计算机表示为一个像素矩阵,即是一个二维数组,现在把这个二维数组变成一维数组,即把第一行后面的数全部添加到第一行。这样一张图片就能表示为一个向量d=(x1,x2......xn)。xn表示像素。

6.1.2 现在训练库里有m张人脸图片,把这些图片都表示成上述的向量形式,即d1,d2,。。。dm,把这m个向量取平均值得向量avg=(y1,y2......yn)。

得到平均图像:

6.1.3 用d1,d2...........dm分别减去avg后组成一个矩阵A,即矩阵A的第一行为d1-avg,后面类似。A的大小为m×n。因为找特征空间不能基于一张图片,而要在所有的人脸图片提取出共同特征,所以要取各个人脸向量到平均人脸向量的向量差。依据这个每个人脸图片跟平均脸向量的向量差组成矩阵A,然后依据矩阵A来求解最特征空间。

6.1.4.矩阵A乘以A的逆矩阵A‘得A的协方差矩阵B,B的大小m×m,求B的特征向量。取最大的K个特征向量组成新的矩阵T,T的大小m×k。

6.1.5 使用A’乘以T得到特征脸C,C的大小n×k。

6.1.6 用图片向量d乘以C得到图片向量d在特征脸的投影向量pn,有多少张图片就有多少个pn。pn的大小1×k

6.2探究各特征值所占有的能量数

6.2.1 第n个特征值占所有特征值之和的百分比 (特征值从小到大排列)。

6.2.2前n个特征值占所有特征值之和的百分比 (特征值从小到大排列)。

在实验中,要求保留90%的能量,所以当取前57个特征值得时候就可以满足要求了。

6.3测试阶段

6.3.1.一张新的图片也表示为d的向量,记为D,D的大小1×n

6.3.2. D乘以上面训练得到的特征脸C得到这个图片向量D在C下的投影向量P,p的大小1×k。

6.3.3.计算p与上面所有的pn的向量距离,与p最小的那个向量所对应的人脸图片跟这张新人脸图片最像。

6.3.4.判别图像的相似性有两种方法:一种是计算N维空间中图像间的距离,另一种是测量图像间的相似性。当测量距离时,距离应尽可能的小,一般选择距离测试图像最近的训练图像作为它所属的类别,识别的方法和最初的图像匹配方法类似:将测试集中的每一幅降维图像与降维的训练集进行匹配,然后将其分类到距离最小的训练集头像中,如果两个头像表示一个人,表示识别成功。而测量相似性时,图像应尽可能的相似,也就是说具有最大相似性的训练图像类被认为是测试图像所属的类别。本程序采用三阶近邻法。核心代码如下

运行程序后,将读取40个人的后5张图片,并进行比对,代码附录给出。

可得到识别率为accuracy =0.8500;

[1]Kyungnam Kim. Face Recognition using Principle Component Analysis [J] . IEEESignal Processing Society,2002,9(2):40-42.

[2] 罗韵. 用Matlab进行PCA人脸识别 [N/OL] . 网易LOFTER,[2013-04-12] .http://blog.163.com/luoyun_dreamer/blog/static/215529070201331281538309/?suggestedreading

[3]haitao111313 . 基于PCA的人脸检测 [N/OL] . CSDN博客 , [2012-08-16] .http://blog.csdn.net/haitao111313/article/details/7875392

[4] Turk,M.A. ; Media Lab., MIT, Cambridge, MA, USA ; Pentland, A.P. Face Recognitionusing Eigenfaces [J] . IEEE Signal Processing Society,1991,7

附录1.基于PCA的人脸识别的Matlab实现代码

function FaceRecognition

clear % calc xmean,sigma and its eigen decomposition

close all

allsamples=[];%所有训练图像

for i=1:40

for j=1:5

if(i<10)

a=imread(strcat('E:\ORL_92x112\00',num2str(i),'0',num2str(j),'.bmp'));

else

a=imread(strcat('E:\ORL_92x112\0',num2str(i),'0',num2str(j),'.bmp'));

end

b=a(1:112*92); % b是行矢量 1×N,其中N=10304,提取顺序是先列后行,即从上到下,从左到右

b=double(b);

allsamples=[allsamples; b]; % allsamples 是一个M * N 矩阵,allsamples 中每一行数据代表一张图片,其中M=200

end

end

samplemean=mean(allsamples); % 平均图片,1 × N

figure%平均图

imshow(mat2gray(reshape(samplemean,112,92)));

for i=1:200

xmean(i,:)=allsamples(i,:)-samplemean; % xmean是一个M × N矩阵,xmean每一行保存的数据是“每个图片数据-平均图片”

end;

% figure%平均图

% imshow(mat2gray(reshape(xmean(1,:),112,92)));

sigma=xmean*xmean'; % M * M 阶矩阵

[v,d]=eig(sigma);

d1=diag(d);

[d2,index]=sort(d1); %以升序排序

cols=size(v,2);% 特征向量矩阵的列数

for i=1:cols

vsort(:,i) = v(:, index(cols-i+1) ); % vsort 是一个M*col(注:col一般等于M)阶矩阵,保存的是按降序排列的特征向量,每一列构成一个特征向量

dsort(i) = d1( index(cols-i+1) ); % dsort 保存的是按降序排列的特征值,是一维行向量

end %完成降序排列 %以下选择90%的能量

dsum = sum(dsort);

dsum_extract = 0;

p = 0;

while( dsum_extract/dsum < 0.9)

p = p + 1;

dsum_extract = sum(dsort(1:p));

end

a=1:1:200;

for i=1:1:200

y(i)=sum(dsort(a(1:i)) );

end

figure

y1=ones(1,200);

plot(a,y/dsum,a,y1*0.9,'linewidth',2);

grid

title('前n个特征特占总的能量百分比');

xlabel('前n个特征值');

ylabel('占百分比');

figure

plot(a,dsort/dsum,'linewidth',2);

grid

title('第n个特征特占总的能量百分比');

xlabel('第n个特征值');

ylabel('占百分比');

i=1; % (训练阶段)计算特征脸形成的坐标系

while (i<=p && dsort(i)>0)

base(:,i) = dsort(i)^(-1/2) * xmean' * vsort(:,i); % base是N×p阶矩阵,除以dsort(i)^(1/2)是对人脸图像的标准化,特征脸

i = i + 1;

end % add by wolfsky 就是下面两行代码,将训练样本对坐标系上进行投影,得到一个 M*p 阶矩阵allcoor

%

% for i=1:20

% figure%平均图

% b=reshape(base(:,i)',112,92);%

% imshow(mat2gray(b));

% end

allcoor = allsamples * base; accu = 0; % 测试过程

for i=1:40

for j=6:10 %读入40 x 5 副测试图像

if(i<10)

if(j<10)

a=imread(strcat('E:\ORL_92x112\00',num2str(i),'0',num2str(j),'.bmp'));

else

a=imread(strcat('E:\ORL_92x112\00',num2str(i),num2str(j),'.bmp'));

end

else

if(j<10)

a=imread(strcat('E:\ORL_92x112\0',num2str(i),'0',num2str(j),'.bmp'));

else

a=imread(strcat('E:\ORL_92x112\0',num2str(i),num2str(j),'.bmp'));

end

end

b=a(1:10304);

b=double(b);

tcoor= b * base; %计算坐标,是1×p阶矩阵

for k=1:200

mdist(k)=norm(tcoor-allcoor(k,:));

end; %三阶近邻

[dist,index2]=sort(mdist);

class1=floor( index2(1)/5 )+1;

class2=floor(index2(2)/5)+1;

class3=floor(index2(3)/5)+1;

if class1~=class2 && class2~=class3

class=class1;

elseif class1==class2

class=class1;

elseif class2==class3

class=class2;

end;

if class==i

accu=accu+1;

end;

end;

end;

accuracy=accu/200 %输出识别率

人脸识别 pca matlab,基于PCA的人脸识别的Matlab实现代码相关推荐

  1. python人脸识别毕业设计-Python基于Dlib的人脸识别系统的实现

    之前已经介绍过人脸识别的基础概念,以及基于opencv的实现方式,今天,我们使用dlib来提取128维的人脸嵌入,并使用k临近值方法来实现人脸识别. 人脸识别系统的实现流程与之前是一样的,只是这里我们 ...

  2. python实现人脸识别系统设计_基于ROS的人脸识别系统设计与实现

    基于ROS的人脸识别系统设计与实现 文/胡思旺 李春杰 [摘 要]摘 要 [期刊名称]<电子技术与软件工程> [年(卷),期]2019(000)007 [总页数]3 [关键词][关键词]R ...

  3. android人脸识别应用架构,基于Android平台人脸识别系统的设计与实现

    摘要: 伴随着社会信息化,自动化的发展,以及科技的进步,未来将是移动互联网的时 代,为适应移动互联网的发展智能化的小型移动终端将是未来的发展趋势.与此同时人们对信息的安全性要求不断的提高,高自动化和高 ...

  4. css人脸识别的圆圈,基于HTML5 的人脸识别活体认证的实现方法

    html> #container { position : relative; } #canvas { position : absolute; left : 0; top : 0; } 你的浏 ...

  5. matlab人脸识别开题报告,基于人脸识别的出勤点名系统中特征提取算法研究开题报告...

    基于人脸识别的出勤点名系统中特征提取算法研究 一.本课题研究的目的,意义 人脸识别是一项既有科学研究价值,又有广泛应用前景的研究课题.国际上大量研究人员几十年的研究取得了丰硕的研究成果,自动人脸识别技 ...

  6. 人脸识别系统设计 -- 基于J2判据和FLDA的多分类器的人脸识别系统设计论文报告(三)(附matlab)

    目录 4 数据提取算法 4.1 数据提取目的 4.2 数据提取算法 5 交叉验证 5.1 交叉验证原理 A.交叉验证 B.交叉验证的用途 C.K-folds cross validation 5.2 ...

  7. pca人脸识别python_[机器学习] 用PCA进行人脸识别

    本文会带你详细的分析PCA人脸识别的代码 PCA在人脸识别中有重要的应用,如果想详细了解PCA的原理,可以看我的这篇文章:任妍Carol:[机器学习] 人脸识别的重要方法--PCA​zhuanlan. ...

  8. python人脸识别库_基于facenet的实时人脸识别系统

    facenet_facerecognition opencv+mtcnn+facenet+python+tensorflow 实现实时人脸识别 Abstract:本文记录了在学习深度学习过程中,使用o ...

  9. android 人脸识别 方法研究,基于Android平台的人脸识别技术研究

    摘要: 在计算机视觉与模式识别领域中,人脸检测与识别技术是一个非常热门的研究课题,同时也具备非常广阔的商业价值.在诸多的目标检测算法中,基于AdaBoost算法的目标检测方法具有检测速度快,检测效果好 ...

最新文章

  1. (POJ 3026) Borg Maze 最小生成树+bfs
  2. 查拉斯图拉的“没落”
  3. ASP.NET中实现模版的动态加载
  4. DataWorks功能实践速览 05——循环与遍历
  5. day12_oracle hint——SQL优化过程中常见Oracle中HINT的30个用法
  6. 使用Cloudformation集成Spring Boot和EC2
  7. 存根类 测试代码 java_为旧版代码创建存根-测试技术6
  8. Spark 大数据处理最佳实践
  9. 【Flink】Flink 消费 kafka 实现 限流处理 RateLimiter
  10. 嵌入式操作系统内核原理和开发(优先级的修改)
  11. TLE5012B ESP32驱动程序、硬件电路设计、4线SPI通信,驱动完美兼容4线SPI不用改MOSI开漏推挽输出
  12. alexa/alexa-avs-sample-app Windows 安装教程
  13. 计算机辅助模具设计实训心得6,模具设计实训心得体会3篇
  14. 作为面试官,我是如何甄别应聘者的包装程度
  15. Weblogic服务器证书安装配置 | Weblogic SSL
  16. SyntaxError: Non-UTF-8 code starting with ‘\xbd‘ in file D:/code/CapsNet/word.py on line 6, but...
  17. ubuntu Android Studio find in files 的快捷键 与搜狗输入法Linux版 简繁体切换快捷键冲突问题的解决办法【ctrl+ shift+F】
  18. Springboot毕业设计毕设作品,农产品销售系统设计与实现
  19. 架构师成长之路 5 --如何获取知识(学习境界)(方法)
  20. HP Xeon 55xx上GPU的带宽问题

热门文章

  1. Non-uniform memory access
  2. Windows Oracle客户端安装
  3. 从苏宁电器到卡巴斯基第19篇:曲折考研路(下)
  4. NewLink能链IPO,能源物联网的先行者?
  5. Spring的学习记录
  6. 微信PK阿里出新功能,小马哥躺着赚钱!
  7. 上海师范大学计算机考研难度,上海师范大学考研难吗?一般要什么水平才可以进入?...
  8. php融云开发文档,融云 - 融云开发文档
  9. python爬取公众号历史文章_Python爬虫爬取微信公众号历史文章全部链接
  10. Ext.net和Coolite的问题汇总