人脸识别经典算法实现(二)——Fisher线性判别分析
来源:互联网 发布:强生研发 知乎 编辑:程序博客网 时间:2024/05/22 11:42
第二种人脸识别的经典算法是Fsiher算法,也称之为线性判别分析,我最先看到这个算法是在周志华老师的《机器学习》中,没想到在人脸识别上也有应用。
这个算法的思路和PCA差不太多,都是着眼于图像全局考虑,PCA考虑的是如何确定一组正交基可以使数据降维,线性判别分析则是考虑如何确定一组投影向量可以让数据集在投影钟尽可能大的相互区分。直观上看,区分为非就是类与类之间的差别应该更大,而类内的数据应该更加聚合。这两个指标需要在数学上定义一定的指标来衡量,从而求解出最好的投影向量。
继续做搬运工。。。。
http://blog.csdn.net/smartempire/article/details/23377385,这篇博客LDA的理论和实现讲得非常透彻了,一篇就够了!看完这篇博客你就会发现LDA的理论推导确实有些复杂,涉及的数学知识也比较多,但是它落地不难,因为你可以不看中间的推导过程,直接抓住他最后的公式编码,这不影响你做出最后结果。
程序中因为涉及到了类内的均值向量的计算,因此在组织数据的时候与PCA有不同。
代码如下:
#encoding=utf-8import numpy as npimport cv2import osclass FisherFace(object): def __init__(self,threshold,k,dsize): self.threshold = threshold # 阈值,暂未使用 self.k = k # 指定投影w的个数 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 = [] dataList = [] 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 index,filename in enumerate(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)) dataList.append(dataMat) label.append(subParent) return dataList,label def LDA(self,dataList,k): ''' 多分类问题的线性判别分析算法 :param dataList: 样本矩阵列表 :param k: 投影向量k的个数 :return: 变换后的矩阵列表和变换矩阵 ''' n = dataList[0].shape[0] W = np.zeros((n,self.k)) Sw = np.zeros((n,n)) Sb = np.zeros((n,n)) u = np.zeros((n,1)) N = 0 meanList = [] sampleNum = [] for dataMat in dataList: meanMat = np.mat(np.mean(dataMat,1)).T meanList.append(meanMat) sampleNum.append(dataMat.shape[1]) dataMat = dataMat-meanMat sw = dataMat*dataMat.T Sw += sw print 'Sw的维度',Sw.shape for index,meanMat in enumerate(meanList): m = sampleNum[index] u += m*meanMat N += m u = u/N print 'u的维度',u.shape for index,meanMat in enumerate(meanList): m = sampleNum[index] sb = m*(meanMat-u)*(meanMat-u).T Sb += sb print 'Sb的维度',Sb.shape eigVals, eigVects = np.linalg.eig(np.mat(np.linalg.inv(Sw)*Sb)) eigValInd = np.argsort(eigVals) eigValInd = eigValInd[::-1] eigValInd = eigValInd[:k] # 取出指定个数的前k大的特征值 print '选取的特征值',eigValInd.shape eigVects = eigVects/np.linalg.norm(eigVects,axis=0) #归一化特征向量 redEigVects = eigVects[:,eigValInd] print '变换矩阵维度',redEigVects.shape transMatList = [] for dataMat in dataList: transMatList.append(redEigVects.T*dataMat) return transMatList,redEigVects def compare(self,dataList,testImg,label): ''' 比较函数,这里只是用了最简单的欧氏距离比较,还可以使用KNN等方法,如需修改修改此处即可 :param dataList: 样本矩阵列表 :param testImg: 测试图像矩阵,最原始形式 :param label: 标签矩阵 :return: 与测试图片最相近的图像文件夹,也就是类别 ''' testImg = cv2.resize(testImg,self.dsize) testImg = cv2.cvtColor(testImg,cv2.COLOR_RGB2GRAY) testImg = np.reshape(testImg,(-1,1)) transMatList,redVects = fisherface.LDA(dataList,self.k) testImg = redVects.T*testImg print '检测样本变换后的维度',testImg.shape disList = [] testVec = np.reshape(testImg,(1,-1)) sumVec = np.mat(np.zeros((self.dsize[0]*self.dsize[1],1))) for transMat in transMatList: for sample in transMat.T: disList.append( np.linalg.norm(testVec-sample)) print disList sortIndex = np.argsort(disList) return label[sortIndex[0]/9] 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 ansif __name__=="__main__": fisherface = FisherFace(10,20,(20,20)) ans = fisherface.predict('d:/face','d:/face_test/8.bmp') print ans
0 0
- 人脸识别经典算法实现(二)——Fisher线性判别分析
- Fisher线性判别分析
- 基于Fisher线性判别分析的手写数字识别
- LDA(线性判别分析或称Fisher线性判别),PCA(主成份分析)代码及表情识别中的应用
- LDA(线性判别分析或称Fisher线性判别),PCA(主成份分析)代码及表情识别中的应用
- LDA(线性判别分析或称Fisher线性判别),PCA(主成份分析)代码及表情识别中的应用
- fisher linear discriminant analysis(fisher线性判别分析)
- LDA 两类Fisher线性判别分析及python实现
- 第八章 采用PCA(主成分分析)或LDA(线性判别分析)的人脸识别(二)
- Fisher线性判别分析(Linear Discriminant Analysis,LDA)
- 从零开始实现线性判别分析(LDA)算法(二类情形)
- LDA 线性判别分析/Fisher线性判别
- fisher判别分析原理+python实现
- 人脸识别——DSIFT+Fisher Vecttor Coding
- LDA 线性判别分析(二)
- 线性判别分析算法(LDA)
- 线性判别分析(LDA)算法
- LDA(线性判别分析)算法
- unity3d场景优化
- ios-UI高级 相册的相关处理和音乐播放AVFoundation框架的内容总结
- iOS程序启动原理
- Http网络传递参数中文乱码问题
- PHP数据库操作
- 人脸识别经典算法实现(二)——Fisher线性判别分析
- 最短路径Dijkstra算法-优先队列优化
- linux设置环境变量
- 十分钟玩转 jQuery
- make命令 clean命令
- QDUOJ 10 - LC和加玛帝国的公主(马拉车)
- 二十四节气的研究
- Android高性能ORM数据库DBFlow入门
- Android TimeAnimator && TimeListener翻译