Детекция лиц
Обзор
Процесс детекции лиц в Face SDK включает детекцию и определение антропометрических точек лица.
Детекция лиц
Детекция выполняется с помощью набора детекторов. Детектор – это алгоритм библиотеки libfacerec, который использует нейронные сети для обнаружения лиц на изображениях. Результатом работы детектора являются координаты ограничивающего прямоугольника (bbox) вокруг задетектированного лица.
Детекторы
На данный момент доступны следующие модификации:
Модификация | Версия | Версия Face SDK | Параметры по умолчанию | Время детекции CPU (мс)* | ||
---|---|---|---|---|---|---|
640x480 | 1280x720 | 1920x1080 | ||||
uld | 1 | 3.19 | precision_level=1, confidence_threshold=0.7, coarse_confidence_threshold=0.3 | 7 | 7 | 8 |
precision_level=2, confidence_threshold=0.7, coarse_confidence_threshold=0.3 | 37 | 38 | 40 | |||
precision_level=3, confidence_threshold=0.7, coarse_confidence_threshold=0.3 | 194 | 187 | 197 | |||
ssyv | 1 | 3.19 | confidence_threshold=0.5, iou_threshold=0.5 | 151 | 150 | 152 |
2 | 46 | 46 | 47 | |||
3 | 96 | 94 | 96 | |||
4 | 3.20 | 1517 | 1506 | 1502 | ||
ssyv_light | 1 | 3.24 | 11 | 11 | 12 | |
blf_front | 1 | 3.19 | confidence_threshold=0.67, iou_threshold=0.5 | 3 | 5 | 9 |
blf_back | 1 | 11 | 13 | 18 |
Модификация по умолчанию -"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]
}
}
- После работы процессинг-блока будет добавлен массив объектов, каждый из которых содержит координаты ограничивающего прямоугольника, уверенность детекции, класс и идентификатор в этом массиве.
{
"image" : {},
"objects": [{
"id": {"type": "long", "minimum": 0},
"class": "face",
"confidence": {"double", "minimum": 0, "maximum": 1},
"bbox": [x1, y2, x2, y2]
}]
}
Определение антропометрических точек
Для определения антропометрических точек (Face Landmarks) в Face SDK используются фиттеры. Фиттеры – это специальные алгоритмы библиотеки libfacerec, результатом работы которых является набор антрометрических точек с 2D/3D координатами, привязанными к задетектированному лицу. Существует несколько вариантов фиттеров, отличающихся набором антопометрических точек, о которых написано ниже.
Антропометрические точки
Существует три набора антропометрических точек: fda, mesh, tddfa.
- Набор tddfa содержит 68 точек лица.
- Набор mesh содержит 470 3D точек лица. Мы рекомендуем использовать его для получения 3D маски лица.
На данный момент доступны следующие модификации:
Модификация | Версия | Версия Face SDK | Время детекции CPU (мс)* | Время детекции GPU (мс)** |
---|---|---|---|---|
fda | 1 | 3.23 | 3 | 3 |
tddfa_faster | 1 | 3.19 | 2 | 1 |
tddfa | 1 | 3.19 | 6 | 2 |
mesh | 1 | 3.19 | 6 | 3 |
** - GPU (NVIDIA GTX 10xx серия)
Модификация по умолчанию -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]
}]
}
- После работы процессинг-блока каждому объекту будет добавлены: 21 ключевые точки лица, точки из набора tddfa или mesh
{
"keypoints": {
"left_eye_brow_left": {"proj" : [x, y]},
"left_eye_brow_up": {"proj" : [x, y]},
"left_eye_brow_right": {"proj" : [x, y]},
"right_eye_brow_left": {"proj" : [x, y]},
"right_eye_brow_up": {"proj" : [x, y]},
"right_eye_brow_right": {"proj" : [x, y]},
"left_eye_left": {"proj" : [x, y]},
"left_eye": {"proj" : [x, y]},
"left_eye_right": {"proj" : [x, y]},
"right_eye_left": {"proj" : [x, y]},
"right_eye": {"proj" : [x, y]},
"right_eye_right": {"proj" : [x, y]},
"left_ear_bottom": {"proj" : [x, y]},
"nose_left": {"proj" : [x, y]},
"nose": {"proj" : [x, y]},
"nose_right": {"proj" : [x, y]},
"right_ear_bottom": {"proj" : [x, y]},
"mouth_left": {"proj" : [x, y]},
"mouth": {"proj" : [x, y]},
"mouth_right": {"proj" : [x, y]},
"chin": {"proj" : [x, y]},
"points": ["proj": [x, y]]
}
}
Пример детекции лиц и определения антопометрических точек лица
Создание процессинг-блоков
Создайте процессинг-блок детектора и фиттера с помощью метода FacerecService.createProcessingBlock
, передав в качестве аргумента контейнер Context с установленными параметрами.
- C++
- Python
- Flutter
- C#
- Java
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);
detectorConfigCtx = {
"unit_type": "FACE_DETECTOR",
"modification": "ssyv",
}
fitterConfigCtx = {
"unit_type": "FACE_FITTER"
}
faceDetector = service.create_processing_block(detectorConfigCtx)
faceFitter = service.create_processing_block(fitterConfigCtx)
Map<String, dynamic> configCtx = {
"unit_type": "FACE_DETECTOR",
"modification": "ssyv",
};
ProcessingBlock faceDetector = service.createProcessingBlock(configCtx);
Dictionary<object, object> detectorConfigCtx = new();
detectorConfigCtx["unit_type"] = "FACE_DETECTOR";
detectorConfigCtx["modification"] = "ssyv";
Dictionary<object, object> fitterConfigCtx = new();
fitterConfigCtx["unit_type"] = "FACE_FITTER";
ProcessingBlock faceDetector = service.CreateProcessingBlock(detectorConfigCtx);
ProcessingBlock faceFitter = service.CreateProcessingBlock(fitterConfigCtx);
Context detectorConfigCtx = service.createContext();
detectorConfigCtx.get("unit_type").setString("FACE_DETECTOR");
detectorConfigCtx.get("modification").setString("ssyv");
Context fitterConfigCtx = service.createContext();
fitterConfigCtx.get("unit_type").setString("FACE_FITTER");
ProcessingBlock faceDetector = service.createProcessingBlock(detectorConfigCtx);
ProcessingBlock faceFitter = service.createProcessingBlock(fitterConfigCtx);
Перечень настраиваемых параметров процессинг-блоков
Запуск детекции
Нужно подать Context-контейнер с бинарным изображением в процессинг-блок детектора:
- C++
- Python
- Flutter
- C#
- Java
ioData["image"] = imgCtx;
faceDetector(ioData);
ioData["image"] = imageCtx
faceDetector(ioData)
ioData["image"].placeValues(imageContext);
faceDetector.process(ioData);
ioData["image"] = imgCtx;
faceDetector.Invoke(ioData);
ioData.get("image").setContext(imgCtx);
faceDetector.process(ioData);
Результат выполнения детекции лица сохраняется переданный контейнер Context согласно спецификации процессинг-блока.
Запуск определения антопометрических точек лица
Нужно подать контейнер Context полученный после работы процессинг-блок детектора:
- C++
- Python
- Flutter
- C#
- Java
faceFitter(ioData);
faceFitter(ioData)
faceFitter.process(ioData);
faceFitter.Invoke(ioData);
faceFitter.process(ioData);
Полученный контейнер Context можно передать в методы оценки возраста, пола, качества и принадлежности лица реальному человеку (Оценка лиц), а также в Recognizer.processing
для создания шаблона (Распознавание лиц).