托托又来了——PCA实现人脸识别
托马斯·哈代又来送诗啦,搬好小凳几~~~
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实现人脸识别相关推荐
- 基于 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 ...
- 基于PCA的人脸识别
基于PCA的人脸识别 实验简介 PCA算法分析 PCA实现具体步骤 构造特征空间 识别 PCA方法的优劣 优势 劣势 实验步骤 训练 测试 计算识别准确率 显示结果 核心代码 分组一 分组二 实验结果 ...
- 【模式识别1】PCA+FLD人脸识别
基于OpenCV的PCA+FLD人脸识别 1. 了解ORL人脸识别数据集格式 2. OpenCV环境配置 3. 理解人脸识别OpenCV教程特别是PCA和FLD部分代码,在ORL上运行并分析它们识别结 ...
- 基于主成分分析PCA的人脸识别
经过本人复现分析,该篇博客代码不全且存在部分错误,思路仅供参考,望周知. 目录 主成分分析PCA 基于PCA的人脸识别算法 matlab代码 主成分分析PCA 主成分分析(Principal Comp ...
- 基于主成分分析(PCA)的人脸识别
基于主成分分析(PCA)的人脸识别 (完整Matlab代码) (有GUI界面) 本设计会将彩色图片直接转化为黑白图像,自带数据库,图片重建效果好很多 自己的图片可能会差一些,效果如下图所示: ID:6 ...
- 【图像处理matlab】PCA+KNN人脸识别 ORL人脸数据集
文章目录 0.写在前面 1. 数据集导入与划分 2. train-PCA构建脸空间 2.1 原始数据导入 2.2 去中心化 2.3 求解协方差矩阵.特征值.特征向量 2.4 特征脸选取--脸空间 3. ...
- 【CSDN下载】第三期:多AGV调度系统软件、基于PCA的人脸识别系统
为便于广大开发者对热门资源的下载需求,下载频道专为广大开发者开辟了推荐一周IT优质资源通道,以供开发者参考下载,同时欢迎大家上传优质资源并留言所需的资源,小编会汇总所需,及时奉上所求. 工具安装包系列 ...
- 基于PCA的人脸识别_Matlab实现(个人研读之后的一些总结)
以下是我在查阅相关文献之后的一些个人的总结,望大神们指正. 基于PCA的人脸识别 PCA简介 这是百度百科的解析: "对于一个训练集,100个对象模板,特征是10维,那么它可以建立一个100 ...
- 基于MatLab的PCA降维人脸识别系统(超详细解说)
(一)基于MatLab的PCA降维人脸识别系统 本次博客内容将详细介绍如何使用MatLab,进行PCA降维来识别人脸.内容参考张铮<精通MatLab数字图像处理与识别>.书中有些内容应该是 ...
最新文章
- LeetCode刷题记录7——824. Goat Latin(easy)
- 两个大炸弹:清华大学医学院院长董晨院士回应“24篇论文质疑”;南开校长,曹雪涛团队12篇论文被正式调查“可信性”...
- 【转】Java学习---Java Web基础面试题整理
- python - 线程
- 【设计模式】里氏替换原则
- 数据仓库--基本概念
- 仅靠“小于运算“生存的map
- 开源项目征集 | CSDN “开源加速器计划”之【开源技术栈选型 Show】
- WIN10添加策略组
- 小说网站服务器架构图,搭建小说网站用什么程序?搭建小说网站图文教程_好特教程...
- mysql省市联动_sql全国 省市 联动级联
- java-家庭作业1
- Count(), Rank(),Percentile.inc() ,Quartile.inc()
- 【为人处事】:如何识人
- 提升自己的实力才是硬道理
- 第十一届“认证杯”数学中国数学建模国际赛 (2022 CERTIFICATE AUTHORITY CUP INTERNATIONAL
- css动画animation详细解读
- uva-1645-递推
- Zotero 和它的朋友们: 一个文献阅读生态
- 数据库如何修改编码格式?