1

I am trying to run a python code but I get an error, I am not familiar with python so I don't know how to debug the code. please help and thank you. I just found this code on this website : http://www.paulvangent.com/2016/04/01/emotion-recognition-with-python-opencv-and-a-face-dataset/ here is the code :

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!")

here is the output of this 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

1 Answer 1

11

int is not iterable

a, b = c means that it will attempt to unpack c as an iterable object and assign to a, b. So, a, b = [1, 2] will set a to 1 and b to 2. a, b = [1] will error because there aren't enough values to unpack. a, b = [1, 2, 3] will error because there are too many values to unpack.

In your case, a, b = 1 would error because 1 can't be unpacked, because you cannot iterate through it. Iterating through an object means going through all of its elements (like a list, tuple, set, dict, etc). An integer is just a value; it isn't iterable.

This means that fishface.predict returns a number. I'm not sure what pred, conf are meant to be (I'm guessing prediction and confidence), but check the docs for FisherFaceRecognizer#predict to see what it returns.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.