Перейти к основному содержимому
Версия: 3.17.4

Распознавание лиц

Обзор

Face SDK позволяет выполнять следующие операции сравнения биометрических шаблонов лиц:

  • Верификация (1:1) — сравнение двух шаблонов лиц на принадлежность одному и тому же человеку (сравнение двух лиц);
  • Идентификация (1:N) — сравнение одного биометрического шаблона лица с другими шаблонами лиц (поиск лица по базе лиц).

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

Методы распознавания

Face SDK содержит набор методов (алгоритмов) распознавания, которые отличаются по точности и скорости распознавания.

С характеристиками методов можно ознакомиться в разделе Характеристики распознавания.

Cистема нумерации методов в Face SDK

Первая цифра в названии метода указывает на его версию. Чем выше версия, тем выше точность работы метода.

Вторая цифра указывает на примерное время построения шаблона в миллисекундах на современном процессоре x86 с частотой порядка 3ГГц. Чем медленнее работает метод, тем выше точность его работы.

  • х.1000 и x.300 - самые точные методы, но и самые медленные. Используются для распознавания лиц в экспертных системах на больших базах данных (более 1 млн лиц).
  • x.100 - более быстрые методы, предназначены для распознавания лиц в видеопотоке в режиме реального времени на десктопных/серверных платформах (x86). Также эти методы можно применять для распознавания лиц в видеопотоке в современных мобильных платформах (arm) с количеством ядер не менее 4-х и частотой ядер не менее 1.6 ГГц.
  • х.50 и х.30 - самые быстрые методы, предназначены для распознавания лиц в видеопотоке на мобильных платформах (arm).
Старая система нумерации методов, используемая в Face SDK до версии 3.3 (deprecated)

Первая цифра (6.x/7.x/8.x) указывает на точность/скорость работы метода:

  • 7.x - самые точные методы, но и самые медленные, используются для распознавания лиц в экспертных системах на больших базах данных (более 1 млн лиц).
  • 6.x - более быстрые методы, предназначены для распознавания лиц в видеопотоке в режиме реального вермени на десктопных/серверных платформах (x86). Также эти методы можно применять для распознавания лиц в видеопотоке в современных мобильных платформах (arm) с количеством ядер не менее 4-х и частотой ядер не менее 1.6 ГГц.
  • 8.х - самые быстрые методы, предназначены для распознавания лиц в видеопотоке на мобильных платформах (arm).

Вторая цифра означает версию метода. Более поздние версии имеют большую точность, на них можно перейти при обновлении Face SDK c соответствующих более ранних версий. Например, если использовался метод 6.6, то при обновлении Face SDK рекомендуется перейти на его новую версию 6.7, при этом размеры шаблонов и скорость построения шаблона остаются такими же, а точность распознавания увеличится.

В очередной версии Face SDK могут присутствовать обновления не всех групп методов распознавания. В этом случае можно либо остаться на старом методе распознавания, либо сравнить его точность с новыми методами из более быстрой группы, и в случае улучшения точности перейти на новые более быстрые методы. Кроме этого, мы предоставляем рекомендации по использованию конкретных методов распознавания при переходе на более новую версию Face SDK.

Таблица методов распознавания по применимости в зависимости от версии Face SDK

Версия Face SDK Экспертные системы Десктопные/серверные платформы Мобильные платформы
SDK-2.0 method7 method6v2
SDK-2.1 method7 method6v3
SDK-2.2 method7v2 method6v4
SDK-2.3 method7v3 method6v5
SDK-2.5 method7v6 method6v6
SDK-3.0 method7v6 method6v6 method8v6
SDK-3.1 method7v7 method6v7 method8v7
SDK-3.3 method9v300
method9v1000
method6v7 method9v30
SDK-3.4 method9v300
method9v1000
method9v300mask
method9v1000mask
method6v7 method9v30
method9v30mask
SDK-3.11 method9v300
method10v1000
method9v300mask
method9v1000mask
method10v100 method10v30
method9v30mask
SDK-3.13 method9v300
method11v1000
method9v300mask
method9v1000mask
method10v100 method10v30
method9v30mask
SDK-3.17 method9v300
method11v1000
method9v300mask
method9v1000mask
method12v1000
method10v100
method12v100
method10v30
method9v30mask
method12v30
method12v50
примечание

Методы могут быть ускорены за счет использования AVX2 (доступно только на Linux x86 64-bit). Для использования набора инструкций AVX2 переместите содержимое директории lib/tensorflow_avx2 в директорию lib. Доступные инструкции Вы можете проверить, выполнив команду grep flags /proc/cpuinfo.

Реализация распознавания лиц

Создание объекта Recognizer

Для распознавания лиц необходимо создать объект Recognizer, вызвав метод FacerecService.createRecognizer с указанием файла конфигурации объекта Recognizer в качестве аргумента.

Все доступные файлы конфигурации хранятся в папке conf дистрибутива Face SDK. Используемый метод распознавания прописан в названии, например: method12v30_recognizer.xml – метод 12.30. Файлы конфигурации последней версии соответствующего метода можно найти по слову "latest" в названии, например, recognizer_latest_v30.xml.

Для распознавания лиц в масках лучше всего подойдут файлы конфигурации объекта Recognizer, в названии которых указано слово "mask", например, method9v300mask_recognizer.xml. Их использование позволяет улучшить точность распознавания. Например, для лиц в масках стандартный метод 9v1000 показывает TAR=0.72, а оптимизированный метод 9v1000mask показывает TAR=0.85 при FAR=1E-6.

Перед созданием объекта Recognizer вы можете определить следующие параметры в файле конфигурации или с помощью метода Config.overrideParameter объекта FacerecService.Config:

  • num_threads, целое число - количество потоков, на которых будет запускаться модель (для всех методов)
  • inter_op_num_threads, целое число - количество потоков, используемых для распараллеливания узлов модели (только для методов 12.x). Работает только в режиме execution_mode (целое число, 1 - включен, 0 - выключен).

Примечание: Узнать, как детектировать и распознавать лица в масках, можно в нашем туториале.

Извлечение шаблона

Для извлечения биометрического шаблона воспользуйтесь методом Recognizer.processing, передав в качестве аргумента объект RawSample. Метод Recognizer.processing возвращает объект типа Template - интерфейсный объект для сохранения биометрического шаблона лица.

С помощью объекта Template вы можете:

  • получить имя метода (Template.getMethodName)
  • сохранить (сериализовать) шаблон (Template.save) на ваш диск

Биометрический шаблон создается сразу в двух видах: коротком (64 байт) и длинном (512 байт). Для решения задач идентификации можно подключить поиск по коротким шаблонам, что уменьшит время поиска совпадений. В этом случае вначале будет найдено совпадение с базой коротких шаблонов, которое затем должно быть подтверждено совпадением с длинным шаблоном.

Верификация лиц (1:1)

Важно! Верификация возможна только в случае если при извлечении шаблонов использовались Recognizer'ы, созданные с помощью одного и того же метода (с указанием одного и того же файла конфигурации).

Для сравнения двух шаблонов выполните следующие шаги:

  1. Извлеките шаблоны из сэмплов методом Recognizer.processing или загрузите их с помощью метода Recognizer.loadTemplate.
  2. Используйте метод Recognizer.verifyMatch, в качестве аргумента укажите два объекта Template.

Пример верификации (1:1)

// создание сэмплов лиц
const pbio::RawSample::Ptr sample1 = capturer->capture(image1);
const pbio::RawSample::Ptr sample2 = capturer->capture(image2);

// создание шаблонов
const pbio::Template::Ptr template1 = recognizer->processing(sample1);
const pbio::Template::Ptr template2 = recognizer->processing(sample2);

// верификация
const pbio::Recognizer::MatchResult match = recognizer->verifyMatch(template1, template2)

Идентификация лиц (1:N)

Важно! Идентификация возможна только в случае если при извлечении шаблонов использовались Recognizer'ы, созданные с помощью одного и того же метода (с указанием одного и того же файла конфигурации).

Для поиска шаблона по базе выполните следующие шаги:

  1. Загрузите (Recognizer.loadTemplate) или извлеките (Recognizer.processing) шаблон для поиска совпадений с базой

  2. Загрузите шаблоны, по которым будет проводиться поиск совпадений (Recognizer.loadTemplate).

  3. Для быстрого поиска по коротким шаблонам создайте объект TemplatesIndex с помощью метода Recognizer.createIndex.

    С помощью объекта TemplatesIndex вы можете:
    • получить имя метода (TemplatesIndex.getMethodName)
    • получить количество шаблонов в индексе (TemplatesIndex.size)
    • получить шаблон из индекса по номеру (TemplatesIndex.at)
    • зарезервировать память для поиска (TemplatesIndex.reserveSearchMemory)

    Примечание: Методы Recognizer.createIndex и TemplatesIndex копируют не данные шаблона, а только умные указатели на данные.

  4. Выполните поиск шаблонов в индексе методом Recognizer.search. В качестве аргументов передайте значения для следующих параметров:

  • query_template - шаблон, с которым происходит сравнение
  • templates_index - индекс для поиска
  • search_k_nearest - количество возвращаемых ближайших найденых шаблонов
  • Ускорение поиска:
    • SEARCH_ACCELERATION_1 - ускоренный линейный поиск
    • NO_SEARCH_ACCELERATION - без ускорения, стандартный линейный поиск

Пример идентификации 1:N

В примере ниже показано формирование TemplateIndex на основе детекций лиц с одного изображения. Recognizer.search выдает результаты поиска запросного шаблона в индексе в количестве search_k_nearest.

// детекция лиц
const std::vector<pbio::RawSample::Ptr> samples = capturer.capture(...);

// создание шаблонов
std::vector<pbio::Template::Ptr> templates;
for(size_t i = 0; i < samples.size(); ++i)
{
const pbio::Template::Ptr templ = recognizer.processing(*samples[i]);
templates.push_back(templ);
}

// идентификация
const int search_k_nearest = 1;
const pbio::TemplatesIndex::Ptr index = recognizer->createIndex(templates);
const std::vector<pbio::Recognizer::SearchResult> search_results = recognizer->search(*templates[0], *index, search_k_nearest, pbio::Recognizer::SEARCH_ACCELERATION_1);

Результат распознавания

Результаты верификации 1:1 и идентификации 1:N возвращаются в виде структуры MatchResult, которая включает следующие параметры:

  • distance - расстояние между сравниваемыми векторами шаблонов. Чем меньше значение, тем выше уверенность в корректном распознавании.
  • FAR - вероятность ошибочных подтверждений, когда система принимает изображения разных людей за изображение одного и того же человека.
  • FRR - вероятность ошибочных отказов, когда система принимает два изображения одного и того же человека за изображения разных людей.
  • Score - вероятность корректного распознавания. Значение Score указано в диапазоне от [0.0..1.0] и может быть использовано для принятия решения о совпадении.

Вы можете установить целевое значение FAR или FRR (FAR является приоритетным) и требуемое значение Score в файле конфигурации метода. Такая настройка, например, потребуется, если при переходе на новый метод, вам необходимо будет оставить значение Score из предыдущего используемого метода.

// Для использования новых значений укажите значение "1", для использования значений по умолчанию - "0"
<fit_score>1</fit_score>

// Затем укажите новые значения Score, FAR и FRR
<target_score>85</target_score>
<target_far>0.00000052</target_far>
<target_frr>0.1</target_frr>

Вы также можете задать свою собственную формулу Score через переменные tar (1 - far), far и distance:

<fit_score>1</fit_score>
<use_custom_score_formula>1</use_custom_score_formula>
// Формула приведена в качестве примера, и не используется по умолчанию
<score_formula>(1-(log10(far)+8)/8)</score_formula>