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 配列を必要とし、2D 配列を渡すことを想定していることです。トレースバックからそれを見ることができます:

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

aが 0D または 1D 配列の場合は明らかにa.shape2 つのメンバーを持たないため、これは失敗します。自分で印刷してみinput_image.T.shapeて、それが何であるかを確認できます。

しかし、コードには少なくとも 1 つ、おそらく 2 つの問題があります。

まず、ある時点で 2D 配列があったとしても、次のようにします。

input_image = input_image.flatten()

その後、もちろん、1D 配列が得られます。

第二に、あなたが 2D 配列を持ったことはないと思います。これ:

input_image = np.array(input_image)

numpy...とPILドキュメントの内容に基づいて、1 つのオブジェクトで「スカラー」(0D) 配列を作成する必要があります。さまざまなセットアップでテストすると、0D 配列が表示される場合もあれば、2D 配列が表示される場合もあります。この問題は発生していない可能性があります。機械。

あなたはおそらくこれを望んでいました:

input_image = np.asarray(input_image)

これにより、2D 配列が得られるか、例外が発生します。(もちろん、誤ってマルチチャンネル画像を開いた場合を除きます。その場合は、もちろん 3D 配列が表示されます。)

于 2013-04-11T23:57:29.050 に答える