Архитектура Сервиса#
Схема архитектуры решения LUNA PASS (Рисунок 1).

Архитектура включает в себя следующие компоненты (Таблица 1):
Таблица 1. Компоненты архитектуры решения LUNA PASS
Название компонента |
Описание взаимодействия |
---|---|
LUNA PASS UI |
Фронтальный компонент LUNA PASS, отвечающий за захват видеопотока, отправку кадров видеопотока в LUNA PASS API и отображение результатов обработки. Вместо LUNA PASS может использоваться внешняя система со схожими функциями, при условии использования протокола LPProto для соединения с Backend (принцип работы см. в разделе Протокол LPProto). |
Фронтальный детектор (Blazeface) |
Детектор, встроенный в LUNA PASS UI, отвечающий за обнаружение лиц до отправки кадра в LUNA PASS API. Используется для снижения нагрузки на канал между LUNA PASS UI и LUNA PASS API (чтобы не пересылать кадры без лиц). |
LUNA PASS API |
Серверный компонент LUNA PASS, реализующий логику обработки кадра и принятия решений по проверкам изображений и Liveness, в том числе с помощью плагинов, построенный на базе AIOHTTP. |
LUNA PASS VIDEO |
Серверный компонент LUNA PASS, реализующий склейку полученных в рамках сессий LUNA PASS API кадров в видео. |
LUNA SDK | Набор средств разработки компании VisionLabs, включающий библиотеки и нейронные сети для обнаружения лиц, оценки атрибутов и проверки Liveness на полученном изображении. |
|
Плагин AggregateLiveness |
Плагин LUNA PASS API позволяющий рассчитывать агрегированное значение Liveness по нескольким кадрам. |
Плагин Bestshot |
Плагин LUNA PASS API позволяющий выбрать в качестве bestshot кадр с наилучшим качеством и оценкой Liveness. |
Плагин Luna3DescriptorQualityCheck |
Плагин LUNA PASS API, и позволяющий отправлять запрос к LUNA PLATFORM 3 на извлечение дескриптора и проверку его качества. Плагин позволяет до отправки кадра на сохранение в LUNA PLATFORM 3 проверить качество дескриптора и отфильтровать его, в случае низкого качества. ВАЖНО: плагин работает только с LUNA PLATFORM версии 3.х. |
NGINX |
Опциональный компонент. HTTP-сервер и обратный прокси-сервер для балансировки нагрузки. ВАЖНО: не входит в состав поставки, необходимо устанавливать и настраивать отдельно (см. Приложение 1). |
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 |
Стартовый запрос на установление соединения с Backend. Без установленного соединения работа невозможна. Допустимые заголовки:
Возможные ответы:
|
CONNECT version: 1.0 heartbeat:1000 |
CONNECTED |
Ответ от Backend об успешном соединение с Frontend по WebSocket. Допустимые заголовки:
|
CONNECTED session-id:623e1bbc-24f9-4d84-907f-8000978ec2a1 version: 1.0 |
FRAME |
Запрос от Frontend, содержащий информацию об изображении (кадр видеопотока в формате, указанном в заголовке content-type). Допустимые заголовки:
Возможные ответы: STATS – изображение/лицо не прошло проверку; SUCCESS – проверка прошла успешно; ERROR – ошибка в рамках запроса на проверку кадра. Ограничение на Frontend: следующая отправка FRAME невозможна до получения ответа, это необходимо для синхронизации отправки данных (в т.ч. при использовании нескольких инстансов Frontend) и минимизации ошибок.| |
FRAME content-type:image/x-jpeg-base64 /9j/4AAQSkZJRgABAQABAA… |
STATS |
Ответ Backend после неуспешной оценки изображения,
содержащий коды выявленных ошибок .
(список ошибок см. в Если лицо было найдено на изображении, то . возвращается информация о BBox Допустимые заголовки:
|
STATS content-type:application/json {isOk: false, errors: [12], details: {,…}} details: {,…} details: {,…} BBox, при наличии. errors: [12] isOk: false |
SUCCESS |
Ответ Backend после успешной проверки изображения, выбора лучшего кадра и оценки лица. Допустимые заголовки:
После получения этого кадра 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 использует кодировку Base64.
JWT состоит из 3-х частей, разделенными точками header.payload.signature:
1․ Название: Header
Описание: Информация о типе JWT.
Пример декодированного Base64:
При работе LUNA PASS всегда используются следующие атрибуты: {"typ":"JWT","alg":"HS256"}
2․ Название: Payload
Описание: Тело сообщения, содержащее информацию по распознанным атрибутам.
Детальное описание см. в /jslib/docs/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: -