Example face - rusbiometrics/IRPV GitHub Wiki

Итак, мы отобрали для проверки 5 алгоритмов, описание которых приведено в таблице 1

Таблица 1 - Открытые алгоритмы распознавания лиц

Алгоритм Кратко о реализации Подробнее
lbp Гистограммы локальных бинарных шаблонов link
openface Свёрточная нейронная сеть с Inception архитектурой, triplet loss embedding link
vgg Свёрточная нейронная сеть с VGG архитектурой, multiclass crossenthropy link
rn101 Свёрточная нейронная сеть с ResNet архитектурой, multiclass crossenthropy link
dlib Свёрточная нейронная сеть с ResNet архитектурой, metric loss embedding link

База данных лиц, на которых мы будем проводить тестирование состоит из 485 пар фотографий, плюс 515 фотографий так называемых дистракторов. База данных наполовину состоит из выборки фотографий из открытой базы лиц голливудских знаменитостей FaceSCURB, а на вторую половину из закрытой базы фотографий лиц славянской внешности. База данных маленькая, положительных сравнений только 485, отрицательных 484515. Мы уже можем оценить, что минимальная FAR, которая может быть достоверно измерена по этой базе 1E-4 и минимальная FRR 3E-2. Тем не менее, забегая вперёд, скажу, что измеренные характеристики окажутся в пределах достоверных значений, поэтому для нашего испытания эта база вполне пригодна. Также следует сказать что фотографии имеют размеры в диапазоне от 128 до 1400 пикселей по горизонтали и от 156 до 1500 пикселей по вертикали. Все фотографии цветные трёхканальные. Лица на исходных фото не выровнены по горизонтали.

Давайте посмотрим как будет выглядеть запуск теста в этом случае. Пусть все фотографии располагаются в директории /Testdata/Faces. Внутри директории мы имеем 485 субдиректорий (в каждой по крайней мере по паре фотографий одного и того же человека) и 515 фотографий дистракторов в корне. Результат теста я хочу сохранить в диреткории /Testdata/Comparision. Также пусть ресурсы алгоритма хранятся в диреткории /API/Resources. Для запуска теста вводим команду:

./IRPVTest -i/Testdata/Faces -o/Testdata/Comparision -r/API/Resources

После окончания каждого теста, внутри директории /Testdata/Comparision будет сохранён его результат в виде текстового json-файла. Имя файла будет совпадать с именем VENDOR_API_NAME, установленным здесь ещё на этапе сборки теста. Для сбора данных по всем тестируемым мной алгоритмам мне необходимо собрать тест для каждого из них и вызвать команду, указанную выше.

Какой алгоритм лучше? Давайте посмотрим на результаты теста проведённого при помощи API IRPV. Для начала посмотрим на так называемые ROC кривые, отображающие взаимосвязь между количеством истинно-положительных (TAR) и ложно-положительных (FAR) предсказаний:

ROC кривая для открытых алгоритмов распознавания лиц

Необходимо отметить, что рисунок, приведённый выше, построен нами при помощи инструментов, не входящих в состав проекта IRPV. Но исходными данными для его построения стали те самые текстовые json-файлы, созданные программой IRPVTest

Очевидно, что лучшим алгоритмом является условно названный нами dlib, а худшим null (null здесь, это характеристика для нашей null-реализации, которая генерирует случайные значения меры близости при сравнении шаблонов).

Таблица 2 - Сравнение FRR

Алгоритм FRR при FAR 1E-4 Ранг
lbp 0.971 5-ое место
openface 0.857 4-ое место
vgg 0.523 2-ое место
rn101 0.604 3-е место
dlib 0.039 1-ое место

Результаты теста сохраняются в виде текстового файла в json-формате. Кроме оценок вероятности в этом же файле можно найти время инициализации алгоритма, среднее время создания шаблона, среднее время сравнения шаблонов и размер шаблона:

Таблица 3 - Прочие характеристики для сравнения

Алгоритм Инициализация ресурсов, мс Среднее время создания шаблона*, мс Среднее время сравнения шаблонов, мкс Размер шаблона, байт
lbp 847 180 361.80 262144
openface 1235 155 2.53 512
vgg 9232 2114 17.50 10488
rn101 3837 1320 14.69 9192
dlib 4151 644 2.38 512

* все реализации запускались на CPU (Intel Core i5-4210U), сборка всех библиотек производилась без оптимизаций