Цель

Основная цель этого проекта — реализовать классификацию изображений в наборе данных kaggle для выражения лицевых эмоций (https://www.kaggle.com/datasets/samaneheslamifar/facial-emotion-expressions?datasetId=2876250).

Этот набор данных содержит наборы данных для обучения и проверки, имеющие 48 x 48 пикселей, изображения в градациях серого из более чем 3000 изображений для 7 эмоций, а именно: гнев, отвращение, страх, счастье, грусть, удивление, нейтральность. Эти изображения классифицируются с использованием модели сверточной нейронной сети CNN.

Найдите мой проект в Google Colab

О проекте

Для начала давайте разберемся с концепцией CNN.

CNN или сверточная нейронная сеть — это модель искусственной нейронной сети, которая в основном используется для классификации изображений, поскольку она изучает изображение и извлекает надежные функции. Дизайн этой модели состоит из 3 основных слоев: сверточный слой, слой активации и объединение, как указано в [3].

описать эти слои —

  1. Сверточный слой: использует фильтры для извлечения основных характеристик изображения.
  2. Слой активации: преобразует отрицательные значения в 0, чтобы повысить производительность модели во время обучения.
  3. Объединение: упрощает вывод за счет уменьшения параметров во время обучения.

теперь, чтобы объяснить проект:

Импорт необходимых библиотек и определение параметров

Основная используемая библиотека — это tensorflow, в которой мы можем эффективно работать с изображениями, такими как библиотека tensorflow ImageDataGeneratorbest для предварительной обработки, которая далее объясняется в разделе о предварительной обработке данных.

import os
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow.keras.preprocessing.image import ImageDataGenerator

Я определил 4 параметра —

batch_size : обработка нескольких образцов.

image_height/image_width : 48 x 48 пикселей — это размер изображения.

эпохи : количество раз обучения модели.

batch_size = 64
img_height = 48
img_width = 48
num_epochs = 10

Предварительная обработка данных

Для предварительной обработки данных используйте библиотеку ImageDataGenerator, которая используется для нормализации и масштабирования изображений, чтобы они лучше соответствовали нашей модели.

поскольку наборы для обучения и проверки даны отдельно, мы не будем дальше разбивать набор данных, поэтому давайте масштабируем наши данные следующим образом:

train_data_gen = ImageDataGenerator(rescale=1./255,
                                    rotation_range=20,
                                    width_shift_range=0.2,
                                    height_shift_range=0.2,
                                    shear_range=0.2,
                                    zoom_range=0.2,
                                    horizontal_flip=True)
                                    
test_data_gen = ImageDataGenerator(rescale=1./255)

Создание и тестирование модели

Давайте построим базовую модель с 10 эпохами и функцией активации ReLU.

чтобы кратко рассказать о ReLU — Rectified Linear Unit, который преобразует отрицательные значения в 0 путем «выпрямления».

базовая модель выглядит следующим образом:

model = tf.keras.models.Sequential([
    tf.keras.layers.Conv2D(8, (3,3), padding='same', activation='relu', input_shape=(img_height, img_width, 1)),
    tf.keras.layers.MaxPooling2D((2,2)),
    tf.keras.layers.Conv2D(16, (3,3), padding='same', activation='relu'),
    tf.keras.layers.MaxPooling2D((2,2)),
    tf.keras.layers.Conv2D(32, (3,3), padding='same', activation='relu'),
    tf.keras.layers.MaxPooling2D((2,2)),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(64, activation='relu'),
    tf.keras.layers.Dense(7, activation='softmax')
])

# Compile the model
from tensorflow.keras.optimizers import Adam
model.compile(optimizer=Adam(learning_rate=0.001),
              loss='categorical_crossentropy',
              metrics=['accuracy'])

# Train the model
history = model.fit(train_data,
                    epochs=num_epochs,
                    validation_data=test_data)

мы можем видеть обучение модели по сгенерированным ниже эпохам:

затем я подбираю тестовый набор и сравниваю точность для обучения и теста, используя график следующим образом:

Мой вклад

В качестве своего вклада я использовал различные функции активации, чтобы проверить их производительность по сравнению с ReLU.

Модель 2: сигмовидная — принимает значения в диапазоне 0–1, как указано в [4].

Модель 3: TanH — похожа на сигмовидную, но принимает выходные значения в диапазоне от -1 до 1, как указано в [4].

Модель 4: Softmax — конгломерат множества сигмоид

В общей сложности я выполнил 4 модели с 4 различными функциями активации, чтобы увидеть, какая функция активации работает лучше, что можно понять при сравнении результатов.

Сравнение результатов

Из всех моделей наиболее эффективной была модель с функцией активации ReLU, дающая точность 0,417537 для набора поездов и 0,48981 для набора проверки.

Задачи:

Я не очень хорошо разбираюсь в концепциях машинного обучения и всегда сталкиваюсь с первоначальными проблемами, но также учусь, находя для них решения. Проблемы, с которыми я столкнулся при работе над этим проектом:

  1. Понимание того, какую модель использовать для классификации изображений. после исследования я понял, что CNN — лучший способ работать над классификацией изображений.
  2. Как работать с изображениями и использовать их в качестве данных для модели, для которой я ссылался на [5], где подробно объяснялись различные способы работы с изображениями.
  3. Для оценки моделей 1 и 3 потребовалось достаточно времени, что было вызвано значениями параметров (изначально значение batch_size = 32, а conv2D было равно 64 и 128), что давало низкую точность в диапазоне от 10 до 18, посткоррекция была эффективной и быстрой. оценивать.

Использованная литература:

[1] https://www.kaggle.com/code/anand1994sp/facial-expression

[2] https://colab.research.google.com/drive/13vqjnfJJzQ1adTBR2vJRh_4x7llyd1FK#scrollTo=uYbE-ECGyNX4

[3] О CNN — https://www.mathworks.com/discovery/convolutional-neural-network-matlab.html

[4] О функциях активации — https://www.v7labs.com/blog/neural-networks-activation-functions

[5] Предобработка изображений — https://pyimagesearch.com/2019/07/08/keras-imagedatagenerator-and-data-augmentation/