What is face detection on android

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

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

Источник

Как работает Face ID и распознавание лица на Android смартфонах?

Интернет буквально переполнен статьями на тему того, как работает разблокировка по лицу (Face ID) на iPhone. Если вы хотя бы немножко интересовались этим вопросом, то сразу же вспомните все эти, набившие оскомину, термины: лазерный проектор, ИК-излучатель, 30 тысяч точек и т.п.

Все популярные ресурсы (The Verge, Wired, Engadget) как под копирку пишут одно и то же, повторяя слова, сказанные еще на презентации первого iPhone с технологией Face ID.

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

Надеюсь, эта статья ответит на многие вопросы!

Нейросети, искусственный интеллект, самообучение…

Эти слова, как мантру, повторяют блогеры, пытаясь объяснить работу Face ID. Но давайте задумаемся на минуточку, что это значит.

Чтобы смартфон научился классифицировать объекты (в нашем случае — лица), он должен пройти долгий и нелегкий процесс обучения. К примеру, если мы хотим, чтобы нейросеть отличала кошек от собак, мы должны «скормить» ей тысячи (а лучше десятки и сотни тысяч) фотографий различных собачек и котиков. Причем, каждая фотография должна иметь пометку о том, что конкретно на ней изображено.

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

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

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

Для обучения нейросетей нужны очень мощные графические процессоры и много времени. Поэтому, на телефон загружают уже обученную нейросеть. Которая способна лишь незначительно адаптироваться в процессе своей работы.

Но как же тогда Android-смартфоны и iPhone за пару секунд запоминают лицо пользователя и в дальнейшем распознают его мгновенно, вне зависимости от выражения лица, освещения и даже макияжа? Где же тысячи фотографий и длительное обучение?

Как работает Face ID и распознавание лица?

Понятное дело, что учить смартфон запоминать ваше лицо, а также лица других людей — бессмысленная и ресурсоемкая задача. Он не будет классифицировать лица в том смысле, как делает это для различных видов животных или растений (в приложении Камера). Вместо этого телефон обучают делать кое-что другое.

Вначале (еще «на заводе») нейросеть учат просто различать лица, то есть, выделять какие-то конкретные признаки лица (формы, размеры, расстояния) и отличать одни от других. Делается это при помощи так называемой сверточной нейронной сети (CNN) и специальных фильтров или сверток (в рамках этой статьи понимание данного процесса совершенно не важно).

Вся нейросеть состоит из слоев: на первый слой подается изображение с лицом, на втором слое применяются свертки, дальше идет выделение отдельных признаков, после чего на последнем (выходном) слое определяется конкретный человек.

К примеру, если бы наша нейросеть определяла расу человека и на предпоследнем слое собрались бы такие признаки, как «темная кожа», «толстые губы», «широкий нос» и «крупные зубы», тогда на выходе активировался бы нейрон, отвечающий за негроидную расу.

Но нам не нужен последний слой. То есть, нейросеть не будет пытаться узнать конкретного человека или расу, а всё должно заканчиваться сбором признаков. Другими словами, Apple или любой другой Android-разработчик обучает нейросеть лишь собирать признаки лиц:

Однако же, само по себе умение собирать признаки еще не позволяет нам реализовать идентификацию пользователя по лицу.

Давайте на секундочку отвлечемся. Как мы понимаем, внутри нейросети нет ничего, кроме чисел. Вся нейросеть — это просто математическая модель, в которой одни числа, «проходя» по связям от нейрона к нейрону, умножаются и суммируются (подробно об этом я рассказывал в этой статье).

В итоге, каждый признак — это не изображение глаза или носа, а определенное число, которое ассоциируется с конкретным глазом, носом или расстоянием между глазами (для каждого лица эти числа будут разными). Набор всех признаков называется вектором. К примеру, на картинке выше у нас есть 7 признаков на выходе из нейросети, то есть, наш вектор признаков — это 7 определенных чисел, уникальных для конкретного лица.

А теперь следите за мыслью, так как это самая важная часть в понимании Face ID или распознавания лица на любом другом смартфоне. Как мы знаем, вектор можно изобразить в пространстве. Для удобства представим, что у нас на выходе из нейросети только два числа: первое отвечает за цвет глаз, а второе — за цвет кожи.

Мы подаем в нейросеть фото человека с голубыми глазами и светлой кожей, а на выходе получаем два числа, например, 5 и 4. Затем мы подаем фото другого человека с темной кожей и зелеными глазами, соответственно, получаем на выходе другие числа, к примеру, 3 и 2. Всё это — двумерные вектора (с двумя координатами), которые можно легко отобразить на плоскости:

Если признаков будет 3, то получим трехмерный вектор, который также очень легко изобразить в пространстве (добавится третья координата глубины).

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

Когда сверточная нейросеть научилась выделять признаки, мы собираем несколько одинаковых нейросетей (с одинаковыми весами) в один блок и продолжаем обучение. Только теперь задание посложнее. Мы должны подавать уже 3 фотографии на вход: на первых двух снимках (А и Б) изображено лицо одного и того же человека, но с небольшими отличиями (макияж, другая прическа, другое выражение), а на третьем снимке (В) — лицо совершенно другого человека:

Задача нашей новой нейросети — не просто выделять какие-то признаки каждого лица, но подбирать их так, чтобы когда мы отобразим эти вектора в пространстве, расстояние между А и Б (слегка отличающимися лицами одного и того же человека) было минимальным, а вектор В (лицо совершенно другого человека) находился как можно дальше:

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

Когда нейросеть научилась это делать, ее можно загружать на iPhone или Android-смартфон.

Теперь пользователь включает функцию распознавания лица (или Face ID) и происходит первоначальная настройка. Обученная нейросеть уже знает, какие именно нужно выделить признаки и создает, образно говоря, их вектор в пространстве. Телефону уже не нужны тысячи ваших фотографий или десятки тысяч снимков других людей, чтобы научиться различать лица (делать классификацию). Вектор признаков вашего лица всегда будет находиться примерно в одном и том же месте скрытого пространства.

Когда вы попытаетесь разблокировать устройство в очередной раз, нейросеть снова создаст вектор признаков того лица, которое видит перед собой. И этот вектор с огромной вероятностью разместится в пространстве очень близко к первому — тому, что был сохранен при начальной настройке Face ID.

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

Подведем небольшие итоги

Смартфон не умеет классифицировать лица, как например, его камера определяет сцену (цветок, собака, кошка и пр.):

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

Как вы уже догадались, смартфон не хранит фотографии своего владельца, так как в этом нет никакого смысла. Сохраняются лишь вектора (наборы чисел), расстояния между которыми и сравниваются при каждой разблокировке.

Может ли iPhone или Android-смартфон «обучаться» в процессе использования? Если мы говорим именно о тренировке нейросети, тогда ответ однозначный — нет.

Сеть обучена производителем и дополнительные «тренировки» невозможны, так как это потребовало бы переобучения всей нейросети. Но когда смартфон создает вектор признаков и он находится дальше, чем нужно для разблокировки, и в то же время вы вводите верный пин-код (то есть, подтверждаете, что это ваш вектор признаков), тогда устройство может (но не факт) запомнить его и в дальнейшем пропускать.

В чем разница между Face ID на iPhone и Распознаванием лица на Android?

Обе технологии используют один и тот же принцип работы, о котором я рассказал чуть выше. Наличие одной лишь селфи-камеры на Android-смартфонах и целый набор датчиков на iPhone могут ввести в заблуждение пользователей касательно самого процесса распознавания лица.

На самом деле, все дополнительные датчики на iPhone нужны только для обнаружения витальности (или жизненности). Помимо распознавания признаков лица, еще более сложной задачей является определение того, находится ли перед камерой смартфона живое (настоящее) лицо или же это фотография/видео/маска.

Android-смартфоны с одной селфи-камерой определяют жизненность лица при помощи определенных алгоритмов. Скорее всего, вам не удастся обмануть современную разблокировку по лицу простой фотографией или даже видео с экрана. Особенно, если камера видит очертание телефона или фотографии/бумаги в ваших руках. Подобные примитивные методы моментально обнаруживаются нейросетью.

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

Может даже использоваться анализ микромимики, когда смартфон делает несколько снимков подряд, а затем попиксельно ищет различия.

С другой стороны, iPhone использует гораздо более эффективный метод защиты. При помощи дополнительных датчиков он строит карту глубины, то есть, видит ваше лицо в трехмерном пространстве. Соответственно, все обманные методы, связанные с использованием 2D подделок (фотографии, снимки с экрана, видео), отпадают сразу же. Остается лишь использование масок. Но и здесь нейросеть пытается обнаружить подделку.

Метод 3D-сканирования однозначно безопаснее 2D-сканирования, но не стоит полагать, что распознавание лица на Android-смартфонах очень легко обмануть. Особенно, когда речь идет о флагманах, вычислительной мощности которых достаточно для работы глубоких нейросетей.

Основные технологии распознавания лиц

В завершение хотелось бы просто перечислить самые популярные методы распознавания лиц:

  • Распознавание только при помощи селфи-камеры. Это наиболее распространенный метод разблокировки на Android-смартфонах (бюджетных, средне-бюджетных и практически всех флагманах). Здесь используется предварительно обученная нейросеть, сравнивающая расстояние между векторами признаков. Главный недостаток этого метода — зависимость от освещения. В темноте разблокировка по лицу работает крайне плохо.
  • Использование дополнительной ИК-подсветки. Подобная технология применяется, например, на смартфоне Huawei P40. Разница с первым методом только в том, что для распознавания совершенно нет нужды во внешнем освещении.
  • Построение карты глубины. Этот метод использует те же нейросети, но анализируется трехмерный снимок лица вместо плоского. На Android-смартфонах встречается крайне редко. Например, Google Pixel 4 вместо модного Soli-радара использует ровно ту же технологию, что и Face ID на iPhone (проецируется шаблон из тысячи точек). Также некоторые флагманы Huawei используют проектор точек (Huawei Mate 20 Pro и Mate 30 Pro).

Алексей, главный редактор Deep-Review

P.S. Не забудьте подписаться в Telegram на первый научно-популярный сайт о мобильных технологиях — Deep-Review, чтобы не пропустить очень интересные материалы, которые мы сейчас готовим!

Как бы вы оценили эту статью?

Нажмите на звездочку для оценки

Внизу страницы есть комментарии.

Напишите свое мнение там, чтобы его увидели все читатели!

Если Вы хотите только поставить оценку, укажите, что именно не так?

Источник

Читайте также:  Как с айфона увидеть андроид
Оцените статью