2013-04-11 2 views
0

python (matplotlib)을 사용하여 주성분 분석 (PCA)에 의한 얼굴 인식을 시도하고 있습니다. 이 이미지에 설명 된대로 내가 할 노력하고 있어요 : 여기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

OK, 맞았습니다. 문제는'n, m = a.shape'입니다. 내 대답을 업데이트하겠습니다. '#Step 4 : 입력 이미지 input_image = Image.open ('C : \\ 사용자 \ Karim \\ 다운로드 \\ att_faces \\ 1.pgm'). – abarnert

답변

3

문제는 PCA 생성자가 2D 배열을 필요로하며,이 배열을 전달할 것으로 가정합니다. a이 0D 또는 1D 배열 인 경우

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

물론, a.shape는 두 멤버가되지 않습니다, 따라서이 실패하게됩니다 : 당신은 역 추적에서 것을 볼 수 있습니다. 당신은 그것이 무엇인지 알기 위해 input_image.T.shape을 인쇄 해 볼 수 있습니다.

하지만 코드에 적어도 하나 이상 문제가 있습니다. 당신이 어떤 점에서 2 차원 배열을 한 경우에도 먼저

,이 작업을 수행 : 그 후

input_image = input_image.flatten() 

물론, 당신은 1 차원 배열을 가지고있다.

둘째, 나는 2D 배열을 가진 적이 없다고 생각합니다. 이 :

input_image = np.array(input_image) 

... numpyPIL 문서의 말에 따라 하나의 객체와 "스칼라"(0D) 배열을 만들어야합니다. 여러 가지 다른 설정에서 테스트 할 때, 나는 때때로 0D 배열을 얻는 것처럼 보이고 다른 배열은 2D 배열을 가지므로이 문제가 발생하지 않을 수도 있습니다. 그러나 그렇지 않은 경우에는 다른 배열에서 실행하자마자 가져올 수 있습니다 기계.

input_image = np.asarray(input_image) 

이 당신에게 2 차원 배열을 제공하거나 예외를 발생시킬 것 중 하나

당신은 아마이 원했다. (우연히 실수로 다중 채널 이미지를 열지 않으면 3D 배열을 얻을 수 있습니다.)

+0

내 코드에 인쇄를 추가 할 때. convert (' L ') input_image = np.array (input_image) input_image input_image.flatten =() 인쇄 input_image' 출력 1D I 그것을 시도 어레이 – user2229953

+0

하지만 변화이다. 변경은'input_image = input_image.flatten()'('input_image' 2D 배열 mot 1D 만들기)를 제거 할 때입니다. 하지만 또 다른 오류'Traceback (가장 최근에 마지막으로 호출) : 파일 "C : \ Users \ Karim \ Desktop \ Bachelor 2 \ New folders \ new2.py", 줄 29, in_results = PCA (input_image.T) 파일 "C : \ Python27 \ lib \ site-packages \ matplotlib \ mlab.py", 줄 848, __init__에서 발생 RuntimeError ('numrows> numcols'로 구성된 데이터가 있다고 가정) RuntimeError : 우리는 numrows> numcols'로 구성된 데이터가 있다고 가정합니다. – user2229953

+1

새로운 문제처럼 이미'input_image'에서 데이터가 제대로 구성되어있는 것 같아서'input_image.T'가 잘못되었습니다. _ 평평한, 조바꿈 등을 추가했는지 설명 할 수 있다면, 할 일을 파악하는 것이 더 쉬울 수도 있습니다. – abarnert

관련 문제