Когда-то Стив Джобс и Стив Возняк закрылись в гараже и выкатили первый Mac. Было бы классно, если всегда можно было закрыть программистов в гараже и получить MVP с большим потенциалом. Однако, если добавить к программистам пару людей, готовых оценивать пользовательский опыт и искать что-то инновационное, то шансы на успех растут.
У нашей команды из 5 человек появилась определённая идея, ради которой мы решили слегка захватить мир похакатонить.
Описание MVP
Приложение для HR-менеджеров, позволяющее определять психотип соискателя и паттерны поведения.
Обязательные составляющие:
- База данных вопросов, видов реакций и система приведения этих вещей к психотипу
- Определение эмоций человека, основанное на проявлениях AU — определенных движениях мышц лица.
- Бесконтактное определение пульса
- Определение направления взгляда
- Определение частоты моргания
- Система агрегирования вышеописанных извлекаемых данных в график стресса и другие полезные метаданные.
MVP для нас — это островок безопасности между самой идеей и большим проектом "Anne", к которому мы держим путь.
Как всё было
Чтобы при разработке не было отвлекающих факторов, было решено снимать квартиру в ближайшем городе-курорте с обеспечением питания. Приехав туда в воскресенье и устроив свои рабочие места, мы сразу сели за обсуждение. В первую же ночь были определены кирпичики, которые однозначно должны быть в итоговом MVP. И пока ребята шлифовали идею, ездили в город за консультациями к HR-менеджерам, разработчики(я в их числе) уже во всю готовили фундамент.
Техническая часть
Определение эмоций решено было делать строго через FACS, поскольку данный способ имеет достаточную научную обоснованность по сравнению с, например, таким грубым подходом. Соответственно, задача разбилась на
- Обучение сети, предсказывающей 68 лэндмарков лица
- Нормализация / фильтрация изображения лица
- Алгоритм, детектирующий лицевые движения в динамике
Обучение, к слову, производилось на Radeon RX580 с помощью PlaidML, про который я уже рассказывал в своей предыдущей статье. Большое спасибо здесь нужно сказать библиотеке imgaug, которая позволяет применять аффинные преобразования одновременно к изображениям и точкам на нём (в нашем случае, к лэндмаркам).
Немного аугментированных изображений:
Для определения направления взгляда изначально использовался алгоритм на классическом компьютерном зрении, ищущий зрачок на области глаза на HOGах. Но вскоре пришло понимание, что зачастую зрачок не видно и направление взгляда может описываться не только им, но и расположением век. В связи с данными сложностями, решение было переведено на нейросетевой подход. Датасет мы нарезали и размечали сами, прогоняя через первый алгоритм, и далее вручную правили места его ошибок.
Первые наработки начались еще летом и существовали грязным скриптом на Python'e:
Определение частоты моргания следовало из агрегации частей двух вышеописанных алгоритмов — сближения лэндмарков век и направления взгляда вниз.
Определение пульса по видеопотоку основывалось на идее поглощения зеленой составляющей света частицами крови и дополнилось алгоритмами трекинга и извлечения областей интереса (кожного покрова).
Жутковатая маска выходит, конечно:
На самом деле, создание вышеописанных кирпичиков свелось к реализации State Of The Art алгоритмов с доработками, позволяющими повысить точность в нашем частном случае. Благо, что существует arxiv.org.
Сложности появились при создании логики нормализации изображения лица и алгоритмов оценки полученных данных. Например, при распознавании лиц активно используются Active Appearance Model — лицо по найденным точкам натягивается на общую текстуру лица. Но нам важно взаимное расположение точек! Как вариант — фильтровать слишком повернутые лица, либо же натягивать на текстуру только по "якорям", ключевым точкам, которые не отображают движение мышц(например, точка на переносице и края лица). Данная проблема сейчас является одной основной и не позволяет получать достоверные данные, если лицо слишком повернуто(угол поворота мы тоже умеем считать!). Допустимые рамки на сегодня — +-20° по обеим осям. Иначе, лицо просто не обрабатывается.
Конечно, есть и другие проблемы:
- Определение лэндмарков, если человек в очках
- Извлечение базовой линии, если человек кривляется
- Определение пульса при сильно мерцающем освещении
Ах, да, а что такое "Базовая линия поведения"? Фундаментальное понятие при обработке эмоций методами FACS. Алгоритм извлечения базовой линии, наверное, является одним из важнейших ноу-хау по итогам нашего хакатона.
Помимо алгоритмов существует и ещё один важный момент, про который мы не могли забывать — производительность. Причём потолок производительности — это даже не ПК, а обычный ноутбук. Вследствие чего, все алгоритмы максимально облегчались, а сети подверглись итерационному уменьшению в размерах с сохранением приемлемой точности.
Итог — 30-40% на Intel i5 при 15-20 fps. Понятно, что есть определенный запас, который будет исчезать по мере добавления дополнительных модулей.
В планах определять:
- Пересыхание в горле
- Изменение цвета лица
- Частоту дыхания
- Интенсивность движений тела
- Паттерны поз человека
- Дрожь в голосе
А что мы умеем еще?
Я, как любитель компьютерного зрения и ML, рассказал вам немного про использованные алгоритмы в нашем ПО. Но в силу своей незавершенности, для данного приложения вышеописанные возможности являются, скорее, приятным дополнением. Важнейшая же часть — это разработанная система определения психотипа человека. В чем суть? К сожалению, этим занимались мои коллеги(друзья!) и разъяснить, что и откуда, я не смогу. Но для минимального понимания можно рассмотреть порядок работы с полученным ПО:
HR задает качества, которые особенно необходимы для рассматриваемой вакансии:
HR проводит собеседование, задавая часть вопросов подготовленной базы данных (во время собеседования HR имеет перед собой дополнительную информацию о проявляемых эмоциях и уровне стресса)
Во время или после собеседования HR заполняет ответы на вопросы и проявленные паттерны поведения:
Через разработанные матрицы ПО строит инфографику, отображающую совпадение заданных и определенных качеств:
После собеседования имеется запись, позволяющая в любое время вернуться к собеседованию и оценить тот или иной момент
Итого
14 дней x 12 часов + 3 разработчика + 2 специалиста в области определения лжи = готовый MVP. Погружение было максимальным — вплоть до того, что в обеденное время мы смотрели сериал Обмани меня — очень советую.
Чтобы не быть голословным, прикладываю пример того, как работает приложение сейчас:
А также промо-ролик большого решения "Anne", к которому мы шагаем.
Автор: pagin