Flutter
Face SDK предоставляет плагин для Flutter, который позволяет реализовать следующие функции:
- детекция лиц на фото
- детекция лиц на видео
- проверка Active Liveness
- верификация лиц
Плагин разработан для iOS и Android устройств.
Примечание
Демонстрационный Flutter сэмпл с плагином Face SDK доступен в директории examples/flutter/demo дистрибутива Face SDK.
#
Подключение плагина Face SDK к flutter-проекту#
Требования- Flutter >=2.2 and <=2.8.1
- Android Studio для Android или XCode для iOS
#
Подключение плагинаДля подключения Face SDK к flutter-проекту, компонент "flutter" должен быть установлен с помощью инсталлятора Face SDK или утилиты maintenancetool:
Если Face SDK не установлен, следуйте инструкции по установке Приступая к работе. Необходимо выбрать компонент "flutter" в разделе "Выбор компонентов".
Если Face SDK установлен без компонента "flutter" (директория flutter отсутствует в корневой директории Face SDK), воспользуйтесь утилитой maintenancetool и установите компонент "flutter", выбрав его в разделе "Выбор компонентов".
Добавить плагины Face SDK и Path Provider в зависимости проекта, указав их в файле <project_dir>/pubspec.yaml
face_sdk_3divi, указав путь до директории с плагином в поле
path
path_provider версии 2.0.0 или выше
Добавить библиотеку libfacerec.so в зависимости проекта
2.a. Для Android-устройств:
указать путь до директории с библиотекой libfacerec.so в блоке
sourceSets
файла build.gradle (<project_dir>/android/app/build.gradle)указать загрузку native-библиотеки в MainActivity.java (<project_dir>/android/app/src/main/java/<android_app_name>/MainActivity.java):
2.b. Для iOS-устройств:
- окрыть файл ios/Runner.xcworkspace в программе XCode
- в меню Target Navigator выбрать "Runner", далее перейти на вкладку "General", в секции "Frameworks, Libraries, and Embedded Content" нажать на кнопку "+". В открывшемся окне нажать "Add Other...", затем "Add Files" и выбрать facerec.framework в Finder
- удалить facerec.framework в секции "Link Binary With Libraries" на вкладке "Build Phases"
Добавить директории и файлы из дистрибутива Face SDK в ассеты приложения:
- Создать директорию <project_dir>/assets (если отсутствует)
- Скопировать директорию lib из директории flutter в <project_dir>/assets
- Скопировать необходимые файлы из директорий conf и share в <project_dir>/assets/conf и <project_dir>/assets/share
- Создать директорию <project_dir>/assets/license
- Скопировать файл лицензии 3divi_face_sdk.lic в директорию <project_dir>/assets/license
Указать список директорий и файлов в <project_dir>/pubspec.yaml, пример:
Примечание
Flutter не копирует директории рекурсивно, поэтому необходимо указывать каждую директорию с файлами.
Добавить в проект функцию копирования ассетов во внутреннюю память приложения (это требуется для корректной работы Face SDK).
dataDir
- это директория, в которую были скопированы папки conf, share and license из дистрибутива Face SDK.Добавить в приложение импорт модуля face_sdk_3divi, а также необходимые дополнительные модули:
#
Работа с плагиномРабота с плагином начинается с инициализации FacerecService
, который позволит создавать другие
примитивы Face SDK для детекции, отслеживания и сравнения лиц.
Пример инициализации объекта FacerecService
в функции main()
:
#
Базовые примитивы#
ConfigРабота с примитивами Face SDK построена на конфигурационных файлах. Например, конфигурационный файл детектора - common_capturere_uld_fda.xml, трекера лиц - video_worker_fdatracker_uld_fda.xml.
Класс Config
инициализируется названием конфигурационного файла и позволяет переопределять его
параметры (например, минимальный Score детектируемых лиц).
#
RawSampleДанный примитив содержит информацию о задетектированном лице.
#
Детекция лиц на изображенияхДля детектирования лиц на фотографиях в Face SDK используется компонент Capturer
. Чтобы его создать,
вызовите у инициализированного объекта FacerecService
метод FacerecService.createCapturer
и в качестве аргумента
передайте объект Config
:
Для получения детекций используется метод Capturer.capture
, который принимает закодированное изображение:
В результате выполнения метода вернется список объектов RawSample
, каждый из которых описывает отдельное задетектированное
лицо. Если детекций на изображении не будет, то метод вернет пустой список.
Для получения детекций с камеры устройства можно использовать метод CameraController.takePicture, который сохраняет изображение в памяти устройства, при этом изображение необходимо предварительно загрузить (далее можно удалить сохраненное изображение):
Более подробную информацию о CameraController можно найти по ссылке.
Использование CameraController во Flutter подробно описано по ссылке.
Для обрезки лица (кроп) можно использовать cutFaceFromImageBytes
:
Примечание
Пример виджета, использующего объект Capturer
для детекции лиц через камеру устройства, можно найти в examples/flutter/demo/lib/photo.dart.
#
Отслеживание лиц на видеопоследовательности и проверка Active LivenessДля отслеживания лиц и выполнения проверки Active Liveness на видеопоследовательности используется объект VideoWorker
.
Порядок действий при использовании объекта VideoWorker
:
- создать объект
VideoWorker
- получить кадры с камеры (например, через
cameraController.startImageStream
), затем передать их напрямую вVideoWorker
через методVideoWorker.addVideoFrame
или сохранять кадры в переменную и вызыватьVideoWorker.addVideoFrame
(например, обернув в зацикленную функцию StreamBuilder) - получить результаты обработки от
VideoWorker
, вызвав функциюVideoWorker.poolTrackResults
#
1. Создание объекта VideoWorkerОбъект VideoWorker
используется для отслеживания лиц на видеопоследовательности и выполнения проверки Active Liveness.
Для создания объекта VideoWorker
необходимо вызвать метод FacerecService.createVideoWorker
который принимает структуру VideoWorkerParams
, содержащую параметры инициализации:
Набор проверок Active Liveness определяется при инициализации свойства active_liveness_checks_order
, которому
передается список действий - сценарий проверки (пример приведен выше).
Доступные проверки Active Liveness:
- TURN_LEFT
- SMILE
- TURN_DOWN
- TURN_RIGHT
- TURN_UP
- BLINK
При использовании видеопоследовательности с камеры необходимо также учитывать базовый угол поворота изображения камеры (можно ориентироваться
на CameraController.description.sensorOrientation).
Для VideoWorker
изображение поворачивать не обязательно, однако необходимо определить параметр base_angle
в соответствии с поворотом камеры.
Для sensorOrientation == 90
установите значение параметра baseAngle = 1,
для sensorOrientation == 270
= 2.
Примечание
Изображение с фронтальной камеры устройств iOS зеркально отражено по горизонтали - в этом случае необходимо
установить значение "1" для параметра active_liveness.apply_horizontal_flip
.
Пример кода для выбора базового угла
#
2. Обработка видео кадров в VideoWorkerДля обработки видеопоследовательности, необходимо передать кадры в VideoWorker
с помощью метода VideoWorker.addVideoFrame
. VideoWorker
принимает кадры в виде массива пикселей RawImageF
.
Поддерживаемые цветовые модели: RGB, BGR, YUV.
Получать кадры с камеры можно через коллбэк ImageStream:
Пример кода с вызовом метода addVideoFrame
Конвертировать изображения для передачи в `VideoWorker` можно с помощью интегрированных функций `convertRAW`, `convertBGRA8888`.
Для независимой работы ImageStream
и VideoWorker
(вызов addVideoFrame
не должен блокировать video stream)
можно использовать StreamBuilder для асинхронного вызова функции addVideoFrame
.
Пример кода для вызова addVideoFrame c StreamBuilder
Коллбэк потока изображений (сохранение изображения и отметки времени в глобальные переменные):
Асинхронная функция передачи кадров в VideoWorker:
Виджет (можно совмещать с другими):
#
3. Получение результатов отслеживанияДля получения результатов операций VideoWorker
, необходимо вызвать метод VideoWorker.poolTrackResults
, который вернет
структуру с данными о текущих отслеживаемых персонах.
Статус Active Liveness содержится в TrackingData.tracking_callback_data
:
Пример реализации проверок Active Liveness
Определение статуса Active Liveness:
Получение результатов трекинга:
Виджет (можно совмещать с другими):
#
4. Получение лучшего снимка (best shot) по завершении проверки Active LivenessДля получения лучшего снимка лица (best shot) необходимо вызвать
метод VideoWorker.resetTrackerOnStream
после успешного прохождения проверок Active Liveness. Метод сбрасывает
состояние трекера и активирует LostTrackingData
в VideoWorker
. Коллбэк LostTrackingData
возвращает лучший снимок лица,
который может быть использован для создания шаблона лица - Template
.
Далее face_template_vw
может использоваться для сравнения с другими шаблонами и получения оценки сходства.
Пример кода для получения шаблона лица
После вызова метода videoWorker.poolTrackResults
(пример приведен выше),
в LostTrackingData
будет доступен атрибут best_quality_sample
, который можно использовать для получения шаблона лица.
Чтобы получить фото лица, необходимо сохранить лучший снимок CameraImage и обновлять его при получении более высокого качества:
Для обрезки изображения лица используется метод cutFaceFromCameraImage
:
Примечание
Пример виджета, который использует объект VideoWorker
и выполняет проверку Active Liveness c фронтальной камеры,
можно найти в examples/flutter/demo/lib/photo.dart.
#
Верификация лицДля построения и сравнения шаблонов лиц используется объект Recognizer
. Этот объект создается в результате вызова
метода FacerecService.createRecognizer
, которому необходимо передать аргумент - имя конфигурационного файла распознавателя:
Порядок выполнения операций при сравнении лиц:
- детекция лица
- построение шаблона лица
- сравнение шаблона лица с другими шаблонами
Пример реализации сравнения двух лиц (предполагается, что созданы все необходимые объекты Face SDK и на каждом изображении есть одно лицо):
#
Сравнение лица на документе и лица, прошедшего проверку Active LivenessДля сравнения лица на документе и лица, прошедшего проверку Active Liveness, необходимо построить шаблоны этих лиц.
- Детекция лица на документе и построение шаблона
face_template_idcard
:
Получение шаблона лица
face_template_vw
от объектаVideoWorker
после прохождения проверки Active Liveness (пример приведен выше)Сравнение шаблонов
face_template_idcard
иface_template_vw
с помощью методаRecognizer.verifyMatch
: