Перейти к основному содержимому
Версия: 3.22.0 (последняя)

Детекция лиц

Обзор

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

Детекция лиц

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

Детекторы

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

Модификация Версия Параметры по умолчанию Время детекции (мс)
640x4801280x7201920x1080
uld1precision_level=1, confidence_threshold=0.7, coarse_confidence_threshold=0.37 8 9
precision_level=2, confidence_threshold=0.7, coarse_confidence_threshold=0.337 40 43
precision_level=3, confidence_threshold=0.7, coarse_confidence_threshold=0.3193 192 203
ssyv1confidence_threshold=0.5, iou_threshold=0.5153 153 157
247 49 54
396 99 104
41355 1419 1420
blf_front1confidence_threshold=0.67, iou_threshold=0.54 6 11
blf_back112 14 20
примечание

Модификация по умолчанию -"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.

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

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

Модификация Версия Время детекции (мс)
tddfa_faster13
tddfa17
mesh17
примечание

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

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

  • Входной контейнер 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 для создания шаблона (Распознавание лиц).