0

我正在尝试使用python(matplotlib)通过主成分分析(PCA)进行人脸识别。我正在尝试按照此图片中的说明进行操作:

在此处输入图像描述

这是我的代码:

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

#Step1: put database images into a 3D array
filenames = glob.glob('C:\\Users\\Karim\\Downloads\\att_faces\\New folder/*.pgm')
filenames.sort()
img = [Image.open(fn).convert('L') for fn in filenames]
images = np.dstack([np.array(im) for im in img])

# Step2: create 2D flattened version of 3D input array
d1,d2,d3 = images.shape
b = np.zeros([d1,d2*d3])
for i in range(len(images)):
  b[i] = images[i].flatten()

#Step 3: database PCA
results = PCA(b.T)
x = results.Wt

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

#Step 5: input PCA
in_results = PCA(input_image.T)
y = in_results.Wt

#Step 6: get shortest distance

但我说错了in_results = PCA(input_image.T)Traceback (most recent call last): File "C:\Users\Karim\Desktop\Bachelor 2\New folder\new2.py", line 29, in <module> in_results = PCA(input_image.T) File "C:\Python27\lib\site-packages\matplotlib\mlab.py", line 846, in __init__ n, m = a.shape ValueError: need more than 1 value to unpack

有人可以帮忙吗??

4

1 回答 1

3

问题是PCA构造函数需要一个 2D 数组,并假设您要传递一个数组。您可以从回溯中看到:

in __init__ 
n, m = a.shape 
ValueError: need more than 1 value to unpack

显然如果a是 0D 或 1D 数组,a.shape将不会有两个成员,因此这将失败。您可以尝试input_image.T.shape自己打印出来看看它是什么。

但是您的代码至少有一个问题,可能是两个。

首先,即使您在某个时候有一个 2D 数组,您也可以这样做:

input_image = input_image.flatten()

在那之后,当然,你有一个一维数组。

其次,我认为您从未有过二维数组。这:

input_image = np.array(input_image)

...应该根据numpyPIL文档所说的内容创建一个带有一个对象的“标量”(0D)数组。在各种不同的设置上测试它,我有时似乎得到一个 0D 数组,其他的 2D 数组,所以也许你没有这个问题 - 但如果你没有,你可能会在你运行时立即得到它机器。

你可能想要这个:

input_image = np.asarray(input_image)

这会给你一个二维数组,或者引发一个异常。(好吧,除非你不小心打开了一个多通道图像,在这种情况下,它当然会给你一个 3D 数组。)

于 2013-04-11T23:57:29.050 回答