Облако
Наши нейросети способны распознавать далеко не только лица, но и разные предметы, объекты и сцены, в том числе достопримечательности. Сейчас они могут распознавать около 10 тыс. категорий, и машинное зрение иной раз работает лучше человеческого.


Наш интранет
Наш интранет называется sys. Это своего рода социальная сеть (у нас же их мало). В ней сотрудники выкладывают фотографии с разных мероприятий.


Стойки для конференций
Позднее мы сделали стойки для конференций. Я писал софт для iPad, который установлен внутри стойки, но вообще я iOS-разработчик и к компьютерному зрению никакого отношения не имею, просто по-дружески помогаю.

Пропускная система
Естественно, такие возможности по распознаванию лиц захотелось использовать не только для поисков своей физиономии на снимках с корпоративов, но и для чего-то более практичного. Например, для автоматической пропускной системы. Прикладывать пропуск при каждом входе на свой этаж не очень удобно: пропуск часто забываешь, а девушкам летом в лёгкой одежде пропуск даже некуда крепить.
Поэтому мы решили поэкспериментировать. Для этого у нас есть все условия: не нужно ни у кого просить разрешения, очень отзывчивый административный отдел, который со вздохом говорит: «Ладно. Прикрепляйте свои камеры. Только не на дверь. Двери относятся к пожарной безопасности». Мы такие: «Ну ладно. Мы сбоку прикрепим». А ещё у нас терпеливые коллеги, они от нас натерпелись.
Архитектура
На первый взгляд, архитектура пропускной системы видится очень простой: камера снимает, отправляет в Vision, а Vision открывает дверь. Но когда мы начали расписывать с коллегами, как же это на самом деле сделать, то получилась вот такая схема:

Мы поставили в серверной ещё одну Raspberry Pi, которая получает видеопоток в реальном времени и прогоняет его через OpenCV. Зачем нам еще OpenCV? Нам нужно определить, есть ли на картинке лицо. Нейронная сеть, которая определяет человека на фотографии, работает чуть-чуть дольше, и постоянно скармливать ей поток видеоданных слишком затратно. Поэтому мы через OpenCV определяем наличие лица, и если оно появилось, тогда отправляем в Vision. Сервис либо отвечает, что не нашел этого сотрудника, либо отправляет идентификатор сотрудника в базе данных HR. С этим идентификатором сотрудника мы идем в интранет, который завязан со СКУД, и он возвращает нам идентификатор пропуска. Дальше этот идентификатор пропуска мы закидываем в Arduino, которая передаёт его в СКУД. Для системы контроля доступа это равносильно тому, что человек приложил пропуск. То есть мы никак не изменяем СКУД, она по-прежнему журналирует вход и выход сотрудников.
Как мы интегрировали свою систему со СКУД? У нас в офисе применяются устройства Bolid C2000-2.



Wiegand
Это стандартный протокол для СКУД, он поддерживается большинством считывателей. Протокол очень простой: две линии данных, одна линия нулей и одна линия единиц. Как только вы подключаете к земле нулевую линию, считывающее устройство понимает, что передан ноль, тоже самое с единицами. То есть у протокола нет стандартизированных таймингов, и номер пропуска легко считывать через прерывание на Arduino, легко представлять в виде последовательности данных. А поскольку для записи нужен какой-то тайминг, я ориентировался на эти значения:

Тестовый стенд

У кастомными продуктов есть одна проблема — все решения узкоспециализированные, они делались бы специально под нас. Во-первых, мы становимся зависимыми от поставщика. Во-вторых, получается уникальная схемотехника с малым тиражом, а значит, стоимость одной штуки будет высокой. В-третьих, достаточно большой срок изготовления, и если какой-то экземпляр выйдет из строя, мы не сможем быстро купить в магазине замену, придётся ждать изготовления следующего тиража, а если сразу делать с запасом, то оставшиеся экземпляры будут пылиться на складе.
После того, как все потенциальные партнёры нас подвели, я пришёл к коллеге из Vision и говорю: «Володя, давай я тебе на 3D-принтере напечатаю корпус, чтобы это красиво выглядело». Он вздохнул и сказал: «Ну давай. Что делать?»
Камера V 1





Камера V 2
Затем сделали такой вариант:



Проблемы с камерами
У нас была мысль растиражировать это решение по всему зданию. Но есть проблема: почти на всех этажах по две двери, и у каждой должно быть две камеры, всего 96 камер только для одной из наших башен, а сейчас идет активное освоение второй. Распечатать столько корпусов можно, но уже кажется сложным. Кроме того, у нас достаточно много компонентов в устройстве, а значит, много точек отказа. Если масштабировать решение на всё здание, мы будем постоянно обслуживать эти камеры. Опять же, сложность быстрой замены, ведь каждая камера — это штучное устройство. И нужно либо распечатать их много, с запасом, либо, если что-то случилось, то сразу бежать, печатать и собирать новую. Мы поняли, что DIY-решения — это классно, но нужно что-то более удобное в тиражировании. И возникла идея перенести всё на iPad.
Айпад
У iPad есть несколько преимуществ. Во-первых, экран. Коллеги жаловались на отсутствие обратной связи, они подходят и не понимают, началось распознавание или нет, ждать им или не ждать.
Во-вторых, в iOS есть встроенная функция распознавания лица. Функцию, которую выполняла OpenCV, мы передали iPad. На экране отображается рамка, и человек должен подойти на такое расстояние, чтобы лицо помещалось в эту рамку. После этого система начинает автоматически его распознавать, ничего нажимать не надо.
В-третьих, iPad — это массовый продукт. Если он вышел из строя, мы ставим другой. Хотя сам планшет стоит около 20 тыс. рублей, то это всё равно дешевле кастомных камер, которые нам предлагали партнеры. К тому же быстрее и надёжнее.
Новая архитектура

Естественно, подтянулись дизайнеры, которые нарисовали нам красивый интерфейс. Вот так это выглядит сейчас на одном из этажей нашего офиса:

Работа с Vision
Несмотря на то, что MCS — это бизнес-продукт, его могут использовать и любители. Сервис предлагает каждому 5 тыс. бесплатных транзакций в месяц, то есть 166 в день. Поэтому вы можете применять для своих домашних нужд, если укладываетесь в лимит, конечно же. Как это можно сделать?
python examples/python/smarty.py -u "https://smarty.mail.ru/api/v1/persons/recognize ?oauth_provider=mcs&oauth_token=e50b000614a371ce 99c01a80a4558d8ed93b313737363830" -p friends1.jpg --meta '{"space":"1", "create_new":true}' -v
Возьмём фотографию и отправим в Vision вместе с нашим токеном доступа. Укажем, что работаем с первым спейсом, и зададим
create_new
— тогда под каждое незнакомое лицо система будет создавать новый идентификатор. Вот что получаем в ответ:{ "status":200, "body":{ "objects": [ { "status":0, "name":"file_0", "persons":[ {"tag":"person1","coord":[102,30,184,134],"confidence":0.99999,"awesomeness":0.5025}, {"tag":"person2","coord":[393,74,461,166],"confidence":0.99987,"awesomeness":0.548}, {"tag":"person3","coord":[458,48,535,149],"confidence":0.99976,"awesomeness":0.4766}, {"tag":"person4","coord":[273,45,352,147],"confidence":0.99963,"awesomeness":0.504}, {"tag":"person5","coord":[525,81,600,184],"confidence":0.99954,"awesomeness":0.4849}, {"tag":"person6","coord":[194,76,258,167],"confidence":0.9984,"awesomeness":0.5725} ] } ], "aliases_changed":false }, "htmlencoded":false, "last_modified":0 }
Я немного отформатировал JSON. В ответе содержится идентификатор человека, координаты лица на фотографии и два параметра: насколько хорошо распознано лицо и насколько этот человек соответствует эталону. Можете на своём языке программирования отправить POST-запрос с картинкой, получить JSON и распарсить ответ.
Если у вас большая проходимость, а нужно определять всего десяток человек, вы можете задать их вручную. Тогда система будет на знакомых людей выдавать их идентификаторы, а на незнакомых — undefined. Людей можно и выборочно удалять, например, если сотрудник уволился.
Идеи
В каких проектах вы можете использовать распознавание лиц? Если захотите реализовать пропускную систему, придётся озаботиться антиспуфингом. Например, добавив инфракрасную камеру, чтобы определять, фотография это или живой человек. Или поставив две камеры для определения глубины объекта, это можно сделать с помощью OpenCV.
Можно организовать распознавание людей в подъезде. Если это ваши соседи, то всё в порядке, а если кто-то посторонний, то можно отсылать себе оповещение. У нас в доме есть такая проблема, периодически приходят посторонние и оставляют после себя много мусора на лестничной площадке.
Если вы сделаете «умное зеркало», то можно оснастить его и распознаванием членов семьи, чтобы каждому показывать то, что ему интересно. Скажем, мне зеркало покажет график встреч на сегодня, а с дочерью весело поздоровается и предложит почистить зубы, причём не быстро, как обычно, а две минуты.
Ещё идея — распознавание автомобильного номера автоматическими воротами на даче. Чтобы не выходить или не нажимать брелок, можете поставить камеру, которая снимет ваш номер, и ворота откроются автоматически.