Построим алгоритм распознавания эмоций (Face Expression Recognition), который работает с изображениями.

Распознавание эмоций – горячая тема в сфере искусственного интеллекта. К наиболее интересным областям применения подобных технологий можно отнести: распознавание состояния водителя, маркетинговые исследования, системы видеоаналитики для умных городов, человеко-машинное взаимодействие, мониторинг учащихся, проходящих online-курсы, носимые устройства и др.
Многие современные роботы, в том числе голосовые помощники, такие как Алиса, Siri, Alexa уже давно и достаточно успешно способны имитировать поведение человека и отвечать сентиментально. Это также относится к когнитивно-поведенческой терапии, которая занимается тревожными расстройствами у пациентов, которые постоянно испытывают эмоциональное напряжение.
Для банка анализ эмоционального фона клиентов может помочь в увеличении продаж продуктов, а также объективной оценке сервиса и услуг. Также, анализ эмоций сотрудника может помочь в выявлении проблем в бизнес-процессах, а также в предотвращении принятия фатальных решений в управлении системой. Поэтому, учитывая масштаб экосистем, применение подобных технологий выглядит крайне актуальным и перспективным.
И это как раз то, над чем мы будем работать сегодня – распознавание эмоций. В мире данных и машинного обучения эта концепция подпадает под понятие когнитивных систем. Попробуем расшифровать науку, лежащую в основе алгоритмов распознавания эмоций, и реализуем один из таких алгоритмов.
Чего именно пытается достичь алгоритм распознавания эмоций? Идея состоит в том, чтобы воспроизвести когнитивный процесс человека на основе обучающих данных (в виде изображений или видео людей) и попытаться сегментировать эмоции, присутствующие в этих данных. Для выполнения нашего анализа сосредоточимся на предварительно записанных изображениях, на которых я постарался показать широкий спектр эмоций.
Когнитивная наука и анализ эмоций
Основная задача любой системы распознания эмоций состоит в том, чтобы изолировать полярность входных данных (текст, речь, выражение лица …), чтобы понять, является ли представленное первичное настроение положительным, отрицательным или нейтральным. Основываясь на этом первоначальном анализе, алго��итмы затем часто копают глубже, анализируют интенсивность, чтобы определить такие эмоции, как удовольствие, счастье, отвращение, гнев, страх, удивление и т.д.

Такой анализ имеет два основных этапа исследований. Во-первых, это количественная оценка входных данных для алгоритмов для чтения и обработки, во-вторых, это психологические исследования, которые помогают определить, какое выражение обозначает какую эмоцию.

С точки зрения вычислительных систем, когнитивная наука - это изучение научных процессов, происходящих в человеческом мозге. Она представляет Междисциплинарное научное направление, объединяющее теорию познания, когнитивную психологию, нейрофизиологию, когнитивную лингвистику, невербальную коммуникацию и теорию искусственного интеллекта.
Целью когнитивной науки является понимание и моделирование человеческого интеллекта с использованием всего спектра результатов и методологий смежных дисциплин. Предполагается, что, создавая компьютерные системы на основе знаний о человеческом интеллекте, машины смогут имитировать обучение и развивать интеллектуальные модели поведения, подобные человеческим.
Когнитивная наука действует на трех различных уровнях анализа:
1. Вычислительная теория: на этом уровне определяются цели анализа и передаются в компьютерную систему. Это может быть имитация речи или распознание эмоций.
2. Представление и алгоритмы: в общих терминах ML это этап обучения. Здесь машине представляются идеальные сценарии ввода и вывода и вводятся в действие алгоритмы, которые в конечном итоге будут отвечать за преобразование ввода в вывод.
3. Аппаратная реализация: это заключительная фаза когнитивистики. Это внедрение алгоритма в реальном мире и анализ траектории его дальнейшего развития в отношении исследований человеческого мозга.

*Потенциальные приложения искусственного интеллекта в когнитивной науке
Распознавание эмоций на изображении
Face expression recognition (более известная как FER) представляет собой Python библиотеку с открытым исходным кодом, используемую для анализа настроений изображений. Проект построен на версии, которая использует сверточную нейронную сеть, веса которой представлены в файле HDF5, присутствующем в исходном коде (ссылка в конце статьи) модели. При необходимости, модель можно переобучить с помощью конструктора FER при вызове и инициализации модели.
MTCNN (Multi-task Cascaded Neural Network) является параметром конструктора. Это техника для распознавания лиц. Когда установлено значение "True", модель MTCNN используется для обнаружения лиц, а когда установлено значение "Ложь", функция использует классификатор OpenCV Haar Cascade по умолчанию.
detect_emotions(): Эта функция используется для классификации обнаруженных эмоций и регистрирует выходные данные по шести категориям, а именно: «angry», «disgust», «fear», «happy», «sad», «surprise», «neutral». Каждая эмоция вычисляется, и результат оценивается по шкале от 0 до 1.
Реализуем алгоритм на заранее подготовленных изображениях.
Зависимости для установки FER - это OpenCV версии 3.2 или выше, TensorFlow версии 1.7 или выше и Python 3.6.
Устанавливаем библиотеку FER () для распознавания лиц. Эта установка также позаботится о любой из вышеперечисленных зависимостей, если они отсутствуют.
pip install FER
from fer import FER
import matplotlib.pyplot as plt
%matplotlib inlineВвод изображений для анализа.
test_image_one = plt.imread("/emo/test_img1.jpg")Конструктор fer() инициализируется путем присвоения ему классификатора распознавания лиц (либо OpenCV Haar Cascade, либо MTCNN).
emo_detector = FER(mtcnn=True)Затем мы вызываем функцию обнаружения эмоций этого конструктора, передавая ей входной объект (изображение)
captured_emotions = emo_detector.detect_emotions(test_image_one)Выводим список зафиксированных эмоций и обработанное изображение.
print(captured_emotions)
plt.imshow(test_image_one)Затем с помощью top_emotion () мы извлекаем наиболее доминирующую тональность изображения.
dominant_emotion, emotion_score = emo_detector.top_emotion(test_image_one)
print(dominant_emotion, emotion_score)Результаты работы алгоритма:
[{'box': (1298, 534, 2103, 2103), 'emotions': {'angry': 0.0, 'disgust': 0.0, 'fear': 0.0, 'happy': 0.99, 'sad': 0.0, 'surprise': 0.01, 'neutral': 0.0}}]
happy 0.99
[{'box': (1363, 908, 2210, 2210), 'emotions': {'angry': 0.48, 'disgust': 0.0, 'fear': 0.11, 'happy': 0.0, 'sad': 0.33, 'surprise': 0.0, 'neutral': 0.08}}]
angry 0.48
[{'box': (1540, 667, 2099, 2099), 'emotions': {'angry': 0.06, 'disgust': 0.0, 'fear': 0.01, 'happy': 0.0, 'sad': 0.24, 'surprise': 0.0, 'neutral': 0.69}}]
neutral 0.69
[{'box': (1433, 670, 2234, 2234), 'emotions': {'angry': 0.19, 'disgust': 0.0, 'fear': 0.23, 'happy': 0.0, 'sad': 0.3, 'surprise': 0.0, 'neutral': 0.28}}]
sad 0.3
[{'box': (1375, 855, 1840, 1840), 'emotions': {'angry': 0.0, 'disgust': 0.0, 'fear': 0.0, 'happy': 0.99, 'sad': 0.0, 'surprise': 0.0, 'neutral': 0.01}}]
happy 0.99
