托马斯·哈代又来送诗啦,搬好小凳几~~~
Sky seems to end its track;
But no.
The road trails down the hill at the back.
Ever the road!

Directory

  • Purpose
  • Principle
  • Procedure
  • Result and Analysis
  • Conclusion

Purpose

  • Learn how to use PCA
  • Preliminarily understand face recognition features
  • Get more proficient in the use of MATLAB

Principle

  • The introduction of PCA
    PCA 的基本原理是利用离散 K-L 变换提取人脸的主要成分,从而构成特征脸空间,识别时把测试样本投影到该空间,构成一组投影系数,通过与特征脸的距离比较,距离最小的特征脸对应的即是识别结果。

  • Face recognition based on PCA
    基于 PCA 的人脸识别分为三个阶段:第一个阶段利用训练样本集构建特征脸空间;第二个阶段是训练阶段,主要是将训练图像投影到特征脸子空间上;第三个阶段是识别阶段,将测试样本集投影到特征脸子空间,然后与投影后的训练图像相比较,距离最小的为识别结果。
    基于 PCA 的人脸识别其实一种统计性的模板比配方法,原理简单,易于实现,但也有不足,它的识别率会随着关照,人脸角度,训练样本集的数量而变换,但仍不失为一种比较好的方法。

Procedure

  • Basic steps of PCA algorithm
    1:Structure feature space

    2:Recognize
  • Train
    1:Training methods
    库里一共有400张照片,有40个子文件夹,每个子文件夹对应一个人的10张不同照片,将照片重新划分并按照顺序命名。
    ① 每个人的任意5-8张照片作为训练并作为测试样本库,其余的5-2张图片作为测试的待识别的照片;
    ② 前30-38个人的照片作为训练,后10-2个人作为测试,其中测试中每个人的任意5-8张照片作为测试样本库,即与特征脸矩阵构成特征脸空间,其余的5-2张照片作为待识别的图片。
n = 1;
p = 1;
%分成train和test两个文件夹,且图片重命名
for i = 1:40                                % 一共40个人a = 1:10;                               % 每个人都是10张Ind = a(:,randperm(size(a,2)));       % size:取矩阵的列数  randperm:打乱顺序for h = 1:train_num  j= Ind(1,h);File = ['C:\Users\Lenovo\Desktop\人脸识别images\s',sprintf('%d',i),'\',sprintf('%d',j),'.pgm'];Filesave = ['C:\Users\Lenovo\Desktop\train','\',sprintf('%03d',p),'.pgm'];copyfile(File,Filesave)p = p + 1;                        % 训练样本总数endfor h = train_num+1:10  j= Ind(1,h);File = ['C:\Users\Lenovo\Desktop\人脸识别images\s',sprintf('%d',i),'\',sprintf('%d',j),'.pgm'];Filesave = ['C:\Users\Lenovo\Desktop\test','\',sprintf('%03d',n),'.pgm'];copyfile(File,Filesave)n = n + 1;                         % 测试样本总数end
end

对于训练2的方式,这里需要分成三个部分:训练集、验证集和测试集。

n = 1;
m = 1;
p = 1;
% 分成train、test、validate三个文件夹,且图片重命名
for i = 1:train_num                         % 前n个人a = 1:10;                               % 每个人10张Ind = a(:,randperm(size(a,2)));       % size:取矩阵的列数  randperm:打乱顺序for h = 1:10 j = Ind(1,h);File = ['C:\Users\Lenovo\Desktop\人脸识别images\s',sprintf('%d',i),'\',sprintf('%d',j),'.pgm'];Filesave = ['C:\Users\Lenovo\Desktop\train','\',sprintf('%03d',p),'.pgm'];copyfile(File,Filesave)p = p + 1;                        % 训练样本总数end
end
for i = train_num + 1 :40                     % 后40-n个人的前5张a = 1:10;                                Ind = a(:,randperm(size(a,2)));  for h = 1:5  j= Ind(1,h);File = ['C:\Users\Lenovo\Desktop\人脸识别images\s',sprintf('%d',i),'\',sprintf('%d',j),'.pgm'];Filesave = ['C:\Users\Lenovo\Desktop\validate','\',sprintf('%03d',m),'.pgm'];copyfile(File,Filesave)m = m + 1;                         % 测试样本总数endfor h = 6:10  j= Ind(1,h);File = ['C:\Users\Lenovo\Desktop\人脸识别images\s',sprintf('%d',i),'\',sprintf('%d',j),'.pgm'];Filesave = ['C:\Users\Lenovo\Desktop\test','\',sprintf('%03d',n),'.pgm'];copyfile(File,Filesave)n = n + 1;                         % 待识别总数end
end

2:The process of the photos in library
① 将每一张库的照片转化成N维的向量,然后把这些向量存入一个矩阵里,可将这些向量以列的形式存在矩阵X里;
② 将矩阵里向量的每个元素加起来求出平均值,再用矩阵X中的每个向量减去这个平均值从而得到每个向量的偏差,最后得到了偏差矩阵X’;
③ 中心化并计算协方差矩阵;
④ 利用协方差矩阵进行主成分分析,提取特征脸,获取训练样本特征数据。
以下实验源代码是针对的训练方式1,训练方式2在形成特征脸与特征空间时稍有所不同。

%批量读取指定文件夹下的图片
path = uigetdir;                         % 打开一个模态对话框
img_path = dir(strcat(path,'\*.pgm'));   % 列出.pgm文件
img_num = length(img_path);              % img_num:文件夹中的总数
imagedata = [];                          % 一张图片为一列
if img_num >0for j = 1:img_numimg_name = img_path(j).name;temp = imread(strcat(path, '/', img_name));temp = double(temp(:));imagedata = [imagedata, temp];end
end%中心化并计算协方差矩阵
wts = size(imagedata,2);                        % imagedata的列数(等于训练的样本数)
img_pj= mean(imagedata,2);                      % 均值
for i = 1:wtsimagedata(:,i) = imagedata(:,i) - img_pj;   % 中心化
end
covMat = imagedata'*imagedata;                  % 转置% 利用协方差矩阵进行主成分分析,提取特征脸,获取训练样本特征数据
% COEFF:系数矩阵
% latent:特征值的大小(从大到小)构成的向量
% explained:贡献率
[COEFF, latent, explained] = pcacov(covMat);
% 留下使累计贡献量达95%的k个特征向量
i = 1;
proportion = 0;
while(proportion < 95)proportion = proportion + explained(i);i = i+1;
end
k = i - 1;
% 求出原协方差矩阵的特征向量,即特征脸
V = imagedata*COEFF;          % N*M阶
V = V(:,1:k);
%显示前3的特征脸
A = reshape(V(:,1),[112,92]);
A = mat2gray(A);
axes( handles.axes1 )
imshow([A]);
B = reshape(V(:,2),[112,92]);
B = mat2gray(B);
axes( handles.axes2 )
imshow([B]);
C = reshape(V(:,3),[112,92]);
C = mat2gray(C);
axes( handles.axes3 )
imshow([C]);
% 训练样本在 PCA 特征空间下的表达矩阵 k*M
W = V'*imagedata;
  • Test
    对于测试样本,先读取图像,将其变换到PCA空间再利用近邻法识别。
    1:Read a photo
[filename, path] = uigetfile({'*.pgm'},'choose photo');
str = [path, filename];
im = imread(str);
axes( handles.axes4);
imshow(im);

2:Nearest neighbor recognition

im1 = double(im(:));
objectone = V'*(im1 - img_pj);              %计算待识别图片的投影
size(objectone)
%最小距离法,寻找和待识别图片最为接近的训练图片
for k = 1:wtstemp1(k) = norm(objectone - W(:,k));    %欧氏距离
end
  • Calculate the accuracy and display the recognition results
    对需要识别的每一张照片进行测试,与训练样本库中的每一张照片进行对比,若得到的最小距离的照片与待识别的照片为同一组(根据输入的每组照片训练数目判断),就标记正确,准确率=正确数/总待识别数。
    为了便于分析,对每一幅测试图像显示距离排名在前三位的识别结果。

1:Display the top 3 recognition results

[s_temp,id]=sort(temp1,'ascend');           %筛选出距离前三小的
axes( handles.axes5 )
imshow(['C:\Users\Lenovo\Desktop\train','\',sprintf('%03d',id(1)),'.pgm'])
axes( handles.axes6 );
imshow(['C:\Users\Lenovo\Desktop\train','\',sprintf('%03d',id(2)),'.pgm'])
axes( handles.axes7 )
imshow(['C:\Users\Lenovo\Desktop\train','\',sprintf('%03d',id(3)),'.pgm'])

2:Acquire accuracy

col_of_data = 40*train_num;
pathname = uigetdir;
img_path_list = dir(strcat(pathname,'\*.pgm'));
img_num = length(img_path_list);
testdata = [];
if img_num >0for j = 1:img_numimg_name = img_path_list(j).name;temp = imread(strcat(pathname, '/', img_name));temp = double(temp(:));testdata = [testdata, temp];end
end
col_of_test = size(testdata,2);            %col_of_test:待测样本数
img_pj= mean(testdata,2);   for i = 1:size(testdata,2)testdata(:,i) = testdata(:,i) - img_pj;
end
object =V'* testdata;num = 0;
for j = 1:col_of_testdistance = 1e8;for k = 1:col_of_data                 %col_of_data:训练样本总数temp = norm(object(:,j) - W(:,k));if(distance>temp)aimone = k;                   %取出距离最小的distance = temp;endendif ceil(j/(10-train_num))==ceil(aimone/(train_num))num = num + 1;                %TP:预测和真实值都为1end
end
accuracy = num/col_of_test;

3:Line chart to show accuracy
ps:图中显示数据是自己多次人工验证的数据。

axes( handles.axes8 )
x=5:1:8;
a=[0.920,0.956,0.967,0.975]; %数据
plot(x,a,'-*b');     %线性,颜色,标记
set(gca,'XTick',[5:1:8])
set(gca,'YTick',[0.75:0.05:1])
xlabel('训练数目(n/10)')
ylabel('准确率')

Result and Analysis

  • Result
    1:The first method

    2:The second method
  • Analysis
    从上面的运行结果可以看出,PCA方法通过特征脸空间根据近邻法可以找到所属的人,并且从最后的准确率折线图可以看出:随着训练样本库照片的增加,所对应的准确率逐步增大,对于训练1方式,当选取的每个人的8张照片作为训练样本库时,识别的准确率已经达到了97.5%;对于训练2方式,当选取40个人的前35个人作为训练样本库,剩余5个人中的5张照片作为验证集,5张照片作为测试集时,识别的准确率已经达到了1,总体来说PCA的方法可以较好地识别人脸。
    PCA主成分分析法通过将人脸作为一个整体来编码,不关心人脸五官的局部特征,从而可以大大地降低识别的复杂度,且图像的原始灰度数据可以直接学习识别,不需进一步的处理,同时可消除评价指标之间的相关影响;但可以看出实现过程中需要计算协方差矩阵,计算量很大,速度较慢,由于忽略了贡献率小的成分,其可能包含特征的重要信息,从而会引起较大的误差。

Conclusion

emm这是一个图像处理方面的简单实验,其中部分代码是老师提供的,就是用PCA去实现一个简单的人脸识别,并用MATLAB做出一个GUI界面来显示结果。This is just a 实验总结,所以没有写出详细原理,想要详细了解的话可以找阿度~~~
其实我本来立下了“宏伟”big志,写一篇全英文Blog,但是嘎嘎嘎flag倒了,想要将所有内容用英语准确连贯,实在是太费brain了,哭唧唧-- --,莫名瞧不起自己哈哈。
当然,对于其中处理不当的地方,还请大家指出,希望可以一起学交流习,想要代码的可以在下面留言,要是我不busy的话可以邮箱给你嘻嘻嘻!

托托又来了——PCA实现人脸识别相关推荐

  1. 基于 PCA 的人脸识别系统及人脸姿态分析

    文章目录 1 PCA 1.1 原理 1.2 算法流程 1.2.1 零均值化 1.2.2 计算协方差矩阵 1.2.3 特征值和特征向量 1.2.4 降维得到 K 维特征 1.2.5 PCA 的优缺点 2 ...

  2. 基于PCA的人脸识别

    基于PCA的人脸识别 实验简介 PCA算法分析 PCA实现具体步骤 构造特征空间 识别 PCA方法的优劣 优势 劣势 实验步骤 训练 测试 计算识别准确率 显示结果 核心代码 分组一 分组二 实验结果 ...

  3. 【模式识别1】PCA+FLD人脸识别

    基于OpenCV的PCA+FLD人脸识别 1. 了解ORL人脸识别数据集格式 2. OpenCV环境配置 3. 理解人脸识别OpenCV教程特别是PCA和FLD部分代码,在ORL上运行并分析它们识别结 ...

  4. 基于主成分分析PCA的人脸识别

    经过本人复现分析,该篇博客代码不全且存在部分错误,思路仅供参考,望周知. 目录 主成分分析PCA 基于PCA的人脸识别算法 matlab代码 主成分分析PCA 主成分分析(Principal Comp ...

  5. 基于主成分分析(PCA)的人脸识别

    基于主成分分析(PCA)的人脸识别 (完整Matlab代码) (有GUI界面) 本设计会将彩色图片直接转化为黑白图像,自带数据库,图片重建效果好很多 自己的图片可能会差一些,效果如下图所示: ID:6 ...

  6. 【图像处理matlab】PCA+KNN人脸识别 ORL人脸数据集

    文章目录 0.写在前面 1. 数据集导入与划分 2. train-PCA构建脸空间 2.1 原始数据导入 2.2 去中心化 2.3 求解协方差矩阵.特征值.特征向量 2.4 特征脸选取--脸空间 3. ...

  7. 【CSDN下载】第三期:多AGV调度系统软件、基于PCA的人脸识别系统

    为便于广大开发者对热门资源的下载需求,下载频道专为广大开发者开辟了推荐一周IT优质资源通道,以供开发者参考下载,同时欢迎大家上传优质资源并留言所需的资源,小编会汇总所需,及时奉上所求. 工具安装包系列 ...

  8. 基于PCA的人脸识别_Matlab实现(个人研读之后的一些总结)

    以下是我在查阅相关文献之后的一些个人的总结,望大神们指正. 基于PCA的人脸识别 PCA简介 这是百度百科的解析: "对于一个训练集,100个对象模板,特征是10维,那么它可以建立一个100 ...

  9. 基于MatLab的PCA降维人脸识别系统(超详细解说)

    (一)基于MatLab的PCA降维人脸识别系统 本次博客内容将详细介绍如何使用MatLab,进行PCA降维来识别人脸.内容参考张铮<精通MatLab数字图像处理与识别>.书中有些内容应该是 ...

最新文章

  1. LeetCode刷题记录7——824. Goat Latin(easy)
  2. 两个大炸弹:清华大学医学院院长董晨院士回应“24篇论文质疑”;南开校长,曹雪涛团队12篇论文被正式调查“可信性”...
  3. 【转】Java学习---Java Web基础面试题整理
  4. python - 线程
  5. 【设计模式】里氏替换原则
  6. 数据仓库--基本概念
  7. 仅靠“小于运算“生存的map
  8. 开源项目征集 | CSDN “开源加速器计划”之【开源技术栈选型 Show】
  9. WIN10添加策略组
  10. 小说网站服务器架构图,搭建小说网站用什么程序?搭建小说网站图文教程_好特教程...
  11. mysql省市联动_sql全国 省市 联动级联
  12. java-家庭作业1
  13. Count(), Rank(),Percentile.inc() ,Quartile.inc()
  14. 【为人处事】:如何识人
  15. 提升自己的实力才是硬道理
  16. 第十一届“认证杯”数学中国数学建模国际赛 (2022 CERTIFICATE AUTHORITY CUP INTERNATIONAL
  17. css动画animation详细解读
  18. uva-1645-递推
  19. Zotero 和它的朋友们: 一个文献阅读生态
  20. 数据库如何修改编码格式?

热门文章

  1. 华为nova10和华为nova9哪个值得买 两者配置对比
  2. PHP7有哪些新特性
  3. 导出数据库的longblob
  4. less和sass支持 css modules 一样的局部环境和使用方式,解决重名样式覆盖的问题
  5. minisys-单周期cpu(一) 数据通路设计
  6. java利用redis的setIfAbsent和incr,实现自增,限制总数
  7. Linux引导故障和修复进入系统
  8. websocket-php
  9. AsyncTask使用
  10. C# DataGridView控件选中行获取其值