process_model.py 3.18 KB
Newer Older
Arne Gerdes's avatar
Arne Gerdes committed
1
2
3
4
"""
Diese Klasse macht das Training des Models möglich
"""

Arne Gerdes's avatar
Arne Gerdes committed
5
6
7
8
import cv2
import glob
import random
import numpy as np
tihmels's avatar
tihmels committed
9
import sys
tihmels's avatar
tihmels committed
10
import logging
Arne Gerdes's avatar
Arne Gerdes committed
11

Arne Gerdes's avatar
Arne Gerdes committed
12
13
14
"""
Erstellt und gibt das Log-File aus 
"""
tihmels's avatar
tihmels committed
15
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(levelname)-8s %(message)s',
tihmels's avatar
tihmels committed
16
17
                    datefmt='%m-%d %H:%M',
                    filename='logs/process_model.log')
18

Arne Gerdes's avatar
Arne Gerdes committed
19
20
21
22
"""
Liest Input Parameter 
"""
args = sys.argv
tihmels's avatar
tihmels committed
23
logging.debug('Fisherface training initialized')
Arne Gerdes's avatar
Arne Gerdes committed
24

tihmels's avatar
tihmels committed
25
file = open("{}.csv".format('_'.join(args[1:]).lower()), "w")
26

Arne Gerdes's avatar
Arne Gerdes committed
27

28
29
30
31
32
33
34
def _get_faces_from_emotion(emotion):
    """
    Holt alle Dateien zu einer Emotion aus dem Dataset, mischt sie und teilt sie in ein Trainings- und Prognoseset.
    :param emotion: Die Emotion
    :return: training, prediction
    """
    files = glob.glob('basis_data/dataset/{}/*'.format(emotion))
Arne Gerdes's avatar
Arne Gerdes committed
35
    random.shuffle(files)
Arne Gerdes's avatar
Arne Gerdes committed
36
37
38
39
40
41
42

    """
    Mischt das Dataset in Trainings- und Vergleichsbilder im Verhältnis 80 zu 20 
    """
    training = files[:int(len(files) * 0.8)]
    prediction = files[-int(len(files) * 0.2):]

Arne Gerdes's avatar
Arne Gerdes committed
43
44
    return training, prediction

Arne Gerdes's avatar
Arne Gerdes committed
45

46
47
48
49
50
51
52
53
def image_preprocessing(image):
    """
    Preprocessing der Dateien
    :param item: Bild
    :return:
    """
    img = cv2.imread(image)  # open image
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # convert to grayscale
tihmels's avatar
tihmels committed
54
55
    blur = cv2.GaussianBlur(gray, (5, 5), 0)
    return blur
Arne Gerdes's avatar
Arne Gerdes committed
56

Arne Gerdes's avatar
Arne Gerdes committed
57

Arne Gerdes's avatar
Arne Gerdes committed
58
59
60
61
62
63
def make_sets():
    training_data = []
    training_labels = []
    prediction_data = []
    prediction_labels = []
    for emotion in emotions:
64
        training, prediction = _get_faces_from_emotion(emotion)
Arne Gerdes's avatar
Arne Gerdes committed
65
66
        # Append data to training and prediction list, and generate labels 0-7
        for item in training:
tihmels's avatar
tihmels committed
67
68
            img = image_preprocessing(item)
            training_data.append(img)  # append image array to training data list
Arne Gerdes's avatar
Arne Gerdes committed
69
70
71
            training_labels.append(emotions.index(emotion))

        for item in prediction:  # repeat above process for prediction set
tihmels's avatar
tihmels committed
72
73
            img = image_preprocessing(item)
            prediction_data.append(img)
Arne Gerdes's avatar
Arne Gerdes committed
74
75
76
77
            prediction_labels.append(emotions.index(emotion))

    return training_data, training_labels, prediction_data, prediction_labels

Arne Gerdes's avatar
Arne Gerdes committed
78

Arne Gerdes's avatar
Arne Gerdes committed
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
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))

Arne Gerdes's avatar
Arne Gerdes committed
97

tihmels's avatar
tihmels committed
98
99
100
if len(args) > 1:
    tags = ', '.join(args[1:])
    logging.debug(tags.upper())
tihmels's avatar
tihmels committed
101

Arne Gerdes's avatar
Arne Gerdes committed
102
103
104
105
"""
Emotions Liste 
"""
emotions = ["happy", "neutral", "surprise"]
tihmels's avatar
tihmels committed
106
fishface = cv2.face.FisherFaceRecognizer_create()
Arne Gerdes's avatar
Arne Gerdes committed
107

Arne Gerdes's avatar
Arne Gerdes committed
108

Arne Gerdes's avatar
Arne Gerdes committed
109
metascore = []
tihmels's avatar
tihmels committed
110

111
for i in range(0, 10):
Arne Gerdes's avatar
Arne Gerdes committed
112
    correct = run_recognizer()
113
    file.write("{}\n".format(int(correct)))
tihmels's avatar
tihmels committed
114
    logging.debug("{} : {}%".format(i, int(correct)))
Arne Gerdes's avatar
Arne Gerdes committed
115
    metascore.append(correct)
116

117
file.close()
Arne Gerdes's avatar
Arne Gerdes committed
118

tihmels's avatar
tihmels committed
119
logging.debug("{} iterations - {}% average\n".format(len(metascore), np.mean(metascore)))
Arne Gerdes's avatar
Arne Gerdes committed
120
fishface.write('basis_data/models/detection_model.xml')