Spaces:
Sleeping
Sleeping
| #!/usr/bin/env python | |
| # coding: utf-8 | |
| # In[ ]: | |
| import numpy as np | |
| import pandas as pd | |
| import cv2 | |
| # In[ ]: | |
| df = pd.read_csv('../input/facial-expression/fer2013.csv') | |
| # In[ ]: | |
| df.head() | |
| # In[ ]: | |
| len(df.iloc[0]['pixels'].split()) | |
| # 48 * 48 | |
| # In[ ]: | |
| label_map = ['Anger', 'Neutral', 'Fear', 'Happy', 'Sad', 'Surprise'] | |
| # In[ ]: | |
| import matplotlib.pyplot as plt | |
| # In[ ]: | |
| img = df.iloc[0]['pixels'].split() | |
| # In[ ]: | |
| img = [int(i) for i in img] | |
| # In[ ]: | |
| type(img[0]) | |
| # In[ ]: | |
| len(img) | |
| # In[ ]: | |
| img = np.array(img) | |
| # In[ ]: | |
| img = img.reshape(48,48) | |
| # In[ ]: | |
| img.shape | |
| # In[ ]: | |
| plt.imshow(img, cmap='gray') | |
| plt.xlabel(df.iloc[0]['emotion']) | |
| # In[ ]: | |
| X = [] | |
| y = [] | |
| # In[ ]: | |
| def getData(path): | |
| anger = 0 | |
| fear = 0 | |
| sad = 0 | |
| happy = 0 | |
| surprise = 0 | |
| neutral = 0 | |
| df = pd.read_csv(path) | |
| X = [] | |
| y = [] | |
| for i in range(len(df)): | |
| if df.iloc[i]['emotion'] != 1: | |
| if df.iloc[i]['emotion'] == 0: | |
| if anger <= 4000: | |
| y.append(df.iloc[i]['emotion']) | |
| im = df.iloc[i]['pixels'] | |
| im = [int(x) for x in im.split()] | |
| X.append(im) | |
| anger += 1 | |
| else: | |
| pass | |
| if df.iloc[i]['emotion'] == 2: | |
| if fear <= 4000: | |
| y.append(df.iloc[i]['emotion']) | |
| im = df.iloc[i]['pixels'] | |
| im = [int(x) for x in im.split()] | |
| X.append(im) | |
| fear += 1 | |
| else: | |
| pass | |
| if df.iloc[i]['emotion'] == 3: | |
| if happy <= 4000: | |
| y.append(df.iloc[i]['emotion']) | |
| im = df.iloc[i]['pixels'] | |
| im = [int(x) for x in im.split()] | |
| X.append(im) | |
| happy += 1 | |
| else: | |
| pass | |
| if df.iloc[i]['emotion'] == 4: | |
| if sad <= 4000: | |
| y.append(df.iloc[i]['emotion']) | |
| im = df.iloc[i]['pixels'] | |
| im = [int(x) for x in im.split()] | |
| X.append(im) | |
| sad += 1 | |
| else: | |
| pass | |
| if df.iloc[i]['emotion'] == 5: | |
| if surprise <= 4000: | |
| y.append(df.iloc[i]['emotion']) | |
| im = df.iloc[i]['pixels'] | |
| im = [int(x) for x in im.split()] | |
| X.append(im) | |
| surprise += 1 | |
| else: | |
| pass | |
| if df.iloc[i]['emotion'] == 6: | |
| if neutral <= 4000: | |
| y.append(df.iloc[i]['emotion']) | |
| im = df.iloc[i]['pixels'] | |
| im = [int(x) for x in im.split()] | |
| X.append(im) | |
| neutral += 1 | |
| else: | |
| pass | |
| return X, y | |
| # In[ ]: | |
| X, y = getData('../input/facial-expression/fer2013.csv') | |
| # In[ ]: | |
| np.unique(y, return_counts=True) | |
| # In[ ]: | |
| X = np.array(X)/255.0 | |
| y = np.array(y) | |
| # In[ ]: | |
| X.shape, y.shape | |
| # In[ ]: | |
| y_o = [] | |
| for i in y: | |
| if i != 6: | |
| y_o.append(i) | |
| else: | |
| y_o.append(1) | |
| # In[ ]: | |
| np.unique(y_o, return_counts=True) | |
| # In[ ]: | |
| for i in range(5): | |
| r = np.random.randint((1), 24000, 1)[0] | |
| plt.figure() | |
| plt.imshow(X[r].reshape(48,48), cmap='gray') | |
| plt.xlabel(label_map[y_o[r]]) | |
| # In[ ]: | |
| X = X.reshape(len(X), 48, 48, 1) | |
| # In[ ]: | |
| # no_of_images, height, width, coloar_map | |
| # In[ ]: | |
| X.shape | |
| # In[ ]: | |
| from keras.utils import to_categorical | |
| y_new = to_categorical(y_o, num_classes=6) | |
| # In[ ]: | |
| len(y_o), y_new.shape | |
| # In[ ]: | |
| y_o[150], y_new[150] | |
| # In[ ]: | |
| from keras.models import Sequential | |
| from keras.layers import Dense , Activation , Dropout ,Flatten | |
| from keras.layers.convolutional import Conv2D | |
| from keras.layers.convolutional import MaxPooling2D | |
| from keras.metrics import categorical_accuracy | |
| from keras.models import model_from_json | |
| from keras.callbacks import ModelCheckpoint | |
| from keras.optimizers import * | |
| from keras.layers.normalization import BatchNormalization | |
| # In[ ]: | |
| model = Sequential() | |
| input_shape = (48,48,1) | |
| model.add(Conv2D(64, (5, 5), input_shape=input_shape,activation='relu', padding='same')) | |
| model.add(Conv2D(64, (5, 5), padding='same')) | |
| model.add(BatchNormalization()) | |
| model.add(Activation('relu')) | |
| model.add(MaxPooling2D(pool_size=(2, 2))) | |
| model.add(Conv2D(128, (5, 5),activation='relu',padding='same')) | |
| model.add(Conv2D(128, (5, 5),padding='same')) | |
| model.add(BatchNormalization()) | |
| model.add(Activation('relu')) | |
| model.add(MaxPooling2D(pool_size=(2, 2))) | |
| model.add(Conv2D(256, (3, 3),activation='relu',padding='same')) | |
| model.add(Conv2D(256, (3, 3),activation='relu',padding='same')) | |
| model.add(BatchNormalization()) | |
| model.add(MaxPooling2D(pool_size=(2, 2))) | |
| ## (15, 15) ---> 30 | |
| model.add(Flatten()) | |
| model.add(Dense(6, activation='softmax')) | |
| model.compile(loss='categorical_crossentropy', metrics=['accuracy'],optimizer='adam') | |
| # In[ ]: | |
| model.fit(X, y_new, epochs=22, batch_size=64, shuffle=True, validation_split=0.2) | |
| # In[ ]: | |
| model.save('model.h5') | |
| # In[ ]: | |
| import cv2 | |
| # In[ ]: | |
| test_img = cv2.imread('../input/happy-img-test/pexels-andrea-piacquadio-941693.jpg', 0) | |
| # In[ ]: | |
| test_img.shape | |
| # In[ ]: | |
| test_img = cv2.resize(test_img, (48,48)) | |
| test_img.shape | |
| # In[ ]: | |
| test_img = test_img.reshape(1,48,48,1) | |
| # In[ ]: | |
| model.predict(test_img) | |
| # In[ ]: | |
| # label_map = ['Anger', 'Neutral', 'Fear', 'Happy', 'Sad', 'Surprise'] | |