«Как он себя чувствует?» По мере того, как разговоры о психическом здоровье становятся все более распространенными, этот вопрос задается мне все чаще. Благодаря яркому изображению психических заболеваний в Джокере мы начинаем говорить о способах поддержания хорошего психического здоровья.

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

Это заставляет меня задуматься ... что, если мы сможем использовать возможности машинного обучения, чтобы предсказать, что кто-то чувствует изнутри, - не задавая ни единого вопроса?

Так что я построил свой собственный детектор эмоций (в этом репозитории Github).

Вот как.

Краткое изложение процесса

Во-первых, я собрал большой набор данных о человеческих лицах с разными эмоциями. Затем я обучил сверточную нейронную сеть распознавать различные эмоции с помощью Keras. Чтобы предсказать эмоции в реальном времени, видео в реальном времени с веб-камеры передается в сеть, которая распознает лица и предсказывает эмоции.

  1. Сбор данных

Используемые данные - это Набор данных для распознавания эмоций лица. Он состоит из 35 887 лиц в оттенках серого 48x48, разделенных на 7 типов эмоций с разбиением на поезд-валидацию-тест 75–12,5–12,5.

Давайте исследуем распределение наших данных. График частоты показывает, что набор данных искажен. В то время как счастливых лиц более 9000, лиц с выражением отвращения меньше 1000. Это говорит нам о том, что мы, возможно, не сможем эффективно распознать лица «отвращения» с этим набором данных.

2. Архитектура

Естественно рассмотреть использование сверточной нейронной сети для задачи распознавания изображений. По сравнению с традиционными методами машинного обучения (такими как дерево решений или градиентное усиление) сверточная нейронная сеть позволяет эффективно обнаруживать функции. Такая сеть позволяет объединять простые функции, обнаруженные на ранней стадии в сети (например, линии), для формирования сложных функций (например, простых кривых линий, образующих левый глаз), что делает сверточную нейронную сеть особенно эффективной при распознавании изображений.

Таким образом, архитектура, используемая здесь, представляет собой сверточную нейронную сеть под названием VGGFace, предложенную группой исследователей из Оксфорда. Вход сети подается на 8 сверточных блоков и 3 полносвязных слоя. Каждый из сверточных блоков содержит линейный сверточный слой, за которым следуют нелинейные слои (такие как ReLU и максимальный пул). Последний слой softmax выводит вероятность каждого типа эмоции.

Учитывая, что сеть принимает входные данные размером 226 x 226, намного больше, чем наши обучающие изображения размером 48 x 48, сеть может чрезмерно соответствовать обучающим изображениям. Другими словами, сеть может запоминать лица в обучающей выборке - она ​​может очень хорошо работать с лицами, которые она уже видела раньше, но не с теми, которых у нее нет. Таким образом, сеть изменяется двумя способами:

  • Во-первых, количество сверточных блоков (Conv) уменьшено с 8 до 5.
  • Во-вторых, количество полностью связанных (FC) слоев сокращается с 3 до 1. За этим полностью подключенным слоем следует слой выпадения с вероятностью 0,5.

3. Процесс обучения

Модель обучается с использованием библиотеки глубокого обучения Keras. Во время обучения категориальная кросс-энтропийная потеря минимизируется с помощью стохастического градиентного спуска со скоростью обучения 0,001. Модель обучалась с 90 эпохами с размером пакета 32.

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

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

4. Производительность

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

Точность тестового набора = Количество лиц, правильно отнесенных к категории в тестовом наборе / Общее количество лиц в тестовом наборе.

Однако плохая модель может сообщать о высокой точности, если набор данных искажен. В этих случаях предпочтительны альтернативные показатели, такие как точность или отзыв. Эти две метрики можно объединить в одну метрику, оценку F1, которая особенно актуальна для модели, обученной и протестированной на искаженном наборе данных, таком как FER2013.

Из этой гистограммы F1-score мы видим, что наша модель способна прилично предсказывать счастливые, удивленные, нейтральные, грустные и сердитые лица. Однако он хуже работает на лицах, которые выражают отвращение и страх. Чтобы исследовать случаи неправильной классификации, мы строим матрицу неточностей для нашего набора данных.

нормализованная матрица неточностей сообщает о доле лиц, классифицированных правильно или иначе. По вертикальной и горизонтальной осям матрицы показаны истинная и прогнозируемая метки лиц соответственно. Диагональ матрицы нечеткости показывает пропорции лиц, классифицированных правильно, а во всех остальных случаях лица классифицированы неправильно.

С помощью матрицы мы можем проанализировать, почему модель плохо справляется с «отвращением» и «страхом», посмотрев на строку матрицы замешательства, где истинным ярлыком является либо «отвращение», либо «страх».

Ах, теперь ясно. Большинство лиц с отвращением ошибочно предсказываются как сердитые, грустные или испуганные, в то время как большинство лиц с отвращением ошибочно предсказываются как грустные или сердитые. Это не должно вызывать удивления, поскольку ограниченное количество лиц с отвращением в обучающей выборке может оказаться недостаточным для обучения модели.

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

5. Ограничения и улучшения

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

Еще одно явное ограничение модели - использование большой сети со множеством параметров, которые могут ограничивать ее скорость прогнозирования. Фактически, модифицированная сеть VGGFace (19,5 млн параметров) значительно крупнее более легких сетей типа MobileNet (2,3 млн параметров). Также стоит изучить другие модели LightFace и SqueezeNet, обе из которых являются легкими моделями, используемыми для компьютерного зрения.

6. Прогнозирование в реальном времени

Для прогнозирования в режиме реального времени поток видео в реальном времени сначала захватывается с помощью CV2 на Python и подается в сеть обнаружения лиц, MTCNN, которая может обеспечить превосходную производительность в режиме реального времени. Обнаруженное лицо затем передается в нашу обученную сеть, где модель выводит прогноз.

7. Дальнейшие действия

Я очень рад продолжить улучшение ограничений модели и, в конечном итоге, развертывание в приложении. В частности, мне интересно изучить возможность создания приложения, которое может определять спады настроения пользователей на основе изображений с камеры. Благодаря способности обнаруживать негативные эмоции на ранней стадии, приложение может помочь улучшить настроение пользователей - с помощью медитации, физических упражнений или иным образом. Чтобы создать приложение, я планирую следовать шагам Лоуренс Монори из deeplearning.ai при использовании Tensorflow Lite.

Если вас интересует код проекта, смело обращайтесь к моему репозиторию Github. Приветствую любые отзывы :)



Подтверждение

P.S. Это мой первый проект глубокого обучения, и я невероятно рад, что он удался. Я призываю всех экспериментировать с новыми проектами и делать то же самое.