- Создание Android приложения для обнаружения лиц в режиме реального времени с использованием Firebase ML Kit
- Камера (Camera)
- Кадр (Frame)
- Детектор лиц (Face Detector)
- Оверлей (Overlay)
- Создание приложения для обнаружения лиц в реальном времени за 3 шага
- Заключение
- Обнаружение лица на фото с помощью Android FaceDetector.Face API
- 1. Обзор
- 3. Предварительные условия
- 4. Создание приложения
- Обновление build.gradle
- Обновление Google Play Services
- Создаем базовый пользовательский интерфейс
- Отредактируйте ваш AndroidManifest.xml
- Добавление распознавания лиц к вашему приложению
- 5. Написание кода приложения
- Введение в обнаружение лиц на Android
- 1. Настройка проекта
- 2. Обнаружение лиц
- 3. Понимание ориентиров
- 4. Дополнительные данные лица
- Заключение
Создание Android приложения для обнаружения лиц в режиме реального времени с использованием Firebase ML Kit
В начале этого года Google представил новый продукт: Firebase Machine Learning Kit. ML Kit позволяет эффективно использовать возможности машинного обучения в Android и iOS приложениях. В этом посте я буду рассказывать о том, как с его помощью создать Android приложение для обнаружения лиц в реальном времени.
Обнаружение лиц — это только одна из возможностей компьютерного зрения, которую предлагает Firebase ML Kit (или, вернее, облегчает её использование). Это функция, которая может быть полезна во многих приложениях: подписывание людей на фотографиях, работа с селфи, добавление эмоджи и других эффектов во время съёмки, фотографирование только тогда, когда все улыбаются с открытыми глазами, и т.д. Возможности безграничны.
Мы уже публиковали статьи о других функциях Firebase ML Kit:
Однако, реализовать детектор лиц в собственном приложении по-прежнему нелегко. Нужно понять, как работает API, какую информацию он предоставляет, как её обрабатывать и использовать, учитывая ориентацию устройства, источник камеры и выбранную камеру (переднюю или заднюю).
В идеале мы должны получить код вроде этого:
Основные компоненты здесь — это camera, frame, faceDetector. Прежде чем разобраться с каждым из них, предположим, что наш layout содержит сам компонент камеры и некий оверлей, на котором мы будем рисовать квадратики вокруг обнаруженных лиц.
Камера (Camera)
Независимо от того, какой API-интерфейс камеры мы используем, самое главное, чтобы он предоставлял способ обработки отдельных кадров. Таким образом, мы сможем обрабатывать каждый входящий кадр, идентифицировать лица в нём и отображать это пользователю.
Кадр (Frame)
Кадр представляет собой информацию, предоставленную камерой, для обнаружения лиц. Он должен содержать всё, что требуется детектору лиц для их обнаружения. Эта необходимая информация определяется ниже:
- data — массив байтов, содержащий информацию о том, что камера отображает;
- rotation — ориентация устройства;
- size — ширина и высота предпросмотра камеры;
- format — формат кодирования кадров;
- isCameraFacingBack — указывает, используется ли передняя камера или задняя.
Детектор лиц (Face Detector)
Детектор лиц является самым важным компонентом — он берёт кадр, обрабатывает его и затем выводит результаты пользователю. Таким образом, детектор лиц использует экземпляр FirebaseVisionFaceDetector для обработки входящих кадров с камеры. Он также должен знать ориентацию камеры и её направление (передняя или задняя). Наконец, он должен знать на каком оверлее будут отображаться результаты. Скелет класса FaceDetector выглядит так:
Оверлей (Overlay)
Оверлей — это View-компонент, который находится поверх камеры. Он отображает рамки (или границы) вокруг обнаруженных лиц. Он должен знать ориентацию устройства, направление камеры (передняя или задняя) и размеры камеры (ширина и высота). Эта информация помогает определить, как рисовать границы вокруг обнаруженного лица, как масштабировать границы и следует ли их отражать.
На приведённой ниже диаграмме показаны компоненты, описанные выше, и способы взаимодействия их друг с другом с момента, когда камера подаёт на вход кадр, до момента, когда результаты отображаются пользователю.
Создание приложения для обнаружения лиц в реальном времени за 3 шага
Используя библиотеку для обнаружения лиц (которая содержит код, описанный выше), создание приложения становится довольно простым.
В этом примере я выбрал следующую библиотеку камеры.
Шаг 1. Добавьте FaceBoundsOverlay поверх камеры.
Шаг 2. Определите экземпляр FaceDetection и подключите его к камере.
Шаг 3. Настройте Firebase в проекте.
Заключение
Обнаружение лиц — это мощный функционал, а ML Kit делает его доступным и позволяет разработчикам выполнять с его помощью более сложные функции, такие как распознавание лиц, что выходит за рамки простого обнаружения: важно не только обнаружить лицо, но и определить, чьё оно.
Скоро в Ml Kit планируют добавить новую функцию — распознавание контура лица. С её помощью можно будет обнаруживать более 100 точек вокруг лица и быстро обрабатывать их. Это потенциально может быть полезно в приложениях с использованием объектов дополненной реальности или виртуальных стикеров (таких как Snapchat). Вместе функционалом обнаружения лиц можно будет создать много интересных приложений.
Источник
Обнаружение лица на фото с помощью Android FaceDetector.Face API
1. Обзор
3. Предварительные условия
4. Создание приложения
Обновление build.gradle
Сейчас самая свежая версия библиотеки Play services 9.4. Копируем и вставляем в секцию зависимостей файла сборки нашего проекта.
Обновление Google Play Services
Google Play services часто обновляется, чтобы получить последнюю версию, нажмите в Android Studio Tools > Android > SDK Manager:
Затем найдите запись для Google Play Services и убедитесь, что у вас стоит 26 или более поздней версии:
Создаем базовый пользовательский интерфейс
. Удалите его и добавьте компонент ImageView, в который будет загружаться изображение.
Отредактируйте ваш AndroidManifest.xml
Вы должны отредактировать файл AndroidManifest.xml, добавив такие строки:
Это гарантирует, что библиотеки для распознавания лиц будут доступны приложению.
Общий вид манифеста приложения:
Добавление распознавания лиц к вашему приложению
Обычно в приложениях делают снимки с камеры устройства, или обрабатывают превью, полученное из камеры устройства. В конце статьи есть ссылка на проекты Google, с образцами такого кода.
Назовите его test1.jpg и добавьте в каталог res/drawable в файловой системе. Android Studio делает файл доступным в качестве ресурса, с идентификатором: R.drawable.test1
5. Написание кода приложения
Вот полный набор импортов классов, используемых в главном активити:
Весь код пишем в методе onCreate. Это не совсем правильно с точки зрения архитектуры приложения, но для нашего упрощенного примера опустим эти условности.
Источник
Введение в обнаружение лиц на Android
Представленная с библиотеками Vision в Play Services 8.1, Face Detection позволяет вам как разработчику анализировать видео или изображение, чтобы найти человеческие лица. Когда у вас есть список лиц, обнаруженных на изображении, вы можете собирать информацию о каждом лице, таком как ориентация, вероятность улыбки, открывать или закрывать глаза у кого-то, а также конкретные ориентиры на их лице.
Эта информация может быть полезна для нескольких приложений, таких как приложение для камеры, которое автоматически делает снимок, когда все в рамке улыбаются с открытыми глазами или для увеличения изображений с глупыми эффектами, такими как рожки единорога. Важно отметить, что распознавание лиц не является распознаванием лица. Хотя информация может быть собрана о лицах, эта информация не используется библиотекой Vision для определения того, являются ли два лица одним и тем же лицом.
В этом руководстве будет использоваться неподвижное изображение для запуска API обнаружения лиц и сбора информации о людях на фотографии, а также иллюстрации этой информации с наложенной графикой. Весь код этого руководства можно найти на GitHub.
1. Настройка проекта
Чтобы добавить библиотеку Vision в свой проект, вам необходимо импортировать Play Services 8.1 или более в ваш проект. В этом учебнике импортируется только библиотека Play Services Vision. Откройте файл build.gradle вашего проекта и добавьте следующую строку компиляции в узел dependecies .
После того, как вы включили Play Services в свой проект, вы можете закрыть файл build.gradle вашего проекта и открыть AndroidManifest.xml. Вам нужно добавить элемент meta-data , определяющий зависимость лица в узле application вашего манифеста. Это позволяет библиотеке Vision знать, что вы планируете обнаруживать лица в своем приложении.
Когда вы закончите настройку AndroidManifest.xml, вы можете продолжить и закрыть его. Затем вам нужно создать новый класс с именем FaceOverlayView.java. Этот класс расширяет View и содержит логику обнаружения лиц в проекте, отображая растровое изображение, которое было проанализировано и нарисовано поверх изображения, чтобы проиллюстрировать точки.
Начнем с добавления переменных-членов в верхней части класса и определения конструкторов. Объект Bitmap будет использоваться для хранения растрового изображения, которое будет проанализировано, и объекты SparseArray of Face будут хранить каждое лицо, найденное в растровом изображении.
Затем добавьте новый метод внутри FaceOverlayView , называемый setBitmap (Bitmap bitmap) . На данный момент это просто сохранит битмап, переданный ему, однако позже вы будете использовать этот метод для анализа изображения.
Затем вам нужно растровое изображение. Я включил один в пример проекта GitHub, но вы можете использовать любое изображение, которое вы хотели бы, чтобы играть с Face Detection и посмотреть, что работает, а что нет. Когда вы выбрали изображение, поместите его в каталог res/raw. В этом учебнике предполагается, что изображение называется face.jpg.
После того, как вы поместили свое изображение в каталог res/raw, откройте res/layout/activity_main.xml. Этот макет содержит ссылку на FaceOverlayView , чтобы он отображался в MainActivity .
С установленным макетом откройте MainActivity и настройте FaceOverlayView из onCreate() . Вы делаете это, получая ссылку на представление, просматривая файл изображения face.jpg из исходного каталога в качестве входного потока и преобразуя его в растровое изображение. После того, как у вас есть растровое изображение, вы можете вызвать setBitmap на FaceOverlayView , чтобы передать изображение в свое пользовательское представление.
2. Обнаружение лиц
Теперь, когда ваш проект настроен, пришло время начать распознавать лица. Android. В setBitmap (Bitmap bitmap) вам необходимо создать FaceDetector . Это можно сделать с помощью FaceDetector.Builder , позволяя вам определить несколько параметров, которые влияют на то, как будут распознаваться быстрые лица и какие другие данные создаст FaceDetector .
Параметры, которые вы выбираете, зависят от того, что вы пытаетесь сделать в своем приложении. Если вы включите поиск ориентиров, то лица будут обнаружены медленнее. Как и в большинстве случаев в программировании, все имеет свои компромиссы. Чтобы узнать больше о вариантах, доступных для FaceDetector.Builder , вы можете найти официальную документацию на веб-сайте разработчика
Вам также необходимо проверить, работает ли FaceDetector . Когда пользователь впервые использует обнаружение лиц на своем устройстве, Play Services необходимо выйти и получить набор небольших собственных библиотек для обработки запроса вашего приложения. Хотя это почти всегда будет сделано до того, как ваше приложение завершит запуск, важно справиться с непредвиденными обстоятельствами, что это не удалось.
Если FaceDetector работает, вы можете преобразовать растровое изображение в объект Frame и передать его детектору для сбора данных о лицах на изображении. Когда вы закончите, вам нужно будет отпустить детектор, чтобы предотвратить утечку памяти. Когда вы закончите обнаружение лиц, вызовите invalidate() , чтобы вызвать перерисовку представления.
Теперь, когда вы обнаружили лица на своем изображении, пришло время их использовать. В этом примере вы просто нарисуете зеленую рамку вокруг каждого лица. Поскольку invalidate() вызывается после того, как лица были обнаружены, вы можете добавить всю необходимую логику в onDraw (Canvas canvas) . Этот метод гарантирует, что битмап и грани установлены, затем нарисуйте растровое изображение на холсте, а затем нарисуйте квадрат вокруг каждой грани.
Так как разные устройства имеют разные размеры дисплея, вы также будете отслеживать масштабированный размер растрового изображения, чтобы все изображение было всегда видимым на устройстве, и все наложения рисуются соответствующим образом.
Метод drawBitmap (Canvas canvas) рисует ваше растровое изображение на холсте и соответствующим образом определяет его, а также возвращает множитель для правильного масштабирования ваших других измерений.
Метод drawFaceBox (Canvas canvas, double scale) становится немного интереснее. Каждое обнаруженное и сохраненное лицо имеет значение позиции выше и слева от каждого лица. Этот метод займет это положение и нарисует из него зеленый прямоугольник, чтобы охватить каждую грань в зависимости от ее ширины и высоты.
Вам нужно определить свой объект Paint , а затем прокрутить каждое Face в вашем SparseArray , чтобы найти его положение, ширину и высоту и нарисовать прямоугольник на холсте, используя эту информацию.
На этом этапе вы сможете запустить приложение и увидеть свое изображение с прямоугольниками вокруг каждого обнаруженного лица. Важно отметить, что API распознавания лиц по-прежнему остается довольно новым на момент написания этой статьи, и он не может обнаружить каждого лица. Вы можете играть с некоторыми настройками в объекте FaceDetector.Builder , чтобы надеяться собрать больше данных, хотя это не гарантировано.
3. Понимание ориентиров
Ориентиры — это точки интереса на лице. API Face Detection API не использует ориентиры для обнаружения лица, а скорее определяет лицо целиком, прежде чем искать ориентиры. Вот почему открытие ориентиров — это необязательная настройка, которая может быть активирована через FaceDetector.Builder .
Вы можете использовать эти ориентиры в качестве дополнительного источника информации, например, где находятся глаза субъекта, чтобы вы могли реагировать соответствующим образом в своем приложении. Есть 12 ориентиров, которые можно найти:
- левый и правый глаз
- левое и правое ухо
- левый и правый ушные наконечники
- основание носа
- левая и правая щека
- левый и правый угол рта
- основание рта
Знаки, которые доступны, зависят от угла распознанного лица. Например, у кого-то, стоящего перед боком, будет только один глаз, который означает, что другой глаз не будет обнаружен. В следующей таблице показано, какие ориентиры должны обнаруживаться на основе угла Эйлера Y (направление влево или вправо) лица.
Euler Y | Видимые ориентиры |
---|---|
36° | Правый правый глаз, правый рот, правое ухо, основание носа, правая щека |
Ориентиры также невероятно просты в использовании в вашем приложении, поскольку вы уже включили их во время обнаружения лица. Вам просто нужно вызвать getLandmarks () на объекте Face , чтобы получить List из Landmark , с которыми вы можете работать.
В этом уроке вы нарисуете небольшой круг на каждом обнаруженном ориентире, вызвав новый метод, drawFaceLandmarks(Canvas canvas, double scale) , из onDraw(canvas canvas) вместо drawFaceBox(Canvas canvas, double scale) . Этот метод занимает положение каждого ориентира, настраивает его для масштаба растрового изображения, а затем отображает знаковый круг индикатора.
После вызова этого метода вы должны увидеть маленькие зеленые круги, покрывающие обнаруженные грани, как показано в примере ниже.
4. Дополнительные данные лица
Хотя положение лица и его ориентиров полезно, вы также можете узнать больше информации о каждом лице, обнаруженном в вашем приложении, с помощью некоторых встроенных методов из объекта Face . Методы getIsSmilingProbability () , getIsLeftEyeOpenProbability () и getIsRightEyeOpenProbability () пытаются определить, открыты ли глаза или если обнаруженное лицо улыбается, возвращая поплавок в диапазоне от 0.0 до 1.0. Чем ближе к 1.0, тем более вероятно, что человек улыбается или у него открывается левый или правый глаз.
Вы также можете найти угол лица по осям Y и Z изображения, проверив его значения Эйлера. Значение Z Euler будет всегда сообщаться, однако вы должны использовать точный режим при обнаружении граней для получения значения X. Вы можете увидеть пример того, как получить эти значения в следующем фрагменте кода.
Заключение
В этом уроке вы узнали об одном из основных компонентов библиотеки Play Services Vision, Face Detection. Теперь вы знаете, как распознавать лица в неподвижном изображении, как собирать информацию и находить важные ориентиры для каждого лица.
Используя то, что вы узнали, вы сможете добавить некоторые замечательные функции в свои собственные приложения для увеличения количества неподвижных изображений, отслеживания лиц в видеопотоке или всего остального, что вы можете себе представить.
Источник