Детекция лиц
Детекция лиц состоит из нескольких этапов:
- Детектия лица на изображении. Результатом этого этапа является рамка вокруг задетектированного лица. Существует несколько вариантов детекторов о которых написано ниже.
- Фиттинг (расстановка) антропометрических точек. Результатом этого этапа является набор антрометрических точек с 2D/3D координатами, привязанными к конкретному задетектированному лицу. Существует несколько вариантов фиттеров, отличающихся набором антопометрических точек, о которых написано ниже.
- Вычисление углов поворота лица относительно оси наблюдения. Результатом этого этапа являются три угла поворота лица: pitch, yaw, roll. Точность определения углов зависит от используемого набора антропометрических точек.
Для выполнения детекции лиц используется класс Capturer
. При создании объекта класса используется файл конфигурации, в котором задаются тип используемого детектора и тип используемого набора антропометрических точек (см. Конфигурационные файлы детекторов). Также в конфигурационном файле можно настроить различные параметры детектирования, влияющие на качество и скорость работы всего алгоритма. Детектор и набор используемых точек указывается в названии файла конфигурации, например: common_capturer_blf_fda_front.xml
- детектор blf, набор точек fda.
Существует отдельный вариант детекции лиц, совмещенный с трекингом лиц в видеопотоке - в этом случае алгоритм предполагает, что на вход подается набор последовательных кадров из видео и осуществляется трекинг лиц от кадра к кадру. Кроме описанных выше этапов добавляется этап трекинга лиц и дополнительно выдается уникальный идентификатор для каждого лица, который не меняется с момента обнаружения лица в видеопотоке и до момента его потери. Такие конфигурации в названии файла содержат слово video, например, common_video_capturer_fda.xml
. На данный момент доступны два трекера:
- common_video_capturer - обеспечивает высокую скорость, но качество при этом ниже, чем у трекера fda_tracker_capturer
- fda_tracker_capturer - обеспечивает высокое качество, но скорость при этом ниже, чем у трекера common_video_capturer
Детекторы
На данный момент доступны следующие детекторы:
- LBF – устаревший детектор, не рекомендован к использованию;
- BLF – детектор, обеспечивающий более высокое качество и скорость детекции, чем LBF, для лиц среднего размера и больше (в т.ч. в масках). На Android позволяет использовать GPU ускорение (включено по умолчанию);
- REFA – детектор, более медленный в сравнении с детекторами LBF и BLF, но при этом гарантирует высокое качество детекции лиц различных размеров (в т.ч. в масках). Рекомендован для использования в экспертных системах;
- ULD – новый детектор, более быстрый в сравнении с REFA. Позволяет детектировать лица различных размеров (в т.ч. в масках).
Для детекторов LBF, REFA, ULD размер детектируемых лиц можно задать через параметр min_size
(см. пункт Подробная информация о параметрах Capturer). Уменьшение значения данного параметра увеличивает время детекции.
Ниже представлены примеры работы разных детекторов в различных условиях.
Нажмите, чтобы развернуть таблицу
BLF (score_threshold=0.6) | REFA (min_size=0.2, score_threshold=0.89) | ULD (min_size=10, score_threshold=0.7) |
Ниже представлены примеры работы разных детекторов на различных порогах.
Нажмите, чтобы развернуть таблицу
ULD (score_threshold=0.4) | ULD (score_threshold=0.7) | REFA (score_threshold=0.89) |
Вы можете использовать созданный детектор для обнаружения и отслеживания лиц. Существует два способа подать изображение на вход детектору:
- подать данные раскодированного изображения в метод
Capturer.capture(final RawImage image)
, используя классRawImage
(см. Сэмплы) - подать данные закодированного изображения в формате JPEG, PNG, TIF или BMP в метод
Capturer.capture(final byte[] data)
В обоих случаях результатом является список найденных / отслеженных лиц (RawSample
– объект, хранящий найденное лицо).
Для трекера вы также можете вызвать метод Capturer.resetHistory
, чтобы начать отслеживание на новой видеопоследовательности.
Антропометрические точки
Примечание: Узнайте, как отобразить антропометрические точки и углы поворота лица в нашем туториале.
Существует четыре набора точек: esr, singlelbf, doublelbf, fda, mesh.
- Набор esr – первый созданный и единственный набор, доступный в предыдущих версиях SDK. Набор esr содержит 47 точек.
- Наборы singlelbf и doublelbf обеспечивают большую точность, чем esr. Набор singlelbf содержит 31 точку. Набор doublelbf содержит 101 точку. Фактически, он представляет собой два сконкатенированных набора – последние 31 точки набора doublelbf дублируют набор singlelbf (в том же порядке).
- Набор fda обеспечивает высокое качество в широком диапазоне ракурсов (вплоть до профильных), в отличие от предыдущих наборов, поэтому мы рекомендуем использовать детекторы с этим набором. Однако алгоритмы распознавания по-прежнему требуют, чтобы ракурс лица был максимально приближен к фронтальному. Набор fda содержит 21 точку.
- Набор mesh на данный момент является самым новым. Он содержит 470 3D точек лица. Мы рекомендуем использовать его для получения 3D маски лица.
Набор точек fda. RawSample.getLeftEye возвращает точку 7. RawSample.getRightEye возвращает точку 10 | Набор точек esr. RawSample.getLeftEye возвращает точку 16. RawSample.getRightEye возвращает точку 17 |
---|---|
Набор точек singlelbf. RawSample.getLeftEye возвращает точку 29. RawSample.getRightEye возвращает точку 30. | Первые 70 точек набора doubleldb (остальные 31 точки взяты из набора singlelbf). RawSample.getLeftEye возвращает точку 68. RawSample.getRightEye возвращает точку 69 |
---|---|
Набор точек mesh. RawSample.getLeftEye возвращает точку 468. | RawSample.getRightEye возвращает точку 469 |
---|---|
Класс Capturer
Для захвата лиц необходимо создать объект Capturer
с помощью метода FacerecService.createCapturer
, передав путь к конфигурационному файлу или объект FacerecService.Config
. При передаче пути к конфигурационному файлу будут использованы параметры по умолчанию. При использовании FacerecService.Config
можно переопределить значение любого числового параметра из конфигурационного файла. Также значения некоторых параметров можно изменить в уже созданном объекте Capturer
с помощью метода Capturer.setParameter
. Примеры использования объекта Capturer
см. здесь.
Тип и характеристики созданного детектора зависят от переданного в FacerecService.createCapturer
конфигурационного файла или объекта FacerecService.Config
.
Примечание: Для детекции лиц на видеопотоках рекомендуется использовать интерфейсный объект VideoWorker
. Если при создании VideoWorker
указаны параметры matching_thread=0
и processing_thread=0
, то потребляется обычная лицензия Face Detector.
Примеры использования объекта Capturer
Пример №1
- C++
- C#
- Java
- Python
pbio::Capturer::Ptr capturer = service->createCapturer("common_capturer4.xml");
Capturer capturer = service.createCapturer("common_capturer4_lbf.xml");
final Capturer capturer = service.createCapturer(service.new Config("common_capturer4_lbf.xml"));
capturer = service.create_capturer(Config("common_capturer4_lbf.xml"))
Пример №2
- C++
- C#
- Java
- Python
pbio::FacerecService::Config capturer_config("common_capturer4.xml");
capturer_config.overrideParameter("min_size", 200);
pbio::Capturer::Ptr capturer = service->createCapturer(capturer_config);
FacerecService.Config capturerConfig = new FacerecService.Config("common_capturer4_lbf.xml");
capturerConfig.overrideParameter("min_size", 200);
Capturer capturer = service.createCapturer(capturerConfig);
FacerecService.Config capturerConfig = service.new Config("common_capturer4_lbf.xml");
capturerConfig.overrideParameter("min_size", 200);
final Capturer capturer = service.createCapturer(capturerConfig);
capturer_config = Config("common_capturer4_lbf.xml")
capturer_config.override_parameter("min_size", 200)
capturer = service.createCapturer(capturer_config)
Пример №3
- C++
- C#
- Java
pbio::Capturer::Ptr capturer = service->createCapturer("common_capturer4.xml");
capturer->setParameter("min_size", 200);
capturer->setParameter("max_size", 800);
// capturer->capture(...);
// ...
capturer->setParameter("min_size", 100);
capturer->setParameter("max_size", 400);
// capturer->capture(...);
Capturer capturer = service.createCapturer("common_capturer4_lbf.xml");
capturer.setParameter("min_size", 200);
capturer.setParameter("max_size", 800);
// capturer.capturer(...);
// ...
capturer.setParameter("min_size", 100);
capturer.setParameter("max_size", 400);
// capturer.capture(...);
Capturer capturer = service.createCapturer(service.new Config("common_capturer4_lbf.xml"));
capturer.setParameter("min_size", 200);
capturer.setParameter("max_size", 800);
// capturer.capturer(...);
// ...
capturer.setParameter("min_size", 100);
capturer.setParameter("max_size", 400);
// capturer.capture(...);
Обрезка лиц
Для обрезки лица вы можете вызвать метод RawSample.cutFaceImage
. Изображение обрезанного лица будет сохранено в указанном формате.
Доступные типы обрезки (RawSample.FaceCutType
):
- FACE_CUT_BASE - базовый (подходит для образцов всех типов).
- FACE_CUT_FULL_FRONTAL - полный фронтальный ТИЛ (тип изображения лица) по ГОСТ Р ИСО / МЭК 19794-5 (ISO/IEC 19794-5 Full Frontal) (только для фронтальных образцов). Используется для сохранения изображений лица в электронных биометрических документах.
- FACE_CUT_TOKEN_FRONTAL - условно фронтальный ТИЛ (тип изображения лица) по ГОСТ Р ИСО / МЭК 19794-5 (ISO/IEC 19794-5 Token Frontal) (только для фронтальных образцов).
Для предварительного просмотра обрезки вызовите метод RawSample.getFaceCutRectangle
, указав тип обрезки. В результате вы получите четыре точки – углы прямоугольника, которые будут использованы для обрезки.
Пример использования см. в разделе Сэмплы.
Класс RawSample
При помощи RawSample вы можете:
- получить id, назначенное сэмплу при детекции (
RawSample.getID
) в том случае, если объект был получен от трекера - получить прямоугольник лица (
RawSample.getRectangle
), углы (RawSample.getAngles
), левый / правый глаз (RawSample.getLeftEye
/RawSample.getRightEye
, см. Антропометрические точки), антропометрические точки (RawSample.getLandmarks
, см. Антропометрические точки), если если лицо расположено фронтально (т.е. получено фронтальным детектором / трекером) - обрезать лицо (см. Обрезка лиц, test_facecut)
- уменьшить внутреннее изображение лица до предпочтительного размера (
RawSample.downscaleToPreferredSize
) - сериализовать объект в бинарном формате (
RawSample.save
илиRawSample.saveWithoutImage
), после чего вы можете десериализовать объект методомFacerecService.loadRawSample
илиFacerecService.loadRawSampleWithoutImage
- передать объект в методы оценки возраста, пола, качества и принадлежности лица реальному человеку (см. Оценка лиц, test_facecut, test_videocap)
- передать объект в
Recognizer.processing
для создания шаблона (см. Идентификация лиц, test_identify)
Подробная информация о параметрах Capturer
Нажмите, чтобы отобразить список параметров из конфигурационных файлов, которые могут быть изменены с помощью объекта FacerecService.Config.overrideParameter
max_processed_width
иmax_processed_height
– (только трекеры) ограничение размера изображения, подаваемого во внутренний детектор новых лиц.min_size
иmax_size
– минимальный и максимальный размер лица для детекции (для трекеров: размер определен для изображения, уже уменьшенного под ограниченияmax_processed_width
иmax_processed_height
).min_neighbors
– целочисленный параметр детектора. Обратите внимание, большие значения требуют более высокой степени подтверждения детекции. Вы можете изменить этот параметр, исходя из ситуации, к примеру, увеличить значение, если наблюдается большое количество ложных детекций, и уменьшить значение, если большое количество лиц не детектируется. Не меняйте этот параметр, если вы не уверены.min_detection_period
– (только трекеры) вещественное число, означающее минимальное время (в секундах) между двумя запусками внутреннего детектора. Используется для уменьшения нагрузки на процессор. Нулевое значение отключает ограничение. Большие значения увеличивают задержку обнаружения новых лиц.max_detection_period
– (только трекеры) целое число, означающее максимальное время (в кадрах) между двумя запусками внутреннего детектора. Нулевое значение отключает ограничение. Например, если вы обрабатываете видео оффлайн, вы можете выставить значение1
, чтобы не пропустить ни одного лица.max_occlusion_time_wait
– (только трекеры) вещественное число в секундах. Когда трекер обнаруживает перекрытие лица, он удерживает позицию лица и пытается отследить его на новых кадрах в течение этого времени.fda_max_bad_count_wait
– целое число. Когдаfda_tracker
обнаруживает снижение качества лица, он пытается отследить это лицо с помощью трекера общего назначения (вместо алгоритма fda, разработатнного для лиц) в течение не болееfda_max_bad_count_wait
кадров.base_angle
– целое число:0
,1
,2
или3
. Ориентация камеры:0
– стандартная,1
означает 90 градусов,2
означает -90 градусов,3
означает 180 градусов.fake_detections_cnt
– целое число. Количество стартовых позиций для поиска лиц при конфигурацииvideo_worker_fdatracker_fake_detector.xml
.fake_detections_period
– целое число. Каждая стартовая позиция будет использоваться раз вfake_detections_period
кадров.fake_rect_center_xN
,fake_rect_center_yN
,fake_rect_angleN
,fake_rect_sizeN
– вещественные числа. Параметры стартовых позиций. N от0
доfake_detections_cnt – 1
включительно.fake_rect_center_xN
– x координата центра относительно ширины изображения.fake_rect_center_yN
– y координата центра относительно высоты изображения.fake_rect_angleN
– угол roll в градусах.fake_rect_sizeN
– размер относительно max(ширина изображения, высота изображения).downscale_rawsamples_to_preferred_size
– целое число,1
– включен,0
– выключен. По умолчанию этот флаг включен. Когда флаг включен,Capturer
уменьшает все образцы до предпочтительного размера (см.RawSample.downscaleToPreferredSize
) в целях уменьшения потребления памяти. Однако это приводит к снижению производительности. Рекомендуется отключатьdownscale_rawsamples_to_preferred_size
и использоватьRawSample.downscaleToPreferredSize
вручную для образцов, которые вам нужно сохранить или в течение длительного времени удерживать в оперативной памяти.