我正在尝试运行python代码,但是我收到错误,我不熟悉python,所以我不知道如何调试代码。 请帮助,谢谢。 我刚刚在这个网站上找到了这个代码: http://www.paulvangent.com/2016/04/01/emotion-recognition-with-python-opencv-and-a-face-dataset/ 这是代码:
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!")
这是此代码的输出:
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
答案 0 :(得分:5)
int
不可迭代 a, b = c
表示它会尝试将c
解包为可迭代对象并分配给a, b
。因此,a, b = [1, 2]
会将a
设置为1
,将b
设置为2
。 a, b = [1]
会出错,因为没有足够的值来解包。 a, b = [1, 2, 3]
会出错,因为要解压的值太多了。
在您的情况下,a, b = 1
会出错,因为1
无法解包,因为您无法对其进行迭代。遍历对象意味着遍历其所有元素(如列表,元组,集合,字典等)。整数只是一个值;它不可迭代。
这意味着fishface.predict
会返回一个数字。我不确定pred, conf
是什么意思(我猜测预测和信心),但请查看FisherFaceRecognizer#predict
的文档以查看它返回的内容。