- Играем с эмоциями: Microsoft Cognitive Services + Unity
- Unity Moscow Meetup #3
- Воспринимаемое распознавание распознавания эмоций с помощью API распознавания лиц
- Аутентификация
- Выполнение распознавания распознавания эмоций
- Отправка запроса
- Обработка ответа
- Тестим API от Microsoft — распознавание эмоций
- Простые тесты распознавания эмоций
- Усложняем тесты
- Групповой снимок
- Итоги
- Мало букафф? Читайте есчо !
- Совместная атака с разных планет в Ogame
- Предлоги в русском языке, sql база всех предлогов
Играем с эмоциями: Microsoft Cognitive Services + Unity
Друзья! Наверняка многие из вас уже слышали про когнитивные сервисы, которые позволяют одним вызовом REST API решать сложные задачи — определять эмоции и возраст человека по фотографии, делать машинный перевод текста и т.д. Часто когнитивные сервисы внедряют в приложения или веб-бекенд. Сегодня наш большой друг, сотрудник компании VRTech и Game-разработчик Григорий Дядиченко расскажет нам, как внедрять когнитивные сервисы в игры на Unity, а также пригласит вас на митап Unity-разработчиков, где можно будет обсудить это подробнее.
В этой статье мне бы хотелось рассказать про интеграцию Microsoft Cognitive Services в Unity; про то, как делать HTTP запросы к сервисам через класс WWW (если вдруг кто-то ещё не сталкивался с этим и не знает) и рассказать, с какими неожиданными для меня проблемами я столкнулся, разрабатывая приложение с использованием этих сервисов для Google Play.
Microsoft Cognitive Services — это набор облачных сервисов, которые позволяют решать такие задачи, как распознавание речи, лиц, эмоций и многое другое. Подробнее можно узнать тут
Когда-то я уже писал статью про когнитивные сервисы, и даже конкретно про Emotions API. В ней использовалась библиотека для UWP, которую нельзя использовать в Unity проекте. Поэтому недавно мне пришла в голову идея, что неплохо было бы написать обёртку для этих сервисов для Unity. И я взялся за дело.
Эти сервисы являются интересным и недорогим инструментом для создания “вау эффекта” на выставках, сбора контактов и подобных задач. Работать с ними в принципе в разы проще, нежели с тем же OpenCV. В контексте разработки игр можно сделать прикольную плюшку для игрока, которая позволяет генерировать аватарку игроку по его фотографии.
Перейдём к описанию самой обёртки. На данный момент в ней частично покрыты Emotions API и Face API.
Взаимодействие с решением построено очень просто. Вы создаёте нужный вам сервис, указывая в конструкторе SubscriptionKey (для удобства в демо сценах для их хранения создан ScriptableObject), а дальше создаёте корутину, в которой забираете необходимые вам данные.
Бесплатную пробную версию subscription key можно получить на сайте когнитивных сервисов Microsoft
Итак, зачем тут корутины? Дело в том, что самый удобный способ обращаться к сервисам — это Rest API. Проще всего в Unity это делается с помощью класса WWW, в котором запрос работает асинхронно. Есть множество способов дождаться его выполнения.
Например, можно заблокировать главный поток, но я подозреваю, что в большинстве случаев это нежелательно.
А можно сделать корутинами, что и реализовано в данной версии обёртки.
Данный способ работает неплохо, и устраивал меня, когда я писал своё приложение под андроид. Так как анализ фотографий занимает некоторое время, чтобы пользователь не сидел без дела, я решил интегрировать рекламу. Но в ходе интеграции рекламы появились неожиданные проблемы. Пользователь смотрит рекламу, профиль анализируется — профит, но не тут-то было. Тут меня ждала особенность, про которую я не знал относительно Unity Ads на андроиде. Дело в том, что во время показа рекламы блокируется главный поток, поэтому для анализа профиля было решено вынести всё в отдельный поток.
Там меня ждало новое, но вполне логичное открытие. Оказывается, класс WWW может работать только в главном потоке. Поэтому пришлось всё писать на System.Net (версии 2.0, так как в Unity именно она). И я бы выложил это решение в репозиторий, но там потребовалось подписывать SSL-сертификат, что неочевидно, и может приводить к непредвиденным последствиям у пользователя обёртки. Если вдруг кому-то будет интересно, то я могу её выложить отдельным проектом на гитхабе, но с точки зрения реализации там нет ничего сложного.
(Не самый красивый пример сделанный на скорую руку)
Ещё одно забавное открытие было обнаружено при тестировании Face API. Хотелось сделать такой эффект идеальной улыбки.
Face API может возвращать тот же набор эмоций, что и Emotions API. Но в ходе тестов я обнаружил, что результаты разнятся, при этом Emotions API работает чуть более стабильно и точно. Поэтому для данного эффекта, лендмарки лица (чтобы правильно поставить звёздочку) забирались из Face API, а эмоции — из Emotions API.
В ближайшее время я планирую вернуться к реализации этой обёртки и к поиску новых приколов, связанных с использованием Microsoft Cognitive Services. А пока в проекте есть Demo сцены, в которых показано простейшее взаимодействие EmotionService с веб камерой. Кроме того, некоторые полезные утилиты для скриншотов (скрипт, который делает скриншот определённого RectTransform к примеру)
Возвращаясь к обёртке, скачать и следить за её развитием можно в Github репозитории. (Возможно после митапа дойдут руки написать документацию)
Unity Moscow Meetup #3
7 июня в ВШБИ пройдёт третий митап Unity разработчиков в Москве. Если вы занимаетесь разработкой на Unity или она вам интересна — приходите! Мероприятие бесплатное, регистрация обязательна, зарегистрироваться и узнать более подробную информацию можно тут
А так же, чтобы сделить за последующими мероприятиями и посмотреть материалы с прошлых встреч, можете вступить в группы:
Источник
Воспринимаемое распознавание распознавания эмоций с помощью API распознавания лиц
API распознавания лиц может выполнять обнаружение распознавания эмоций для обнаружения гнев, неприятия, отвращение, аномалии, счастье, нейтрального, грусть и удивительного в выражении лица, основанного на воспринимаемых заметках человеческими программистами. Важно отметить, однако, что только выражения лица могут необязательно представлять внутренние состояния людей.
Помимо возврата результата распознавания эмоций для выражения лица, API распознавания лиц может также возвращать ограничивающий прямоугольник для обнаруженных сторон.
Распознавание распознавания эмоций можно выполнить с помощью клиентской библиотеки и с помощью REST API. В этой статье рассматривается выполнение распознавания эмоцийного распознавания с помощью REST API. Дополнительные сведения о REST API см. в разделе REST API лиц.
API распознавания лиц также можно использовать для распознавания выражений лица в видео и получения сводки по их эмоции. Дополнительные сведения см. в статье анализ видео в режиме реального времени.
Если у вас еще нет подписки Azure, создайте бесплатную учетную запись Azure, прежде чем начать работу.
Чтобы использовать API распознавания лиц, необходимо получить ключ API. Это можно получить на Cognitive Services попытки.
Дополнительные сведения о API распознавания лиц см. в разделе API распознавания лиц.
Аутентификация
Для каждого запроса, выполненного в API распознавания лиц, требуется ключ API, который должен быть указан в качестве значения Ocp-Apim-Subscription-Key заголовка. В следующем примере кода показано, как добавить ключ API в Ocp-Apim-Subscription-Key заголовок запроса:
Сбой передачи допустимого ключа API в API распознавания лиц приведет к ошибке ответа 401.
Выполнение распознавания распознавания эмоций
Распознавание распознавания эмоций выполняется путем создания запроса POST, содержащего изображение, в detect API https://[location].api.cognitive.microsoft.com/face/v1.0 , где [location]] — это регион, который вы использовали для получения ключа API. Необязательные параметры запроса:
- returnFaceId — Указывает, следует ли возвращать Фацеидс обнаруженных сторон. Значение по умолчанию — true .
- returnFaceLandmarks — Указывает, следует ли возвращать ориентиры обнаруженных лиц. Значение по умолчанию — false .
- returnFaceAttributes — следует ли анализировать и возвращать один или несколько указанных атрибутов лиц. Поддерживаются следующие атрибуты лиц: age , gender , headPose . smile facialHair glasses emotion , hair , makeup , occlusion . accessories blur exposure и noise . Обратите внимание, что анализ атрибутов лица имеет дополнительные вычислительные и временные затраты.
Содержимое изображения должно быть помещено в текст запроса POST в виде URL-адреса или двоичных данных.
Поддерживаются форматы файлов изображений JPEG, PNG, GIF и BMP, а размер разрешенного файла — от 1 КБ до 4 МБ.
В примере приложения процесс распознавания распознавания эмоций вызывается путем вызова DetectAsync метода:
Этот вызов метода задает поток, содержащий данные изображения, которые Фацеидс должны быть возвращены, и эти ориентиры не должны возвращаться и распознавания эмоций изображения. Он также указывает, что результаты будут возвращены в виде массива Face объектов. В свою очередь, DetectAsync метод вызывает detect REST API, который выполняет распознавание распознавания эмоций:
Этот метод создает URI запроса, а затем отправляет запрос detect API через SendRequestAsync метод.
Вы должны использовать один и тот же регион в API распознавания лицных вызовах, как вы использовали для получения ключей подписки. Например, если вы получили ключи подписки из westus региона, конечная точка обнаружения лиц будет иметь значение https://westus.api.cognitive.microsoft.com/face/v1.0/detect .
Отправка запроса
SendRequestAsync Метод выполняет запрос POST к API распознавания лиц и возвращает результат в виде Face массива:
Если образ предоставляется через поток, метод создает запрос POST путем заключения потока изображения в StreamContent экземпляр, который предоставляет содержимое HTTP на основе потока. Кроме того, если образ предоставляется через URL-адрес, метод создает запрос POST путем заключения URL-адреса в StringContent экземпляр, который предоставляет содержимое HTTP на основе строки.
Затем запрос POST отправляется в detect API. Ответ считывается, десериализуется и возвращается вызывающему методу.
detect API отправит код состояния HTTP 200 (ОК) в ответе при условии, что запрос действителен, что означает, что запрос выполнен успешно и запрошенные сведения находятся в ответе. Список возможных ответов об ошибках см. в разделе REST API.
Обработка ответа
Ответ API возвращается в формате JSON. В следующих данных JSON показано типичное успешное сообщение ответа, которое предоставляет данные, запрошенные образцом приложения:
Сообщение об успешном ответе состоит из массива записей лиц, ранжированных по размеру прямоугольника в убывающем порядке, в то время как пустой ответ означает, что лица не обнаружены. Каждое распознанное лицо включает ряд дополнительных атрибутов, которые задаются returnFaceAttributes аргументом для DetectAsync метода.
В примере приложения ответ JSON десериализуется в массив Face объектов. При интерпретации результатов API распознавания лиц, обнаруженный распознавания эмоций должен интерпретироваться как распознавания эмоций с наивысшим рейтингом, так как оценки нормализованы до одной суммы. Таким образом, пример приложения отображает распознанный распознавания эмоций с наивысшим рейтингом для наибольшего обнаруженного лица в изображении. Для этого используется такой код:
На следующем снимке экрана показан результат процесса распознавания распознавания эмоций в примере приложения:
Источник
Тестим API от Microsoft — распознавание эмоций
Найти лицо на фотке может сейчас почти любая «мыльница», а вот понять, что выражает это лицо — это уже шаг вперед. Microsoft в рамках проекта Oxford предлагает демонстрацию своего алгоритма распознавания эмоций на фотографиях.
Любой желающий может закачать фотку и получить результат работы API Emotion Recognition (распознавание эмоций).
Не знаю сколько будет висеть демка для тестирования, вот ссылка — www.projectoxford.ai/demo/Emotion.
На каждой фотографии производится поиск лиц (максимум до 64), которые потом помечаются на изображении рамочкой. Т.е. в обработку можно запихнуть весьма серьезные коллективные фотки. Есть ограничения по разрешению картинки — до 4х мегапикселей. При использовании современных мыльниц, фотку скорее всего придется уменьшать или обрезать.
Эмоция в терминах API — это некий 8-мерный вектор. Для каждого найденного лица на фотке мы получаем 8 базовых составляющих эмоции:
- Anger (Гнев),
- Contempt ( Презрение ),
- Disgust ( Отвращение ),
- Fear ( Страх) ,
- Happiness ( Счастье ),
- Neutral ( Обычный) — эдакий покер-фейс,
- Sadness (Печаль),
- Surprise (Удивление)
Нормировка произведена так, чтобы в сумме компоненты давали единицу.
Простые тесты распознавания эмоций
Для начала посмотрим как алгоритм распознаёт и оценивает самые очевидные варианты. Благо, под рукой всегда кто то вертится для экспериментов. 🙂
Практически вся 1 — это счастье. Согласен, Лиза очень довольная тут.
Тут я попросил свою ассистентку изобразить гнев. Но ей было почему то очень весело, что и увидел умный алгоритм, распределив эмоции между гневом (0.46) и счастьем (0.53).
С печалью вышло получше, т.к. перед нами опытная хныкалка. Алгоритм почти поверил Рите и дал оценку в 0.69 балла. Тоже согласен.
А тут редкая фотка, где Леха примеривает покер-файс. Алгоритм выставляет почти единицу. Согласен. Знаю, что Леха почитывает мой блог, ему будет приятно увидеть здесь себя. 🙂
Усложняем тесты
Я загрузил вместо фото — рисунок. Видим, что был найден только один персонаж. Мне кажется, счастье этого малыша переоценено программой (0.76). На мой взгляд, это больше Нейтральное выражение лица.
Черно-белое фотографическое изображение Гитлера. Что это? Он щурится от солнца или действительно так зол? Программа тоже сомневается : ярость (0.55) + отвращение (0.27). Пожалуй, я соглашусь с вердиктом.
Уил Смит удивлен (0.99) способностям алгоритма. Думаю, как актер он способен на любое выражение лица.
Алгоритму не важна ни раса, ни возраст персонажа (я вообще то, ещё и Эйнштейна прогонял с его высунутым языком).
Групповой снимок
Алгоритм нашел девушку как бы она не закатывала глаза и поджимала губы.
1 и 5 почти имеют почти одинаковое нейтрально-доброжелательное выражение, что и отметил алгоритм (примерно — 70 нейтральная компонента, 30 — счастье).
2 и 4 были распознаны отлично — соответственно получили по единице удивление и счастье.
3я пикча алгоритмом интерпретирована не верно (нейтраль — 0.87). Оставшаяся доля распределена между яростью, отвращением и презрением, т.е. в принципе в том спектре эмоций, которые и ожидаются. Но доля их очень мала. Возможно, это связано с не очень высокой детализацией изображения, иначе алгоритм принял бы верное решение.
6я — картинка алгоритмом была не понята (0.96 — нейтраль). Я тоже не понял это выражение лица, но оно точно не нейтральное. Возможно, не хватает нужной эмоциональной компоненты — что то вроде раздражения или озабоченности. При этом — «губки бантиком» — баловство.
7я картинка — это должно быть сомнение или что то ещё из того спектра эмоций, которыми не владеет алгоритм (покерфэйс — 0.52, счастье — 0.37 и презрение — 0.09).
8 — это должно быть удивление (бровь приподнята, глаза широко раскрыты), но программа не поняла этих мимических сигналов — (нейтраль 0.93).
9 — после серии неудача, алгоритм берет реванш на последней картинке. Программа посчитала, что это ярость (0.52) + печаль (0.21). Соглашаюсь.
Итоги
Ну что ж… молодцы! Но, надо ещё много работать.
Алгоритм, скорее всего, пользуется какими то «геометрическими» построениями, основываясь на характерной мимике. Обнаружение лиц и их эмоций получается только в ан-фас (в профиль не находит даже лица).
8 эмоций, как мы увидели — маловато для полноценного спектра. Но это только начало. Вполне возможно, что экспериментаторы пробовали и больший спектр эмоций, но алгоритм начинал давать слишком размытые результаты.
Никто не мешает и вам попробовать поиграть с распознавателем. 😉
Данная запись опубликована в 16.11.2015 19:37 и размещена в На первой полосе. Вы можете перейти в конец страницы и оставить ваш комментарий.
Мало букафф? Читайте есчо !
Совместная атака с разных планет в Ogame
В далекой, далекой галактике ogame. всё без особых изменений. Бессмысленная кровопролитная война продолжается. Не удавалось разобраться как же организовать .
Предлоги в русском языке, sql база всех предлогов
Список предлогов извлечен из базы морфологии русского языка. Предлоги, как оказалось, обладают кое-какой морфологией, некоторые из них склоняются по падежам. Я не смог четко сформулировать как происходит склонение, потому не стал создавать «нормализованную» .
Источник