Архитектура Сервиса#
Архитектура Сервиса отображена на схеме (Рисунок 1), описание компонентов архитектуры представлено ниже (Таблица 1).

Таблица 1. Компоненты архитектуры LUNA PASS
Название компонента |
Описание взаимодействия |
---|---|
LUNA PASS UI |
Клиентская часть LUNA PASS, отвечающая за захват видеопотока, отправку кадров видеопотока в LUNA PASS API и отображение результатов обработки. Вместо LUNA PASS UI может использоваться внешняя система со схожими функциями, при условии использования протокола LPProto для соединения с Backend (принцип работы см. в разделе "Протокол LPProto"). |
LUNA PASS API |
Серверный компонент LUNA PASS, построенный на базе AIOHTTP. Обрабатывает кадры, проверяет изображения и Liveness с помощью плагинов. По результатам проверки принимает решения о прохождении изображением проверок. |
LUNA SDK |
Набор средств разработки компании VisionLabs, включающий библиотеки и нейронные сети для обнаружения, оценки атрибутов и проверки Liveness на полученном изображении лица. |
Плагин FaceMatcher |
Плагин LUNA PASS API, позволяет обрывать сессию, если на двух кадрах в рамках одной сессии обнаружены несколько основных лиц. |
Плагин VirtualCameraChecker |
Плагин LUNA PASS API, обнаруживает использование виртуальной камеры вместо реальной камеры устройства. |
Плагин ActiveLiveness |
Плагин LUNA PASS API, подтверждает витальность человека по нескольким кадрам, на которых пользователь взаимодействует с Сервисом — моргает, поворачивает голову влево-вправо по оси Y, наклоняет голову вверх-вниз по оси X. |
Плагин VideoRedis |
Плагин LUNA PASS API, хранит последовательность кадров и результаты проверок по ним для дальнейшей склейки и создания видео в LUNA PASS VIDEO. Для работы плагина требуется Redis |
LUNA PASS VIDEO |
Серверный компонент LUNA PASS, реализует склейку полученных в рамках сессий LUNA PASS API кадров для создания видеофайла. |
NGINX |
Опциональный компонент. HTTP-сервер и обратный прокси-сервер для балансировки нагрузки. Не входит в состав поставки, необходимо устанавливать и настраивать отдельно (см. Приложение). |
LPProto |
Протокол передачи информации транспортного уровня, который определяет структуру передаваемых кадров с помощью WebSocket. Кадр – фрагмент данных протокола. Список кадров см. в разделе "Протокол LPProto". |
При успешном прохождении Liveness LUNA PASS API формирует JWT-пакет с лучшим кадром. Схема сетевого взаимодействия приведена ниже (Рисунок 2).

Протокол LPProto#
LPProto – протокол транспортного уровня, разработанный компанией VisionLabs, для ограничения информации, передаваемой с помощью WebSocket. Принцип работы – передача последовательных кадров с сообщениями.
Кадр — фрагмент данных протокола, который должен быть задан строго согласно шаблону. Определение распространяется только на этот раздел, во всем остальном документе кадр – часть видеопотока. В первой строчке каждого кадра указывается его команда в рамках протокола.
Настройки соединения, которые передаются в рамках команды CONNECT:
- heartbeat:1000
- session-id:623e1bbc-24f9-4d84-907f-8000978ec2a1
Идентификатор сессии передаётся в заголовке session-id при инициализации соединения.
Формат протокола LPProto#
Схематичное представление формата протокола приведено ниже (Рисунок 3).

Сообщение состоит из трёх строк:
- Первая строка – тип сообщения или команда (Таблица 2);
- Вторая – секция с произвольным количеством заголовков;
- Третья – тело сообщения, отделённое пустой строкой.
Таблица 2. Поддерживаемые типы сообщений
Команда |
Описание |
Пример |
---|---|---|
CONNECT |
Стартовый запрос на установление соединения с LUNA PASS API. Без установленного соединения работа невозможна. Допустимые заголовки:
Возможные ответы:
|
CONNECT version: 1.0 heartbeat:1000 |
CONNECTED |
Ответ от LUNA PASS API об успешном соединении с LUNA PASS UI по WebSocket. Допустимые заголовки:
|
CONNECTED session-id:623e1bbc-24f9 -4d84-907f-8000978ec2a1 version: 1.0 |
FRAME |
Запрос от LUNA PASS UI, содержащий информацию об изображении: кадр видеопотока в формате, указанном в заголовке content-type. Допустимые заголовки:
Возможные ответы: STATS – изображение/лицо не прошло проверку; SUCCESS – проверка прошла успешно; ERROR – ошибка в рамках запроса на проверку кадра. Ограничение на LUNA PASS UI: следующая отправка FRAME невозможна до получения ответа, это необходимо для синхронизации отправки данных, в т.ч. при использовании нескольких инстансов LUNA PASS UI и минимизации ошибок. |
FRAME content-type:image/x-jpeg-ba se64 /9j/4AAQSkZJRgABAQABAA… |
STATS |
Ответ LUNA PASS API после неуспешной оценки изображения,
содержащий коды выявленных ошибок. Список ошибок см.
в Если лицо было найдено на изображении, то возвращается информация о BBox Допустимые заголовки:
Набор эстимаций зависит от реализации сервера, в рамках протокола ограничений нет.
|
STATS content-type:application/json {isOk: false, errors: [12], details: {,…}} details: {,…} details: {,…} BBox, при наличии. errors: [12] isOk: false |
SUCCESS |
Ответ LUNA PASS API после успешной проверки изображения, выбора лучшего кадра и оценки лица. Допустимые заголовки:
После получения кадра WebSocket-соединение закрывается. Для дальнейшей работы необходимо повторное подключение. |
SUCCESS content-type:application/jwt eyJ0eXAiOiJKV… |
ERROR |
Ответ Backend при появлении внутренней ошибки:
Допустимые заголовки:
В данной версии существуют следующие системные ошибки:
|
ERROR error: 1002 |
HEARTBEAT |
Опциональный повторяющийся фоновый запрос от Backend на поддержание WebSocket открытым. Способ включения см. в CONNECT. Каждые N мс отправляет пустой кадр. |
HEARTBEAT |
JWT-пакет#
JSON Web Token (JWT) – JSON объект, позволяющий передавать подписанную текстовую информацию.
JWT состоит из 3-х частей, разделенными точками — header.payload.signature. Секции header и payload используют кодировку Base64:
1․ Название: Header
Описание: Информация о типе JWT.
Пример декодированного Base64:
При работе LUNA PASS используются атрибуты { "alg": "HS256", "typ": "JWT" }
. Атрибут "algorithm" настраивается в lunapassapi в параметрах конфигурации JWT.
2․ Название: Payload
Описание: Тело сообщения, содержащее информацию по распознанным атрибутам.
Детальное описание см. в /docs/jslib/LunaPass.js.html
.
Пример декодированного Base64:
{
"details":
{
"ags":0.9812286496162415,
"quality":
{
"blur":0.9293031692504883,
"isBlurred":false,
"light":0.6043056845664978,
"isHighlighted":false,
"darkness":0.8230781555175781,
"isDark":false,
"illumination":0.18545985221862793,
"isIlluminated":false,
"specularity":0.5418229103088379,
"isSpecular":false
},
"faceFramePosition":
{
"faceRect":
{
"x":229,
"y":138,
"width":207,
"height":281
},
"frameRect":{"x":0,"y":0,"width":640,"height":480},
"margins":[138,204,61,229]},
"headPose":{
"yaw":-3.0735106468200684, "roll":1.396299958229065,"pitch":0.3325376510620117},
"mouth":{"opened":0.29780369997024536, "smile":0.0018320679664611816, "occluded":0.016269110143184662},
"eyeglasses":"GlassesEstimation.NoGlasses",
"liveness":{"score":0.8843579292297363, "qualityScore":1.0}},
"errors":[],
"isOk":true,
"bestshot":"<Face image in Base64>",
"iat":1680679123,
"jti":"a9be95d6-6653-4279-bac1-a2a01618a158"}
3․ Название: Signature
Описание: Уникальная подпись сообщения.
Не кодируется в Base64.