2013-04-11 5 views
0

Я пытаюсь сделать распознавание лиц основным анализом компонентов (PCA) с использованием python (matplotlib). Я пытаюсь сделать это, как описано в этом образе:Ошибка Python - ValueError: требуется больше, чем 1 значение для распаковки

enter image description here

Вот мой код:

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

Любой может помочь??

+1

Можете ли вы разместить фактическую трассировку вместо сообщения об ошибке? – abarnert

+0

@abarnert Я добавил фактическую трассировку вместо сообщения об ошибке на вопрос – user2229953

+0

Хорошо, я догадался, правильно. Проблема в том, что 'n, m = a.shape'. Позвольте мне уточнить свой ответ. – abarnert

ответ

3

Проблема заключается в том, что конструктор PCA требует 2D-массив и предполагает, что вы его передадите. Вы можете видеть, что из TRACEBACK:

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() 

После этого, конечно, у вас есть массив 1D.

Во-вторых, я не думаю, что у вас когда-либо был 2D-массив. Это:

input_image = np.array(input_image) 

... следует создать «скалярный» (0D) массив с одним объектом, основываясь на том, что говорят numpy и PIL документов. Проверяя его на разных разных настройках, я иногда получаю массив 0D, например 2D-массив, поэтому, возможно, у вас нет этой проблемы, но если вы этого не сделаете, вы можете получить его, как только будете работать на другом машина.

Вы, наверное, хотели это:

input_image = np.asarray(input_image) 

Это будет либо дать вам 2D массив, или вызвать исключение. (Хорошо, если вы случайно не открыли многоканальное изображение, и в этом случае, конечно, он даст вам трехмерный массив.)

+0

, когда я добавил печать к моему коду: '# Шаг 4: входное изображение 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() print input_image' выход 1D массив – user2229953

+0

Я пробовал, но без изменений. Изменение происходит, когда я удаляю 'input_image = input_image.flatten()' (создавая 2D-массив 'input_image' mot 1D). Но я получаю еще одну ошибку «Traceback (последний последний звонок): Файл« C: \ Users \ Karim \ Desktop \ Bachelor 2 \ New folder \ new2.py », строка 29, в in_results = PCA (input_image.T) Файл «C: \ Python27 \ lib \ site-packages \ matplotlib \ mlab.py», строка 848, в __init__ raise RuntimeError ('мы предполагаем, что данные в a организованы с помощью numrows> numcols') RuntimeError: we предположим, что данные в a организованы с помощью numrows> numcols' – user2229953

+1

Похоже, ваша новая проблема в том, что у вас уже были данные, упорядоченные правильно в 'input_image', поэтому' input_image.T' ошибочно. Если вы можете объяснить _why_, вы добавили сглаживание, транспонирование и т. Д., Было бы легче выяснить, что вы должны делать. – abarnert