Недавно я руководил проектной группой в ThoughtWorks по созданию и открытию исходного кода нового инструментария Распознавание выражений лиц (FER) под названием EmoPy. Система обеспечивает показатели точности, сравнимые с самыми высокими показателями, достижимыми в FER, и теперь доступна для любого бесплатного использования.

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

Распознавание выражений лица — быстро развивающаяся область. Если вы новичок в этой технологии, возможно, вам будет интересно прочитать мой ранее опубликованный Обзор области ТЭР.

Наша цель — расширить публичный доступ к этой важнейшей новой технологии, разработка которой обычно происходит за закрытыми коммерческими дверями. Мы приветствуем поднятые вопросы и вклад сообщества разработчиков открытого исходного кода и надеемся, что вы найдете EmoPy полезным для своих проектов.

Истоки ЭмоПи

Инструментарий EmoPy был создан в рамках ThoughtWorks Arts, программы, которая инкубирует художников, исследующих пересечения технологий и общества. Наша команда разработчиков поддержала художницу Карен Палмер в создании новой версии ее интерактивного опыта кино, RIOT.

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

История разветвляется в разных направлениях в зависимости от воспринимаемой эмоциональной реакции каждого зрителя на фильм. Каждый зритель сталкивается с разными путями в истории, в зависимости от того, является ли его доминирующая воспринимаемая эмоция в данный момент страхом, гневом или спокойствием.

По мере того, как мы разрабатывали новые функции для RIOT, мы сформулировали новые требования к EmoPy, который был создан в тандеме как автономный набор инструментов для распознавания эмоций. Система была построена с нуля, первоначально вдохновленная исследованиями доктор Хунъин Мэн, одного из предыдущих технических партнеров Карен. Подход нейронной сети с временной задержкой доктора Менга был аппроксимирован в архитектуре TimeDelayConvNN, включенной в EmoPy.

№1. Архитектура нейронной сети

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

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

Показанный ниже пример — это Сверточная NN, которая при тестировании показала наилучшие результаты среди сверточных архитектур. Эта архитектура имеет слои, расположенные так, как показано на диаграмме ниже.

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

Некоторые архитектуры имеют гораздо больше уровней, чем показано на приведенной выше схеме. Например, модель TransferLearningNN, имеющая архитектуру Google Inception-v3, имеет сотни уровней.

Полный список исходных архитектур, поставляемых с EmoPy, указан в файле определения класса neuralnets.py, а также в документации EmoPy. Сравнение моделей нейронных сетей также включено в Readme EmoPy, а также в данную обзорную статью.

Каждый из четырех подклассов в neuralnets.py реализует различную архитектуру нейронной сети с использованием Keras framework с бэкендом Tensorflow, что позволяет пользователям экспериментировать и видеть, какой из них лучше всего подходит для их нужд.

№ 2. Выбор наборов данных

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

К сожалению, общедоступных наборов данных такого размера не существует, но у нас есть доступ к двум общедоступным наборам данных — Microsoft FER2013 и набору данных Extended Cohn-Kanade.

Набор данных FER2013 содержит более 35 000 изображений выражений лица для семи классов эмоций, включая гнев, отвращение, страх, счастье, печаль, удивление и спокойствие. Разбивка ярлыков изображений показывает перекос в сторону счастья и отвращения, как показано в таблице ниже.

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

Доступные пиковые эмоции: спокойствие, гнев, презрение, отвращение, страх, радость, печаль и удивление. Набор данных Кона-Канаде содержит 327 последовательностей, из которых мы извлекли неподвижные изображения.

Поскольку набор данных FER намного больше, мы обучили наши модели с 85% его изображений и проверили с оставшимися 15%, а также с набором данных Кона-Канаде во время тестирования.

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

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

№3. Учебный процесс

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

Для каждого изображения, проходящего через нейронную сеть во время обучения, происходит следующий процесс:

  1. Нейронная сеть делает прогноз эмоций на основе своих текущих весов и параметров.
  2. Нейронная сеть сравнивает предсказанную эмоцию с истинной эмоцией изображения, чтобы вычислить значение потери.
  3. Значение потерь используется для корректировки весов нейронной сети.

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

Проверочный набор используется для тестирования нейронной сети после ее обучения. Имея в проверочном наборе отдельный набор образцов изображений, которые не использовались для обучения, мы можем более объективно оценить модель.

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

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

№ 4. Измерение производительности

Четвертое и последнее соображение EmoPy — измерение производительности. Насколько точны данные архитектуры при прогнозировании эмоций на основе обучающего набора и проверочного набора?

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

Модель ConvolutionalLstmNN прилично работала на неподвижных изображениях, но на самом деле это архитектура, предназначенная для обучения на образцах временных рядов. Модель TransferLearningNN очень хорошо показала себя на некоторых подмножествах эмоций, но наиболее эффективной была модель ConvolutionalNN.

Основываясь на этих результатах испытаний, мы решили использовать модель ConvolutionalNN исключительно при продвижении проекта RIOT.

Анализ ошибочных классификаций

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

По оси x матрицы путаницы отложены предсказанные метки, классифицированные нейронной сетью, а по оси y - фактические метки. С очень точной моделью мы ожидаем увидеть четкую диагональную линию, ведущую от верхнего левого угла вниз к нижнему правому углу матрицы. Это показало бы, что каждая из предсказанных меток соответствовала истинным меткам с высокой скоростью. Менее точная модель даст более пеструю матрицу.

Приведенные ниже матрицы путаницы показывают результаты, полученные при тестировании нейронных сетей на обоих наборах данных, используемых в EmoPy. Все матрицы показывают результаты моделей, обученных на FER2013. Однако важно отметить, что матрицы слева показывают результаты, когда эта сеть была проверена с помощью FER2013. Матрицы справа показывают результаты, когда матрицы были проверены с помощью Cohn-Kanade.

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

Ниже приведены два образца изображений, по одному из каждого набора данных. Примечательно, что все изображения из Cohn-Kanade представляют собой фронтальные виды, тогда как изображения в FER2013 были сделаны под разными углами.

Более того, когда был создан набор данных Кона-Канаде, участникам дали примеры выражений лица, а затем попросили разыграть их. Изображения FER2013 намного разнообразнее. Они поступают из многих источников в Интернете — некоторые кажутся необработанными «подлинными» эмоциями, тогда как другие явно преувеличены или разыграны.

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

Просмотр образцов изображений из каждого набора данных показывает, почему это может быть так.

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

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

Вклад в ЭмоПи

Мы сделали EmoPy проектом с открытым исходным кодом, чтобы расширить публичный доступ к технологиям, которые часто недоступны. Цель проекта — упростить эксперименты с нейронными сетями для FER и поделиться со всеми высокопроизводительными предварительно обученными моделями.

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

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

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

Первоначально опубликовано на сайте thinkworksarts.io 6 сентября 2018 г.