Перейти к содержанию

Архитектура Сервиса#

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

Общая схема архитектуры LUNA PASS
Рисунок 1. Общая схема архитектуры LUNA PASS

Таблица 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).

Схема сетевого взаимодействия компонентов LUNA PASS
Рисунок 2. Схема сетевого взаимодействия компонентов LUNA PASS

Протокол LPProto#

LPProto – протокол транспортного уровня, разработанный компанией VisionLabs, для ограничения информации, передаваемой с помощью WebSocket. Принцип работы – передача последовательных кадров с сообщениями.

Кадр — фрагмент данных протокола, который должен быть задан строго согласно шаблону. Определение распространяется только на этот раздел, во всем остальном документе кадр – часть видеопотока. В первой строчке каждого кадра указывается его команда в рамках протокола.

Настройки соединения, которые передаются в рамках команды CONNECT:

  • heartbeat:1000
  • session-id:623e1bbc-24f9-4d84-907f-8000978ec2a1

Идентификатор сессии передаётся в заголовке session-id при инициализации соединения.

Формат протокола LPProto#

Схематичное представление формата протокола приведено ниже (Рисунок 3).

Формат протокола
Рисунок 3. Формат протокола

Сообщение состоит из трёх строк:

  • Первая строка – тип сообщения или команда (Таблица 2);
  • Вторая – секция с произвольным количеством заголовков;
  • Третья – тело сообщения, отделённое пустой строкой.

Таблица 2. Поддерживаемые типы сообщений

Команда

Описание

Пример

CONNECT

Стартовый запрос на установление соединения с LUNA PASS API. Без установленного соединения работа невозможна.

Допустимые заголовки:

  • version – версия протокола LPProto.

  • heartbeat – опциональная активация фоновых запросов каждые N мс для поддержания WebSocket открытым (см. команду HEARTBEAT).

Возможные ответы:

  • CONNECTED – успешное подключение;

  • ERROR – ошибка при подключении.

CONNECT

version: 1.0

heartbeat:1000

CONNECTED

Ответ от LUNA PASS API об успешном соединении с LUNA PASS UI по WebSocket.

Допустимые заголовки:

  • session-id – UUID сессии, уникальное значение подключения;

  • version – версия протокола LPProto.

CONNECTED

session-id:623e1bbc-24f9 -4d84-907f-8000978ec2a1

version: 1.0

FRAME

Запрос от LUNA PASS UI, содержащий информацию об изображении: кадр видеопотока в формате, указанном в заголовке content-type.

Допустимые заголовки:

  • content-type – тип передаваемого изображения

  • Отступ в одну строку

  • Тело кадра – изображение в формате base64.

Возможные ответы:

STATS – изображение/лицо не прошло проверку;

SUCCESS – проверка прошла успешно;

ERROR – ошибка в рамках запроса на проверку кадра.

Ограничение на LUNA PASS UI: следующая отправка FRAME невозможна до получения ответа, это необходимо для синхронизации отправки данных, в т.ч. при использовании нескольких инстансов LUNA PASS UI и минимизации ошибок.

FRAME

content-type:image/x-jpeg-ba se64

/9j/4AAQSkZJRgABAQABAA…

STATS

Ответ LUNA PASS API после неуспешной оценки изображения, содержащий коды выявленных ошибок. Список ошибок см. в /docs/jslib/lpErrors.js.html

Если лицо было найдено на изображении, то возвращается информация о BBox

Допустимые заголовки:

  • content-type – тип передаваемого сообщения;

  • details – эстимации кадра, включая BBox положение.

Набор эстимаций зависит от реализации сервера, в рамках протокола ограничений нет.

  • errors – список ошибок после оценки изображения

  • isOk – булевое значение, которое указывает, был ли запрос FRAME успешно выполнен.

STATS

content-type:application/json

{isOk: false, errors: [12], details: {,…}}

details: {,…}

details: {,…} BBox, при наличии.

errors: [12]

isOk: false

SUCCESS

Ответ LUNA PASS API после успешной проверки изображения, выбора лучшего кадра и оценки лица.

Допустимые заголовки:

  • content-type – тип передаваемого сообщения;

  • Отступ в одну строку.

  • Тело кадра – информация об оценки изображения в формате JWT (состав см. в разделе JWT-пакет).

После получения кадра WebSocket-соединение закрывается. Для дальнейшей работы необходимо повторное подключение.

SUCCESS

content-type:application/jwt

eyJ0eXAiOiJKV…

ERROR

Ответ Backend при появлении внутренней ошибки:

  • Некорректная установка;

  • Обрыв связи;

  • Некорректная лицензия;

  • Прочие системные ошибки.

Допустимые заголовки:

  • error – код ошибки.

В данной версии существуют следующие системные ошибки:

  • 1002 - внутренняя ошибка сервера

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.