С переездом нашей компании в новый просторный офис перед нами возник вопрос организации контролируемого доступа сотрудников и учета посещаемости офиса. Действующая система с магнитным замком и ключом "таблеткой" была ненадежной. Ключи требовалось тиражировать, выдавать каждому сотруднику и осуществлять контроль их распространения, также данная система не решала вопрос учета посещаемости офиса. Назревшая внутренняя задача подтолкнула нас разработать собственную систему, решающую возникшие вопросы и учитывающую последние тренды IT-индустрии.
Разработка технологии для контроля доступа и учета посещаемости офиса Интаро
В последнее время технологии машинного обучения и машинного зрения очень стремительно развиваются. Мы решили следовать тренду и отказаться от каких либо материальных идентификаторов личности. Лицо должно было стать идентификатором.
Первым делом необходимо было реализовать интерфейс взаимодействия программного кода с механизмом открывания двери. В качестве точки взаимодействия была выбрана домофонная трубка, имеющая кнопку открывания двери изнутри. Для решения этой задачи мы выбрали Raspberry Pi.
В нашей компании используется корпоративный портал Битрикс24 для ведения учета сотрудников, хранения актуальной информации о статусе (активный/не активный), а главное, фото. Битрикс24 предоставляет API для получения этой информации, что позволило выбрать его как источник исходных данных.
Прототип системы был написан на python ввиду того, что этот язык уже имел готовые модули, написанные сторонними разработчиками, для распознавания лиц.
Система состояла из двух частей:
На выходе мы получили систему, которая узнает сотрудника, подошедшего к двери и, при разрешенном доступе, открывает дверь, а также записывает фото и время в журнал регистрации посещений. Система способна распознать одновременно несколько лиц в кадре и зарегистрировать всех разом.
Следовательно, требовалось реализовать функционал создания пользователя, который в дальнейшем будет идентифицироваться из записи в журнале о неизвестном лице. А для увеличения скорости работы необходимо, чтобы система обучалась на основе удачных и неудачных распознаваний.
В итоге система была значительно переработана. В качестве основы для построения моделей лиц была выбрана dlib. В отличии от предыдущей версии, в которой данные о моделях известных сотрудников хранились в оперативной памяти, и для обновления данных требовалась перезагрузка сервиса с загрузкой новых данных, в текущей системе все данные хранятся в СУБД PostgreSQL, и любое изменение данных о пользователе применяется моментально.
Таким образом, фоновые задачи изменяют данные о пользователях в режиме реального времени. Система приобрела модульную архитектуру, при проектировании которой мы следовали unix-way философии. Каждый модуль системы выполняет свою задачу, а результат выполнения передает другому модулю. Так у нас сформировалось несколько стандартных модулей, которые могут быть заменены или доработаны согласно потребностям.
Для дополнительных модулей была реализована событийная модель. Модулям, подписанным на какие-либо события, передавались данные, полученные в результате этого события. Например, при удачном распознавании лица модулю открывания двери передавались данные о распознанном пользователе. А сам модуль на основе этих данных решал открывать дверь или нет. Разрабатывая дополнительные модули, можно расширять систему и наполнять ее большим функционалом. Например, можно научить ее здороваться с сотрудником при первом его появлении в офисе за день.
Система способна самообучаться и достраивать модели пользователей на основе распознаваний с камеры. Таким образом, после недели эксплуатации система "привыкла" к нашим сотрудникам и распознавание стало происходить быстро.
Так как теперь в журнале мы регистрируем неизвестные лица, то на основе записи журнала мы можем создать локального пользователя и разрешить ему доступ в офис. Совместно с этим функционалом была реализована возможность указывать системе на ошибки. Если она кого-то не смогла распознать и он попал в журнал как "неизвестный", то в web-интерфейсе мы можем указать системе, кто это на самом деле был. В следующий раз система его распознает верно.
В итоге мы получили расширяемую, модульную систему, способную: