PCA人脸识别
人脸数据来自http://www.cl.cam.ac.uk/research/dtg/attarchive/facedatabase.html
实现代码和效果如下。由于图片数量有限(40*10),将原有图片顺序打乱进行检测。
可见马氏距离效果最佳。
[以下公式和文字来自John Hany的博文 http://johnhany.net/2016/05/from-qr-decomposition-to-pca-to-face-recognition/]
PCA(Principal Component Analysis,主成分分析)
PCA是一种很常用的根据变量协方差对数据进行降维、压缩的方法。它的精髓在于尽量用最少数量的维度,尽可能精确地描述数据。
将PCA用于人脸识别的过程如下:
基于QR分解的PCA算法步骤如下:
进一步,进行人脸识别的过程如下:
距离度量d:
#coding:utf8
import cv2
import numpy as np
import matplotlib.pyplot as plt def load_img():
img=[]
for i in range(40):
for j in range(10):
path='att_faces\\s'+str(i+1)+'\\'+str(j+1)+'.pgm'
a=cv2.imread(path,0)
a=a.flatten()/255.0
img.append(a)
return img def dis(A,B,dis_type=0,s=None):
if dis_type==1: # 欧式距离
return np.sum(np.square(A-B))
elif dis_type==2: # 马式距离
f=np.sqrt(abs(np.dot(np.dot((A-B),s.I),(A-B).T))) # h增大时右侧会出现负值,防止溢出可以s/np.linalg.norm(s)
return f.tolist()[0][0]
else: # 曼哈顿距离
return np.sum(abs(A-B)) def pca(data,h,dis_type=0):
q,r=np.linalg.qr(data.T)
u,s,v=np.linalg.svd(r.T)
fi=np.dot(q,(v[:h]).T)
y=np.dot(fi.T,data.T)
ym=[np.mean(np.reshape(x,(40,10)),axis=1) for x in y]
ym=np.reshape(ym,(h,40))
c=[]
if dis_type==2:# 计算马氏距离的额外处理"
yr=[np.reshape(x,(40,10)) for x in y]
yr=[[np.array(yr)[j][k] for j in range(h)]for k in range(40)]
for k in yr:
k=np.reshape(k,(h,10))
e=np.cov(k)
c.append(e)
return fi,ym,c def validate(fi,ym,test,label,dis_type=0,c=None):
ty=np.dot(fi.T,test.T)
correctnum=0
testnum=len(test)
for i in range(testnum):
if dis_type==2:
n=len(ym.T)
dd=[dis(ty.T[i],ym.T[n_],dis_type,np.mat(c[n_])) for n_ in range(n)]
else:
dd=[dis(ty.T[i],yy,dis_type) for yy in ym.T]
if np.argsort(dd)[0]+1==label[i]:
correctnum+=1
rate = float(correctnum) / testnum
print "Correctnum = %d, Sumnum = %d" % (correctnum, testnum), "Accuracy:%.2f" % (rate)
return rate if __name__ == '__main__':
img=load_img()
test=img
label=[a+1 for a in range(40) for j in range(10)]
index=range(400)
np.random.shuffle(index)
label_=[label[i] for i in index]
test_=np.mat([test[i] for i in index])
x_=[2**i for i in range(9)]
d_=['Manhattan Distance','Euclidean Metric', 'Mahalanobis Distance']
for j in range(3):
y_=[]
plt.figure()
for i in range(9):
fi,ym,c=pca(np.mat(img),h=x_[i],dis_type=j)
y_.append(validate(fi,ym,test_,label_,dis_type=j,c=c))
plt.ylim([0,1.0])
plt.plot(x_,y_)
plt.scatter(x_,y_)
plt.xlabel('h')
plt.ylabel('Accuracy')
plt.title(d_[j])
plt.show()
PCA人脸识别的更多相关文章
- Eigenface与PCA人脸识别算法实验
简单的特征脸识别实验 实现特征脸的过程其实就是主成分分析(Principal Component Analysis,PCA)的一个过程.关于PCA的原理问题,它是一种数学降维的方法.是为了简化问题.在 ...
- OpenCV+python 人脸识别
首先给大家推荐一本书:机器学习算法原理与编程实践 本文内容全部转载于书中,相当于一个读书笔记了吧 绪论 1992年麻省理工学院通过实验对比了基于结构特征的方法与基于模版匹配的方法,发现模版匹配的方法要 ...
- PCA人脸识别学习笔记---原理篇
前言 在PCA人脸识别中我们把一个人脸图片看做一个特征向量,PCA做的事情就是:找到这样一组基向量来表示已有的数据点,不仅仅是将高维度数据变成低维度数据,更能够找到最关键信息. 假设已有数据{xi} ...
- 主成分分析 (PCA) 与其高维度下python实现(简单人脸识别)
Introduction 主成分分析(Principal Components Analysis)是一种对特征进行降维的方法.由于观测指标间存在相关性,将导致信息的重叠与低效,我们倾向于用少量的.尽可 ...
- 基于PCA的人脸识别步骤
代码下载:基于PCA(主成分分析)的人脸识别 人脸识别是一个有监督学习过程,首先利用训练集构造一个人脸模型,然后将测试集与训练集进行匹配,找到与之对应的训练集头像.最容易的方式是直接利用欧式距离计算测 ...
- 机器学习:PCA(人脸识别中的应用——特征脸)
一.思维理解 X:原始数据集: Wk:原始数据集 X 的前 K 个主成分: Xk:n 维的原始数据降维到 k 维后的数据集: 将原始数据集降维,就是将数据集中的每一个样本降维:X(i) . WkT = ...
- PCA算法提取人脸识别特征脸(降噪)
PCA算法可以使得高维数据(mxn)降到低维,而在整个降维的过程中会丢失一定的信息,也会因此而实现降噪除噪的效果,另外,它通过降维可以计算出原本数据集的主成分分量Wk矩阵(kxn),如果将其作为数据样 ...
- opencv基于PCA降维算法的人脸识别
opencv基于PCA降维算法的人脸识别(att_faces) 一.数据提取与处理 # 导入所需模块 import matplotlib.pyplot as plt import numpy as n ...
- 【笔记】特征脸(PCA在人脸识别领域的应用)
人脸识别与特征脸(简单介绍) 什么是特征脸 特征脸(Eigenface)是指用于机器视觉领域中的人脸识别问题的一组特征向量,该方法被认为是第一种有效的人脸识别方法. PCA的具体实现思想见 [笔记]主 ...
随机推荐
- lib静态链接库,dll动态链接库,h文件
最近在弄摄像头,发现我在调用摄像头自带的函数的时候,库没连接上,于是经过高人指点,学习了一下lib静态链接库,dll动态链接库来补充一下自己的基础知识. 一.首先我们来介绍一下lib静态链接库. li ...
- 为什么socket编程要用到多线程
不得不佩服计算机先驱的设计:socket编程为什么需要多线程.如果只有一个ServerSocket线程,那么如下代码: public void start() throws Exception { S ...
- Objective-c 命名规则
1.方法名:第一个单词的首字母用小写,后面的单词首字母要大写<骆驼规则>,例如doSomething . doSomethingElse 2.类名:第一个单词的首字母要求大写,后面的单词首 ...
- php大力力 [017节]来来来,庆祝一下🎁大力力第一个数据库录入程序完成!
庆祝一下
- 2013杭州现场赛B题-Rabbit Kingdom
杭州现场赛的题.BFS+DFS #include <iostream> #include<cstdio> #include<cstring> #define inf ...
- 使用java理解程序逻辑 第三章 选择结构一
if 选择结构: if(条件){ 代码块 //条件成立后要执行的代码.可以是一条语句,也可以是一组语句 } 可以处理单一或组合条件的情况. if-else 选择结构: if(条件){ ...
- Js获取URL中的QueryStirng字符串
function GetQueryString(name) { var reg = new RegExp("(^|&)" + name + "=([^&] ...
- HDU 3047
http://acm.hdu.edu.cn/showproblem.php?pid=3047 和hdu 3038以及poj那个食物链一样,都是带权并查集,此题做法和hdu 3038完全相同,具体操作看 ...
- Magento后台Grid删除Add New按钮
开发过包含后台Grid及表等Magento完整模块的朋友应该知道,默认的,在Magento后台Grid右上方都会包含一个Add New按钮,用来添加新的item.但有些情况我们也可能不需要这个Add ...
- 第一个Sprint冲刺第五天
讨论成员:邵家文.李新.朱浩龙.陈俊金 讨论问题:掌握计时技术的知识 讨论地点:qq网络 进展:完成对功能的理解