Архитектура Сервиса#
Архитектура Сервиса отображена на схеме (Рисунок 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 Configurator |
Компонент LP5, который хранит конфигурации всех сервисов. |
LUNA Licenses |
LUNA Licenses содержит информацию о доступных лицензируемых возможностях и их ограничениях, предоставляет информацию об условиях лицензии компонентам LUNA PASS: дату окончания лицензии, максимально допустимое количество созданных лиц с биометрическими шаблонами, информацию о доступности Liveness И Deepfake. LUNA Licenses необходим для работы компонентов Сервиса и их взаимодействия с компонентами LP5 |
LUNA Remote SDK |
Набор средств разработки компании VisionLabs, включающий библиотеки и нейронные сети для обнаружения, оценки атрибутов и проверки Liveness на полученном изображении лица. |
LUNA PASS VIDEO |
Серверный компонент LUNA PASS, реализует склейку полученных в рамках сессий LUNA PASS API кадров для создания видеофайлов. |
NGINX |
Опциональный компонент. HTTP-сервер и обратный прокси-сервер для балансировки нагрузки. Не входит в состав поставки, необходимо устанавливать и настраивать отдельно (см. Приложение). |
LPProto |
Протокол передачи информации транспортного уровня, который определяет структуру передаваемых кадров с помощью WebSocket. Кадр – фрагмент данных протокола. Список кадров см. в разделе "Протокол LPProto". |
Обработка первого кадра проходит в пять этапов (Таблица 2).
Таблица 2. Этапы обработки кадра
Этап |
Описание |
---|---|
1 |
PreProcessing — предварительная обработка кадра (реализация протокола lpproto, конвертации и пр.), а также работа плагинов, для которых не нужны кадры |
2 |
Обработка кадра при помощи Remote SDK (2-3)
В случае ошибок обработка кадра прекращается. |
3 |
Параллельная работа плагинов FaceMatcher, ActiveLiveness, VirtualCameraChecker. |
4 |
Decision Phase — этап принятия решения о дальнейшем продолжении сессии, если например:
|
5 |
Ответ вызывающей стороне и создание фоновых задач по постобработке файла (FileLogger, VideoRedis и др.), которые должны завершиться либо до окончания сессии, либо до получения следующего кадра. |
При успешном прохождении Liveness LUNA PASS API формирует JWT-пакет с лучшим кадром. Схема сетевого взаимодействия приведена ниже (Рисунок 2).

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

Сообщение состоит из трёх строк:
- Первая строка – тип сообщения или команда (Таблица 3);
- Вторая – секция с произвольным количеством заголовков;
- Третья – тело сообщения, отделённое пустой строкой.
Таблица 3. Поддерживаемые типы сообщений
Команда |
Описание |
Пример |
---|---|---|
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. Секции используют кодировку Base64:
1․ Название: Header
Описание: Информация о типе JWT.
Пример декодированного Base64:
При работе LUNA PASS используются атрибуты { "alg": "HS256", "typ": "JWT" }
. Атрибут "algorithm" настраивается в lunapassapi в параметрах конфигурации JWT.
2․ Название: Payload
Описание: Тело сообщения, содержащее информацию по распознанным атрибутам.
Детальное описание см. в /docs/jslib/LunaPass.js.html
.
Пример декодированного Base64:
{
"errors": [],
"bestshot": "***",
"estimations": {
"faceCount": 1,
"ags": null,
"imageQuality": {
"blur": 0.9192548394203186,
"isBlurred": false,
"light": 0.7044228315353394,
"isHighlighted": false,
"darkness": 0.7675179243087769,
"isDark": false,
"illumination": 0.2165278196334839,
"isIlluminated": false,
"specularity": 0.5341013669967651,
"isSpecular": false
},
"faceFramePosition": {
"faceRect": {
"x": 135,
"y": 167,
"width": 243,
"height": 336
},
"frameRect": {
"x": 0,
"y": 0,
"width": 480,
"height": 640
},
"margins": [
167,
102,
137,
135
]
},
"headPose": {
"yaw": 6.0508646965026855,
"roll": 0.8311771750450134,
"pitch": 3.0268990993499756
},
"eyes": {
"left": "open",
"right": "open",
"state": "open"
},
"mouth": {
"opened": 0.013608532957732677,
"smile": 0.0012621879577636719,
"occluded": 0.0009340881952084601,
"state": "opened"
},
"eyeglasses": "no_glasses",
"deepfake": {
"score": 0.9797163605690002,
"state": "real"
},
"liveness": {
"score": 0.9812202453613281
}
},
"isOk": true,
"iat": 1747917134,
"jti": "d52158fa-e154-4203-9bc0-b6045b7a1a1f"
}
3․ Название: Signature
Описание: Уникальная подпись сообщения.