Распознавание лиц
Обзор
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
и определите параметр use_avx2
в конфигурационном файле. Доступные инструкции вы можете проверить, выполнив команду grep flags /proc/cpuinfo
.
Включение avx2 возможно на всех методов кроме 12.x, на них включение происходит автоматически.
Реализация распознавания лиц
Создание объекта 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 – выключен).use_avx2
- включает использование avx2 на cpu для ускорения создания шаблона. (кроме методов 12.x, только linux-x86-64)
Примечание: узнать, как детектировать и распознавать лица в масках, можно в нашем туториале.
Извлечение шаблона
Для извлечения биометрического шаблона воспользуйтесь методом Recognizer.processing
, передав в качестве аргумента объект RawSample
. Метод Recognizer.processing
возвращает объект типа Template
– интерфейсный объект для сохранения биометрического шаблона лица.
С помощью объекта Template
вы можете:
- Получить имя метода (
Template.getMethodName
). - Сохранить (сериализовать) шаблон (
Template.save
) на ваш диск.
Биометрический шаблон создается сразу в двух видах: коротком (64 байт) и длинном (512 байт). Для решения задач идентификации можно подключить поиск по коротким шаблонам, что уменьшит время поиска совпадений. В этом случае вначале будет найдено совпадение с базой коротких шаблонов, которое затем должно быть подтверждено совпадением с длинным шаблоном.
Верификация лиц (1:1)
Важно! Верификация возможна только в случае если при извлечении шаблонов использовались Recognizer'ы, созданные с помощью одного и того же метода (с указанием одного и того же файла конфигурации).
Для сравнения двух шаблонов выполните следующие шаги:
- Извлеките шаблоны из сэмплов методом
Recognizer.processing
или загрузите их с помощью методаRecognizer.loadTemplate
. - Используйте метод
Recognizer.verifyMatch
, в качестве аргумента укажите два объектаTemplate
.
Пример верификации (1:1)
- C++
- Python
// создание сэмплов лиц
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)
# создание сэмплов лиц
sample1 = capturer.capture(image1)
sample2 = capturer.capture(image2)
# создание шаблонов
template1 = recognizer.processing(sample1)
template2 = recognizer.processing(sample2)
# верификация
verif_results = recognizer.verify_match(template1, template2)
Идентификация лиц (1:N)
Важно! Идентификация возможна только в случае если при извлечении шаблонов использовались Recognizer'ы, созданные с помощью одного и того же метода (с указанием одного и того же файла конфигурации).
Для поиска шаблона по базе выполните следующие шаги:
Загрузите (
Recognizer.loadTemplate
) или извлеките (Recognizer.processing
) шаблон для поиска совпадений с базой.Загрузите шаблоны, по которым будет проводиться поиск совпадений (
Recognizer.loadTemplate
).Для быстрого поиска по коротким шаблонам создайте объект
TemplatesIndex
с помощью методаRecognizer.createIndex
.С помощью объекта TemplatesIndex вы можете:
- получить имя метода (
TemplatesIndex.getMethodName
), - получить количество шаблонов в индексе (
TemplatesIndex.size
), - получить шаблон из индекса по номеру (
TemplatesIndex.at
), - зарезервировать память для поиска (
TemplatesIndex.reserveSearchMemory
).
Примечание. Методы
Recognizer.createIndex
иTemplatesIndex
копируют не данные шаблона, а только умные указатели на данные.- получить имя метода (
Выполните поиск шаблонов в индексе методом
Recognizer.search
. В качестве аргументов передайте значения для следующих параметров:
- query_template – шаблон, с которым происходит сравнение.
- templates_index – индекс для поиска.
- search_k_nearest – количество возвращаемых ближайших найденых шаблонов.
- Ускорение поиска:
- SEARCH_ACCELERATION_1 – ускоренный линейный поиск.
- NO_SEARCH_ACCELERATION – без ускорения, стандартный линейный поиск.
Пример идентификации 1:N
В примере ниже показано формирование TemplateIndex
на основе детекций лиц с одного изображения. Recognizer.search
выдает результаты поиска запросного шаблона в индексе в количестве search_k_nearest
.
- C++
- Python
// детекция лиц
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);
# детекция лиц
samples = my_capturer.capture(...)
# создание шаблонов
templates = [my_recognizer.processing(sample) for sample in samples]
# идентификация
search_k_nearest = 1
index = my_recognizer.create_index(templates, 1)
search_results = my_recognizer.search([templates[0]], index, search_k_nearest, recognizer.SearchAccelerationType.SEARCH_ACCELERATION_1)
Результат распознавания
Результаты верификации 1:1 и идентификации 1:N возвращаются в виде структуры MatchResult, которая включает следующие параметры:
- distance – расстояние между сравниваемыми векторами шаблонов. Чем меньше значение, тем выше уверенность в корректном распознавании.
- FAR – вероятность ошибочных подтверждений, когда система принимает изображения разных людей за изображение одного и того же человека.
- FRR – вероятность ошибочных отказов, когда система принимает два изображения одного и того же человека за изображения разных людей.
- Score – степень схожести лиц от 0 (0%) до 1 (100%). Высокая степень схожести означает, что два биометрических шаблона принадлежат одному и тому же человеку.
Вы можете установить целевое значение 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>