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

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

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

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

Архитектура включает в себя следующие компоненты (Таблица 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 по нескольким кадрам.

Плагин ActiveLiveness

Плагин LUNA PASS API, позволяющий подтвердить витальность (живучесть, жизненность) человека по нескольким кадрам с помощью взаимодействия с пользователем: моргания, поворота головы влево-вправо по оси Y, наклона головы вверх-вниз по оси X.

Плагин VideoRedis

Плагин LUNA PASS API, позволяющий хранить последовательность кадров (вместе с результатами проверок по ним) для дальнейшей склейки и создания видео в LUNA PASS VIDEO. Для работы плагина требуется Redis

Плагин Bestshot

Плагин LUNA PASS API, позволяющий выбрать в качестве bestshot кадр с наилучшим качеством и оценкой Liveness.

Плагин Luna3DescriptorQualityCheck

Плагин LUNA PASS API, позволяющий отправлять запрос к LUNA PLATFORM 3 на извлечение дескриптора и проверку его качества.

Плагин позволяет до отправки кадра на сохранение в LUNA PLATFORM 3 проверить качество дескриптора и отфильтровать его, в случае низкого качества.

ВАЖНО: плагин работает только с LUNA PLATFORM версии 3.х.

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

Стартовый запрос на установление соединения с Backend.

Без установленного соединения работа невозможна.

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

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

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

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

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

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

CONNECT

version: 1.0

heartbeat:1000

CONNECTED

Ответ от Backend об успешном соединение с Frontend по WebSocket.

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

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

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

CONNECTED

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

version: 1.0

FRAME

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

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

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

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

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

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

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

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

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

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

FRAME

content-type:image/x-jpeg-base64

/9j/4AAQSkZJRgABAQABAA…

STATS

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

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

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

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

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

  • errors – список ошибок после оценки изображения (коды ошибок см. в /jslib/docs/lpErrors.js.html).

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

STATS

content-type:application/json

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

details: {,…}

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

errors: [12]

isOk: false

SUCCESS

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

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

  • 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 использует кодировку 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: -