2013-04-16 95 views
0

我想通過使用python進行主成分分析(PCA)進行人臉識別。我正在使用matplotlib中的類pca。下面是它的文檔:類PCA matplotlib用於人臉識別

class matplotlib.mlab.PCA(a) compute the SVD of a and store data for PCA. Use project to project the data onto a reduced set of dimensions

Inputs: 
a: a numobservations x numdims array 
Attrs: 
a a centered unit sigma version of input a 
numrows, numcols: the dimensions of a 
mu : a numdims array of means of a 
sigma : a numdims array of atandard deviation of a 
fracs : the proportion of variance of each of the principal components 
Wt : the weight vector for projecting a numdims point or array into PCA space 
Y : a projected into PCA space 

因子載荷都在野生型因子,即對第一主成分因子載荷的重量給出[0]

這裏是我的代碼:

import os 
from PIL import Image 
import numpy as np 
import glob 
import numpy.linalg as linalg 
from matplotlib.mlab import PCA 


#Step 1: put database images into a 2D array 
filenames = glob.glob('C:\\Users\\Karim\\Downloads\\att_faces\\New folder/*.pgm') 
filenames.sort() 
img = [Image.open(fn).convert('L').resize((90, 90)) for fn in filenames] 
images = np.asarray([np.array(im).flatten() for im in img]) 


#Step 2: database PCA 
results = PCA(images.T) 
w = results.Wt 


#Step 3: input image 
input_image = Image.open('C:\\Users\\Karim\\Downloads\\att_faces\\1.pgm').convert('L') 
input_image = np.asarray(input_image) 


#Step 4: input image PCA 
results_in = PCA(input_image) 
w_in = results_in.Wt 


#Step 5: Euclidean distance 
d = np.sqrt(np.sum(np.asarray(w - w_in)**2, axis=1)) 

但我得到一個錯誤:

Traceback (most recent call last): 
    File "C:/Users/Karim/Desktop/Bachelor 2/New folder/matplotlib_pca.py", line 32, in <module> 
    d = np.sqrt(np.sum(np.asarray(w - w_in)**2, axis=1)) 
ValueError: operands could not be broadcast together with shapes (30,30) (92,92) 
  1. 任何人都可以幫助我糾正錯誤嗎?
  2. 這是正確的人臉識別方式嗎?
+0

你是否得到這個整理? – tacaswell

回答

0

錯誤是告訴你,這兩個陣列(ww_in)是不一樣的大小和numpy無法弄清楚如何廣播值走差異。

我對這個功能並不熟悉,但我猜測問題的根源在於你輸入的圖像大小不同。