인공지능 공부/딥러닝 논문읽기
(딥러닝) 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()