PCA人臉識別的python實現


     這幾天看了看PCA及其人臉識別的流程,並在網絡上搜相應的python代碼,有,但代碼質量不好,於是自己就重新寫了下,對於att_faces數據集的識別率能達到92.5%~98.0%(40種類型,每種隨機選5張訓練,5張識別),全部代碼如下,不到50行哦。

# -*- coding: utf-8 -*-
import numpy as np
import os, glob, random, cv2

def pca(data,k):
    data = np.float32(np.mat(data)) 
    rows,cols = data.shape                              #取大小
    data_mean = np.mean(data,0)                         #求均值
    Z = data - np.tile(data_mean,(rows,1))
    D,V = np.linalg.eig(Z*Z.T )                         #特征值與特征向量
    V1 = V[:, :k]                                       #取前k個特征向量
    V1 = Z.T*V1
    for i in xrange(k):                                 #特征向量歸一化
        V1[:,i] /= np.linalg.norm(V1[:,i])
    return np.array(Z*V1),data_mean,V1

def loadImageSet(folder=u'E:/迅雷下載/faceProcess/att_faces', sampleCount=5): #加載圖像集,隨機選擇sampleCount張圖片用於訓練
    trainData = []; testData = []; yTrain=[]; yTest = [];
    for k in range(40):
        folder2 = os.path.join(folder, 's%d' % (k+1))
        data = [cv2.imread(d.encode('gbk'),0) for d in glob.glob(os.path.join(folder2, '*.pgm'))]
        sample = random.sample(range(10), sampleCount)
        trainData.extend([data[i].ravel() for i in range(10) if i in sample])
        testData.extend([data[i].ravel() for i in range(10) if i not in sample])
        yTest.extend([k]* (10-sampleCount))
        yTrain.extend([k]* sampleCount)
    return np.array(trainData),  np.array(yTrain), np.array(testData), np.array(yTest)

def main(): 
    xTrain_, yTrain, xTest_, yTest = loadImageSet()
    num_train, num_test = xTrain_.shape[0], xTest_.shape[0]
    
    xTrain,data_mean,V = pca(xTrain_, 50)
    xTest = np.array((xTest_-np.tile(data_mean,(num_test,1))) * V)  #得到測試臉在特征向量下的數據

    yPredict =[yTrain[np.sum((xTrain-np.tile(d,(num_train,1)))**2, 1).argmin()] for d in xTest]
    print u'歐式距離法識別率: %.2f%%'% ((yPredict == yTest).mean()*100)

    svm = cv2.SVM()                              #支持向量機方法
    svm.train(np.float32(xTrain), np.float32(yTrain), params = {'kernel_type':cv2.SVM_LINEAR})
    yPredict = [svm.predict(d) for d in np.float32(xTest)]
    #yPredict = svm.predict_all(xTest.astype(np.float64)) 
    print u'支持向量機識別率: %.2f%%' % ((yPredict == yTest).mean()*100)

if __name__ =='__main__':
    main()

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM