Цель
Основная цель этого проекта — реализовать классификацию изображений в наборе данных kaggle для выражения лицевых эмоций (https://www.kaggle.com/datasets/samaneheslamifar/facial-emotion-expressions?datasetId=2876250).
Этот набор данных содержит наборы данных для обучения и проверки, имеющие 48 x 48 пикселей, изображения в градациях серого из более чем 3000 изображений для 7 эмоций, а именно: гнев, отвращение, страх, счастье, грусть, удивление, нейтральность. Эти изображения классифицируются с использованием модели сверточной нейронной сети CNN.
Найдите мой проект в Google Colab
О проекте
Для начала давайте разберемся с концепцией CNN.
CNN или сверточная нейронная сеть — это модель искусственной нейронной сети, которая в основном используется для классификации изображений, поскольку она изучает изображение и извлекает надежные функции. Дизайн этой модели состоит из 3 основных слоев: сверточный слой, слой активации и объединение, как указано в [3].
описать эти слои —
- Сверточный слой: использует фильтры для извлечения основных характеристик изображения.
- Слой активации: преобразует отрицательные значения в 0, чтобы повысить производительность модели во время обучения.
- Объединение: упрощает вывод за счет уменьшения параметров во время обучения.
теперь, чтобы объяснить проект:
Импорт необходимых библиотек и определение параметров
Основная используемая библиотека — это 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 для набора проверки.
Задачи:
Я не очень хорошо разбираюсь в концепциях машинного обучения и всегда сталкиваюсь с первоначальными проблемами, но также учусь, находя для них решения. Проблемы, с которыми я столкнулся при работе над этим проектом:
- Понимание того, какую модель использовать для классификации изображений. после исследования я понял, что CNN — лучший способ работать над классификацией изображений.
- Как работать с изображениями и использовать их в качестве данных для модели, для которой я ссылался на [5], где подробно объяснялись различные способы работы с изображениями.
- Для оценки моделей 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/