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

Мотивация

Наша команда постоянно растет, набирая новых членов. По сути, в фирме стало труднее узнать, кто есть кто. Вот почему мы создали WeJit - наш внутренний «Facebook», разработанный нашей внутренней командой разработчиков, доступный как веб-приложение, так и мобильное приложение. Его главная особенность - база данных профилей сотрудников с возможностью поиска. Вы можете думать об этом как о причудливой базе данных резюме. Каждому профилю назначена фотография, и отдел кадров следит за тем, чтобы эти фотографии были настоящими фотографиями людей, которых мы нанимаем (а не их домашних животных, автомобилей или их любимых Мстителей).

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

Как пользователь WeJit, я хотел бы найти профиль, сфотографировав человека.

История проста: я иду в обеденный зал, вижу кого-то, кого я не знаю, и фотографирую его / ее - и приложение показывает мне его / ее общедоступный профиль WeJit. Может быть, это не самый умный способ завести новых друзей, но определенно стоит принять разумный вызов кодированию.

Что такое распознавание лиц?

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

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

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

Стек технологий

Я искал наиболее подходящее решение, которое я мог бы легко интегрировать с существующим мобильным приложением (которое представляет собой кроссплатформенное приложение React Native). Более того, было бы неплохо иметь такое же решение, применимое и к веб-части в будущем. Это привело к выводу, что облачное решение API будет лучшим первым выбором.

Основываясь на некоторых общедоступных источниках (Quora, Kairos и RapidAPI), я решил следовать предложениям Microsoft, доступным в их облаке Azure, с планами по реализации собственной нейронной сети, оставленной для будущее.

Когнитивные службы Azure

Cognitive Services, часть облачной платформы Microsoft Azure, представляет собой набор служб для добавления алгоритмов машинного обучения к существующим (или новым) продуктам. В нашем случае я сосредоточился на наборе RESTful-сервисов, содержащихся в Face API, который предоставляет следующие функции:

  • Обнаружение - определение местоположения лица и определение его атрибутов, таких как возраст, эмоция, пол, цвет волос или аксессуары на нем,
  • Идентификация - поиск, идентификация и сопоставление изображения лица из определенного хранилища,
  • Проверка - сравнение двух лиц и проверка, принадлежат ли они одному и тому же человеку,
  • Группировка - объединение лиц в группы;
  • Найти похожие - поиск похожих лиц в наборе данных.

Так что, похоже, в нем есть все, что нам нужно! Кроме того, Microsoft предоставляет очень удовлетворительную многоплатформенную документацию с примерами и поддержкой для веб-разработки, iOS и Android.

Говорят, нет розы без шипа. И действительно, мы столкнулись с некоторыми ограничениями. Одно из них - квота на трафик: 20 транзакций в минуту и ​​до 30 000 транзакций в месяц. Эти условия распространяются на первый год использования. К счастью, в нашем случае этого больше, чем нужно!

Первый подход - игра с существующим примером

Первым шагом нашего экспериментального проекта было тестирование демонстрационного приложения, предоставленного Microsoft: Cognitive-Face-iOS.

Я начал со следующей конфигурации:

Набор данных для обучения: Группа из 3 человек: 2 человека с 2 фотографиями, 1 человек с 1 фотографией.

Результаты: люди с 2 фотографиями распознаются правильно, а человек с 1 фотографией - нет!

Чтобы улучшить результаты и получить ожидаемый ответ, я исправил источник ввода, добавив дополнительное изображение Якуба.

Набор данных для обучения: группа из 3 человек, каждый с 2 ​​фотографиями.

Результаты: Все люди распознаны правильно! 🚀

Второй шаг - интеграция с WeJit

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

Для создания набора данных, необходимого для алгоритмов, я использовал инструмент с открытым исходным кодом: howlowck / train-faces, который предлагает приятный веб-интерфейс для взаимодействия с Face API.

Единственное, что сейчас нужно, - это сделать снимок, сделать несколько асинхронных вызовов Face API и получить ответы. С технической точки зрения, необходимо выполнить следующие шаги:

Кажется просто! Посмотрим на результат.

Конечный результат

В коротком ролике ниже показано приложение в действии:

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

Резюме

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

Первоначальная концепция, основанная на облаке, оказалась успешной. Наш следующий шаг - углубиться в детали и поработать над индивидуальным решением без проприетарных облачных API. Мы выступаем за такие популярные библиотеки, как OpenCV (компьютерное зрение) и Tensorflow (нейронные сети). Следите за новостями!