Итак, ребята, в сегодняшнем блоге мы будем реализовывать определение возраста с помощью CNN с помощью Keras. Это будет очень забавный проект, так что без дальнейших рассуждений.

Прочитайте полную статью с исходным кодом здесь —https://machinelearningprojects.net/age-detection-using-cnn-with-keras/

ДАВАЙ СДЕЛАЕМ ЭТО…

Код для обучения модели…

Шаг 1 — Импортируйте все необходимые библиотеки.

import cv2
import pandas as pd
import os
import seaborn as sns
import matplotlib.pyplot as plt
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, Dense, Dropout, Flatten, AveragePooling2D, GlobalAveragePooling2D
from tensorflow.keras.callbacks import ModelCheckpoint
import numpy as np
from sklearn.model_selection import train_test_split
from keras.utils import np_utils

np.random.seed(42)
tf.random.set_seed(42)

Шаг 2 — Прочитайте входные изображения и извлеките их метки.

all_images = os.listdir('combined_faces/')
ranges = ['1-2','3-9','10-20','21-27','28-45','46-65','66-116']

X = []
y = []

l = len(all_images)

for a in range(l):
    X.append(cv2.imread(f'combined_faces/{all_images[a]}',0))
    age = int(all_images[a].split('_')[0])
    
    if age>=1 and age<=2:
        y.append(0)
    elif age>=3 and age<=9:
        y.append(1)
    elif age>=10 and age<=20:
        y.append(2)
    elif age>=21 and age<=27:
        y.append(3)
    elif age>=28 and age<=45:
        y.append(4)
    elif age>=46 and age<=65:
        y.append(5)
    elif age>=66 and age<=116:
        y.append(6)
    print(str(a)+'/'+str(l))

np.savez_compressed('compressed image data.npz',x=X,y=y)
  • Здесь мы читаем наши изображения в режиме оттенков серого и сохраняем их в массиве X.
  • Мы сохраняем их возраст в массиве y.
  • И, наконец, мы сохраняем массивы X и y в сжатом формате npz, чтобы нам не нужно было снова и снова читать изображения.

Как загрузить сжатые данные npz…

loaded = np.load('compressed image data.npz')

X = loaded['x']
y = loaded['y']

Шаг 3 — Визуализируйте изображение.

plt.imshow(X[0],cmap=’gray’)

Шаг 4 — Один массив горячего кодирования y.

y = np_utils.to_categorical(y)
y

  • Здесь мы просто сразу кодируем массив y, используя np_utils.to_categorical.

Шаг 5 — Тренировочный тест Разделите данные для создания определения возраста с использованием модели CNN.

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30, random_state=42)

X_train = np.array(X_train).reshape(-1,200,200,1)
X_test = np.array(X_test).reshape(-1,200,200,1)
  • Мы тренируем тест, разделяя данные здесь и изменяя форму X в правильном формате, чтобы передать его в модель на дальнейших этапах.

Шаг 6 — Инициализируйте некоторые константы.

IMG_HEIGHT = 200
IMG_WIDTH = 200
IMG_SIZE = (IMG_HEIGHT,IMG_WIDTH)
batch_size = 128
epochs = 60

Шаг 7 — Создайте объекты ImageDataGenerator для увеличения данных.

train_datagen = ImageDataGenerator(rescale=1./255,
                                   horizontal_flip=True,
                                   shear_range=0.2,
                                   zoom_range=0.2,
                                   height_shift_range=0.1,
                                   width_shift_range=0.1,
                                   rotation_range=15)

test_datagen = ImageDataGenerator(rescale=1./255)
  • Создание объектов для аугментации данных с помощью ImageDataGenerator.

Шаг 8 — Дополните данные для определения возраста, используя модель CNN.

train_data = train_datagen.flow(X_train,y_train,batch_size)
test_data = test_datagen.flow(X_test,y_test,batch_size)
  • Наконец, увеличивая данные, используя поток.

Шаг 9 — Создание определения возраста с использованием модели CNN.

final_cnn = Sequential()

final_cnn.add(Conv2D(filters=32, kernel_size=3, activation='relu', input_shape=(200, 200, 1)))    # 3rd dim = 1 for grayscale images.
final_cnn.add(AveragePooling2D(pool_size=(2,2)))

final_cnn.add(Conv2D(filters=64, kernel_size=3, activation='relu'))
final_cnn.add(AveragePooling2D(pool_size=(2,2)))

final_cnn.add(Conv2D(filters=128, kernel_size=3, activation='relu'))
final_cnn.add(AveragePooling2D(pool_size=(2,2)))

final_cnn.add(Conv2D(filters=256, kernel_size=3, activation='relu'))
final_cnn.add(AveragePooling2D(pool_size=(2,2)))

final_cnn.add(GlobalAveragePooling2D())

final_cnn.add(Dense(132, activation='relu'))

final_cnn.add(Dense(7, activation='softmax'))

final_cnn.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

final_cnn.summary()
  • Здесь мы создали и скомпилировали нашу модель.

Шаг 10 — Создайте контрольную точку модели, чтобы сохранить только лучшую модель.

checkpoint = ModelCheckpoint(filepath="final_cnn_model_checkpoint.h5",
                             monitor='val_accuracy',
                             save_best_only=True,
                             save_weights_only=False,
                             verbose=1
                            )
  • ModelCheckpoint — это просто простой обратный вызов в Keras, который говорит, что хранит только лучшую модель.
  • Под лучшей моделью здесь подразумевается модель с наивысшим значением val_acuracy.

Шаг 11 — Обучите определение возраста с использованием модели CNN.

history = final_cnn.fit(train_data,
                    batch_size=batch_size,
                    validation_data=test_data,
                    epochs=epochs,
                    callbacks=[checkpoint],
                    shuffle=False    
                    )

Шаг 12 — Визуализируйте процесс обучения.

plotting_data_dict = history.history

plt.figure(figsize=(12,8))

test_loss = plotting_data_dict['val_loss']
training_loss = plotting_data_dict['loss']
test_accuracy = plotting_data_dict['val_accuracy']
training_accuracy = plotting_data_dict['accuracy']

epochs = range(1,len(test_loss)+1)

plt.subplot(121)
plt.plot(epochs,test_loss,marker='X',label='test_loss')
plt.plot(epochs,training_loss,marker='X',label='training_loss')
plt.legend()

plt.subplot(122)
plt.plot(epochs,test_accuracy,marker='X',label='test_accuracy')
plt.plot(epochs,training_accuracy,marker='X',label='training_accuracy')
plt.legend()

plt.savefig('training.png')

Код для прогнозирования возраста с помощью веб-камеры с использованием CNN…

import cv2
import imutils
import numpy as np
from tensorflow.keras.models import load_model

model = load_model('age_detect_cnn_model.h5')

detector = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

ranges = ['1-2','3-9','10-20','21-27','28-45','46-65','66-116']

cam = cv2.VideoCapture(0)

while 1:
    ret,frame = cam.read()
    if ret:
        faces = detector.detectMultiScale(frame,1.3,5)
        for x,y,w,h in faces:
            face = frame[y:y+h,x:x+w]
            face = cv2.cvtColor(face,cv2.COLOR_BGR2GRAY)
            face = cv2.resize(face,(200,200))
            face = face.reshape(1,200,200,1)
            age = model.predict(face)
            cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2)
            cv2.rectangle(frame,(x,y+h),(x+w,y+h+50),(255,0,0),-1)
            cv2.putText(frame,ranges[np.argmax(age)],(x+65,y+h+35),cv2.FONT_HERSHEY_DUPLEX,0.8,(255,255,255),2)
            
        cv2.imshow('Live',frame)
        
        
    if cv2.waitKey(1)==27:
        break

cam.release()
cv2.destroyAllWindows()
  • Строка 1–4 — Импорт необходимых библиотек.
  • Строка 6 — Загрузка модели детектора возраста, которую мы обучили выше.
  • Строка 8 — Использование Haarcascades для обнаружения лица в кадре.
  • Строка 10 — Создание массива возрастных диапазонов, на котором мы обучали нашу модель.
  • Строка 12 — Инициация объекта VideoCapture для доступа к веб-камере.
  • Строка 14–32 — Чтение изображения с веб-камеры, обнаружение лица, обрезка лица, масштабирование лица в оттенках серого, изменение размера лица, преобразование его в формат (1 200 200,1), который требуется моделям Keras для прогнозирования, а затем, наконец, прогнозирование возрастного диапазона. и показать его на финальном изображении.
  • Строка 34–35 — освободить объект камеры и уничтожить все окна.

Окончательные результаты определения возраста с помощью CNN…

Дайте мне знать, если есть какие-либо вопросы относительно определения возраста с использованием CNN, связавшись со мной по электронной почте или LinkedIn.

Чтобы узнать больше о машинном обучении, глубоком обучении, компьютерном зрении, НЛП и проектах Flask, посетите мой блог — Проекты машинного обучения

Для дальнейшего объяснения кода и исходного кода посетите здесьhttps://machinelearningprojects.net/age-detection-using-cnn-with-keras/

Итак, это все для этого блога, ребята, спасибо за то, что прочитали его, и я надеюсь, что вы возьмете что-то с собой после прочтения этого и до следующего раза 👋…

Прочитайте мой предыдущий пост: КЛАССИФИКАТОР КОШЕК И СОБАК — САМЫЙ ПРОСТОЙ