2.1.4 Ограничения проектирования
1. Операционные системы: Windows NT, Ubuntu 18.04;
2. Языки: Python (3.6), JavaScript (ES6);
3. Реляционные базы данных;
2.2 Взаимодействие с системой
Пользователь имеет возможность работать с системой с помощью любых доступных ему средств. Рассмотрим на двух примерах, где возможно использование данной системы:
1) Осуществление проверки личности перед тем, как пройти через турникет. Обычных пропусков может быть недостаточно, поскольку не всегда это оказывается именно этот человек, который является владельцем пропуска. Данную проблему предположительно можно решить, осуществив дополнительную проверку личности по лицу при использовании пропуска. Для этого камера должна отослать запрос на распознавание соответствующей системе.
2) Запрос на дополнительную проверку при смене пароля на каком-либо онлайн ресурсе. Чтобы окончательно убедиться в подлинности пользователя, запрашивается его фотография лица, которую достать злоумышленнику, зная лишь логин и пароль пользователя, очень проблематично.
2.3 Архитектура
Проанализировав вышеуказанные требования и подходы к проектированию веб-приложения, была спроектирована и реализована следующая архитектура (Рис. 7), которая состоит из 6 компонентов:
Рисунок 7. Архитектура системы
1. База данных;
2. Веб сервис;
3. Worker pool;
4. Брокер сообщений;
5. Контрольная панель;
6. Балансировщик нагрузки.
В анализе архитектур веб-приложения (Гл. 1 п. 1.6) очередь задач находилась на отдельном сервере. В данном случае было принято решение иметь очередь задач и worker процессы на каждом сервере, поскольку веб сервис не требует больших вычислительных ресурсов. Что касается серверов кэширования, то в них нет необходимости, поскольку сервисам не требуется отслеживать сессии пользователей.
2.4 Используемые языки программирования
Таблица 1. Языки программирования
|
Язык |
Описание |
|
|
Python |
Высокоуровневый язык программирования общего назначения, ориентированный на повышение производительности разработчика и читаемости кода. |
|
|
Javascript |
Мультипарадигменный язык программирования. |
Python в настоящее время является весьма популярным языком анализа данных. Кроме того, для данного языка доступно огромное количество полезных инструментов, облегчающих процесс разработки. Выбрав его как главный инструмент веб-разработки, разработчику предоставляется возможность простой интеграции с алгоритмами машинного обучения.
2.5 Используемые библиотеки
2.5.1 Python
Таблица 2. Инструменты для Python
|
Библиотека |
Описание |
|
|
flask |
Простой, гибкий фреймворк для создания веб приложений |
|
|
flask_jwt_extended |
Поддержка jwt для flask |
|
|
flask_socketio |
Поддержка websockets для flask |
|
|
psutil |
Сбор системной информации. Например, количество ядер процессора. |
|
|
PIL |
Обработка изображений |
|
|
dlib |
Нейронные сети и детекторы лиц, написанные на с++ с доступным интерфейсом на питоне |
|
|
psycopg2 |
Адаптер для базы данных PostgreSQL |
|
|
mysqlclient |
Адаптер для базы данных MySQL |
|
|
numpy |
Эффективная работа с объектами линейной алгебры |
|
|
base64 |
Кодирование и декодирование изображений |
|
|
redis |
Адаптер для Redis базы данных |
|
|
keras |
Библиотека для программирования нейронных сетей |
|
|
asyncio |
Асинхронное программирование. Используются для отправки асинхронных запросов на сервер для тестирования. |
|
|
aiohttp |
Асинхронные http запросы |
|
|
pytest |
Тестирование |
|
|
celery |
Асинхронная очередь задач |
Главными инструментами являются Flask, Celery. Flask идеально подходит для небольших сервисов, которые требуют базовую функциональность с небольшими дополнениями, в то время как Django нацелен на решения более сложных задач и проблем. Flask работает на WSGI сервере, для которого существует множество доступных решений вроде UWSGI, Gunicorn и другие. Celery был выбран поскольку данный фреймворк предоставляет надежное взаимодействие с кластерами рабочих процессов, а также качественную обработку ошибок, возможность использования приоритетов и многих других полезных инструментов.
2.5.2 JavaScript
Таблица 3. Инструменты для JavaScript
|
Библиотека |
Описание |
|
|
React |
Библиотека для разработки пользовательских интерфейсов в компонентном стиле |
|
|
socket.io-client |
Поддержка websockets на стороне браузера |
|
|
react-dropzone |
Графический элемент, позволяющий “скидывать” файлы в окно компонента |
|
|
react-chartjs-2 |
Библиотека, позволяющая по данным строить большое количество графиков |
|
|
material-ui |
Material компоненты для react |
React нацелен больше на разработку интерфейсов, в отличие от Angular, который предоставляет инструменты не только для разработки UI. Помимо этого, Angular по умолчанию использует TypeScript вместо JavaScript. React оставил реализацию инструментов и выбор языка самим разработчикам. Именно простота React стала причиной выбора этой библиотеки.
2.6 Базы данных
Таблица 4. Базы данных
|
База данных |
Описание |
|
|
PostgreSQL |
Свободная объектно-реляционная система управления базами данных(СУБД). |
|
|
MySQL |
Свободная реляционная система управления базами данных |
|
|
Redis |
Резидентная система управления базами данных класса NoSQL с открытым исходным кодом, работающая со структурами данных типа «ключ -- значение». Используется как для баз данных, так и для реализации кэшей, брокеров сообщений. |
Существует полноценный сервер очередей, который называется RabbitMQ. Однако, в данной работе использование подобного сервера можно заменить Redis базой данных, поскольку требуется передавать только лишь данные. PostgreSQL и MySQL были выбраны как две базы данных, использующие разные подходы к сохранению многомерных данных.
Выводы по главе
В данной главе были рассмотрены сформированные требования к системе, архитектура, выбранные инструменты и примеры использования системы. В следующей главе будут рассмотрены детали реализации.
Глава 3. Особенности реализации системы
3.1 Базы данных
База данных взаимодействует с worker процессом. При поступлении фотографий лиц на сервер, они кодируются в n-мерный вектор, который в дальнейшем можно использовать для определения степени сходства. Для сравнения векторов используются обычное расстояние между векторами в евклидовом пространстве. Пусть - исходные закодированные лица. Тогда - мера сходства между закодированными лицами.
В системе на текущий момент поддерживаются две базы данных: PostgreSQL и MySQL.
3.1.1 PostgreSQL
PostgreSQL реляционная база данных имеет встроенную поддержку многомерных векторов. В качестве колонок используются тип Cube, который предоставляет встроенные математические операции над векторами. Стоит учитывать, что cube по умолчанию поддерживает лишь 100 значений, поэтому при большом вектора лиц его следует дробить на несколько колонок.
3.1.2 MySQL
В отличие от PostgreSQL, у MySQL нет встроенной поддержки многомерных векторов. Однако не составляет сложности создать столько колонок, сколько составляет размерность вектора лиц.
3.1.3 Оптимизация поиска
При необходимости оптимизации поиска среди векторов в таблицах при большом количестве данных можно использовать сегментирование базы данных (рис. 8, 9).
Рисунок 8. Сегментирование по половому признаку
Рисунок 9. Сегментирование по зданиям
3.2 Веб сервис
Главная задача веб сервиса состоит в том, чтобы отвечать на запросы с данными, поступающие с камер или других источников, и отправлять задания worker процессам через Redis очередь с помощью Celery. Сервис опрашивает очередь о полученном результате с определенным интервалом и отправляет ответ обратно, как только получает результат.
Чтобы обеспечить возможность использовать любые алгоритмы распознавания и детектирования, пользователю предлагается реализовать собственный класс, унаследованный от интерфейса FaceProcessor:
Также доступна возможность использовать свою собственную обработку фотографий, для чего нужно реализовать производный класс от Preprocessing:
От пользователя требуется лишь реализовать алгоритмы детектирования, распознавания и некую предварительную обработку фотографий при необходимости. Написанный модуль будет динамически импортирован в worker процессе. Далее требуется написать следующий конфигурационный файл:
В пунктах model и preprocessing нужно вписать путь по модулям к классу относительно корневого каталога, а также имя созданного класса. В пунктах database, redis требуется ввести необходимые настройки для установления соединения с базами данных. Кроме того, у сервиса есть поддержка jwt токенов, которую можно включить при передаче секретного ключа.
В данной работе использовались алгоритмы из библиотеки dlib. Она включает себя множество алгоритмов компьютерного зрения. В качестве алгоритма распознавания лиц используется ResNet с выходным слоем в 128 чисел, а обнаружение лиц происходит с помощью HOG дескрипторов.
3.3 API
Таблица 5. Точки доступа на сервере
|
Ресурс |
Http методы |
Описание |
|
|
workers/<worker_id> |
DELETE |
удалить worker процесс с идентификатором worker_id |
|
|
workers/create |
POST |
создать worker процесс |
|
|
/image/recognize |
POST |
распознать человека на фотографии |
|
|
/image/store |
POST |
сохранить векторное представление в базу данных |
Таблица 6. Точки доступа Websockets на сервере
|
Событие |
Namespace |
Описание |
|
|
poll_data |
/ |
Запрос на обновление данных о компьютере (занятость процессора в процентах и т.д) |
|
|
poll_workers |
/ |
Запрос на обновление списка текущих worker процессов |
|
|
debug |
/debug |
Включить/Отключить режим отладки |
Таблица 7. Точки доступа Websockets на клиенте
|
Событие |
Namespace |
Описание |
|
|
Data |
/ |
Получение информации о запросах |
|
|
workers |
/ |
Получение активных рабочих процессов |
|
|
recognition |
/debug |
Получение обработанных фотографий |
3.4 Worker pool
Поскольку методы распознавания и обнаружения лиц являются достаточно длительным по времени, то необходимо запускать их в отдельных процессах, чтобы обеспечивать своевременную обработку запросов на стороне серверов. Worker pool управляется с помощью библиотеки Celery. Сервисы имеют возможность создать или удалить такие процессы при необходимости. Рабочие процессы опрашивают очередь задач, зарегистрированную в Celery как брокер сообщений, на наличие каких-либо доступных работ и выполняет их, попутно обращаясь к базе данных при необходимости.
Рисунок 10. Процесс обработки фотографии
3.5 Контрольная панель
Была реализована контрольная панель, позволяющая взаимодействовать c серверами. На данный момент контрольная панель позволяет делать следующее:
1. Контролировать количество worker процессов на стороне сервера. Со стороны панели имеется возможность отослать любому из известных серверов запрос на удаление или создание рабочего процесса с нейронной сетью.
2. Средства для отладки. Каждому сервису можно отправлять фотографии и получать результаты обработки изображения.
Кроме того, для каждого сервера отображается статистика полученных запросов и некоторой информации об оперативной памяти и занятости процессора.
Рисунок 11. Интерфейс панели
При запуске панели предлагается ввести сервера, к которым требуется установить соединение. Панель изначально проверяет можно ли подключиться к серверу путем отправления на него эхо-запроса. После получения ответа панель устанавливает Websocket соединение с сервером, с помощью которого получаются необходимые сведения об характеристиках компьютера и количестве запросов за некоторый промежуток времени. Далее появляется возможность управления пулом рабочих процессов и отладки. При нажатии на Debug вкладку устанавливается еще одно Websocket соединение на прослушку поступивших запросов на распознавание, а также дается возможность отправить свою фотографии через графический веб интерфейс.