基于PCA降维实现人脸识别

链接:https://pan.baidu.com/s/15jkVDVrZ2ArZy3IbwG977A
提取码:9syn

实现流程:

  1. 定义灰度函数(√)
  2. 读入图片数据(√)
  3. 均值化函数(√)
  4. 百分比转化为函数(√)
  5. pca主函数(√)
  6. 可视化特征脸(√)
  7. 自带训练数据特征个数和所携带信息数的曲线图(√)
  8. 欧式距离法分类(√)
  9. 支持向量机法分类(√)
# 导包
import numpy as np
import os
import cv2
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
# 定义灰度函数(RGB模式调换顺序参数顺序即可)
def bgr2gray(bgr):return np.dot(bgr[...,:3], [0.114, 0.587, 0.299])
# 读入图片数据
dirName = './ORL/'
def loadBmpData(path):y = np.empty([200, 1]) # 类别# X = np.empty([200, 256]) X = np.empty([200, 16384]) # 128*128像素点图像铺平i = 0for filename in os.listdir(path):if filename != "Thumbs.db": # 防止bugy[i] = int(filename[5:7])img = cv2.imread(os.path.join(path,filename))gray_img = bgr2gray(img)# gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 自带函数X[i] = gray_img.reshape(1, -1)# X[i] = np.concatenate((gray_img.mean(axis=0).reshape(1, -1), gray_img.mean(axis=1).reshape(1, -1)), axis=1) i = i + 1return X, y
# 零均值化
def zeroMean(dataMat):      meanVal = np.mean(dataMat, axis=0)     # 按列求均值,即求各个特征的均值newData = dataMat - meanValreturn newData, meanVal
# 百分比转化
def percentage2n(eigVals, percentage):sortArray = np.sort(eigVals)   # 升序sortArray = sortArray[-1: :-1]  # 逆转,即降序arraySum = sum(sortArray)tmpSum = 0num = 0for i in sortArray:tmpSum += inum += 1if tmpSum >= arraySum * percentage:return num
def pca(dataMat, n):newData, meanVal = zeroMean(dataMat)covMat = np.cov(newData, rowvar=0) # 求协方差矩阵,return ndarray;若rowvar非0,一列代表一个样本,为0,一行代表一个样本eigVals, eigVects = np.linalg.eig(np.mat(covMat)) # 求特征值和特征向量,特征向量是按列放的,即一列代表一个特征向量# n = percentage2n(eigVals, percentage) # 要达到percent的方差百分比,需要前n个特征向量eigValIndice = np.argsort(eigVals) # 对特征值从小到大排序n_eigValIndice = eigValIndice[-1 : - (n + 1) : -1] # 最大的n个特征值的下标n_eigVect = eigVects[:, n_eigValIndice] # 最大的n个特征值对应的特征向量lowDDataMat = newData * n_eigVect # 低维特征空间的数据# reconMat = (lowDDataMat * n_eigVect.T) + meanVal # 重构数据return lowDDataMat, meanVal, n_eigVect
# 绘制特征脸
def facePlot(V):figs,objs = plt.subplots(5, 8, figsize=(8,5), subplot_kw={"xticks":[],"yticks":[]})for i,obj in enumerate(objs.flat):obj.imshow(V[i,:].reshape(12, 12), cmap="gray")
from sklearn.decomposition import PCA
def drawComponetsRatio(X):length = min(X.shape[0], X.shape[1])explained_variance_ratio = []for i in range(1, length + 1): pca = PCA(n_components=i).fit(X)explained_variance_ratio.append(pca.explained_variance_ratio_.sum())plt.plot(range(1, length + 1), explained_variance_ratio)plt.show()
X, y = loadBmpData(dirName) # 导入数据
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=5)
drawComponetsRatio(X_train) # 画出特征个数和所携带信息数的曲线图


def facefind(): # 降维X_train_new, X_mean, V = pca(X_train, 144)X_trainNo = X_train_new.shape[0]X_testNo = X_test.shape[0]X_temp = X_test - X_meanX_test_new = X_temp * V # 得到测试脸在特征向量下的数据# facePlot(X_test_new)X_test_new = np.array(X_test_new)facePlot(np.real(X_test_new))X_train_new = np.array(X_train_new)# 欧式距离true_num = 0for i in range(X_testNo):testFace = X_test_new[i, :]diffMat = X_train_new - testFacesqDiffMat = diffMat**2sqDistances = sqDiffMat.sum(axis=1)sortedDistIndicies = sqDistances.argsort()indexMin = sortedDistIndicies[0]if y_train[indexMin] == y_test[i]:true_num += 1accuracy1 = float(true_num) / X_testNoprint ('The euclid distance classifier accuracy is: %.2f%%'%(accuracy1 * 100))# 支持向量机from sklearn import svmclassifier = svm.SVC(kernel='linear', C=1).fit(np.real(X_train_new), np.real(y_train).ravel())accuracy2 = classifier.score(np.real(X_test_new), np.real(y_test))print ('The svm classifier accuracy is: %.2f%%'%(accuracy2 * 100))
facefind()
The euclid distance classifier accuracy is: 97.50%
The svm classifier accuracy is: 92.50%

基于PCA降维实现人脸识别相关推荐

  1. 模式识别与机器学习(作业5)基于PCA–LDA的人脸识别

    基于PCA–LDA的人脸识别 ORC数据集 提取码: cggh 本次的实验是在模式识别与机器学习(作业4),PCA降维的基础上加入了线性判别分析,对维度进行了进一步的降低. 1. 导入数据 一共有40 ...

  2. 基于PCA 人脸识别/人脸识别算法/人脸检测程序源码MATLAB ELM+PCA人脸识别 PCA人脸识别matlab代码 基于PCA算法的人脸识别

    1.基于PCA的人脸识别代码 2.MATLAB ELM+PCA人脸识别 2.基于PCA的人脸识别(matlab)(采用PCA算法进行人脸识别,通过抽取人脸的主要成 分,构成特征脸空间,识别时将测试图像 ...

  3. 基于PCA方法的人脸识别(Python)

    目录 1.PCA简介 2.照片要求 3.创建训练人脸库的特征脸空间 3.1:创建所有训练样本组成的 M×N 矩阵 3.2:计算训练样本的平均值矩阵 3.3:去除平均值,得到规格化后的训练样本矩阵 3. ...

  4. 基于DeepFace模型设计的人脸识别软件

    资源下载地址:https://download.csdn.net/download/sheziqiong/85601096 人脸识别软件(无外部API) V2.0 基于DeepFace模型设计的人脸识 ...

  5. 基于Android系统的人脸识别签到软件

    项目名称:   基于Android系统的人脸识别签到软件 目  录 1 项目介绍..... 1 1.1 项目背景.... 1 1.2 产品特点.... 2 1.3 可行性分析.... 2 1.3.1 ...

  6. 基于SVM支持向量机实现人脸识别

    文章目录 基于SVM支持向量机实现人脸识别 SVM支持向量机的定义 SVM支持向量机的原理作用 如何计算SVM支持向量机的权值w和偏置项b 代码实现原理步骤 代码实例演示: 基于SVM支持向量机实现人 ...

  7. 基于全局信息的人脸识别总结

    一.           课题名称 基于全局信息的人脸识别算法研究 二.           课题的提出 在当今社会中,身份确认具有十分重要的价值.随着网络技术的发展,信息安全也显示出了前所未有的重要 ...

  8. 模式识别PCA方法实现人脸识别-Python

    模式识别PCA方法实现人脸识别-Python 一.学习目标 二.学习内容 三.学习时间 四.学习产出 五.正文部分 1.什么是PCA? 2.使用PCA方法进行人脸识别的步骤 1)前期尝试及准备 (1) ...

  9. 《繁凡的论文精读》(一)CVPR 2019 基于决策的高效人脸识别黑盒对抗攻击(清华朱军)

    点我一文弄懂深度学习所有基础和各大主流研究方向! <繁凡的深度学习笔记>,包含深度学习基础和 TensorFlow2.0,PyTorch 详解,以及 CNN,RNN,GNN,AE,GAN, ...

  10. 基于kl变换的人脸识别_简述几种人脸识别的主要方法

    人脸识别的方法很多,以下介绍一些主要的人脸识别方法.(1)几何特征的人脸识别方法几何特征可以是眼.鼻.嘴等的形状和它们之间的几何关系(如相互之间的距离).这些算法识别速度快,需要的内存小,但识别率较低 ...

最新文章

  1. Oracle ASM 详解 收藏
  2. dom4j ---最好的xml解决方案?
  3. 【Web安全】关于SQL注入简介以及使用SqlMap获取管理员密码的探索
  4. linux学习总结--linux100day(day2)
  5. UVA-1045 - The Great Wall Game(二分图最佳匹配)
  6. 篇幅达2840页、目录就有31页,这位华人小哥的博士论文堪比教材
  7. ReplicaManager分析
  8. Mybatis缓存模块(一)BlockingCache
  9. 备份文件到本地服务器失败,已解决: 备份index/boostrap ,备份filesystem 失败 - Dell Community...
  10. [bzoj 1452] [JSOI2009]Count
  11. 华为ARP代理的三种方式
  12. snmp的oid查询方法
  13. 陶哲轩实分析 3.4
  14. 产品初探:银行理财产品简介
  15. 自动驾驶词汇概念介绍
  16. python时间序列分析包_python关于时间序列的分析
  17. 二维图形的基本变换与裁剪的变换矩阵
  18. 手柄映射键盘_如何使用运动加加TAP手柄在PC上玩手游
  19. 20-CVPR-Multi-branch and Multi-scale Attention Learning for Fine-Grained Visual Categorization
  20. Voyager如何使用Compass

热门文章

  1. python timedelta_Python使用笔记:时间的运算timedelta
  2. 【转】Topshelf入门
  3. Three.js中的矩阵
  4. Hibernate方法save、update、merge、saveOrUpdate及get和load的区别
  5. Android package属性、package name和Application ID三者的联系及区别
  6. Let’s Encrypt 推动了 HTTPS 的普及
  7. 深入理解JavaScript系列(31):设计模式之代理模式
  8. js的this作用域
  9. android分享到新浪微博,认证+发送微博,
  10. oracle中字符串连接