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

Детекция лиц

Обзор​

Процесс детекции лиц в 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
ssyx13.29confidence_threshold=0.5, iou_threshold=0.540 40 41
23.3140 40 41
* - CPU Intel Xeon E5-2683 v4 (1 ядро)
примечание

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

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

  • confidence_threshold – порог уверенности детекции.
  • iou_threshold – параметр. Метрика определяет, относятся ли два bbox'а к одному и тому же лицу. Например, при пороге в 0.5 два bbox'а, у которых IOU больше 0.5, считаются относящимися к одному лицу. Данный порог нужен на стадии постпроцессинга детекции, чтобы отфильтровать кейсы, когда у нас на один объект приходится несколько боксов
  • min_size - фильтрует все лица, которые меньше указаного значения. Может принимать как относительные значения [0, 1], так и абсолютные.
  • max_size - фильтрует все лица, которые больше указаного значения. Может принимать как относительные значения [0, 1], так и абсолютные.
  • 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 для создания шаблона (Распознавание лиц).

Каскад детекторов​

В случаях, когда в одной зоне требуется детектировать лица на данных из разных доменов (например, селфи, фото с камеры СКУД и фото удостоверения личности), бывает сложно обеспечить высокое качество.

Для решения этой проблемы можно воспользоваться модификацией cascade, которая будет последовательно запускать детекторы, добавленные на этапе инициализации процессинг-блока.

Настройка модуля​

Для добавления детекторов в каскад используется параметр face_detectors. В него укажите конфигурации детекторов.

Пример конфигурации каскада​

{
"unit_type": "FACE_DETECTOR",
"modification": "cascade",
"face_detectors": [
{
"unit_type": "FACE_DETECTOR",
"modification": "ssyv",
"version": 3
},
{
"unit_type": "FACE_DETECTOR",
"modification": "uld",
"precision_level": 2
},
],
}
auto detectorConfigCtx1 = service->createContext();
detectorConfigCtx1["unit_type"] = "FACE_DETECTOR";
detectorConfigCtx1["modification"] = "ssyv";
detectorConfigCtx1["version"] = 3;

auto detectorConfigCtx2 = service->createContext();
detectorConfigCtx2["unit_type"] = "FACE_DETECTOR";
detectorConfigCtx2["modification"] = "uld";
detectorConfigCtx2["precision_level"] = 2;

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

detectorConfigCtx["face_detectors"].push_back(detectorConfigCtx1);
detectorConfigCtx["face_detectors"].push_back(detectorConfigCtx2);

auto faceDetector = service.create_processing_block(detectorConfigCtx);