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

Детекция лиц

Обзор

Процесс детекции лиц в Face SDK включает детекцию и определение антропометрических точек лица.

Детекция лиц

Детекция выполняется с помощью набора детекторов. Детектор – это алгоритм библиотеки libfacerec, который использует нейронные сети для обнаружения лиц на изображениях. Результатом работы детектора являются координаты ограничивающего прямоугольника (bbox) вокруг задетектированного лица.

Детекторы

На данный момент доступны следующие модификации:

Модификация Версия Версия Face SDK Параметры по умолчанию Время детекции CPU (мс)*
640x4801280x7201920x1080
uld13.19precision_level=1, confidence_threshold=0.7, coarse_confidence_threshold=0.37 7 8
precision_level=2, confidence_threshold=0.7, coarse_confidence_threshold=0.337 38 40
precision_level=3, confidence_threshold=0.7, coarse_confidence_threshold=0.3194 187 197
ssyv13.19confidence_threshold=0.5, iou_threshold=0.5151 150 152
246 46 47
396 94 96
43.201517 1506 1502
ssyv_light13.2411 11 12
blf_front13.19confidence_threshold=0.67, iou_threshold=0.53 5 9
blf_back111 13 18
* - CPU Intel Xeon E5-2683 v4 (1 ядро)
примечание

Модификация по умолчанию -"ssyv".

Параметры детектора

  • confidence_threshold – порог уверенности детекции.
  • iou_threshold – параметр. Метрика определяет, относятся ли два bbox'а к одному и тому же лицу. Например, при пороге в 0.5 два bbox'а, у которых IOU больше 0.5, считаются относящимися к одному лицу. Данный порог нужен на стадии постпроцессинга детекции, чтобы отфильтровать кейсы, когда у нас на один объект приходится несколько боксов
  • coarse_confidence_threshold(только для uld) – грубый порог уверенности детекции. Во время детекции детектор создает набор bbox'ов, для каждого из которых указано значение confidence (число от 0 до 1, показывает степень уверенности в том, что в bbox находится лицо). Bbox'ы со confidence_threshold'ми подаются в nms-алгоритм, который определяет пересечения (совпадения) между bbox'ми. Параметр coarse_confidence_threshold позволяет отсечь bbox'ы с низким confidence, что сокращает количество вычислений, выполняемых nms-алгоритмом.
  • precision_level(только для uld) определяет уровень точности. Значение из диапозон [1, 3], чем выше значение тем выше точность и меньше скорость работы. По умолчанию 1.

Ниже представлены примеры работы детекторов в различных условиях. Настроить пороги детекции (confidence_threshold) и другие параметры можно при создании процессинг-блока.

Нажмите, чтобы развернуть таблицу
BLF (confidence_threshold=0.6) ULD (precision_level=3, confidence_threshold=0.7)
Нажмите, чтобы развернуть таблицу
ULD (confidence_threshold=0.4) ULD (confidence_threshold=0.7)

Спецификация блоков детектора

  • Входной контейнер Context должен содержать изображение в бинарном формате.
{
"image" : {
"format": "NDARRAY",
"blob": "data pointer",
"dtype": "uint8_t",
"shape": [height, width, channels]
}
}

Определение антропометрических точек

Для определения антропометрических точек (Face Landmarks) в Face SDK используются фиттеры. Фиттеры – это специальные алгоритмы библиотеки libfacerec, результатом работы которых является набор антрометрических точек с 2D/3D координатами, привязанными к задетектированному лицу. Существует несколько вариантов фиттеров, отличающихся набором антопометрических точек, о которых написано ниже.

Антропометрические точки

Существует три набора антропометрических точек: fda, mesh, tddfa.

  • Набор fda содержит 21 точку лица.
  • Набор tddfa содержит 68 точек лица.
  • Набор mesh содержит 470 3D точек лица. Мы рекомендуем использовать его для получения 3D маски лица.

На данный момент доступны следующие модификации:

Модификация Версия Версия Face SDK Время детекции CPU (мс)* Время детекции GPU (мс)**
fda13.2333
tddfa_faster13.1921
tddfa13.1962
mesh13.1963
* - CPU Intel Xeon E5-2683 v4 (1 ядро)
** - GPU (NVIDIA GTX 10xx серия)
примечание

Модификация по умолчанию -fda.

Спецификация блоков фиттера

  • Входной контейнер Context должен содержать изображение в бинарном формате и массив объектов, полученных от детектора
{
"image" : {
"format": "NDARRAY",
"blob": "data pointer",
"dtype": "uint8_t",
"shape": [height, width, channels]
},
"objects": [{
"id": {"type": "long", "minimum": 0},
"class": "face",
"confidence": {"double", "minimum": 0, "maximum": 1},
"bbox": [x1, y2, x2, y2]
}]
}

Пример детекции лиц и определения антопометрических точек лица

Создание процессинг-блоков

Создайте процессинг-блок детектора и фиттера с помощью метода FacerecService.createProcessingBlock, передав в качестве аргумента контейнер Context с установленными параметрами.

auto detectorConfigCtx = service->createContext();
detectorConfigCtx["unit_type"] = "FACE_DETECTOR";
detectorConfigCtx["modification"] = "ssyv";

auto fitterConfigCtx = service->createContext();
fitterConfigCtx["unit_type"] = "FACE_FITTER";

pbio::ProcessingBlock faceDetector = service->createProcessingBlock(detectorConfigCtx);
pbio::ProcessingBlock faceFitter = service->createProcessingBlock(fitterConfigCtx);

Перечень настраиваемых параметров процессинг-блоков

Запуск детекции

Нужно подать Context-контейнер с бинарным изображением в процессинг-блок детектора:

ioData["image"] = imgCtx;
faceDetector(ioData);

Результат выполнения детекции лица сохраняется переданный контейнер Context согласно спецификации процессинг-блока.

Запуск определения антопометрических точек лица

Нужно подать контейнер Context полученный после работы процессинг-блок детектора:

faceFitter(ioData);

Полученный контейнер Context можно передать в методы оценки возраста, пола, качества и принадлежности лица реальному человеку (Оценка лиц), а также в Recognizer.processing для создания шаблона (Распознавание лиц).