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

Детекция лиц

Детекция лиц состоит из нескольких этапов:

  1. Детектия лица на изображении. Результатом этого этапа является рамка вокруг задетектированного лица. Существует несколько вариантов детекторов о которых написано ниже.

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

  1. Вычисление углов поворота лица относительно оси наблюдения. Результатом этого этапа являются три угла поворота лица: 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. Позволяет детектировать лица различных размеров (в т.ч. в масках).

Для детекторов BLF, REFA и ULD доступно получение степени уверенности детекции (confidence). Для этого необходимо вызвать метод RawSample.getScore(). В результате вернется число с плавающей точкой в диапазоне [0, 1].

Для детекторов 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

Расширенный набор точек глаз

Помимо стандартных антропометрических точек лица вы можете получить расширенный набор точек глаз, который включает в себя точки зрачков и век. Для получения данного набора необходимо вызвать метод RawSample.getIrisLandmarks(). В результате вернется вектор из 40 точек для левого и правого глаза в порядке, указанном на изображении ниже. Для каждого глаза возвращается 20 точек: первые 5 точек относятся к зрачку (центр и точки на окружности), остальные 15 точек образуют контур век. Пример отрисовки доступен в демонстрационной программе demo (C++/Java/C#).

Для получения набора точек глаз необходимо включить параметр iris_enabled в конфигурационном файле (например, через метод переопределения параметров конфигурационного файла overrideParameter). При выключенном параметре векторы будут пустыми.

Класс 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

pbio::Capturer::Ptr capturer = service->createCapturer("common_capturer4.xml");

Пример №2

pbio::FacerecService::Config capturer_config("common_capturer4.xml");
capturer_config.overrideParameter("min_size", 200);
pbio::Capturer::Ptr capturer = service->createCapturer(capturer_config);

Пример №3

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(...);

Обрезка лиц

Обрезка лица может быть выполнена одним из следующих методов:

  • RawSample.cutFaceImage: обрезанное лицо сохраняется в указанный поток (например, в файл), формат кодирования выбирается через RawSample.ImageFormat
  • RawSample.cutFaceRawImage: обрезанное лицо возвращается в формате RawImage (в нем хранятся незакодированные пиксели изображения в формате RGB/BGR/GRAY (формат выбирается через RawImage.Format)

Примеры использования RawSample.cutFaceRawImage:

auto raw_image_crop = sample->cutFaceRawImage(
pbio::RawImage::Format::FORMAT_BGR,
pbio::RawSample::FACE_CUT_FULL_FRONTAL);
cv::Mat img_crop(raw_image_crop.height, raw_image_crop.width, CV_8UC3, (void*) raw_image_crop.data);

Доступные типы обрезки (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 вручную для образцов, которые вам нужно сохранить или в течение длительного времени удерживать в оперативной памяти.