- PVSM.RU - https://www.pvsm.ru -

Путь к бесконтактному детектору лжи, или Как устроить себе хакатон на максималках

image

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

У нашей команды из 5 человек появилась определённая идея, ради которой мы решили слегка захватить мир похакатонить.

Описание MVP

Приложение для HR-менеджеров, позволяющее определять психотип соискателя и паттерны поведения.

Обязательные составляющие:

  1. База данных вопросов, видов реакций и система приведения этих вещей к психотипу
  2. Определение эмоций человека, основанное на проявлениях AU — определенных движениях мышц лица.
  3. Бесконтактное определение пульса
  4. Определение направления взгляда
  5. Определение частоты моргания
  6. Система агрегирования вышеописанных извлекаемых данных в график стресса и другие полезные метаданные.

MVP для нас — это островок безопасности между самой идеей и большим проектом "Anne", к которому мы держим путь.

Как всё было

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

Техническая часть

Определение эмоций решено было делать строго через FACS [1], поскольку данный способ имеет достаточную научную обоснованность по сравнению с, например, таким [2] грубым подходом. Соответственно, задача разбилась на

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

Обучение, к слову, производилось на Radeon RX580 с помощью PlaidML, про который я уже рассказывал в своей предыдущей статье [3]. Большое спасибо здесь нужно сказать библиотеке imgaug [4], которая позволяет применять аффинные преобразования одновременно к изображениям и точкам на нём (в нашем случае, к лэндмаркам).

Немного аугментированных изображений:

image

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

Первые наработки начались еще летом и существовали грязным скриптом на Python'e:

image

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

Определение пульса по видеопотоку основывалось на идее поглощения зеленой составляющей света частицами крови [5] и дополнилось алгоритмами трекинга и извлечения областей интереса (кожного покрова).

Жутковатая маска выходит, конечно:

image

На самом деле, создание вышеописанных кирпичиков свелось к реализации State Of The Art алгоритмов с доработками, позволяющими повысить точность в нашем частном случае. Благо, что существует arxiv.org [6].

Сложности появились при создании логики нормализации изображения лица и алгоритмов оценки полученных данных. Например, при распознавании лиц активно используются Active Appearance Model [7] — лицо по найденным точкам натягивается на общую текстуру лица. Но нам важно взаимное расположение точек! Как вариант — фильтровать слишком повернутые лица, либо же натягивать на текстуру только по "якорям", ключевым точкам, которые не отображают движение мышц(например, точка на переносице и края лица). Данная проблема сейчас является одной основной и не позволяет получать достоверные данные, если лицо слишком повернуто(угол поворота мы тоже умеем считать!). Допустимые рамки на сегодня — +-20° по обеим осям. Иначе, лицо просто не обрабатывается.

Конечно, есть и другие проблемы:

  • Определение лэндмарков, если человек в очках
  • Извлечение базовой линии, если человек кривляется
  • Определение пульса при сильно мерцающем освещении

Ах, да, а что такое "Базовая линия поведения" [8]? Фундаментальное понятие при обработке эмоций методами FACS. Алгоритм извлечения базовой линии, наверное, является одним из важнейших ноу-хау по итогам нашего хакатона.

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

Итог — 30-40% на Intel i5 при 15-20 fps. Понятно, что есть определенный запас, который будет исчезать по мере добавления дополнительных модулей.

В планах определять:

  • Пересыхание в горле
  • Изменение цвета лица
  • Частоту дыхания
  • Интенсивность движений тела
  • Паттерны поз человека
  • Дрожь в голосе

А что мы умеем еще?

Я, как любитель компьютерного зрения и ML, рассказал вам немного про использованные алгоритмы в нашем ПО. Но в силу своей незавершенности, для данного приложения вышеописанные возможности являются, скорее, приятным дополнением. Важнейшая же часть — это разработанная система определения психотипа человека. В чем суть? К сожалению, этим занимались мои коллеги(друзья!) и разъяснить, что и откуда, я не смогу. Но для минимального понимания можно рассмотреть порядок работы с полученным ПО:

HR задает качества, которые особенно необходимы для рассматриваемой вакансии:

image

HR проводит собеседование, задавая часть вопросов подготовленной базы данных (во время собеседования HR имеет перед собой дополнительную информацию о проявляемых эмоциях и уровне стресса)

Во время или после собеседования HR заполняет ответы на вопросы и проявленные паттерны поведения:

image

Через разработанные матрицы ПО строит инфографику, отображающую совпадение заданных и определенных качеств:

image

После собеседования имеется запись, позволяющая в любое время вернуться к собеседованию и оценить тот или иной момент

Итого

image

14 дней x 12 часов + 3 разработчика + 2 специалиста в области определения лжи = готовый MVP. Погружение было максимальным — вплоть до того, что в обеденное время мы смотрели сериал Обмани меня [9] — очень советую.

Чтобы не быть голословным, прикладываю пример [10] того, как работает приложение сейчас:

А также промо-ролик [11] большого решения "Anne", к которому мы шагаем.

image

Автор: pagin

Источник [12]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/programmirovanie/301197

Ссылки в тексте:

[1] FACS: https://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D0%BA%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BB%D0%B8%D1%86%D0%B5%D0%B2%D1%8B%D1%85_%D0%B4%D0%B2%D0%B8%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9

[2] таким: https://arxiv.org/pdf/1805.00326.pdf

[3] статье: https://habr.com/post/420989/

[4] imgaug: https://imgaug.readthedocs.io/en/latest/

[5] поглощения зеленой составляющей света частицами крови: https://arxiv.org/pdf/1710.08369.pdf

[6] arxiv.org: https://arxiv.org

[7] Active Appearance Model: https://habr.com/post/155759/

[8] "Базовая линия поведения": https://arxiv.org/pdf/1612.05038.pdf

[9] Обмани меня: https://www.kinopoisk.ru/film/obmani-menya-2009-428930

[10] пример: https://www.youtube.com/watch?v=9ye3RblDADE

[11] промо-ролик: https://www.youtube.com/watch?v=5RoD8LLa3Co

[12] Источник: https://habr.com/post/432030/?utm_campaign=432030