Построим алгоритм распознавания эмоций (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