Основные положения#
Дополнительный модуль индексирования LUNA Index Module:
- отправляет запросы на индексацию списка с БШ;
- выполняет построение индекса;
- загружает индекс в память и выполняет сравнение.
LIM содержит следующие сервисы:
- Index Manager — управляет задачами на построение индекса и координирует сервис Indexer;
- Indexer — строит индексы на основе списка БШ;
- Indexed Matcher — выполняет аппроксимированное сравнение ближайших соседей (БШ) с помощью индекса.
См. подробную информацию про задачу поиска ближайшего соседа в Wiki.
Для работы с модулем требуется сервис Python Matcher Proxy с встроенным плагином сравнения, позволяющим определять к какому сервису будут направляться запросы из сервиса LUNA API — к сервису Python Matcher или к сервису Indexed Matcher. Также для работы сервисов Index Manager и Indexed Matcher требуется наличие БД Redis.
Все сервисы LIM масштабируются, что означает возможность использования нескольких экземпляров.
При необходимости можно сменить формат логирования всех сервисов на json
(см. настройку FORMAT
для каждого сервиса).
Индекс#
Индекс — коллекция предоставленного пользователем набора БШ, развернутых вместе для выполнения аппроксимированного сравнения. Он строится как граф зависимостей, вершинами которого являются БШ. Поиск зависимостей (биометрических шаблонов) в этом графе выполняется при перемещении по его вершинам (см. раздел "Процесс сравнения" ниже).
Построение индекса требует много ресурсов в течение длительного времени и является достаточно медленным процессом, поэтому нужно грамотно выставлять настройку периода автоматического перестроения индекса при появлении изменений кл списке (см. ниже).
Размер списка c БШ определяет соотношение скорости и точности при построении индекса и поиске. Более высокие значения приводят к более точному, но более медленному поиску. Для настройки этих параметров следует использовать настройки "ef_construction" и "ef_search".
Связь индекса с версией биометрического шаблона#
LUNA Index Module учитывает изменение версии биометрических шаблонов лиц. Сервис Indexer выполняет построение индекса из биометрических шаблонов версии, указанной в настройке "DEFAULT_FACE_DESCRIPTOR_VERSION" сервиса Index Manager. Сервис Index Manager автоматически перестраивает индекс, если в нем не содержится информация о версиях биометрических шаблонов. Сервис Indexed Matcher загружает только те индексы, которые содержат биометрические шаблоны версии, указанной в настройке "DEFAULT_FACE_DESCRIPTOR_VERSION" сервиса Index Manager.
Структура индекса#
Индекс состоит из следующих файлов:
- файла meta.json, который содержит метаинформацию об индексе, в том числе о версии биометрического шаблона и о том, какие объекты индексируются;
- файла index.dat, который содержит двоичные данные индекса;
- файла ids.dat, который содержит упорядоченный список идентификаторов объектов в индексе.
Каждый индекс имеет уникальное имя, которое используется в качестве имени ключа/папки.
Стандартная директория для сохранения индекса указывается для каждого сервиса LIM в настройке "index_storage_local" секции "OTHER" сервиса Configurator. Обратите внимание, что для всех трех сервисов директория должна быть одинаковой.
Процесс создания задачи на построение индекса#
Индексация набора БШ осуществляется посредством постановки задач на индексирование в очередь. Такие задачи создаются в сервисе Index Manager. Существует два типа задач построения индекса — разовый и фоновый.
Разовый тип позволяет единоразово создать задачу на построение индекса с помощью HTTP-запроса "create task" к сервису Index Manager. В теле запроса необходимо указать требуемый "list_id".
Фоновый тип позволяет создавать задачи на построение индекса в фоновом режиме, где:
- набор списков явно задается в настройке "indexing_lists";
- динамически индексируются все существующие в LP списки, у которых количество лиц превышает количество, заданное в настройке "min_indexing_list_size". При этом значение настройки "indexing_lists" должно принимать значение "dynamic". Значение по умолчанию — 50000 лиц.
При использовании фонового типа, сервис Index Manager отслеживает изменение количества лиц в списках, взаимодействуя с сервисом Faces. Если количество лиц изменилось, то во внутреннюю очередь будет отправлена новая задача.
Одна задача обрабатывает только один список.
Для отключения построения задач в фоновом режиме необходимо установить значение настройки "indexing_lists" равным [ ]
.
Процесс создания индекса#
Ниже описан процесс создания индекса:
-
Для начала индексации сервис Index Manager отправляет запрос сервису Indexer с необходимыми параметрами — "list_id" и "task_id". Сервис Indexer преобразует данные параметры в "label" (далее — метка для сравнения) и "index_id" соответственно.
-
При получении запроса на индексацию сервис Indexer запускает отдельный процесс для индексации. На данном этапе Indexer устанавливает свой статус на "indexing".
-
Когда процесс индексации запущен, сервис Indexer извлекает БШ из сервиса Faces. Выборка выполняется партиями по 1000 элементов.
-
После того, как все БШ были извлечены и загружены в память, сервис Indexer начинает построение индекса. Строится ориентированный граф зависимостей БШ (см. раздел "Индекс").
-
Затем, когда индексация завершена, сам индекс сохраняется в хранилище (файловую систему). В хранилище индекс представляет собой каталог, содержащий некоторые файлы (см. раздел "Структура индекса").
-
После успешного сохранения индекса процесс индексации останавливается. На данном этапе Indexer устанавливает свой статус на "success". Если же процесс индексации закончился ошибкой, то Indexer установит свой статус на "error".
Информацию о сохраненных индексах можно получить с помощью запросов "get indexes" или "get most relevant indexes" к сервису Index Manager.
Посмотреть статус сервиса Indexer можно с помощью запроса "get tasks" к сервису Index Manager.
Через некоторое время после сохранения индексов все запущенные экземпляры Indexed Matcher автоматически (повторно) загружают эти индексы в память. После загрузки индексов в память можно отправлять запросы на сравнение индексированных наборов БШ с указанной меткой для сравнения.
Удаление индексов#
Индексы можно удалить несколькими способами:
- по идентификатору "index_id" в запросе "remove index"
- по политике (все или только те, для которых есть более новые индексы) в запросе "remove indexes"
Сравнение#
Сервис Indexed Matcher загружает более релевантные индексы из хранилища и обрабатывает запросы на сравнение. Поскольку хранилище индексов может содержать несколько версий индексов с определенной меткой для сравнения, сервис Indexed Matcher всегда стремится выполнить сравнение с более новой (т.е. более релевантной) версией.
Индекс устаревает, как только в LUNA PLATFORM 5 создаются или удаляются БШ.
Для синхронизации индексов в памяти сервиса Indexed Matcher с хранилищем индексов предназначен переодический фоновый процесс, называемый перезагрузкой индекса (см. подробную информацию в разделе "Перезагрузка индекса").
Если в исходный список были внесены какие-то изменения, то сервис Indexed Matcher обновляет соответствующие индексы у себя в памяти, путем постепенного добавления небольшого количества новых биометрических шаблонов в загруженный в память индекс (см. подробную информацию в разделе "Обновление индекса в памяти").
Запросы на сравнение#
Запросы на сравнение поступают из сервиса API в сервис Python Matcher Proxy, который использует плагин сравнения для перенаправления запроса в сервис Indexed Matcher. Сервис Indexed Matcher принимает запросы на сравнение через потоки Redis, выполняет сравнение и отправляет результат сравнения в канал Redis, откуда результат перенаправляется в сервис Python Matcher Proxy, а затем в сервис API.
Для запросов для каждой соответствующей метки для сравнения существует поток с именем метки. Несколько запущенных экземпляров Indexed Matcher с загруженным индексом являются группой потребителей для этого потока.
Процесс сравнения#
Сервис Indexed Matcher перемещается по вершинам графа зависимостей (индекса).
После перехода к первой вершине входящий БШ сравнивается со всеми вершинами, связанными с текущей вершиной. Когда найдена наиболее похожая вершина, выполняется следующее сравнение с вершинами, связанными с ней. После нескольких итераций находится наиболее похожая вершина (т.е. БШ с наибольшим показателем сходства). Количество операций при таком поиске значительно сокращается, что увеличивает производительность поиска в сотни раз.