2017-09-27 1 views
-1

Ich versuche, einen Python-Code auszuführen, aber ich bekomme einen Fehler, ich bin nicht vertraut mit Python, also weiß ich nicht, wie Sie den Code debuggen. bitte helfen und danke. Ich habe gerade diesen Code auf dieser Website: http://www.paulvangent.com/2016/04/01/emotion-recognition-with-python-opencv-and-a-face-dataset/ hier ist der Code:TypeError: 'int' -Objekt ist nicht iterierbar Fehler

import cv2 
import glob 
import random 
import numpy as np 

emotions = ["neutral", "anger", "contempt", "disgust", "fear", "happy", "sadness", "surprise"] #Emotion list 
fishface = cv2.face.createFisherFaceRecognizer() #Initialize fisher face classifier 

data = {} 

def get_files(emotion): #Define function to get file list, randomly shuffle it and split 80/20 
    files = glob.glob("dataset\\%s\\*" %emotion) 
    random.shuffle(files) 
    training = files[:int(len(files)*0.8)] #get first 80% of file list 
    prediction = files[-int(len(files)*0.2):] #get last 20% of file list 
    return training, prediction 

def make_sets(): 
    training_data = [] 
    training_labels = [] 
    prediction_data = [] 
    prediction_labels = [] 
    for emotion in emotions: 
     training, prediction = get_files(emotion) 
     #Append data to training and prediction list, and generate labels 0-7 
     for item in training: 
      image = cv2.imread(item) #open image 
      gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) #convert to grayscale 
      training_data.append(gray) #append image array to training data list 
      training_labels.append(emotions.index(emotion)) 

     for item in prediction: #repeat above process for prediction set 
      image = cv2.imread(item) 
      gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) 
      prediction_data.append(gray) 
      prediction_labels.append(emotions.index(emotion)) 

    return training_data, training_labels, prediction_data, prediction_labels 

def run_recognizer(): 
    training_data, training_labels, prediction_data, prediction_labels = make_sets() 

    print ("training fisher face classifier") 
    print ("size of training set is:", len(training_labels), "images") 
    fishface.train(training_data, np.asarray(training_labels)) 
    print ("predicting classification set") 
    cnt = 0 
    correct = 0 
    incorrect = 0 
    for image in prediction_data: 
     pred, conf = fishface.predict(image) 
     if pred == prediction_labels[cnt]: 
      correct += 1 
      cnt += 1 
     else: 
      incorrect += 1 
      cnt += 1 
    return ((100*correct)/(correct + incorrect)) 
#Now run it 
metascore = [] 
for i in range(0,10): 
    correct = run_recognizer() 
    print ("got", correct, "percent correct!") 
    metascore.append(correct) 

print ("\n\nend score:", np.mean(metascore), "percent correct!") 

hier ist der Ausgang dieses Code:

training fisher face classifier 
size of training set is: 351 images 
predicting classification set 
Traceback (most recent call last): 
    File "splitData.py", line 62, in <module> 
    correct = run_recognizer() 
    File "splitData.py", line 51, in run_recognizer 
    pred, conf = fishface.predict(image) 
TypeError: 'int' object is not iterable 

Antwort

3

int ist nicht iterable

a, b = c Mittel dass es versucht, c als ein iterables Objekt zu entpacken und a, b zuzuweisen. So wird a, b = [1, 2]a zu 1 und b zu 2 setzen. a, b = [1] wird Fehler, da nicht genügend Werte zum Entpacken vorhanden sind. a, b = [1, 2, 3] wird Fehler, weil es zu viele Werte zum Entpacken gibt.

In Ihrem Fall würde a, b = 1 Fehler, weil 1 nicht entpackt werden kann, weil Sie nicht durchlaufen können. Iterieren durch ein Objekt bedeutet, durch alle seine Elemente (wie eine Liste, Tupel, Set, Diktat usw.) zu gehen. Eine ganze Zahl ist nur ein Wert; es ist nicht iterierbar.

Das bedeutet, dass fishface.predict eine Zahl zurückgibt. Ich bin nicht sicher, was pred, conf gemeint ist (ich rate Prognose und Vertrauen), aber überprüfen Sie die Dokumente für FisherFaceRecognizer#predict, um zu sehen, was es zurückgibt.

Verwandte Themen