import cv2 import glob import random import numpy as np import sys import logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(levelname)-8s %(message)s', datefmt='%m-%d %H:%M', filename='logs/process_model.log') args = sys.argv logging.debug('Fisherface training initialized') def get_files_from_emotion(emotion): # Define function to get file list, randomly shuffle it and split 80/20 files = glob.glob('basis_data/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 image_preprocessing(item): image = cv2.imread(item) # open image gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # convert to grayscale return gray def make_sets(): training_data = [] training_labels = [] prediction_data = [] prediction_labels = [] for emotion in emotions: training, prediction = get_files_from_emotion(emotion) # Append data to training and prediction list, and generate labels 0-7 for item in training: img = image_preprocessing(item) training_data.append(img) # append image array to training data list training_labels.append(emotions.index(emotion)) for item in prediction: # repeat above process for prediction set img = image_preprocessing(item) prediction_data.append(img) 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() fishface.train(training_data, np.asarray(training_labels)) 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)) if len(args) > 1: tags = ', '.join(args[1:]) logging.debug(tags.upper()) emotions = ["anger", "disgust", "happy", "neutral", "surprise"] # Emotion list fishface = cv2.face.FisherFaceRecognizer_create() # Now run it metascore = [] for i in range(0, 10): correct = run_recognizer() logging.debug("{} : {}%".format(i, int(correct))) metascore.append(correct) logging.debug("{} iterations - {}% average\n".format(len(metascore), np.mean(metascore))) fishface.write('basis_data/models/detection_model.xml')