Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Android
Code

Введение в обнаружение лиц на Android

by
Difficulty:IntermediateLength:LongLanguages:

Russian (Pусский) translation by Alex Grigorovich (you can also view the original English article)

Представленная с библиотеками Vision в Play Services 8.1, Face Detection позволяет вам как разработчику анализировать видео или изображение, чтобы найти человеческие лица. Когда у вас есть список лиц, обнаруженных на изображении, вы можете собирать информацию о каждом лице, таком как ориентация, вероятность улыбки, открывать или закрывать глаза у кого-то, а также конкретные ориентиры на их лице.

Эта информация может быть полезна для нескольких приложений, таких как приложение для камеры, которое автоматически делает снимок, когда все в рамке улыбаются с открытыми глазами или для увеличения изображений с глупыми эффектами, такими как рожки единорога. Важно отметить, что распознавание лиц не является распознаванием лица. Хотя информация может быть собрана о лицах, эта информация не используется библиотекой Vision для определения того, являются ли два лица одним и тем же лицом.

В этом руководстве будет использоваться неподвижное изображение для запуска API обнаружения лиц и сбора информации о людях на фотографии, а также иллюстрации этой информации с наложенной графикой. Весь код этого руководства можно найти на GitHub.

Example of a silly effect adding a unicorn horn to a face

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, чтобы надеяться собрать больше данных, хотя это не гарантировано.

Faces detected and bound by a drawn rectangle

3. Понимание ориентиров

Ориентиры - это точки интереса на лице. API Face Detection API не использует ориентиры для обнаружения лица, а скорее определяет лицо целиком, прежде чем искать ориентиры. Вот почему открытие ориентиров - это необязательная настройка, которая может быть активирована через FaceDetector.Builder.

Вы можете использовать эти ориентиры в качестве дополнительного источника информации, например, где находятся глаза субъекта, чтобы вы могли реагировать соответствующим образом в своем приложении. Есть 12 ориентиров, которые можно найти:

  • левый и правый глаз
  • левое и правое ухо
  • левый и правый ушные наконечники
  • основание носа
  • левая и правая щека
  • левый и правый угол рта
  • основание рта

Знаки, которые доступны, зависят от угла распознанного лица. Например, у кого-то, стоящего перед боком, будет только один глаз, который означает, что другой глаз не будет обнаружен. В следующей таблице показано, какие ориентиры должны обнаруживаться на основе угла Эйлера Y (направление влево или вправо) лица.

Euler Y Видимые ориентиры
<-36 ° левый глаз, левый рот, левое ухо, основание носа, левая щека
От -36 ° до -12 ° левый рот, основание носа, нижний рот, правый глаз, левый глаз, левая щека, левый ухо
-12 ° до 12 ° правый глаз, левый глаз, основание носа, левая щека, правая щека, левый рот, правый рот, нижний рот
12 ° до 36 ° правая рта, основание носа, нижний рот, левый глаз, правый глаз, правая щека, правый ушной наконечник
> 36° Правый правый глаз, правый рот, правое ухо, основание носа, правая щека

Ориентиры также невероятно просты в использовании в вашем приложении, поскольку вы уже включили их во время обнаружения лица. Вам просто нужно вызвать getLandmarks () на объекте Face, чтобы получить List из Landmark, с которыми вы можете работать.

В этом уроке вы нарисуете небольшой круг на каждом обнаруженном ориентире, вызвав новый метод, drawFaceLandmarks(Canvas canvas, double scale), из onDraw(canvas canvas) вместо drawFaceBox(Canvas canvas, double scale). Этот метод занимает положение каждого ориентира, настраивает его для масштаба растрового изображения, а затем отображает знаковый круг индикатора.

После вызова этого метода вы должны увидеть маленькие зеленые круги, покрывающие обнаруженные грани, как показано в примере ниже.

Circles placed over detected facial landmarks

4. Дополнительные данные лица

Хотя положение лица и его ориентиров полезно, вы также можете узнать больше информации о каждом лице, обнаруженном в вашем приложении, с помощью некоторых встроенных методов из объекта Face. Методы getIsSmilingProbability (), getIsLeftEyeOpenProbability () и getIsRightEyeOpenProbability () пытаются определить, открыты ли глаза или если обнаруженное лицо улыбается, возвращая поплавок в диапазоне от 0.0 до 1.0. Чем ближе к 1.0, тем более вероятно, что человек улыбается или у него открывается левый или правый глаз.

Вы также можете найти угол лица по осям Y и Z изображения, проверив его значения Эйлера. Значение Z Euler будет всегда сообщаться, однако вы должны использовать точный режим при обнаружении граней для получения значения X. Вы можете увидеть пример того, как получить эти значения в следующем фрагменте кода.

Заключение

В этом уроке вы узнали об одном из основных компонентов библиотеки Play Services Vision, Face Detection. Теперь вы знаете, как распознавать лица в неподвижном изображении, как собирать информацию и находить важные ориентиры для каждого лица.

Используя то, что вы узнали, вы сможете добавить некоторые замечательные функции в свои собственные приложения для увеличения количества неподвижных изображений, отслеживания лиц в видеопотоке или всего остального, что вы можете себе представить.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.