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

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

Архитектура Сервиса отображена на схеме (Рисунок 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 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)

  1. Оценка и выбор "главного" лица;
  2. Оценка биометрического образца;
  3. Оценка атрибутов лица/головы;
  4. Проверка, была ли сессия раннее помечена как фейковая;
  5. Оценка Liveness, Deepfakeб извлечение дескриптора.

В случае ошибок обработка кадра прекращается.

3

Параллельная работа плагинов FaceMatcher, ActiveLiveness, VirtualCameraChecker.

4

Decision Phase — этап принятия решения о дальнейшем продолжении сессии, если например:

  • исчерпан лимит кадров;
  • получен бестшот и т.д.

5

Ответ вызывающей стороне и создание фоновых задач по постобработке файла (FileLogger, VideoRedis и др.), которые должны завершиться либо до окончания сессии, либо до получения следующего кадра.

При успешном прохождении 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. Формат протокола

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

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

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

Команда

Описание

Пример

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. Секции используют кодировку 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

Описание: Уникальная подпись сообщения.