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

article/2025/11/1 3:17:23

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

  • PCA算法
  • 方案设计
  • 代码实现
  • 结果分析
  • 参考文献

PCA的理论知识已经有很多博客做了清晰的解释,主要概括为找到投影的面使得类间误差最大,转化为找到构建的协方差的特征值与特征向量,在新的投影方向(特征向量)上投影,构建数据库和待检索的人脸进行比对,得到相似度最高的人脸作为查询结果,本文使用ORL人脸数据库基于PCA方法实现人脸识别。

机器学习理论《统计学习方法》学习笔记:主成分分析(PCA)

本文所用的是ORL人脸库,由英国剑桥实验室拍摄,共有40人,每人不同角度不同表情拍摄了10张,所以共有400个样本数据,图片尺寸为112*92,格式为pgm。本文将每人的前5张作为训练集,后5张作为测试集。ORL人脸库可在该网址下载。

https://download.csdn.net/download/qq_40507857/13714311

PCA算法

设有m条n维数据:
(1)将原始数据按列组成n行m列矩阵X
(2)将X的每一行(代表一个属性字段)进行零均值化,即减去这一行的均值
(3)求出协方差矩阵
(4)求出协方差矩阵的特征值及对应的特征向量
(5)将特征向量按对应特征值大小从上到下按行进行排列成矩阵,取前k行组成矩阵P
(6)Y=PX即为降维到K维后的数据

方案设计

  1. 将ORL人脸数据库的40位志愿者的10张图片,使用10折交叉验证。每个人依次取出一张作为验证数据,进行10轮验证,最后得到准确率的均值。对于每次运算,训练集大小为360张图片,验证集大小为40张图片。对于每张图片,将其展开为一维向量 X i X_i Xi;即训练集 X = X 1 , X 2 , ⋯ , X 3 60 X=X_1,X_2,\cdots,X_360 X=X1,X2,,X360,维度为(10304,400).
  2. 求X每行的均值向量u,并将其与X相减,进行零均值化,得到 C = ( X 1 − u , X 2 − u , ⋯ , X 3 60 − u ) C=(X_1-u,X_2-u,\cdots,X_360-u) C=(X1u,X2u,,X360u);
  3. 构建协方差矩阵 C C T CC^T CCT
  4. 求解协方差矩阵的特征值,选取最大的K个,求出对应的K个特征向量,并将其按列排成变换矩阵P,其维度为(10304*K);
  5. 计算训练集的图片在上述特征向量下的投影,即为 Y i = P T ( X i − u ) Y_i=P^T(X_i-u) Yi=PT(Xiu),作为查找集;
  6. 将待识别的图片做以上相同投影运算得到Z;
  7. 遍历搜索查找集,满足 m i n ∣ ∣ Y i − Z ∣ ∣ min||Y_i-Z|| minYiZ条件的,即待识别图片与 Y i Y_i Yi对应图片属于一类,即找到待识别照片的主人。

其中,构建的协方差矩阵 C C T CC^T CCT进行特征值与特征向量求解时非常耗时,所以构造 C T C C^TC CTC进行特征值和特征向量的求取,最后通过将求得的特征向量左乘C,即可得到 C T C C^TC CTC的特征向量。

代码实现

import cv2
import numpy as np
import glob# 预处理 构建数据矩阵
images = glob.glob(r'.\ORL\*.bmp')
X = []
for img in images:img = cv2.imread(img, 0)temp = np.resize(img, (img.shape[0] * img.shape[1], 1))X.append(temp.T)
X = np.array(X).squeeze().T
print(X.shape, X.shape[1])  # (10304, 400) 400# 10轮
correct_sum = 0
for epoch in range(10):# 10折交叉验证  数据划分train_data = X[:, [x for x in list(range(X.shape[1])) if x not in list(range(epoch, X.shape[1], 10))]]test_data = X[:, list(range(epoch, X.shape[1], 10))]# trainu = np.sum(train_data, axis=1) / train_data.shape[1]  # 求均值向量# 平均脸# u = np.array(u, dtype='uint8')# average_face = np.resize(u, (img.shape[0], img.shape[1]))# cv2.imwrite('Average_Face.png', average_face)u = u[:, np.newaxis]C = train_data - u  # 中心化后数据矩阵Covariance = np.dot(C.T, C)  # 构建协方差矩阵,一般为C .* C.T,但是构造这种类型可减少运算量eigvalue, eigvector = np.linalg.eig(Covariance)  # 由协方差矩阵求解特征值、特征向量real_eigvector = np.dot(C, eigvector)  # 通过之前的构造来恢复真正协方差矩阵对应的特征向量sort = np.argsort(-eigvalue)  # 将特征值从大到小怕排序,得到排序后对于原索引P = real_eigvector.T[sort[0:100]]  # 对于排序构造特征向量,取前面较大权重值Y = []for i in range(train_data.shape[1]):temp = train_data[:, i, np.newaxis]Y.append(np.dot(P, temp - u))  # 构建每幅图像投影后的值,构造查找表# testcorrect = 0for index in range(test_data.shape[1]):img_test = test_data[:, index, np.newaxis]  # 从测试集提取单张人脸Result = np.dot(P, img_test - u)  # 计算待识别的人脸的投影a = np.sum(abs(Y - Result), axis=1).argmin()  # 遍历搜索匹配if index * 9 <= a < (index + 1) * 9:  # 若索引在宽度为9的区间内则为该人脸,视为匹配正确correct += 1print('Epoch{} correct rate: {}%'.format(epoch, correct / 40 * 100))correct_sum += correctprint('Final  correct rate: {}%'.format(correct_sum / 4))
  • 平均脸

在这里插入图片描述

  • 运行结果
    在这里插入图片描述

结果分析

通过10折交叉验证,最后得到的准确度为97.75%,即通过少量样本可以得到较好的结果,说明PCA在降维上拥有很好的效果,较好的保留了主要特征。

参考文献

  1. https://blog.csdn.net/qq_24946843/article/details/81775701
  2. https://blog.csdn.net/Big_Huang/article/details/103830082

http://chatgpt.dhexx.cn/article/l6d2erBv.shtml

相关文章

ORL Character Recgnition

文章目录 ORL Character Recgnition0 Abstract1 Introduction2 Related Work2.1 Character recognition2.2 Text detection 3 Connection Text Proposal Network3.1 Anchor3.2 Bi-Directional LSTM3.3 RPN layer3.4 Text line constructor3.5 Loss function3.6 Total system3.7…

ORL Faces Database介绍

ORL人脸数据集共包含40个不同人的400张图像&#xff0c;是在1992年4月至1994年4月期间由英国剑桥的Olivetti研究实验室创建。 此数据集下包含40个目录&#xff0c;每个目录下有10张图像&#xff0c;每个目录表示一个不同的人。所有的图像是以PGM格式存储&#xff0c;灰度图&…

基于ORL人脸数据库和PCA特征降维算法的人脸识别matlab仿真

目录 1.算法仿真效果 2.MATLAB核心程序 3.算法涉及理论知识概要 4.完整MATLAB 1.算法仿真效果 matlab2022a仿真结果如下&#xff1a; 2.MATLAB核心程序 ...................................................................... for i1:40sub_dir strcat(s, num2str(i))…

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

文章目录 0.写在前面1. 数据集导入与划分2. train-PCA构建脸空间2.1 原始数据导入2.2 去中心化2.3 求解协方差矩阵、特征值、特征向量2.4 特征脸选取--脸空间 3. test-物以类聚 KNN分类3.1 KNN简介3.2 KNN实现步骤3.2.1 距离度量---欧式距离、豪斯多夫距离.......3.2.2 k值选择…

Orcal 数据库

目录 一、数据库 1. 数据库概念 2. SQL 语言 3. Oracle结构 4. 表&#xff08;Table&#xff09; 5. 三范式 6. SELECT 语句 二、Orcal 基本操作 1. 查询列&#xff08;字段&#xff09; 2. 查询行&#xff08;记录&#xff09; 2.1 比较条件 2.2 且或非 2.3 null…

【人脸识别】基于PCA实现ORL人脸识别附matlab代码和报告

1 简介 人脸识别技术先进,应用广泛。借助PCA算法,利用MATLAB GUI可以简单操作,通过对待识别图像的预处理即可提高识别率。本文首先对相关概念进行了阐述,对工作原理进行了介绍,具体对基于PCA算法人脸识别的MATLAB实现进行了解析。 2 部分代码 function [neednum,average_face…

orical

truncate 和delete table 表名&#xff08;前面效率比后面高&#xff0c;而且前面执行后无法停止&#xff0c;前面会将orical查找数据时使用的节点删除&#xff0c;后面不会&#xff09; select * from 表名 会消耗大量资源不建议使用了&#xff1b; creat table 表名 as selec…

基于BP神经网络和ORL库的人脸识别matlab仿真

目录 一、理论基础 二、案例背景 1.问题描述 2.思路流程 三、部分MATLAB代码 四、仿真结论分析 五、参考文献 一、理论基础 这里&#xff0c;人脸的识别主要依据如下的流程进行&#xff1a; 具体的算法流程是这么一个过程&#xff1a; 第一&#xff1a;首先初始化一个区…

图像处理ORL--训练集及测试集建立--Matlab实现

在深度学习的研究与学习过程中&#xff0c;往往对神经网络的网络结构以及代码有比较好的理解&#xff0c;但基于matlab的数据集建立等操作经常困扰初学者。 今天带来matlab数据集建立的文件结构与代码。 文件格式 首先将图片保存在当前运行文件的文件夹中&#xff0c;将其命名…

深度学习入门_对ORL数据集进行特征提取降维后SVM分类

ORL人脸数据集共包含40个不同人的400张图像。所有图像都是以PGM格式存储的灰度图。每一个目录下的图像是在不同的时间、不同的光照、不同的面部表情条件下采集的。在该数据集中&#xff0c;每个人有10张照片。这10张照片中&#xff0c;前8张作为训练集&#xff0c;而后2张归为测…

编译原理——词法分析器实验

实验目的 掌握词法分析器的功能。掌握词法分析器的实现。 实验内容及要求 对于如下文法所定义的语言子集&#xff0c;试编写并上机调试一个词法分析程序&#xff1a; <程序>→PROGRAM <标识符>;<分程序>. <分程序>→<变量说明>BEGIN<语…

(C++)带你手肝词法分析器,容易理解,跟着思路有手就行

词法分析器 一.前言二.什么是“词法分析器”&#xff1f;三.正式设计1.设计种别码表2.设置判断为字母或数字的函数3.设置全局参数4.核心&#xff1a;scan()函数5.主函数里结合scan函数进行循环扫描6.结果截图7.需要注意&#xff08;比较难&#xff09;的地方 四.心得体会五.源代…

词法分析器实现

点击打开链接 词法分析器实现 一、写在前面 编译原理是软件工程的一项基础的课程&#xff0c;是研究软件是什么&#xff0c;为什么可以运行&#xff0c;以及怎么运行的学科&#xff0c;编译系统的改进将会直接对其上层的应用程序的执行效率&#xff0c;执行原理产生深刻的影响…

词法分析器(一)

词法分析器 &#xff08;基本符号表&#xff0c;状态转换图&#xff09; 引言&#xff1a;编译原理的实验部分是关于编译器的&#xff0c;我决定将这部分的学习和实践过程记录下来&#xff0c;也希望看到这篇文章的有缘人来指正和提出宝贵的意见。 基本符号表 本次实验我通过…

词法分析器 Java完整代码版

想了解更多内容&#xff0c;移步至编译原理专栏 2021.12.22 更新 整理了一下代码&#xff0c;同步到了gitee https://gitee.com/godelgnis/lrparserhttps://gitee.com/godelgnis/lrparser --------------------------------------------------分割线-----------------------…

编译原理——词法分析器(C/C++代码实现)

目录 0 实验目的&#xff1a; 1 实验要求&#xff1a; 2 实验内容&#xff1a; 3 实验思路&#xff1a; 4 实验代码&#xff1a; 5 实验结果&#xff1a; 6 实验总结&#xff1a; 7 实验程序以及实验报告下载链接&#xff1a; 0 实验目的&#xff1a; 设计、编制、实现…

词法分析器的构成(含源代码)

标题&#xff1a;词法分析器 本人最近在学习编译原理&#xff0c;刚刚学到词法分析器&#xff0c;心想着挺好玩&#xff0c;就想着自己写一个&#xff0c;奈何一没有系统的学过c语言&#xff0c;只是粗略的看过一遍K&R的c语言书&#xff0c;所以水平尚浅&#xff0c;代码有…

java实现词法分析器

实现词法分析器 实验内容要求 一、实验目的 加深对词法分析器的工作过程的理解&#xff1b;加强对词法分析方法的掌握&#xff1b;能够采用一种编程 语言实现简单的词法分析程序&#xff1b;能够使用自己编写的分析程序对简单的程序段进行词法分 析。 二、实验内容 自定义一…

python实现词法分析器

基于python3 实现一个简单的词法分析器。 主要使用的库&#xff1a;正则表达式、tkinter 识别关键字&#xff0c;标识符&#xff0c;运算符&#xff0c;分界符&#xff0c;数字&#xff08;整数和浮点数&#xff09; 当以数字开头时报错&#xff0c;标识符超过8个字符长度时报…

词法分析器设计与实现

开篇 编译&#xff0c;简单的说&#xff0c;就是把源程序转换为可执行程序。从hello world 说程序运行机制 里面简单的说明了程序运行的过程&#xff0c;以及一个程序是如何一步步变成可执行文件的。在这个过程中&#xff0c;编译器做了很多重要的工作。对底层该兴趣的我&…