Идентификация лиц
Face SDK содержит несколько методов идентификации, отличающихся по характеристикам качества распознавания и времени работы.
Менее быстрые методы имеют лучшие показатели по качеству распознавания (характеристики методов представлены в пункте Характеристики идентификации).
Использование распознавателей
В зависимости от качества распознавания и времени работы методы можно разделить на 3 группы в привязке к вариантам использования:
- 10.30 – для real-time идентификации по видео на мобильных платформах (arm)
- 10.100 – для real-time идентификации по видео на настольных платформах (x86)
- 9.300, 11.1000 – для экспертных систем поиска лица по фото
Устаревшая система нумерации методов, используемая в SDK до версии 3.3 (deprecated)
Первая цифра(6.x/7.x/8.x) указывает на качество/скорость метода:
- 7.x - самые качественные методы, но и самые медленные, используются для идентификации лиц в серверных системах на больших базах данных (более 1 млн лиц).
- 6.x - более быстрые методы, предназначены для идентификации лиц в видеопотоке в режиме реального вермени на десктопных/серверных платформах (x86). Также эти методы можно применять для идентификации лиц в видеопотоке в современных мобильных платформах (arm) с количеством ядер не менее 4-х и частотой ядер не менее 1.6 ГГц.
- 8.х - самые быстрые методы, предназначены для идентификации лиц в видеопотоке на мобильных платформах (arm).
Вторая цифра означает версию метода. Более старшие версии выпущены позже и, соответственно, они более качественные, на них можно переходить при обновлении SDK c соответствующих младших версий. Например, если использовался распознаватель 6.6, то при обновлении SDK рекомендуется перейти на его новую версию 6.7, при этом размеры шаблонов и скорость построения шаблона остаются такими же, а качество идентификации повысится.
Актуальная система нумерации методов, используемая в SDK начиная с версии 3.3
Первая цифра(начиная с 9) указывает на версию метода. Чем выше версия, тем лучше качество.
Вторая цифра указывает на примерное время построения шаблона в миллисекундах на современном процессоре x86 с частотой порядка 3ГГц. Чем медленнее метод, тем он качественнее.
- х.1000 и x.300 - самые качественные методы, но и самые медленные.* Используются для идентификации лиц в серверных системах на больших базах данных (более 1 млн лиц).
- x.100 - более быстрые методы, предназначены для идентификации лиц в видеопотоке в режиме реального времени на десктопных/серверных платформах (x86). Также эти методы можно применять для идентификации лиц в видеопотоке в современных мобильных платформах (arm) с количеством ядер не менее 4-х и частотой ядер не менее 1.6 ГГц.
- х.30 - самые быстрые методы, предназначены для идентификации лиц в видеопотоке на мобильных платформах (arm).
В очередной версии SDK могут присутствовать обновления не всех групп методов идентификации, в этом случае можно либо остаться на старом методе идентификации, либо сравнить его качество с новыми методами из более быстрой группы и в случае улучшения качества перейти на новые более быстрые методы. Кроме этого, мы предоставляем рекомендации по использованию конкретных методов идентификации при переходе на более новую версию SDK.
Таблица методов идентификации по применимости в зависимости от версии SDK
Применение/версия 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 |
* - Методы могут быть ускорены за счет использования AVX2 (доступно только на Linux x86 64-bit). Для использования набора инструкций AVX2 переместите содержимое директории lib/tensorflow_avx2
в директорию lib
. Доступные инструкции Вы можете проверить, выполнив команду grep flags /proc/cpuinfo
Для идентификации лиц необходимо создать объект Recognizer
, вызвав метод FacerecService.createRecognizer
с указанием файла конфигурации.
Для создания компонента Encoder для одного потока необходимо указать параметры processing_threads_count=true
, matching_threads_count=false
.
Для создания компонента MatcherDB для одного потока необходимо указать параметры processing_threads_count=false
, matching_threads_count=true
.
На данный момент существуют следующие файлы конфигурации и методы распознавания:
method6_recognizer.xml
– метод 6method6v2_recognizer.xml
– метод 6.2method6v3_recognizer.xml
– метод 6.3method6v4_recognizer.xml
– метод 6.4method6v5_recognizer.xml
– метод 6.5method6v6_recognizer.xml
– метод 6.6method6v7_recognizer.xml
– метод 6.7method7_recognizer.xml
– метод 7method7v2_recognizer.xml
– метод 7.2method7v3_recognizer.xml
– метод 7.3method7v6_recognizer.xml
– метод 7.6method7v7_recognizer.xml
– метод 7.7method8v6_recognizer.xml
– метод 8.6method8v7_recognizer.xml
– метод 8.7method9v30_recognizer.xml
– метод 9.30method9v300_recognizer.xml
– метод 9.300method9v1000_recognizer.xml
– метод 9.1000method10v30_recognizer.xml
– метод 10.30method10v100_recognizer.xml
– метод 10.100method10v1000_recognizer.xml
– метод 10.1000method11v1000_recognizer.xml
– метод 11.1000
Также доступны следующие файлы конфигурации для распознавания лиц в масках:
method9v30mask_recognizer.xml
method9v300mask_recognizer.xml
method9v1000mask_recognizer.xml
Данные методы позволяют улучшить качество идентификации лиц в масках. Например, для лиц в масках стандартный метод 9v1000 показывает TAR=0.72, а оптимизированный метод 9v1000mask показывает TAR=0.85 при FAR=1E-6.
Примечание: Узнайте, как детектировать и распознавать лица в масках, в нашем туториале.
Также Вы можете использовать файлы конфигурации, которые указывают на последнюю версию соответствующего метода:
recognizer_latest_v30.xml
recognizer_latest_v100.xml
recognizer_latest_v300.xml
recognizer_latest_v1000.xml
При помощи объекта Recognizer
вы можете:
- получить имя метода (
Recognizer.getMethodName
) - создать шаблон лица (
Recognizer.processing
) – вы получите объектTemplate
- сравнить два шаблона (
Recognizer.verifyMatch
) – сравнивать можно только шаблоны, созданные этим же методом (т.е. с таким же конфигурационным файлом) - загрузить (десериализовать) шаблон (
Recognizer.loadTemplate
) – загружать можно только шаблоны, созданные этим же методом (т.е. с таким же конфигурационным файлом) - создать индекс
TemplatesIndex
для быстрого поиска в больших базах (Recognizer.createIndex
) - выполнить поиск шаблонов в индексе (
Recognizer.search
)
Пример идентификации 1:N
В примере ниже показано формирование TemplateIndex
на основании детекций лиц с одного изображения. Recognizer.search
выдает результаты поиска запросного шаблона в индексе в количестве search_k_nearest
.
- C++
- Python
// capture the faces
const std::vector<pbio::RawSample::Ptr> samples = capturer.capture(...);
// make templates
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);
# capture the faces
samples = my_capturer.capture(...)
# make templates
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)
При помощи объекта Template
вы можете:
- получить имя метода (
Template.getMethodName
) - сохранить (сериализовать) шаблон (
Template.save
)
При помощи объекта TemplatesIndex
вы можете:
- получить имя метода (
TemplatesIndex.getMethodName
) - получить количество шаблонов в индексе (
TemplatesIndex.size
) - получить шаблон из индекса по номеру (
TemplatesIndex.at
) - зарезервировать память для поиска (
TemplatesIndex.reserveSearchMemory
)
Примечание: Методы Recognizer.createIndex
и TemplatesIndex
не копируют данные шаблона, они копируют только умные указатели на данные.
Результат распознавания
Результат совпадения 1:1 и результат поиска 1:N содержат структуру MatchResult, показывающую разницу между двумя сравниваемыми шаблонами в виде расстояния и соответствующих значений FAR, FRR и Score. Значение Score в диапазоне от [0.0..1.0] можно использовать для принятия решения о совпадении. Поскольку порог расстояния зависит от требуемых показателей FAR и FRR, то метрику score можно настроить на желаемое значение расстояния. Для этого вам необходимо установить целевое значение FAR или FRR (FAR является приоритетным) и требуемое значение Score в конфигурационном файле детектора:
// не установлен, если вы хотите использовать старый score, сохраненный в файле конфигурации
<fit_score>1</fit_score>
<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>
// this formula is an example and differs from the default one
<score_formula>(1-(log10(far)+8)/8)</score_formula>