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

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

Нашей задачей было найти существующую проблему в нашем офисе и решить ее в течение 24 часов. Мы спросили наших коллег, когда и где можно использовать распознавание человека и его взгляда / лица. Среди множества предложений одно выделялось и звучало очень весело: «Многие люди забывают о своих кофейных чашках на пьедестале для кофемашин. Можете ли вы отправить им прямое уведомление? »- Вызов принят!

Определение проблемы

Ситуация, которую должна обрабатывать наша система, была определена следующим образом: если человек готовит кофе, но забывает выпить его в течение 2 минут, он должен быть уведомлен напрямую, чтобы не беспокоить всех. Типичный способ выхода из этой ситуации - громкий крик: «Кто оставил кофе ?!». Чтобы напрямую уведомить владельца кофе, система должна иметь возможность различать людей по их фотографиям. Были особые обстоятельства, когда нужно было пинговать человека: кофе был приготовлен, но чашка не была принята в течение 2 минут; в противном случае никого не следует беспокоить. Дополнительная функция, которую мы включили в требования и посоветовал наш наставник, касается конфиденциальности: система будет делать снимки только тогда, когда это позволяет человек, нажав соответствующую кнопку.

Аппаратное обеспечение

Сердцем нашей системы был Raspberry Pi 4 под управлением ОС Raspbian, подключенной к WiFI (для отправки сообщения через Slack). Кроме того, использовалось небольшое количество периферийных устройств. Для фотосъемки использовалась стандартная веб-камера ПК, подключенная к USB-порту. Есть одна кнопка, один датчик расстояния (ультразвуковой датчик) и одна светодиодная панель. Все было соединено с помощью макета, нескольких кабелей и транзисторов.

Выполнение

Мы решили использовать Python по двум основным причинам:

  • Быстро для прототипирования - (у нас было всего 24 часа)
  • В той области, над которой мы работали, существует множество общедоступных библиотек.

Компоненты

Проект был разбит на логические модули, представленные ниже:

Модуль Camera.py содержит логику для захвата и обработки изображений, включая распознавание лиц. Распознавание лиц достигается за счет использования библиотеки компьютерного зрения OpenCV. Библиотека использует классификатор Haar Cascade, который представляет собой подход, основанный на машинном обучении, при котором каскадная функция обучается на основе большого количества положительных и отрицательных изображений. Затем он используется для обнаружения объектов на других изображениях. OpenCV поставляется с тренером и детектором, а также есть предварительно обученные классификаторы, включая классификатор лиц.

Наш кейс по распознаванию лиц состоит из 3 этапов:

  • Сбор данных - этот этап означает запуск модуля камеры в режиме обучения, который захватывает 30 изображений (конкретного лица) и создает набор данных, назначенный определенному идентификатору.
  • Этап обучения - мы запускаем его автоматически сразу после создания набора данных. На этом этапе фотографии из набора данных используются тренером OpenCV, который генерирует выходной файл trainer.yml.
  • Распознавание лиц - использование распознавателя OpenCV для «предсказания», например. узнайте лицо на новой фотографии. Распознаватель использует данные из trainer.yml.

Второй модуль ввода - button.py, который сигнализирует о нажатии кнопки. Distance.py и coffe_detector.py обрабатывают входные данные ультразвукового датчика, чтобы определить, находится ли чашка в его диапазоне или нет. Когда объект появлялся на пьедестале, был сделан снимок, который использовался для обнаружения знакомого лица.

В нашей системе несколько выходов используются по-разному. Модуль Slack отправляет прямые сообщения распознанному человеку или по каналу #random, если человек неизвестен (лицо отсутствует в базе данных или изображение недостаточно хорошее). Сообщения включают в себя снимки, сделанные камерой, когда чашка ставится на пьедестал. Мы используем Slack API, который требует нескольких стандартных шагов для настройки связи:

  • Создание приложения на странице управления приложениями.
  • Добавление областей действия OAuth (разрешите приложению просматривать информацию о личности пользователя и отправлять прямые сообщения)
  • Использование токена безопасности при вызове api - он создается автоматически при добавлении приложения

Целью модуля lcd.py было взаимодействие с lcd, подключенным к Raspberry (для отображения имени), а nexoboard.py отправляет сообщение внутренней системе мотивации, называемой nexoboard.

Реализация конечного автомата

Заключительной частью приложения была последовательность действий с правильным использованием всех компонентов. Есть два фактора, которые контролируют текущее состояние системы. Первый - это ввод от датчика расстояния, который может иметь два значения 0 или 1 в зависимости от объекта в пределах досягаемости. Второй - время, а точнее, отсутствие чашки, система находится в состоянии ожидания, и если чашка находится на пьедестале k == 1 и прошло 2 минуты, то система переходит в состояние отправки сообщения. Мы использовали доску, чтобы определить состояния и последовательность действий.

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

А вот и точка входа в приложение (некоторые строчки для наглядности убраны):

Запуск тестов

Raspberry PI 4 обладает достаточной мощностью для запуска всех компонентов и очень плавного использования модулей OpenCV. На распознавание человека уходит около секунды, а через несколько секунд после того, как будет доставлено сообщение о задержке, ваш кофе больше никогда не будет холодным!

Если человека нет в базе данных изображений или система не может распознать лицо (например, изображение недостаточно хорошее), она отправляет общее уведомление на канал #random.

Резюме

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

P.S.

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

После некоторых доработок, аппаратной отладки мы заказали новые платы с завода. Пару недель ожидания и вот мы - новенькие платы с завода:

Полезные ссылки:

Первоначально опубликовано на https://www.nexocode.com 7 апреля 2020 г.

Хотите больше от команды Nexocode? Следуйте за нами в Medium, Twitter и LinkedIn. Хотите вместе творить волшебство? Мы нанимаем!