python实现人脸识别经典算法(一) 特征脸法


Posted in Python onMarch 13, 2018

近来想要做一做人脸识别相关的内容,主要是想集成一个系统,看到opencv已经集成了三种性能较好的算法,但是还是想自己动手试一下,毕竟算法都比较初级。

操作环境:python2.7

第三方库:opencv for python、numpy

第一种比较经典的算法就是特征脸法,本质上其实就是PCA降维,这种算法的基本思路是,把二维的图像先灰度化,转化为一通道的图像,之后再把它首尾相接转化为一个列向量,假设图像大小是20*20的,那么这个向量就是400维,理论上讲组织成一个向量,就可以应用任何机器学习算法了,但是维度太高算法复杂度也会随之升高,所以需要使用PCA算法降维,然后使用简单排序或者KNN都可以。

只当搬运工,送上链接。

PCA ,这篇博客讲得非常好了,从原理到实现基本看这个就能搞出来了:PCA的数学原理

特征脸法:PCA应用在人脸识别当中:人脸识别经典算法一:特征脸方法(Eigenface) ,这里与PCA有不同的操作就是特征值分解的时候,由于图像组成的列向量维度太高,直接按照PCA算法求解会很慢,所以这里有一种特殊的处理方法。

数据组织形式为若干样本图片分类放入对应文件夹中,然后在统一存放入face文件夹下,测试图像单独一张图像即可。

另外,由于PCA中维度是一个很麻烦的事情,所以在程序中,我打印了很多维度信息,有助于我们理解PCA的工作过程和调试。

代码如下:

#encoding=utf-8 
import numpy as np 
import cv2 
import os 
 
class EigenFace(object): 
 def __init__(self,threshold,dimNum,dsize): 
 self.threshold = threshold # 阈值暂未使用 
 self.dimNum = dimNum 
 self.dsize = dsize 
 
 def loadImg(self,fileName,dsize): 
 ''''' 
 载入图像,灰度化处理,统一尺寸,直方图均衡化 
 :param fileName: 图像文件名 
 :param dsize: 统一尺寸大小。元组形式 
 :return: 图像矩阵 
 ''' 
 img = cv2.imread(fileName) 
 retImg = cv2.resize(img,dsize) 
 retImg = cv2.cvtColor(retImg,cv2.COLOR_RGB2GRAY) 
 retImg = cv2.equalizeHist(retImg) 
 # cv2.imshow('img',retImg) 
 # cv2.waitKey() 
 return retImg 
 
 
 def createImgMat(self,dirName): 
 ''''' 
 生成图像样本矩阵,组织形式为行为属性,列为样本 
 :param dirName: 包含训练数据集的图像文件夹路径 
 :return: 样本矩阵,标签矩阵 
 ''' 
 dataMat = np.zeros((10,1)) 
 label = [] 
 for parent,dirnames,filenames in os.walk(dirName): 
  # print parent 
  # print dirnames 
  # print filenames 
  index = 0 
  for dirname in dirnames: 
  for subParent,subDirName,subFilenames in os.walk(parent+'/'+dirname): 
   for filename in subFilenames: 
   img = self.loadImg(subParent+'/'+filename,self.dsize) 
   tempImg = np.reshape(img,(-1,1)) 
   if index == 0 : 
    dataMat = tempImg 
   else: 
    dataMat = np.column_stack((dataMat,tempImg)) 
   label.append(subParent+'/'+filename) 
   index += 1 
 return dataMat,label 
 
 
 def PCA(self,dataMat,dimNum): 
 ''''' 
 PCA函数,用于数据降维 
 :param dataMat: 样本矩阵 
 :param dimNum: 降维后的目标维度 
 :return: 降维后的样本矩阵和变换矩阵 
 ''' 
 # 均值化矩阵 
 meanMat = np.mat(np.mean(dataMat,1)).T 
 print '平均值矩阵维度',meanMat.shape 
 diffMat = dataMat-meanMat 
 # 求协方差矩阵,由于样本维度远远大于样本数目,所以不直接求协方差矩阵,采用下面的方法 
 covMat = (diffMat.T*diffMat)/float(diffMat.shape[1]) # 归一化 
 #covMat2 = np.cov(dataMat,bias=True) 
 #print '基本方法计算协方差矩阵为',covMat2 
 print '协方差矩阵维度',covMat.shape 
 eigVals, eigVects = np.linalg.eig(np.mat(covMat)) 
 print '特征向量维度',eigVects.shape 
 print '特征值',eigVals 
 eigVects = diffMat*eigVects 
 eigValInd = np.argsort(eigVals) 
 eigValInd = eigValInd[::-1] 
 eigValInd = eigValInd[:dimNum] # 取出指定个数的前n大的特征值 
 print '选取的特征值',eigValInd 
 eigVects = eigVects/np.linalg.norm(eigVects,axis=0) #归一化特征向量 
 redEigVects = eigVects[:,eigValInd] 
 print '选取的特征向量',redEigVects.shape 
 print '均值矩阵维度',diffMat.shape 
 lowMat = redEigVects.T*diffMat 
 print '低维矩阵维度',lowMat.shape 
 return lowMat,redEigVects 
 
 def compare(self,dataMat,testImg,label): 
 ''''' 
 比较函数,这里只是用了最简单的欧氏距离比较,还可以使用KNN等方法,如需修改修改此处即可 
 :param dataMat: 样本矩阵 
 :param testImg: 测试图像矩阵,最原始形式 
 :param label: 标签矩阵 
 :return: 与测试图片最相近的图像文件名 
 ''' 
 testImg = cv2.resize(testImg,self.dsize) 
 testImg = cv2.cvtColor(testImg,cv2.COLOR_RGB2GRAY) 
 testImg = np.reshape(testImg,(-1,1)) 
 lowMat,redVects = self.PCA(dataMat,self.dimNum) 
 testImg = redVects.T*testImg 
 print '检测样本变换后的维度',testImg.shape 
 disList = [] 
 testVec = np.reshape(testImg,(1,-1)) 
 for sample in lowMat.T: 
  disList.append(np.linalg.norm(testVec-sample)) 
 print disList 
 sortIndex = np.argsort(disList) 
 return label[sortIndex[0]] 
 
 
 def predict(self,dirName,testFileName): 
 ''''' 
 预测函数 
 :param dirName: 包含训练数据集的文件夹路径 
 :param testFileName: 测试图像文件名 
 :return: 预测结果 
 ''' 
 testImg = cv2.imread(testFileName) 
 dataMat,label = self.createImgMat(dirName) 
 print '加载图片标签',label 
 ans = self.compare(dataMat,testImg,label) 
 return ans 
 
 
if __name__ == '__main__': 
 eigenface = EigenFace(20,50,(50,50)) 
 print eigenface.predict('d:/face','D:/face_test/1.bmp')

 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python笔记(1) 关于我们应不应该继续学习python
Oct 24 Python
浅析Python中MySQLdb的事务处理功能
Sep 21 Python
python实现应用程序在右键菜单中添加打开方式功能
Jan 09 Python
win8下python3.4安装和环境配置图文教程
Jul 31 Python
pyqt5实现登录界面的模板
May 30 Python
Python实现最常见加密方式详解
Jul 13 Python
python实现文件的分割与合并
Aug 29 Python
python-web根据元素属性进行定位的方法
Dec 13 Python
python实现局域网内实时通信代码
Dec 22 Python
PyTorch 普通卷积和空洞卷积实例
Jan 07 Python
Pyhton模块和包相关知识总结
May 12 Python
Python排序算法之插入排序及其优化方案详解
Jun 11 Python
tensorflow实现softma识别MNIST
Mar 12 #Python
wxpython实现图书管理系统
Mar 12 #Python
人生苦短我用python python如何快速入门?
Mar 12 #Python
tensorflow实现KNN识别MNIST
Mar 12 #Python
Python操作MySQL模拟银行转账
Mar 12 #Python
python3 图片referer防盗链的实现方法
Mar 12 #Python
tensorflow构建BP神经网络的方法
Mar 12 #Python
You might like
dedecms防止FCK乱格式化你的代码的修改方法
2007/03/17 PHP
PHP获取搜索引擎关键字来源的函数(支持百度和谷歌等搜索引擎)
2012/10/03 PHP
PHP预定义接口――Iterator用法示例
2020/06/05 PHP
phpStorm2020 注册码
2020/09/17 PHP
jQuery validate 中文API 附validate.js中文api手册
2010/07/31 Javascript
js常用排序实现代码
2010/12/28 Javascript
小试JQuery的AutoComplete插件
2011/05/04 Javascript
js与jquery中获取当前鼠标的x、y坐标位置的代码
2011/05/23 Javascript
js实现有过渡渐变效果的图片轮播相册(兼容IE,ff)
2016/01/19 Javascript
体验jQuery和AngularJS的不同点及AngularJS的迷人之处
2016/02/02 Javascript
node.js学习之base64编码解码
2016/10/21 Javascript
用vue封装插件并发布到npm的方法步骤
2017/10/18 Javascript
npm全局模块卸载及默认安装目录修改方法
2018/05/15 Javascript
使用ng-packagr打包Angular的方法示例
2018/09/21 Javascript
微信小程序API—获取定位的详解
2019/04/30 Javascript
Vue 中可以定义组件模版的几种方式
2019/08/06 Javascript
Vue3 源码导读(推荐)
2019/10/14 Javascript
[09:23]国际邀请赛采访专栏:iG战队VK,Tongfu战队Cu
2013/08/05 DOTA
Python简直是万能的,这5大主要用途你一定要知道!(推荐)
2019/04/03 Python
Python中Numpy ndarray的使用详解
2019/05/24 Python
基于python的列表list和集合set操作
2019/11/24 Python
Python接口测试get请求过程详解
2020/02/28 Python
python3用PyPDF2解析pdf文件,用正则匹配数据方式
2020/05/12 Python
Python实现一个简单的毕业生信息管理系统的示例代码
2020/06/08 Python
python中查看.db文件中表格的名字及表格中的字段操作
2020/07/07 Python
详解KMP算法以及python如何实现
2020/09/18 Python
html5 更新图片颜色示例代码
2014/07/29 HTML / CSS
魅力惠奢品线上平台:MEI.COM
2016/11/29 全球购物
英国最大的高品质珠宝和手表专家:Goldsmiths
2017/03/11 全球购物
FC-Moto英国:欧洲最大的摩托车服装和头盔商店之一
2019/08/25 全球购物
幼儿园教师工作制度
2014/01/22 职场文书
创先争优公开承诺书
2014/08/30 职场文书
大学生作弊检讨书
2014/09/11 职场文书
2014年大学班长工作总结
2014/11/14 职场文书
上课说话检讨书
2015/01/27 职场文书
python_tkinter弹出对话框创建
2022/03/20 Python