基于PCA的ORL人脸识别---Python
PCA的理论知识已经有很多博客都做了清晰的解释,主要概括为找到投影的面使得类间误差最大,转化为找到构建的协方差矩阵的特征值与特征向量,再在新的投影方向上(特征向量)上投影,构建数据库和带检索人脸进行比对,得到相似度最高的视为查询结果。下面针对ORL人脸数据库进行PCA的识别。。。
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张图片。对每张图片,将其展开为一维向量Xi;即训练集X=(X1, X2,…X360)维度为(10304,360);
2.求取X每行的均值向量u,并将其与X相减,进行零均值化,得到C=(X1-u, X2-u,…,X360-u);
3.构建协方差矩阵 CCT;
4.求解协方差矩阵的特征值,选取最大的k个,求出对应的k个特征向量,并将其按列排成变换矩阵P,其维度为(10304*k);
5.计算训练集的图片在上述特征向量下的投影,即为Yi = PT(Xi-u),作为查找集;
6.将待识别的图片做以上相同投影运算得到Z;
7.遍历搜索查找集,满足min||Yi-Z||条件的即待识别图片与Yi对应图片属于一类;即找到待识别照片的主人。
其中构建的协方差矩阵CCT进行特征值与特征向量求解时非常耗时,故构造CTC进行特征值和特征向量的求取,最后通过将求得的特征向量左乘C即可得到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
# 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.imshow('Avarage Face', average_face)cv2.waitKey(0)'''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折交叉验证,最后得到的验证准确度为98.5%,为较好水平。即通过少量的样本可以得到很好的结果,说明PCA在降维上拥有很好的效果,较好的保留了主要特征。
基于PCA的ORL人脸识别---Python相关推荐
- 基于PCA 人脸识别/人脸识别算法/人脸检测程序源码MATLAB ELM+PCA人脸识别 PCA人脸识别matlab代码 基于PCA算法的人脸识别
1.基于PCA的人脸识别代码 2.MATLAB ELM+PCA人脸识别 2.基于PCA的人脸识别(matlab)(采用PCA算法进行人脸识别,通过抽取人脸的主要成 分,构成特征脸空间,识别时将测试图像 ...
- 模式识别PCA方法实现人脸识别-Python
模式识别PCA方法实现人脸识别-Python 一.学习目标 二.学习内容 三.学习时间 四.学习产出 五.正文部分 1.什么是PCA? 2.使用PCA方法进行人脸识别的步骤 1)前期尝试及准备 (1) ...
- 模式识别与机器学习(作业5)基于PCA–LDA的人脸识别
基于PCA–LDA的人脸识别 ORC数据集 提取码: cggh 本次的实验是在模式识别与机器学习(作业4),PCA降维的基础上加入了线性判别分析,对维度进行了进一步的降低. 1. 导入数据 一共有40 ...
- 基于PCA方法的人脸识别(Python)
目录 1.PCA简介 2.照片要求 3.创建训练人脸库的特征脸空间 3.1:创建所有训练样本组成的 M×N 矩阵 3.2:计算训练样本的平均值矩阵 3.3:去除平均值,得到规格化后的训练样本矩阵 3. ...
- 基于PCA方法的ORL人脸识别及Python代码实现
基于PCA方法的ORL人脸识别及Python代码实现 PCA算法 方案设计 代码实现 结果分析 参考文献 PCA的理论知识已经有很多博客做了清晰的解释,主要概括为找到投影的面使得类间误差最大,转化为找 ...
- 基于DeepFace模型设计的人脸识别软件
资源下载地址:https://download.csdn.net/download/sheziqiong/85601096 人脸识别软件(无外部API) V2.0 基于DeepFace模型设计的人脸识 ...
- 基于深度学习的人脸识别与管理系统(UI界面增强版,Python代码)
摘要:人脸检测与识别是机器视觉领域最热门的研究方向之一,本文详细介绍博主自主设计的一款基于深度学习的人脸识别与管理系统.博文给出人脸识别实现原理的同时,给出Python的人脸识别实现代码以及PyQt设 ...
- python人脸识别系统界面设计_基于卷积神经网络的人脸识别系统的设计(Python)
基于卷积神经网络的人脸识别系统的设计(Python)(论文10000字,外文翻译,参考代码,流程图,人脸图像库) 摘要:随着社会的进步与发展,个人信息的保护变得十分重要.传统的密码保护方式已经不再满足 ...
- python dlib caffe人脸相似度_基于深度学习的人脸识别系统(Caffe+OpenCV+Dlib)【一】如何配置caffe属性表...
前言 基于深度学习的人脸识别系统,一共用到了5个开源库:OpenCV(计算机视觉库).Caffe(深度学习库).Dlib(机器学习库).libfacedetection(人脸检测库).cudnn(gp ...
- python鱼眼图像识别_一种基于鱼眼摄像头的人脸识别锁以及识别方法与流程
本发明涉及人脸识别领域,特别涉及一种基于鱼眼摄像头的人脸识别锁. 背景技术: 人脸识别具有用在门锁上存在一些不足.例如,门锁一般装在门上,其高度在安装时已经固定,针对不同身高的用户来说可能造成人脸图像 ...
最新文章
- 基于BootStrap,FortAweSome,Ajax的学生管理系统
- 增强包_机电工程学院开展“情暖冬日,爱在机电”冬至包饺子活动
- 5分绩点转4分_作为一名大学生,如何规划4年大学生活?学姐:建议从这5点做起...
- thinking-in-java(10)内部类
- Gadget,又见Gadget - 浅尝Windows Live Contacts Gadget
- php读取url连接的图片,输出到浏览器
- mysql中权限的小知识
- 强制卸载kernel
- aiml简介+源代码解析+中文分词(java)
- 软件测试肖sir___项目讲解之银行项目
- 人事管理--转正功能需求分析
- 「2017ACM/ICPC亚洲区域赛北京站现场赛G」Liaoning Ship's Voyage【计算几何】
- ueditor如何改变图片大小等比缩放
- Inkscape基础制图教程
- 在WIN10下通过网口给华为海思Hi3516DV300刷机(鸿蒙系统)
- 2022年高新技术企业认定的补贴有多少?
- 建立您的启动:自定义会议视图
- java加法的底层_常见开发语言加减乘除底层是如何做到的?
- cocos2d-LUA逆向之用idaPro调试so库获取xxtea解密key
- 51Nod_1925 进制转换【进制+枚举】
热门文章
- VMware Workstation16安装
- 腾讯QQ空间登录的方法实现方式与验证过程分析
- BP神经网络介绍及算法实现
- 根据国家统计局处理四级地址库
- u盘在 计算机管理显示无媒体,urdrive_u盘显示无媒体怎么办_启动盘
- 答题卡 移动端在线考试html模板,标准化考试答题卡模板.doc
- 大学抢课到学校的计算机房,网络选课制度引发“抢课大战”
- 如何在移动硬盘上安装Linux系统?WIN10 + Ubuntu 18.0.4(LTS)
- Ubuntu下FileZilla的安装
- 带你快速了解ISO27001信息安全管理体系认证