인공지능 공부/딥러닝 논문읽기

(딥러닝) Deep Learning age and gender detection 나이를 추측해보자

앨런튜링_ 2021. 10. 29. 11:50

https://susanqq.github.io/UTKFace/

 

UTKFace

Large Scale Face Dataset

susanqq.github.io

import pandas as pd
import numpy as np
import os
import matplotlib.pyplot as plt
import tensorflow as tf
import cv2
from tensorflow.keras.models import Sequential, load_model, Model
from tensorflow.keras.layers import Conv2D, MaxPool2D, Dense, Dropout, BatchNormalization, Flatten, Input
from sklearn.model_selection import train_test_split
path = "C:/Users/user/Desktop/UTKFace.tar/UTKFace"

images = []
age = []
gender = []

for img in os.listdir(path):
    ages = img.split("_")[0]
    genders = img.split("_")[1]
    img = cv2.imread(str(path) + "/" + str(img))
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    images.append(np.array(img))
    age.append(np.array(ages))
    gender.append(np.array(genders))
    

age = np.array(age, dtype = np.int64)
images = np.array(images)
gender = np.array(gender, np.uint64)
x_train_age, x_test_age, y_train_age, y_test_age = train_test_split(images, age, random_state=42)
x_train_gender, x_test_gender, y_train_gender, y_test_gender = train_test_split(images, gender, random_state=42)
## age model

age_model = Sequential()
age_model.add(Conv2D(128, kernel_size = 3, activation = 'relu', input_shape=(200,200,3)))

age_model.add(MaxPool2D(pool_size=3, strides=2))

age_model.add(Conv2D(128, kernel_size = 3, activation = 'relu'))
age_model.add(MaxPool2D(pool_size=3, strides=2))

age_model.add(Conv2D(256, kernel_size = 3, activation = 'relu'))
age_model.add(MaxPool2D(pool_size=3, strides=2))

age_model.add(Conv2D(512, kernel_size = 3, activation = 'relu'))
age_model.add(MaxPool2D(pool_size=3, strides=2))

age_model.add(Flatten())
age_model.add(Dropout(0.2))
age_model.add(Dense(512, activation  = 'relu'))

age_model.add(Dense(1, activation = 'linear', name = 'age'))
age_model.compile(optimizer='adam', loss = 'mse', metrics = ['mae'])

print(age_model.summary())

history_age = age_model.fit(x_train_age, y_train_age, validation_data=(x_test_age, y_test_age), epochs=50)

age_model.save('age_model_50epochs.h4')

## age model

gneder_model = Sequential()
gneder_model.add(Conv2D(128, kernel_size = 3, activation = 'relu', input_shape=(200,200,3)))

gneder_model.add(MaxPool2D(pool_size=3, strides=2))

gneder_model.add(Conv2D(128, kernel_size = 3, activation = 'relu'))
gneder_model.add(MaxPool2D(pool_size=3, strides=2))

gneder_model.add(Conv2D(256, kernel_size = 3, activation = 'relu'))
gneder_model.add(MaxPool2D(pool_size=3, strides=2))

gneder_model.add(Conv2D(512, kernel_size = 3, activation = 'relu'))
gneder_model.add(MaxPool2D(pool_size=3, strides=2))

gneder_model.add(Flatten())
gneder_model.add(Dropout(0.2))
gneder_model.add(Dense(512, activation  = 'relu'))

gneder_model.add(Dense(1, activation = 'sigmoid', name = 'gender'))
gneder_model.compile(optimizer='adam', loss = 'binary_crossentropy', metrics = ['accuracy'])

print(age_model.summary())

history_age = gneder_model.fit(x_train_gender, y_train_gender, validation_data=(x_test_gender, y_test_gender), epochs=50)

age_model.save('gender_model_50epochs.h4')
history = history_age

loss = history.history['loss']
val_loss = history.history['val_loss']
epochs = range(1, len(loss) + 1)
plt.plot(epochs, loss, 'y', label='Training loss')
plt.plot(epochs, val_loss, 'r', label='Validation loss')
plt.title('Training and validation loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.show()

acc = history.history['accuracy']

val_acc = history.history['val_accuracy']


plt.plot(epochs, acc, 'y', label='Training acc')
plt.plot(epochs, val_acc, 'r', label='Validation acc')
plt.title('Training and validation accuracy')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend()
plt.show()