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

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

Схема архитектуры решения 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 по нескольким кадрам.

Плагин 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).

Схема сетевого взаимодействия компонентов 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: -