-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfinalNet.py
More file actions
144 lines (115 loc) · 4.75 KB
/
Copy pathfinalNet.py
File metadata and controls
144 lines (115 loc) · 4.75 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
# import numpy for calculations and pandas to load CSV
import numpy as np
import pandas as pd
from matplotlib import pyplot
# Import tensorflow and keras to train the net
import tensorflow as tf
from tensorflow import keras
from keras.preprocessing.image import ImageDataGenerator
#load csv
Data = pd.read_csv('fer2013.csv')
# load images to array
pixels = Data.pixels
pixels = pixels.str.split(expand=True)
img_arr = np.array(pixels).reshape(-1, 48, 48, 1).astype(int)
## Code block to equalize the histogram's of the data set
# startimage = 20
# fig, ax = plt.subplots(nrows=2, ncols=10, figsize=(25,25))
# for i in range(10):
# ax[0][i].imshow(np.array(img_arr[startimage+i]), cmap='gray')
# ax[0][i].set_title(i)
# for i in range(0,len(img_arr)):
# img_arr[i] = cv.equalizeHist(img_arr[i])
# for i in range(10):
# ax[1][i].imshow(np.array(img_arr[startimage+i]), cmap='gray')
# ax[1][i].set_title(i)
# store labels to numpy array
img_labels = Data.emotion.values
# split test data
X_valid, X_train = img_arr[:3000], img_arr[3000:]
y_valid, y_train = img_labels[:3000], img_labels[3000:]
# get image shapes
img_width = X_train.shape[1]
img_height = X_train.shape[2]
img_depth = X_train.shape[3]
num_classes = 7
# normalize data
X_train = X_train / 255.
X_valid = X_valid / 255.
# output images
print(X_train.shape, X_valid.shape, y_train.shape, y_valid.shape)
print("Input Shape:", img_width, img_height, img_depth, num_classes)
# set Seed
tf.random.set_seed(77)
# Build model
model = keras.models.Sequential()
model.add(keras.layers.Conv2D(64, kernel_size=(5, 5), activation='relu', input_shape=(img_width, img_height, img_depth)))
model.add(keras.layers.BatchNormalization())
model.add(keras.layers.Conv2D(64, kernel_size=(5, 5), activation='relu'))
model.add(keras.layers.BatchNormalization())
model.add(keras.layers.MaxPooling2D(pool_size=(2, 2)))
model.add(keras.layers.Dropout(0.4))
model.add(keras.layers.Conv2D(128, kernel_size=(3, 3), activation='relu'))
model.add(keras.layers.BatchNormalization())
model.add(keras.layers.Conv2D(128, kernel_size=(3, 3), activation='relu'))
model.add(keras.layers.BatchNormalization())
model.add(keras.layers.MaxPooling2D(pool_size=(2, 2)))
model.add(keras.layers.Dropout(0.4))
model.add(keras.layers.Conv2D(256, kernel_size=(3, 3), activation='relu'))
model.add(keras.layers.BatchNormalization())
model.add(keras.layers.Conv2D(256, kernel_size=(3, 3), activation='relu'))
model.add(keras.layers.BatchNormalization())
model.add(keras.layers.MaxPooling2D(pool_size=(2, 2)))
model.add(keras.layers.Dropout(0.4))
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(128, activation="relu"))
model.add(keras.layers.BatchNormalization())
model.add(keras.layers.Dropout(0.6))
model.add(keras.layers.Dense(64, activation="relu"))
model.add(keras.layers.BatchNormalization())
model.add(keras.layers.Dropout(0.6))
model.add(keras.layers.Dense(num_classes, activation="softmax"))
# set comiler settings
model.compile(loss="sparse_categorical_crossentropy",
optimizer="adam",
metrics=["acc"])
# Generate transformed images
datagen = ImageDataGenerator(
zoom_range=0.2, # randomly zoom into images up to 20%
rotation_range=20, # randomly rotate images in the range to 10 degress
width_shift_range=0.1, # randomly shift images horizontally up to 10%
height_shift_range=0.1, # randomly shift images vertically up to 10%
horizontal_flip=True, # randomly flip images horizontal
vertical_flip=False) # dont flip images vertical
batch_size = 128
epochs = 300
# fit model with Data Generator
# model_history = model.fit(datagen.flow(X_train, y_train, batch_size=batch_size), epochs=epochs ,batch_size=batch_size ,validation_data=(X_valid, y_valid))
# fit model without Data Generator
# model_history = model.fit(X_train, y_train , epochs=epochs ,batch_size=batch_size ,validation_data=(X_valid, y_valid))
# save model
# model.save("finalNet.h5")
# Restore the weights
model.load_weights('finalNet.h5')
np.random.seed(7)
fig = pyplot.figure(1, (14, 14))
labels = {0:'anger', 1:'disgust', 2:'fear', 3:'happiness', 4: 'sadness', 5: 'surprise', 6: 'neutral'}
randomImages = []
for x in range(7):
randomImages.append(np.random.choice(np.where(y_valid == x)[0], size=7))
correct=0
k=0
for i in range(5):
for label in range(7):
px = X_valid[randomImages[label][i],:,:,0]
k += 1
ax = pyplot.subplot(7, 7, k)
ax.imshow(px, cmap='gray')
ax.set_xticks([])
ax.set_yticks([])
ax.set_title(f"Emotion:{labels[label]} \nPredicted:{labels[model.predict_classes(px.reshape(1,48,48,1))[0]]}")
pyplot.tight_layout()
if(labels[label] == labels[model.predict_classes(px.reshape(1,48,48,1))[0]]):
correct +=1
pyplot.show()
print(print(correct/k * 100))