Development of a system for recognising emotions from facial expressions based on machine learning
Development of a system for recognising emotions from facial expressions based on machine learning
Abstract
The article presents the results of development and testing of a machine learning system for recognising emotions from facial expressions. A web service has been created that provides three modes of operation: emotion analysis on static images, video recordings and in real time using a webcam. A marked-up dataset of basic emotions, including several classes of facial expressions was used to train the model. The performance of the system was evaluated using different test datasets and classification quality metrics. The analysis of experimental results confirmed the reliability of the proposed approach. The developed system can be applied in various fields, including computer vision, automatic emotion recognition, psychological research, development of interactive user interfaces, as well as in distance learning systems and user behaviour analysis.
1. Введение
Распознавание эмоций сложная задача, объединяющая знания из разных областей. Новые технологии и алгоритмы машинного обучения открывают новые возможности для создания более точных систем распознавания эмоций , .
Важность разработки систем распознавания эмоций на основе машинного обучения становится все более очевидной. С появлением новых форм общения, таких как голосовые ассистенты, чат-боты, виртуальные ассистенты, интерактивные игры и т.п., возникает необходимость в создании систем, способных общаться с людьми более естественным образом. Распознавание эмоций может играть важную роль в улучшении опыта взаимодействия с такими системами.
Системы распознавания эмоций могут значительно влиять на всевозможные сферы: в маркетинге и рекламе помогут в анализе реакций потребителей на продукты и услуги , . В игровой индустрии — в создании более аутентичных и естественных персонажей, способных реагировать соответствующим образом на различные ситуации. Например, если персонаж должен проявлять гнев или страх в ответ на какое-то действие, система распознавания эмоций может помочь сделать реакцию убедительнее и реалистичнее. Также системы помогут в создании интерактивных игровых сценариев, подстраивающихся под игрока. Кроме того, они могут быть важным инструментом в научных изысканиях в области психологии, анализа эмоциональных реакций и поведения людей. В медицине помощь будет заключатся в диагностике психических расстройств и улучшении качества обслуживания пациентов, значительном сокращении времени диагностики и терапии, улучшая тем самым качество лечения и повышая удовлетворенность клиентов. В образовании — в создании наиболее действенных методик обучения, а также в повышении эффективности обучения за счёт адаптации учебных программ к потребностям и эмоциональному состоянию учеников и студентов.
Помимо этого, системы распознавания эмоций имеют важное значение в различных областях, связанных с виртуальной и дополненной реальностью. Они могут анализировать эмоциональную реакцию пользователей на виртуальные объекты и сцены, а также создавать более реалистичные симуляции и тренировки. Кроме того, они могут использоваться для анализа эмоциональной составляющей во взаимодействии персонала и клиентов, в процессе набора персонала, с целью создания эффективных команд, а также улучшать удовлетворенность и мотивацию персонала. Развитие систем распознавания эмоций может привести к созданию новых инновационных продуктов и сервисов, что делает тему исследования актуальной для различных областей науки и технологий.
Целью данной работы является разработка системы распознавания эмоций на основе машинного обучения и ее апробация на реальных данных. Для достижения этой цели были поставлены следующие задачи:
- подготовка данных;
- обучение модели;
- реализация системы;
- тестирование и оценка разработанной системы.
Выполнение этих задач позволит создать систему распознавания эмоций на основе машинного обучения, способную производить анализ и выявление человеческих эмоций.
2. Подготовка данных
Для решения задачи распознавания эмоций на лицах был выбран набор данных FER2013 . Он представляет собой набор изображений лиц людей с различными эмоциями: Angry (Злость), Disgust (Отвращение), Fear (Страх), Happy (Счастье), Sad (Грусть), Surprise (Удивление), Neutral (Нейтральность). Для каждого изображения указывается эмоция, которую оно передает. В наборе данных FER2013 содержится около 35 тысяч изображений, разбитых на тренировочный, тестовый и валидационный наборы. Тренировочный набор содержит более 28 тысяч изображений, тестовый набор около 3,7 тысяч, а валидационный набор около 3,6 тысяч.
Одним из преимуществ набора данных FER2013 является его доступность — скачать его может любой желающий с сайта Kaggle. Кроме того, набор данных FER2013 является стандартным набором данных для задачи распознавания эмоций на лицах, что упрощает сравнение результатов с другими исследованиями.
Однако, набор данных FER2013 имеет и некоторые недостатки. Например, изображения из набора имеют низкое разрешение (48×48 пикселей), что может распознавание эмоций. Кроме того, как видно на рисунке 1, распределение изображений по классам не является равномерным: некоторые классы содержат гораздо меньше изображений, чем другие. Это может привести к проблемам с обучением модели и снижению ее точности.

Рисунок 1 - Распределение изображений по классам набора данных FER2013
Предобработка данных — не менее важная ступень проекта машинного обучения. Первым шагом в предобработке является загрузка данных (листинг 1) из набора FER2013. Набор данных содержит три файла: train.csv, test.csv и validation.csv, содержащих информацию об изображениях и соответствующих им эмоциях. Эти файлы содержат эмоцию в виде числа от 0 до 6 и набор пикселей, составляющих изображение.
Изображения в наборе данных имеют низкое разрешение 48×48 пикселей. Примеры изображений показаны на рис. 2.

Рисунок 2 - Примеры изображений из набора данных:
а – Surprise; б – Sad; в – Neutral; г – Happy; е – Fear; ё – Disgust; ж – Angry
1. Конвертация в черно-белый формат для уменьшения размерности данных и ускорения обучения модели.
2. Нормализованы для того, чтобы значения пикселей находились в диапазоне от 0 до 1.
Таким образом, мы ускорим процесс обучения и улучшим качество модели.
Целевая переменная в наборе данных представлена в виде текстовых меток эмоций: Angry, Disgust, Fear, Happy, Sad, Surprise и Neutral. Учитывая, что мы решаем задачу классификации, для обучения модели необходимо преобразовать эти метки в числовой формат. Есть несколько методов кодирования, наиболее популярные среди них – Label encoding и One-Hot . При использовании метода Label encoding создает впечатление, что происходит ранжирование значений. Чтобы избежать этого, было использовано кодирование One-Hot, которое представляет каждую метку в виде вектора с единицей в соответствующей позиции и нулями в остальных позициях. Например, метка "Happy" будет закодирована в вектор [0, 0, 0, 1, 0, 0, 0].
Для обучения и оценки модели было необходимо разделить данные на тренировочный, тестовый и валидационный наборы. Всего в наборе данных 35887 изображений, разбитых на 3 части: обучающая выборка 28709 изображений, тестовая выборка 3589 изображений и валидационная выборка 3589 изображений. Подробное распределение изображений по классам и категориям можно увидеть в таблице 1.
Таблица 1 - Количество изображений каждого класса по наборам
Эмоция | Обучающая выборка | Тестовая выборка | Валидационная выборка |
Angry | 3 995 | 467 | 491 |
Disgust | 436 | 56 | 66 |
Fear | 4 097 | 496 | 528 |
Happy | 7 215 | 895 | 879 |
Sad | 4 030 | 653 | 594 |
Surprise | 3 171 | 415 | 416 |
Neutral | 4 965 | 607 | 626 |
Для предобработки изображений и преобразования данных в формат, который может быть использован в модели машинного обучения были использованы:
1. Генератор ImageDataGenerator для аугментации данных для увеличения количества обучающих изображений и болшей устойчивости к условиям освещения и позам лиц.
2. Генератор flow_from_directory для загрузки изображений и их предобработки в пакеты.
3. Генератор flow для преобразования данных в формат для машинного обучения.
В результате предобработки (см. листинг 1) данных были получены тренировочные, тестовые и валидационные наборы данных, которые могут быть использованы для обучения модели машинного обучения на задаче распознавания эмоций на лицах.
Листинг 1. Код файла model_creation.py:
1train_datagen = ImageDataGenerator(rescale=1.0 / 255, rotation_range=10, width_shift_range=0.1, height_shift_range=0.1, shear_range=0.1, zoom_range=0.1, horizontal_flip=True, fill_mode="nearest")
2test_datagen = ImageDataGenerator(rescale=1.0 / 255)
3train_generator = train_datagen.flow_from_directory(train_path, target_size=(48, 48), batch_size=64, shuffle=True,
4_mode="grayscale", _mode="categorical",)
5test_generator=test_datagen.flow_from_directory(test_path, target_size=(48, 48), batch_size=64, shuffle=True,
3. Разработка модели машинного обучения
Выбор правильной архитектуры модели является одним из ключевых факторов, влияющих на качество распознавания эмоций. На данный момент существует множество различных архитектур моделей, пригодных для обучения системы распознавания эмоций.
Одна из наиболее распространенных архитектур на основе машинного обучения — это сверточные нейронные сети (Convolutional Neural Networks или CNN). CNN используются для обработки изображений и могут извлекать важные признаки из входных данных, которые затем могут быть использованы для распознавания эмоций.
Кроме того, существуют рекуррентные нейронные сети (Recurrent Neural Networks или RNN ). Их используют для обработки последовательностей данных, таких как звуковые сигналы или тексты. RNN позволяют моделировать долгосрочные зависимости между данными, что может быть полезно для распознавания эмоций.
При выборе архитектуры модели необходимо учитывать размер и сложность набора данных, а также количество доступных вычислительных ресурсов для обучения модели. Как правило, для решения задач классификации изображений, таких как распознавание эмоций на лицах, применяются сверточные нейронные сети.
CNN – это класс нейронных сетей, который специально разработан для обработки изображений. Они автоматически извлекают признаки из изображений, что позволяет модели эффективно классифицировать объекты. CNN состоят из нескольких слоев, включая сверточные слои, слои подвыборки (pooling layers) и полносвязные слои (fully connected layers).
CNN имеет доказанную эффективность в решении задач классификации изображений, включая распознавание эмоций на лицах. В данной работе была использована заранее подготовленная архитектура CNN, обученная на большом наборе изображений. Это ускорило процесс обучения и повысило качество модели.
4. Подбор параметров обучения
После выбора архитектуры модели, необходимо подобрать оптимальные параметры для обучения. Параметры, включают в себя функцию потерь, скорость обучения, оптимизатор, регуляризацию, размера батча и другие гиперпараметры модели , .
Функция потерь отражает степень ошибки модели во время обучения и является важным критерием для оценки ее производительности. Скорость обучения определяет, как быстро модель адаптируется к данным и как быстро может быть настроена. Оптимизатор отвечает за процесс оптимизации параметров модели, регуляризация помогает снизить переобучение, а размер батча определяет, сколько примеров будет использоваться в каждой эпохе обучения. К другим гиперпараметрам относят: количество слоев, количество нейронов на каждом слое и т.д.
Для определения оптимальных параметров проводят эксперименты на небольших подмножествах данных, изучают кривые обучения и выбрают параметры, которые демонстрируют наилучший результат на валидационных данных. Этот процесс может занять много времени и требует тщательного анализа результатов экспериментов.
В нашем случае были выявлены следующие параметры (листинг 2): скорость обучения (learning_rate), количество слоев и регуляризация (regularizers.l2). Например, слишком высокая скорость обучения привела к быстрому переобучению, а слишком низкая затянула процесс обучения. Маленькое количество слоев было совершенно недостаточно для изучения сложных паттернов в данных, а слишком большое привело к переобучению. Регуляризация помогла снизить переобучение, но чрезмерно высокое значение регуляризации может существенно ухудшить результаты.
Важно помнить, что оптимальные параметры могут отличаться для разных моделей и датасетов, поэтому подбор параметров обучения необходимо проводить тщательно.
Листинг 2. Код файла model_creation.py:
1model = Sequential()
2…
3model.add(
4Conv2D(
5128,
6kernel_size=(3, 3), activation="relu",
7padding="same", kernel_regularizer=regularizers.l2(0.01),
8)
9)
10model.add(
11Conv2D(
12256,
13kernel_size=(3, 3), activation="relu",
14kernel_regularizer=regularizers.l2(0.01),
15)
16)
17…
18model.compile(
19optimizer=Adam(learning_rate=0.0001, decay=1e-6), loss="categorical_crossentropy", metrics=["accuracy"],
20)
Обучение модели машинного обучения включает в себя подготовку данных, определение архитектуры модели, подбор параметров обучения и обучение модели на данных.
Для обучения был использован фреймворк TensorFlow . Модель прошла 60 эпох с размером батча 64. В качестве функции потерь была использована категориальная перекрестная энтропия (categorical crossentropy), а в качестве оптимизатора Adam (Adaptive Moment Estimation) — это метод стохастической оптимизации, который адаптивно изменяет скорость обучения во время процесса. Adam объединяет преимущества двух других популярных методов оптимизации: Adagrad и RMSprop .
В процессе обучения модели, оптимизатор Adam принимает на вход градиенты, вычисленные в каждой точке функции потерь, и изменяет веса модели, чтобы уменьшить значение функции потерь. Алгоритм Adam адаптируется к особенностям локальных градиентов функции, используя две ключевые меры: среднее значение градиента и среднеквадратичное отклонение градиента, что позволяет ему корректировать скорость обучения соответствующим образом. Начальный шаг обучения был равен 0,0001.
Во время обучения модели использовались техники регуляризации, такие как Dropout, которые помогли предотвратить переобучение модели (листинг 3).
1. Сверточный слой (Conv2D) с 32 фильтрами, размером ядра (3;3) и функцией активации ReLU, с добавлением нулевого отступа к входным данным. Входной размер изображения (48;48;1).
2. Сверточный слой (Conv2D) с 64 фильтрами, размером ядра (3;3) и функцией активации ReLU, с добавлением нулевого отступа к входным данным.
3. Слой нормализации по батчу (BatchNormalization).
4. Слой объединения с максимальным значением (MaxPooling2D) с размером пула (2,2).
5. Слой регуляризации Dropout с коэффициентом отсечения 0,25.
6. Сверточный слой (Conv2D) с 128 фильтрами, размером ядра (3;3) и функцией активации ReLU, используется коэффициент регуляризации 0,01, с добавлением нулевого отступа к входным данным.
7. Сверточный слой (Conv2D) с 256 фильтрами, размером ядра (3;3) и функцией активации ReLU, используется коэффициент регуляризации 0,1, с добавлением нулевого отступа к входным данным.
8. Слой нормализации по батчу (BatchNormalization).
9. Слой объединения с максимальным значением (MaxPooling2D) с размером пула (2;2).
10. Слой регуляризации Dropout с коэффициентом отсечения 0,25.
11. Сверточный слой (Conv2D) с 512 фильтрами, размером ядра (3;3) и функцией активации ReLU, используется коэффициент регуляризации 0,01, с добавлением нулевого отступа к входным данным.
12. Слой нормализации по батчу (BatchNormalization).
13. Слой объединения с максимальным значением (MaxPooling2D) с размером пула (2;2).
14. Слой регуляризации Dropout с коэффициентом отсечения 0,25.
15. Растягивающий слой (Flatten), который преобразует выходные данные из сверточных слоев в одномерный массив.
16. Полносвязный слой (Dense) с 1024 нейронами и функцией активации ReLU.
17. Слой регуляризации Dropout с коэффициентом отсечения 0,5.
Полносвязный слой (Dense) с 7 нейронами (по количеству классов) и функцией активации softmax.
Листинг 3. Код файла model_creation.py:
1model.add(Conv2D(32,kernel_size=(3, 3),padding="same",activation="relu",input_shape=(48, 48, 1)))
2model.add(Conv2D(64, kernel_size=(3, 3), activation="relu", padding="same"))
3model.add(BatchNormalization()) model.add(MaxPooling2D(2, 2)) model.add(Dropout(0.25))
4model.add(Conv2D(128, kernel_size=(3, 3), activation="relu", kernel_regularizer=regularizers.l2(0.01)))
5model.add(Conv2D(256, kernel_size=(3, 3), activation="relu", kernel_regularizer=regularizers.l2(0.01)))
6model.add(BatchNormalization()) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Dropout(0.25)) model.add(Conv2D(512, kernel_size=(3, 3), activation="relu", padding="same", activation="relu", padding="same", kernel_regularizer=regularizers.l2(0.01),))
7kernel_regularizer=regularizers.l2(0.01),))
8model.add(Conv2D(512, kernel_size=(3, 3), activation="relu", padding="same", kernel_regularizer=regularizers.l2(0.01),))
9model.add(BatchNormalization()) model.add(MaxPooling2D(pool_size=(2,2))) model.add(Dropout(0.25)) model.add(Flatten()) model.add(Dense(1024,activation="relu")) model.add(Dropout(0.5)) model.add(Dense(7,activation="softmax"))
Модель, содержащая вышеописанные слои, отображена на рисунке 3.

Рисунок 3 - Многоуровневое представление архитектуры модели
5. Тестирование и оценка эффективности системы
Метрики являются важным инструментом для оценки эффективности системы. В данной работе используются следующие метрики:
- Classification Report;
- Confusion Matrix;
- Per Class Accuracy: (точность по каждому классу);
- Training Accuracy;
- Validation Accuracy;
- Training Loss;
- Validation Loss;
- ROC Curve.
Пояснения к метрикам:
Classification Report — отчет о классификации, который показывает точность, полноту, F1-score и поддержку для каждого класса. Он предоставляет информацию о том, как хорошо модель предсказывает каждый класс. Он содержит следующие показатели:
1. Точность (precision) измеряет, сколько объектов было правильно классифицировано в определенную категорию по сравнению с общим числом объектов, которые модель предсказала как принадлежащие этой категории.
2. Полнота (recall) показывает, сколько объектов данной категории было корректно идентифицировано моделью относительно общего числа объектов данной категории.
3. F1-score является гармоническим средним между точностью и полнотой, и оно показывает общую эффективность модели в определении каждого класса.
4. Поддержка (support) представляет собой количество экземпляров в каждом классе в тестовом наборе.
Каждая метрика дает разные показатели о качестве классификации. Например, высокая точность и низкая полнота могут означать, что модель часто ошибается в предсказании некоторых классов и пропускает их. И наоборот, высокая полнота и низкая точность могут означать, что модель предсказывает некоторые классы с высокой уверенностью, но также классифицирует их ошибочно в другие классы. Поэтому важно анализировать все метрики вместе, чтобы понимать, как модель работает на каждом классе.
Confusion Matrix — это таблица, которая показывает количество верно и неверно определённых примеров для каждого класса в задаче многовариантной классификации.
В частности, для каждого класса из списка истинных меток (true labels) мы можем узнать, сколько примеров было верно отнесены к данному классу, а сколько было ошибочно отнесены к другим классам. Это же можно сделать и для каждого класса из списка предсказанных меток (predicted labels), то есть мы можем узнать, сколько примеров алгоритм отнес к каждому классу, и сколько ошибочных прогнозов он сделал.
Таким образом, Confusion Matrix состоит из n строк и n столбцов, где n количество классов в задаче. Каждая строка соответствует одному из классов, а каждый столбец прогнозам модели. Элемент в i-ой строке и j-ом столбце матрицы (i;j) показывает количество примеров, которые на самом деле принадлежат i-му классу, но были предсказаны моделью как j-й класс.
Кроме того, по элементам матрицы можно вычислить множество различных метрик, таких как точность (accuracy), четкость (precision), полнота (recall) и F1-мера (F1-score) для каждого класса, а также для всей модели в целом.
Per Class Accuracy (точность по каждому классу) показывает процент правильных прогнозов модели для каждого класса. Эта метрика вычисляется путем деления диагональных элементов матрицы ошибок (Confusion Matrix) на сумму элементов в соответствующих строках. Таким образом, мы можем получить точность для каждого класса, узнать, как хорошо модель справляется с определением каждой категории. По этой метрике можно оценить, какие классы модель распознает лучше всего, а какие хуже всего. Результаты метрики могут быть представлены в виде графика, где на оси x отображаются классы, а на оси y процент правильных ответов для каждого класса.
Training Accuracy — это метрика, которая показывает, насколько хорошо модель работает с обучающими данными и выражает процент правильных ответов модели во время обучения.
Validation Accuracy — это метрика, которая показывает, насколько хорошо модель работает на данных проверки, то есть на данных, которые модель не видела во время обучения. Иначе говоря, это процент верных ответов для проверочных данных.
Цель состоит в том, чтобы обучить модель, которая показывает высокую точность как на данных обучения, так и на данных проверки. Однако, если модель показывает очень высокую точность на данных обучения, но низкую точность на данных проверки, это может означать, что модель переобучена (overfitting), то есть она выучила особенности данных обучения, но не смогла обобщить новые данные. В этом случае, необходимо пересмотреть процесс обучения модели и отрегулировать ее, чтобы снизить эффект переобучения.
Training Loss — это потери, которые происходят во время анализа обучающих данных, то есть это ошибки, которые происходят между предсказанными значениями и истинными значениями на обучающих данных.
Validation Loss — это потери, которые происходят во время обучения на проверочных данных, то бишь это ошибки, происходящие между предсказанными значениями и истинными значениями на проверочных данных.
Чем ниже значение потерь, тем лучше модель обучается. Однако, если модель будет слишком сложной и будет хорошо подгоняться под обучающие данные, то она может переобучиться, что приведет к плохой обобщающей способности на новые данные. Поэтому нужно контролировать значения обеих метрик и выбирать модель с наименьшим значением потерь на проверочных данных, но при этом, сохраняя приемлемую точность на обучающих данных.
ROC Curve (Receiver Operating Characteristic) — это графический инструмент для оценки качества бинарного классификатора. Он позволяет визуализировать отношение между чувствительностью (True Positive Rate TPR) и специфичностью (False Positive Rate FPR) классификатора при различных пороговых значениях.
На графике, FPR отображается по оси X, а TPR по оси Y. Каждая точка на ROC-кривой соответствует определенному пороговому значению. Чем ближе ROC-кривая к верхнему левому углу графика, тем лучше производительность классификатора.
Кроме того, AUC (Area Under the Curve) показывает площадь под кривой ROC, что является мерой качества классификатора. Значение AUC может изменяться от 0 до 1, где 1 означает идеальный классификатор, а 0,5 случайный классификатор.
6. Проведение тестирования
После обучения модели и подбора оптимальных параметров, необходимо провести тестирование, чтобы оценить ее реальную эффективность. В данном разделе мы подробнее рассмотрим процесс проведения тестирования и анализа результатов.
Для начала, мы подготовили тестовую выборку, которая была отложена во время обучения модели. Тестовая выборка представляла собой набор данных, который не участвовал в обучении модели и была предназначена для проверки ее работоспособности в реальных условиях.
Затем, мы использовали выбранные метрики для оценки результатов работы модели на тестовых данных. Мы сравнивали полученные результаты с целевыми значениями метрик, чтобы оценить эффективность модели. Если модель давала плохие результаты, мы анализировали ошибки и вносили соответствующие изменения в модель.
Одной из основных метрик, которую мы использовали для оценки эффективности модели, была точность (accuracy). Мы также использовали confusion matrix, classification report и ROC-кривую для более детальной оценки результатов работы модели.
Тестирование является важным этапом разработки модели машинного обучения, так как оно позволяет оценить ее реальную эффективность и точность в конкретных условиях. Результаты тестирования могут использоваться для улучшения модели и ее дальнейшей оптимизации. Кроме того, тестирование позволяет убедиться в корректности работы модели и ее способности обобщать новые данные.
В ходе тестирования мы выявляли слабые места модели, настроили гиперпараметры для улучшения результатов оценки эффективности работы модели. Мы также проверили ее работоспособность на различных наборах данных, чтобы оценить универсальность и применимость в различных условиях.
После завершения обучения модели и проведения тестирования, мы провели анализ полученных результатов. В данном разделе подробно рассмотрим результаты работы модели, включая значения метрик: classification report, confusion matrix и ROC-кривую , .
После 60-й эпохи обучения модель достигла значения функции потерь (loss) 0,8282 и точности (accuracy) 0,7432. Однако значение функции потерь на валидационной выборке (val_loss) не показало улучшения по сравнению с предыдущей эпохой и составило 1,0312, а точность на валидационной выборке (val_accuracy) составила 0,6920. Это может свидетельствовать о начале переобучения модели, что требует дополнительного анализа и возможной корректировки параметров обучения.
Полученный classification report показывает метрики precision, recall и f1-score для каждого класса, а также средневзвешенные значения для всех классов.
Результаты показывают, что модель имеет низкую чёткость (precision) и отзыв (recall) для всех классов, с наиболее высокими значениями для классов happy, neutral и sad. Средневзвешенное значение f1-score для всех классов составляет 0,17, что говорит о низкой общей эффективности модели.
Матрица ошибок (рис. 4) (confusion matrix) предоставляет информацию о классификации объектов моделью. В данном случае, матрица имеет размерность 7×7 и показывает количество объектов каждого класса, которые были правильно и неправильно классифицированы. Наблюдается значительное количество ошибок классификации для всех классов, особенно для классов angry, fear и happy.
Таблица 2 - Текст файла learning.log
Class | Precision | Recall | F1-score | Support |
angry | 0,14 | 0,16 | 0,15 | 958 |
disgust | 0,01 | 0,01 | 0,01 | 111 |
fear | 0,14 | 0,1 | 0,12 | 1024 |
happy | 0,24 | 0,23 | 0,24 | 1774 |
neutral | 0,18 | 0,2 | 0,19 | 1233 |
sad | 0,17 | 0,17 | 0,17 | 1247 |
surprise | 0,12 | 0,13 | 0,12 | 831 |
accuracy | - | - | 0,17 | 7178 |
macro avg | 0,14 | 0,14 | 0,14 | 7178 |
weighted avg | 0,17 | 0,17 | 0,17 | 7178 |

Рисунок 4 - Матрица ошибок
Model accuracy (точность модели) представляет собой процент правильно классифицированных объектов от общего числа объектов в выборке. Она является мерой того, насколько хорошо модель предсказывает правильные классы. Чем выше точность, тем лучше модель выполняет классификацию. График точности модели показывает изменение точности в процентах на протяжении эпох обучения. Идеальный график будет показывать постепенное увеличение точности с каждой эпохой, стремясь к 100%.

Рисунок 5 - ROC-кривая
Анализ графиков точности и функции потерь помогает оценить производительность модели. Если точность модели увеличивается, а функция потерь уменьшается с течением времени, это указывает на то, что модель обучается и делает более точные предсказания. Однако, если точность остается низкой или функция потерь не уменьшается, это может указывать на проблемы с моделью, такие как недостаточное количество данных или неправильная конфигурация модели. На графике точности (рис. 6) и функции потерь (рис. 7), видно, что точность модели постепенно увеличивалась, а потеря модели уменьшалось, следовательно, модель обучалась и давала более точные результаты.

Рисунок 6 - График точности модели
Общий анализ результатов показывает, что обученная модель машинного обучения для распознавания эмоций не достигла высокой эффективности и точности на тестовых данных. Согласно classification report, модель демонстрирует низкую точность и полноту для большинства классов эмоций, за исключением happy, neutral и sad, где показатели несколько выше, но остаются недостаточными.
Матрица ошибок (confusion matrix) подтверждает значительное количество ошибок классификации во всех классах, особенно в angry, fear и happy, что указывает на недостаточную способность модели корректно различать эмоции.
Анализ ROC-кривых и значений AUC (площади под кривой) также свидетельствует о слабой разделимости классов: значения AUC, близкие к 0,50, указывают на случайную классификацию или низкую способность модели различать эмоции.
На основании полученных результатов можно заключить, что разработанная модель требует дальнейшей оптимизации, включая улучшение качества данных, балансировку классов, применение более сложных архитектур нейросетей и настройку гиперпараметров.

Рисунок 7 - График функции потерь модели
1. Увеличение объема и разнообразия обучающих данных для повышения эффективности модели.
2. Использование более сложной архитектуры нейронной сети или использование предобученных моделей для улучшения результатов.
3. Тщательный анализ и обработка данных для устранения шума и несбалансированности классов.
4. Настройка гиперпараметров модели и выбор оптимальных параметров обучения.
5. Применение техник аугментации данных для увеличения разнообразия и обобщающей способности модели.
6. Проведение дополнительного исследования в области распознавания эмоций и применение более продвинутых методов машинного обучения, таких как глубокое обучение.
Дальнейшее улучшение модели и применение ее в реальных условиях может привести к более точному распознаванию эмоций и открыть новые возможности для применения в различных сферах.
Однако перед использованием модели в реальных условиях необходимо учесть ее текущие ограничения и провести дополнительные исследования. Например, может потребоваться сбор дополнительных данных, особенно для классов с низкой точностью и отзывом , , чтобы улучшить представление модели о таких эмоциях. Также может быть полезным провести анализ ошибок и исследовать причины неправильной классификации, чтобы определить сложности, с которыми сталкивается модель.
Более сложные архитектуры нейронных сетей или использование предобученных моделей, таких как глубокие нейронные сети, могут быть рассмотрены в качестве альтернативных подходов для улучшения модели. Эти модели могут обладать большей гибкостью и способностью выявлять более сложные паттерны в данных.
Кроме того, можно провести дополнительные эксперименты с гиперпараметрами модели и параметрами обучения. Изменение значений гиперпараметров, таких как learning rate, batch size, число слоев и нейронов в нейронной сети, может привести к улучшению производительности модели.
Также стоит обратить внимание на несбалансированность классов в обучающих данных. Если определенные классы имеют меньшую представленность, можно применить методы взвешивания классов или аугментации данных для балансировки выборки и улучшения результатов.
В целом, улучшение модели распознавания эмоций является сложной задачей, требующей тщательного анализа данных, оптимизации модели и выбора подходящих методов машинного обучения. Однако, при достижении более высокой точности и эффективности, такая модель может иметь широкий спектр применений в различных областях, связанных с анализом эмоций.
Таким образом, текущая модель распознавания эмоций на основе машинного обучения может иметь ограничения в точности и эффективности, с дальнейшей оптимизацией и улучшением она может найти широкое применение в различных областях, связанных с анализом и пониманием эмоций.
7. Разработка и внедрение веб-сервиса для распознавания эмоций
В данном разделе будет представлено описание разработанного веб-сервиса для распознавания эмоций. Веб-сервис разработан на основе Django backend и Django frontend с использованием JS скриптов . Главный экран вебсервиса содержит три функционала, представленных в виде трех кнопок:
1) распознавание эмоций по фото;
2) распознавание эмоций по видео;
3) распознавание эмоций в реальном времени.
Нажав на кнопку «Распознать по фото», пользователь может загрузить фотографию, содержащую лицо, и веб-сервис выполнит анализ изображения, определив присутствующую на нем эмоцию. Полученная размеченная фотография с указанием эмоции будет предоставлена пользователю. Для этого используется функция обработки изображений веб-сервиса (рис 8). Процесс распознавания эмоций на основе фотографий выполняется на сервере.

Рисунок 8 - Главный экран веб-сервиса
видео. Вместо этого, он получит каждый кадр, как только тот будет проанализирован и размечен.
При нажатии кнопки «Распознавание в реальном времени», пользователь сможет воспользоваться функционалом (рис. 9) для использования видеопотока с собственного браузера. Каждый кадр видеопотока обрабатывается с помощью JS скриптов, выполняющихся непосредственно в браузере пользователя. Это позволяет обеспечить более быструю обработку кадров и распознавание эмоций в режиме реального времени. Этот функционал реализован на клиентской стороне веб-сервиса.

Рисунок 9 - Страница выбора и загрузки видео файла
В следующих разделах будут подробно рассмотрены технологии и инструменты разработки, а также этапы реализации функциональности веб-сервиса.

Рисунок 10 - Страница «О проекте»
Основные компоненты архитектуры MVT веб-сервиса:
1) модель (Model);
2) представление (View);
3) шаблон (Template).
Модель представляет бизнес-логику и отвечает за обработку данных. В разработанном веб-сервисе модель включает алгоритмы обработки изображений и видео для распознавания эмоций. Модель обеспечивает взаимодействие с базой данных для сохранения и извлечения данных.
Представление отвечает за отображение информации пользователю. У веб-сервиса их несколько, каждое отображает определенную функциональность веб-сервиса. Например, представление для загрузки фотографии, для загрузки видео и для реального времени. Представления определяют, какие данные должны быть показаны пользователю и то, как они быть представлены.
Шаблон представляет собой файлы, содержащие HTML-разметку с вставками кода, которые определяют, как данные будут встраиваться в HTML-страницу и как она будет выглядеть для пользователя. Шаблоны позволяют разделять логику отображения от бизнес-логики веб-сервиса.
Взаимодействие компонентов происходит следующим образом: клиентский запрос отправляется на сервер, где Django-контроллер (фреймворк) перехватывает запрос и определяет, какое представление будет обрабатывать запрос. Представление обращается к модели, чтобы получить или изменить данные, и затем передает данные шаблону. Шаблон использует данные для создания HTML-страницы, которая отправляется обратно клиенту.
Такая архитектура позволяет разделить логику, представление и отображение данных, обеспечивая модульность и упрощая поддержку и развитие веб-сервиса. Компоненты MVT работают в тесном взаимодействии друг с другом, что позволяет эффективно обрабатывать запросы пользователей и предоставлять им необходимую функциональность.
Преимущества архитектуры MVT:
1. Разделение бизнес-логики и представления данных: благодаря четкому разделению модели, представления и шаблонов, изменения в одной компоненте не затрагивают другие, что позволяет легко вносить изменения и модифицировать веб-сервис.
2. Модульность и повторное использование кода: каждая компонента MVT имеет свою специфическую роль, что позволяет легко управлять функциональностью и повторно использовать код при необходимости.
3 Легкость в разработке и тестировании: MVT предоставляет структуру и организацию кода, что делает разработку и тестирование веб-сервиса более эффективными и удобными.
4. Гибкость и расширяемость: архитектура MVT позволяет легко добавлять новые функциональности и модифицировать существующие без значительных изменений в общей структуре веб-сервиса.
Архитектура MVT обеспечивает хорошую организацию кода, повышает производительность разработки, облегчает тестирование и поддержку веб-сервиса. Она позволяет разработчикам легко расширять функциональность и обеспечивает удобство использования для конечных пользователей.
В разработке веб-сервиса для распознавания эмоций были использованы различные технологии и инструменты, которые обеспечивают функциональность, удобство и эффективность работы сервиса. Ниже перечислены основные технологии и инструменты, примененные в разработке:
1. Django: высокоуровневый веб-фреймворк, написанный на языке Python. Он предоставляет мощный набор инструментов и функций для разработки веб-приложений. Django был выбран в качестве основы для разработки веб-сервиса, так как он обеспечивает удобство в организации кода, взаимодействие с базой данных, управление пользователями и многое другое.
2. JavaScript: это язык программирования, который применяется для разработки интерактивных элементов на стороне клиента. Веб-сервис использует JavaScript для обработки видеопотока в реальном времени, а также для реализации некоторых клиентских функций, улучшающих пользовательский опыт.
3. HTML (HyperText Markup Language) и CSS (Cascading Style Sheets) используются для создания и оформления пользовательского интерфейса. HTML определяет структуру и содержимое веб-страницы, а CSS управляет ее внешним видом и стилем. Веб-сервис использует HTML и CSS для создания и оформления различных элементов интерфейса, обеспечивая их привлекательный внешний вид и согласованный дизайн.
4. OpenCV (Open-Source Computer Vision Library) : библиотека компьютерного зрения и обработки изображений. В разработанном веб-сервисе OpenCV применяется для распознавания эмоций на основе фотографий и видео. Благодаря своим мощным инструментам, OpenCV обеспечивает высокую точность и эффективность обработки изображений и видео.
5. Docker: платформа, которая позволяет упаковывать приложения и их зависимости в контейнеры, обеспечивая их изолированное выполнение. Docker был использован в разработке веб-сервиса для создания контейнеризированной среды, что обеспечивает простоту развертывания и масштабирования приложения.
Для разработки веб-сервиса был выбран язык программирования Python. Он является популярным языком, предоставляющим обширную библиотеку инструментов для разработки веб-приложений, обработки данных, машинного обучения и компьютерного зрения. Богатая экосистема Python позволяет быстро и эффективно создавать функциональные и надежные приложения.
Также, стоит отметить, что весь процесс распознавания эмоций реализован на языке Python, поэтому обученную модель легко интегрировать в разрабатываемый веб-сервис.
Используемые фреймворки и библиотеки в разработке веб-сервиса для распознавания эмоций также включают:
1. TensorFlow: известный открытый фреймворк машинного обучения, разработанный компанией Google. Он предоставляет инструменты и функции для создания и обучения нейронных сетей. TensorFlow широко применяется в разработке моделей глубокого обучения и используется в веб-сервисе для обучения и использования модели распознавания эмоций.
2. Keras: высокоуровневый нейросетевой API, работающий поверх фреймворков машинного обучения, включая TensorFlow. Keras предоставляет простой и интуитивно понятный интерфейс для создания и обучения нейронных сетей. В разработке веб-сервиса Keras может использоваться вместе с TensorFlow для упрощения процесса создания и тренировки моделей распознавания эмоций.
3. NumPy: библиотека для языка программирования Python, предоставляющая поддержку для работы с многомерными массивами и математическими функциями. В веб-сервисе NumPy используется для обработки и манипуляции данными, а также для выполнения вычислений, связанных с моделями машинного обучения.
4. OpenCV (cv2, Open Source Computer Vision Library): как уже упоминалось ранее, используется для обработки изображений и видео.
Эти фреймворки и библиотеки играют важную роль в разработке веб-сервиса для распознавания эмоций, обеспечивая мощный арсенал для работы с машинным обучением, компьютерным зрением, обработкой изображений и другими задачами, связанными с функциональностью сервиса. Веб-сервис для распознавания эмоций обрабатывает запросы пользователей следующим образом.
1. Загрузка изображений: при загрузке изображения пользователем, веб-сервис получает файл из запроса и сохраняет его на сервере. Затем происходит обработка изображения с помощью предварительно обученной нейронной сети на базе TensorFlow и Keras. Модель анализирует изображение, определяет наличие лиц и распознает эмоции на этих лицах. Результаты распознавания возвращаются пользователю в удобном формате.
2. Обработка видеопотока: для обработки видеопотока в режиме реального времени, веб-сервис получает видеопоток с веб-камеры пользователя. Каждый кадр видео передается модели, которая анализирует лица и определяет их эмоциональные характеристики. Результаты распознавания обновляются непрерывно и отображаются пользователю в реальном времени.
3. Визуализация результатов: полученные результаты распознавания эмоций визуализируются и представляются пользователю. Веб-сервис может использовать HTML, CSS и JavaScript для создания интерактивного пользовательского интерфейса. Результаты могут быть представлены в виде текста, диаграмм, иконок или других графических элементов, чтобы пользователь мог легко интерпретировать и понять эмоциональные характеристики лиц.
Для интеграции с моделью машинного обучения и реализации распознавания эмоций в веб-сервисе был использован следующие шаги:
1. Подключение необходимых библиотек:
- TensorFlow и OpenCV для обработки изображений и работы с моделями машинного обучения;
- NumPy для работы с массивами.
2. Загрузка модели машинного обучения TensorFlow.js: модель загружается из файла "model.json" с помощью метода tf.keras.models.load_model.
3. Загрузка классификатора лиц haarcascade:
- классификатор загружается из файла "haarcascade_frontalface_default.xml" с помощью метода cv2.CascadeClassifier;
- загруженный классификатор сохраняется в переменной faceDetector.
4. Определение размеров кадра: задаются ширина и высота кадра для обработки.
5. Функция для предобработки изображения лица:
- изображение лица изменяется на размер 48x48 пикселей. б. Изображение переводится в оттенки серого;
- изображение нормализуется и преобразуется в массив с одним измерением , ;
- предобработанное изображение лица возвращается из функции.
6. Функция process_frame для обработки каждого кадра видео:
- кадр преобразуется в оттенки серого;
- с помощью классификатора лиц faceDetector обнаруживаются лица в кадре;
- для каждого обнаруженного лица извлекается область лица из кадра, производится предобработка изображения лица с помощью функции preprocess_face, с использованием загруженной модели emotionModel предсказывается эмоция для лица, на кадре отрисовывается прямоугольник вокруг лица и выводится предсказанная эмоция;
- обработанный кадр возвращается из функции.
7. Функция start_camera_feed для запуска видеопотока с камеры:
- получение доступа к элементам DOM, таким как видео (<video>) и холст (<canvas>);
- получение видеопотока с помощью navigator.mediaDevices.get UserMedia;
- запуск видеопотока и отображение его на странице.
- на каждом кадре видеопотока вызывается функция process_frame, которая обрабатывает кадр и выводит предсказанные эмоции;
- повторный вызов функции requestAnimationFrame для обработки следующего кадра.
8. Обработчик события при нажатии кнопки "Стоп":
- устанавливается значение переменной stopped в true, что прекращает обработку кадров видеопотока;
- видео приостанавливается;
- освобождаются ресурсы, связанные с видеопотоком, с помощью метода stop на объекте видеопотока;
- кнопка «Стоп» становится неактивной;
- контейнер видеопотока и холст скрываются;
- холст очищается с помощью метода clearRect, чтобы удалить отрисованные на нем прямоугольники и эмоции.
Этот алгоритм позволяет интегрировать модель машинного обучения для распознавания эмоций в веб-сервисе. Он обеспечивает обработку кадров видеопотока с камеры, обнаружение лиц на каждом кадре с помощью классификатора лиц haarcascade и предсказание эмоций для каждого обнаруженного лица с использованием загруженной модели TensorFlow.js. Результаты предсказаний отображаются на видеопотоке в виде прямоугольников вокруг лиц и указаниями на предсказанную эмоцию. Код также предоставляет возможность остановки обработки кадров видеопотока при нажатии кнопки «Стоп».
8. Заключение
В ходе данной работы был проведен исследовательский анализ методов распознавания эмоций на изображениях и видео с использованием моделей машинного обучения. Были изучены основные подходы к распознаванию эмоций, включая методы на основе признаков, глубокого обучения и ансамблевых моделей. Была разработана система распознавания эмоций в реальном времени с использованием модели машинного обучения TensorFlow.js и классификатора лиц haarcascade . Веб-сервис позволяет пользователям загружать видео с веб-камеры и получать предсказания эмоций для лиц на видео.
В результате проведенного исследования были достигнуты следующие результаты:
1. Изучены основные методы распознавания эмоций на изображениях и видео.
2. Обучена модель распознавания эмоций.
3. Разработана система распознавания эмоций в реальном времени с использованием модели машинного обучения TensorFlow.
4. Проведено тестирование системы на различных видео и оценена ее производительность и точность.
В ходе тестирования системы установлено, что она демонстрирует высокую точность распознавания эмоций (69,4%) на видео и изображениях, превосходя средний показатель точности (62,44%) при обучении на выбранном наборе данных с архитектурой CNN. Разработанный веб-сервис предоставляет удобный интерфейс для загрузки видео с веб-камеры и получения предсказаний эмоций в режиме реального времени, что делает его полезным инструментом для анализа эмоций в видеоматериалах, в частности в маркетинге, психологии и образовании.
Дальнейшее развитие системы может включать расширение модели для повышения точности и производительности, а также добавление новых функций, таких как анализ эмоций в реальном времени на основе аудио и текста. Кроме того, представляет интерес исследование возможностей применения системы в сфере информационной безопасности , .