Перейти к основному содержимому
Версия: 3.25.1 (последняя)

DynamicTemplateIndex

DynamicTemplateIndex используется для создания базы биометрических шаблонов.

Поддерживаемые операции:

  • Добавление и удаление шаблонов по UUID
  • Поиск по базе 1:N

Для выполнения поиска 1:N используется MATCHER_MODULE.

Пример использования DynamicTemplateIndex для поиска по базе:

Спецификация конфигурационного Context

  • async - Создание асинхронной версии DynamicTemplateIndex
  • max_license_count - Максимальное число лицензий
  • capacity - Зарезервированное количество шаблонов
  • model_version - Название метода и версия в формате название_версия
{
"async": "<bool>",
"max_license_count": "<long>",
"capacity": "<long>",
"model_version": "<string>"
}
примечание

Режим async в DynamicTemplateIndex находится в бета режиме

Использование DynamicTemplateIndex

  1. Создать FacerecService
  2. Создать DynamicTemplateIndex(используя загруженные/созданные шаблоны или указав предварительное количество шаблонов и модификацию_версию FACE_TEMPLATE_EXTRACTOR)
  3. Добавить шаблоны (загрузить или создать с помощью FACE_TEMPLATE_EXTRACTOR)
  4. Запустить поиск по DynamicTemplateIndex с помощью MATCHER_MODULE
// 1
pbio::FacerecService::Ptr service = pbio::FacerecService::createService("<dll_path>", "<conf_path>", "<license_path>");

// 2
pbio::Context indexConfig = service->createContext();

indexConfig["capacity"] = 1000;
indexConfig["model_version"] = "1000_1";
indexConfig["async"] = false;
indexConfig["max_license_count"] = 1000;

pbio::DynamicTemplateIndex::Ptr index = service->createDynamicTemplateIndex(indexConfig);

// 3
std::vector<std::string> imagePaths =
{
"<path_to_image>"
};
std::vector<pbio::ProcessingBlock> pipeline;
pbio::Context detectorConfig = service->createContext();
pbio::Context fitterConfig = service->createContext();
pbio::Context faceTemplateExtractorConfig = service->createContext();
pbio::Context matcherModuleConfig = service->createContext();

pipeline.reserve(3);

detectorConfig["unit_type"] = "FACE_DETECTOR";
fitterConfig["unit_type"] = "FACE_FITTER";

faceTemplateExtractorConfig["unit_type"] = "FACE_TEMPLATE_EXTRACTOR";
faceTemplateExtractorConfig["modification"] = "1000";

matcherModuleConfig["unit_type"] = "MATCHER_MODULE";
matcherModuleConfig["modification"] = "1000";

pipeline.push_back(service->createProcessingBlock(detectorConfig));
pipeline.push_back(service->createProcessingBlock(fitterConfig));
pipeline.push_back(service->createProcessingBlock(faceTemplateExtractorConfig));

pbio::ProcessingBlock matcherModule = service->createProcessingBlock(matcherModuleConfig);
std::unordered_map<std::string, pbio::ContextTemplate::Ptr> uuidToTemplate;

for (const std::string& imagePath : imagePaths)
{
std::string imageData;

{
std::ifstream image(imagePath, std::ios::binary);
std::ostringstream stream;

if (!image.is_open())
{
throw std::runtime_error("Can't open file: " + imagePath);
}

stream << image.rdbuf();

imageData = stream.str();
}

pbio::Context data = service->createContextFromEncodedImage(imageData);

for (pbio::ProcessingBlock& block : pipeline)
{
block(data);
}

for (const pbio::Context& object : data["objects"])
{
pbio::ContextTemplate::Ptr contextTemplate = object["face_template"]["template"].getContextTemplate();
std::string uuid = object["face_template"]["uuid"].getString();

index->add(contextTemplate, uuid);

uuidToTemplate.emplace(std::move(uuid), contextTemplate);
}
}

// 4
pbio::Context matcherData = service->createContext();

matcherData["template_index"] = index;

for (const auto& value : uuidToTemplate)
{
matcherData["queries"] = value.second;

matcherModule(matcherData);

std::cout << (matcherData["results"][0]["uuid"].getString() == value.first) << std::endl;
}

Методы DynamicTemplateIndex

// Получение UUID шаблона по индексу в базе
std::string getUUID(size_t index) const;

// Получение шаблона по UUID
pbio::ContextTemplate::Ptr at(const std::string& uuid) const;

// Получение шаблона по индексу в базе
pbio::ContextTemplate::Ptr at(int64_t index) const;

// Добавление шаблона в базу
void add(pbio::Template::Ptr templ, const std::string& uuid);

void add(const std::vector<pbio::Template::Ptr>& templates, const std::vector<std::string>& uuids);

void add(pbio::ContextTemplate::Ptr templ, const std::string& uuid);

void add(const std::vector<pbio::ContextTemplate::Ptr>& templates, const std::vector<std::string>& uuids);

// Удаление шаблона из базы по UUID
void remove(const std::string& uuid);

void remove(const std::vector<std::string>& uuids);

// Количество шаблонов в базе
size_t size() const;

// Текущая вместимость базы
size_t capacity() const;

// Слияние баз шаблонов
// otherIndex становится невалидным
void concat(DynamicTemplateIndex::Ptr otherIndex);

// Получение названия метода шаблонов в базе
std::string getMethodName() const;