Как работает распознавание лица на андроид
Технология распознавания лиц на смартфоне: что это и как работает?
Особенности, преимущества и недостатки технологии распознавания лиц.
Еще 5 лет назад для защиты личных данных в смартфоне использовались стандартные пароли — числовые комбинации и графические ключи. Данные вводились пользователями на экране блокировки. Чтобы получить доступ к устройству, достаточно было узнать 4-значный пароль. На смену классическим способам защиты телефона пришли сканеры отпечатки пальцев. Это более надежный способ блокировки гаджета — чтобы разблокировать смартфон, нужно приложить палец владельца устройства.
Современные смартфоны используют технологию распознавания лиц. Простыми словами, телефон «узнает» своего владельца и снимает блокировку, открывая доступ к персональным данным и приложениям.
Как работает технология распознавания лиц на смартфоне?
Технология использует 2D или 3D-датчик (зависит от модели смартфона), который сканирует лицо человека. При первой настройке телефона датчик запоминает лицо владельца: расстояние между глазами, контур губ, размер носа, подбородок и другие отличительные особенности внешности.
Полученная информация преобразуется в цифровые данные — в смартфоне создается трехмерная модель лица владельца устройства. После этого, когда мы хотим разблокировать телефон, алгоритм начинает сравнивать созданную модель и лицо, которое отсканировал 2D или 3D-датчик.
Сам датчик для распознавания лиц находится на лицевой части мобильного устройства — в верхней части. Его часто можно увидеть возле фронтальной камеры — небольшая точка, которую иногда можно принять за дополнительный динамик.
Искусственный интеллект, который сканирует лицо, постоянно обучается. Каждый раз когда блокировка снимается со смартфона через технологию распознавания лица, датчик «запоминает» больше особенностей. Например, через 1-2 недели использования телефона увеличится скорость снятия блокировки смартфона. Даже если владелец устройства опустит густую бороду или наденет очки, технология распознавания лиц узнает его.
На бюджетных смартфонах для распознавания лица может использоваться фронтальная камера. У этой технологии меньше преимуществ, чем у 3D-сканирования. При разблокировке смартфона с плохим освещением (ночью, в комнате с выключенным светом или пасмурную погоду) телефон может выдать ошибку, что не может распознать владельца. В этом случае нужно поднести фронтальную камеру ближе к лицу или использовать альтернативный вариант — ввести классический пароль, графический ключ или воспользоваться сканером отпечатков пальцев (если он есть в гаджете).
Технология распознавания лиц, встроенная в камеру, запоминает меньше деталей внешности человека. Возможности функции ограничены разрешением камеры.
На некоторых смартфонах установлен специальный инфракрасный датчик. Во-первых, он определяет, есть ли лицо перед смартфоном. Во-вторых, датчик «передает» на лицо владельца тысячи точек — в районе 30 000. Благодаря этому выполняется проецирование трехмерной модели лица. ИК-камера, которая находится на лицевой части мобильного устройства, считывает созданную ранее карту из точек — лицо человека. Все данные передаются в специальный процессор гаджета.
Что такое технологии Face ID и Liveness и как их используют в мобильных приложениях
Биометрия сегодня на подъеме. Особенно впечатляет скорость развития технологии распознавания лица в областях контроля доступа и бесконтактных платежей. Еще каких-нибудь 10-12 лет назад безконтактная оплата с помощью смартфона (NFC) казалась нам фантастикой, медленно становящейся реальностью. Сейчас для совершения покупки в некоторых оффлайн-магазинах не нужен даже смартфон, не говоря о пластиковой карте, достаточно посмотреть в камеру на кассе. Я говорю о селфи-биометрии — биометрическом распознавании лица во время проведения транзакции (Face Pay) или для получения доступа: к устройству, сервису, приложению.
Взрывной рост этой технологии стал возможен благодаря достижениям в области искусственного интеллекта, направленным на борьбу с биометрическим мошенничеством — подделкой биометрических данных пользователей: изображения лица, отпечатков пальцев, голоса. Решения, позволяющие безошибочно идентифицировать реального пользователя и выявить мошенника, способствуют повышению доверия к доступу по биометрии лица. Сегодня я хочу рассказать о том, как работают в приложениях технологии распознавания лиц Face ID и Liveness. Думаю, вам уже пора знать это, ведь нас ждет беспарольное будущее, а селфи-биометрия очень скоро станет нашим верификационным стандартом, вытеснив даже отпечатки пальцев и сканирование радужки глаза, поскольку здесь отсутствует прямой контакт с пользователем.
Face ID — это биометрическая технология распознавания лица для его идентификации с целью подтверждения личности человека. Технология применяет методы трехмерного и двухмерного сканирования лица пользователя, анализа деталей изображения лица и их сопоставления с эталоном из базы данных. Проще говоря, каждый человек имеет уникальное строение лица. Специальное программное обеспечение способно анализировать его, сопоставляя с информацией в базе данных для последующей идентификации того, кто вы такой. Сравнение моделей лица происходит с помощью программ, основанных на искуственных сверточных нейронных сетях.
Facial recognition technology (FRT) еще до мобильных телефонов активно использовали и сейчас используют в правоохранительных органах как инструмент розыска преступников; в Physical Access Control System (PACS) — банки, офисы; в системах наблюдения аэропортов и других общественных мест; в медицине и генетике — для обнаружения генетических нарушений (например, фреймворки Face2Gene и DeepGestalt).
В мобильных телефонах технология используется для разблокировки аппарата, доступа пользователя к приложениям и совершения денежных транзакций (оплаты, перевода). В Android-смартфонах и планшетах распознавание лица применяется уже с десяток лет. Однако способ, применяемый там для идентификации, не безопасен, поскольку использует алгоритм 2D-распознавания. то есть достаточно только фотографии, а не трехмерного изображения, чтобы разблокировать телефон, а это легко подделать. Качество передней камеры аппарата является здесь определяющим фактором, как и сложность алгоритма, используемого для извлечения деталей лица. Сегодня сверточные сети используют в дорогих смартфонах, но не в бюджетных (например, 360 Face Unlock от Huawei и технологии быстрой разблокировки OnePlus). А ведь именно они позволяют точно идентифицировать личность.
Трехмерное распознавание лица в мобильном телефоне впервые внедрила5 Apple Inc., презентовав функцию Face ID в 2017 году в рамках запуска iPhone X. Именно Apple озвучила такое название, которое сейчас стало нарицательным для технологии идентификации по лицу: разные компании используют термин «Face ID» в своих сервисных решениях для банковской сферы, ритейла, сферы доставки и логистики, в системах контроля доступа (например, Face ID Biometrics, Evergreen). Свои решения по распознаванию лиц сегодня имеют все гиганты программного обеспечения: Google (FaceNet); Facebook (DeepFace); Microsoft, IBM и Megvii (FACE ++); Amazon (Rekognition); Academia (GaussianFace).
Но, конечно, самый популярный кейс реального применения — это Apple Face ID. Для биометрического сканирования формы лица и ее распознавания при снятии блокировки в iPhone задействуется камера TrueDepth, оснащенная двумя инфракрасными проекторами, выделяющими лицевые точки и сохраняющими их в память в виде математического кода. Комплекс из камеры и датчиков приближения и освещенности, системы подсветки Flood Illuminator (которую не видно в темноте) и проектор точек Dot Projector создает высокоточную трехмерную модель лица и сохраняет шаблон напрямую в процессор. За хранение ключа Face ID отвечает специально заблокированная часть ЦП смартфона. По заверениям разработчиков, система способна самообучаться и подстраиваться под пользователя, не обращая внимания на одежду, очки и возрастные изменения лица. Функцию Face ID можно использовать для авторизации покупок с помощью платежной системы Apple Pay. По утверждению Apple технология Face ID проверяет соответствие с использованием данных о структуре лица, которые невозможно считать с напечатанной или цифровой двухмерной фотографии. А сложные нейронные сети защищают от мошенничества с использованием масок или других приемов. Технология Face ID может даже определять ваше внимание. Она распознает ваше лицо, только если ваши глаза открыты и вы смотрите на устройство. Это усложняет задачу разблокировать устройство без вашего ведома (например, когда вы спите). Вероятность того, что другой человек сможет разблокировать ваш iPhone или iPad Pro с помощью Face ID, составляет 1 из 1 000 000.
Но как система определяет, реальный и живой ли человек перед ней? Для этого существует еще одна интересная технология — Liveness. Она «занимается» биометрическим определением живого лица. Liveness Detection не позволяет ботам и злоумышленникам использовать украденные фотографии, внедренные deepfake-видео, реалистичные маски или другие подделки для создания или доступа к онлайн-аккаунтам. Liveness гарантирует, что только реальные люди могут создавать учетные записи и получать к ним доступ. Цель этапа подтверждения реального присутствия: помешать мошенникам, которые всё чаще прибегают к спуфинг-атакам, используя фотографию, видео или другую замену биометрических характеристик уполномоченного лица, чтобы получить чьи-то привилегии или права доступа. Внедренный в систему Liveness Detection должен соответствовать стандарту обнаружения атак ISO 30107-3.
Разные разработчики предоставляют обществу свои Liveness-решения (FaceTec, ID R&D, VisionLabs), но принцип работы их идентичен. Перед тем, как пользователь при регистрации предоставит документ, удостоверяющий личность, он должен надежно доказать, что он реальный живой человек. Это нужно для того, чтобы у злоумышленника не было возможности пройти идентификацию по поддельной фотографии или реалистичной маске на лице (Deepfake). Для каждой аутентификации пользователя требуются два типа данных: о лицах (для сопоставления) и о “живости” (чтобы подтвердить, что данные о лицах были получены от живого человека). Данные о “живости” должны иметь временную метку и быть действительными только в течение нескольких минут, а затем удалены. Всегда следует хранить только данные о лицах. Новые данные о “живости” должны собираться при каждой попытке аутентификации.
Итак, биометрическая система должна определить, были ли данные получены от живого человека или от неживого артефакта (неодушевленного объекта, который пытается воспроизвести биометрические черты человека). 3D Liveness анализирует ваше быстрое видеоселфи на наличие атрибутов живого человека: это определенные движения головы и мышц лица в ответ на команды и соответствующие им тени и блики на текстуре кожи; микроизменения в мимике при движении и статике; скорость реакций. Как только будет доказано, что новая учетная запись принадлежит реальному человеку, его биометрические данные будут сохранены в качестве надежного эталона их цифровой личности для последующей авторизации.
Android и 3D камера. Распознавание лиц с защитой от Fraud
Привет! Меня зовут Владимир Шальков, я Android-разработчик в Surf.
Не так давно нам необходимо было реализовать систему распознавания лиц на Android с защитой от мошенничества (fraud). В этой статье я поделюсь самыми интересными аспектами реализации с примерами кода и ссылками. Уверен, вы найдёте что-то новое и интересное для себя, поэтому усаживайтесь поудобнее, начинаем.
Системы распознавания лиц сейчас становятся всё более и более востребованными: количество устройств с функцией разблокировки по лицу растёт, так же как и количество инструментов для разработчиков.
Компания Apple в своих продуктах использует FaceID, кроме этого они позаботились о разработчиках и добавили API для доступа к этой функциональности. FaceID считается достаточно безопасным и его можно использовать для разблокировки банковских приложений. Android SDK же до недавнего времени не имел готового решения. Хотя производители устройств добавляли в свои прошивки возможность разблокировать устройство с помощью лица, разработчики не могли использовать функциональность в приложениях, да и безопасность такого способа разблокировки, оставляла желать лучшего.
Недавно, класс FingerprintManager, который использовался для разблокировки приложений по отпечатку пальцев, задепрекейтили на API 28 и выше, и разработчикам предлагается использовать BiometricPrompt. Это класс, содержит логику, связанную с биометрией, в том числе по идентификации лиц. Однако использовать его в каждом смартфоне не получится, потому что согласно информации от Google, устройство должно иметь высокий рейтинг безопасности.
Некоторые устройства не имеют встроенного сканера отпечатка пальцев, от него отказались ввиду высокого уровня защиты от мошенничества при распознавании лица и всё благодаря фронтальному ToF(Time-of-flight) датчику. С его помощью можно построить карту глубины, тем самым увеличить устойчивость системы к взлому.
Требования
Разработка мобильного приложения для бизнеса, которое по своей функциональности является системой контроля доступа, где в качестве способа идентификации личности — лицо. С помощью специальных алгоритмов проверяется принадлежность лица реальному человеку. Нового пользователя можно добавить в базу данных непосредственно с устройства, сфотографировав и указав имя. Если необходимо определить наличие человека в базе данных, то поиск осуществляется по фотографии, сделанной в реальном времени с устройства. Алгоритмы определяют сходство с лицами из базы данных, если такое находится – выдаётся информация об этом человеке.
Основной целью мы ставили обеспечение максимального уровня безопасности: необходимо было минимизировать возможность обхода системы распознавания лиц, например, с помощью фотографии, которую поднесли к видоискателю. Для этого решили использовать 3D-камеру Intel RealSense (модель D435i), которая имеет встроенный ToF датчик, благодаря ему можно получить все необходимые данные для построения карты глубины.
В качестве рабочего устройства нам необходимо было использовать планшет с большой диагональю экрана, который не имел встроенной батареи и требовал постоянного подключения к электросети.
Ещё одно не менее важное ограничение — работа в оффлайн режиме. Из-за этого мы не могли применять облачные сервисы для распознавания лиц. Кроме этого писать алгоритмы распознавания лиц с нуля неразумно, с учётом ограничения времени и трудозатрат. Возникает вопрос: зачем изобретать велосипед, если уже есть готовые решения? Исходя из всего выше сказанного, решили использовать библиотеку Face SDK от 3DiVi.
Получение изображения с камеры Intel RealSense
На первом этапе реализации необходимо было получить два изображения с 3D камеры: одно цветное, второе с картой глубины. Потом они будут использоваться библиотекой Face SDK для дальнейших вычислений.
Чтобы начать работать с камерой Intel RealSense в Android-проекте, необходимо добавить зависимость RealSense SDK for Android OS: она является оберткой над официальной C++ библиотекой. В официальных семплах можно найти как произвести инициализацию и отобразить картинку с камер, на этом останавливаться не будем, там всё достаточно просто. Перейдём сразу к коду получения изображений:
С помощью FrameReleaser() мы получаем отдельные кадры с видеопотока, которые имеют тип Frame. К фреймам можно применять различные фильтры через applyFilter().
Для получения кадра нужного формата, фрейм необходимо преобразовать в соответствующий тип. В нашем случае первый с типом VideoFrame, второй DepthFrame.
Если мы хотим отобразить картинку на экране устройства, то для этого существует метод upload(), в параметрах указывается тип фрейма, который нужно отобразить на экране, у нас это кадры с цветной камеры.
Преобразование фреймов в изображение
На следующем этапе необходимо получить из VideoFrame и DepthFrame картинки в нужном нам формате. Эти картинки мы будем использовать, чтобы определять принадлежит ли лицо на изображении реальному человеку и добавлять информацию в базу данных.
- Цветное, с расширением .bmp, получаемое из VideoFrame
- С картой глубины, имеющее расширение .tiff и получаемое из DepthFrame
Чтобы осуществить преобразования нам понадобится библиотека компьютерного зрения с открытым исходным кодом OpenCV. Вся работа заключается в формировании объекта Mat и конвертировании его в нужный формат:
Для сохранения цветного изображения необходимо сформировать матрицу с типом CvType.CV_8UC3, после конвертировать в BRG, чтобы цвета имели нормальный оттенок.
Используя метод Imgcodecs.imwrite, сохранить на устройстве:
Тоже самое необходимо проделать для DepthFrame с тем лишь отличием, что матрица должна быть с типом CvType.CV_16UC1, так как изображение будет строиться из кадра, который содержит данные с датчика глубины:
Сохранение изображения с картой глубины:
Работа с библиотекой Face SDK
Face SDK имеет большой объём программных компонентов, но большая часть из них нам не нужна. Библиотека так же, как и RealSense SDK написана на C++ и имеет обёртку, чтобы было удобно работать под Android. Face SDK не бесплатна, но если вы разработчик, то вам выдадут тестовую лицензию.
Большинство компонентов библиотеки настраиваются с помощью XML конфигурационных файлов. В зависимости от конфигурации, будет применяться тот или иной алгоритм.
Чтобы начать работать необходимо создать экземпляр класса FacerecService, он используется при инициализации других компонентов, в параметрах передается путь до DLL библиотек, конфигурационных файлов и лицензии.
Далее, используя этот сервис, нужно создать объекты классов FacerecService.Config и Capturer:
Класс Capturer используется для распознавания лиц. Конфигурация manual_capturer.xml означает, что мы будем использовать алгоритмы из библиотеки OpenCV — это детектор фронтальных лиц Viola-Jones, для распознавания используются признаки Хаара. Библиотека предоставляет готовое множество XML файлов с конфигурациями, отличающихся по характеристикам качества распознавания и времени работы. Менее быстрые методы имеют лучшие показатели по качеству распознавания. Если нам нужно распознавать лица в профиль, то следует использовать другой конфигурационный XML файл — common_lprofile_capturer.xml. Конфигов достаточно много, с ними можно подробнее ознакомиться в документации. В нашем случае необходимо было использовать конфиг common_capturer4_singleface.xml — это конфигурация с пониженным порогом качества в результате использования которой, всегда будет возвращаться не более одного лица.
Чтобы найти лицо на изображении применяется метод capturerSingleFace.capture(), в который передаётся массив байтов картинки, которая содержит лицо человека:
Объект RawSample хранит информацию о найденном лице и содержит набор различных методов, например если вызвать getLandmarks(), то можно получить антропометрические точки лица.
Принадлежность лица реальному человеку
Чтобы определить реальный ли человек находится в кадре, а не фотография, приставленная к камере детекции лиц, библиотека Face SDK, предоставляет модуль DepthLivenessEstimator, он возвращает enum с одним из четырех значений:
- NOT_ENOUGH_DATA — слишком много отсутствующих значений на карте глубины
- REAL — наблюдаемое лицо принадлежит живому человеку
- FAKE — наблюдаемое лицо является фотографией
- NOT_COMPUTED — не удалось произвести вычисления
Инициализация модуля:
Определение принадлежности лица реальному человеку:
Метод getLivenessState() в качестве параметров получает ссылки на изображения: цветное и с картой глубины. Из цветного мы формируем объект RawImage, этот класс предоставляет данные изображения в сыром виде и опциональной информации для обрезки. Из карты глубины формируется DepthMapRaw — карта глубины, отрегистрированная в соответствии с исходным цветным изображением. Это необходимо сделать, чтобы использовать метод estimateLiveness(originalRawSimple, depthMapRaw), который вернёт нам enum с информацией реальное ли лицо было в кадре.
Стоит обратить внимание на формирование объекта DepthMapRaw. Одна из переменных имеет наименование depth_data_ptr — это указатель на данные глубины, но как известно в Java нет указателей. Для получения указателя надо воспользоваться JNI функцией, которая в качестве аргумента принимает ссылку на изображение с картой глубины:
Для вызова кода написанного на C в Kotlin, необходимо создать класс такого типа:
В System.loadLibrary() передаётся наименование файла .cpp, где содержится метод readDepthMap(), в нашем случае это native-lib.cpp. Также необходимо поставить модификатор external, который означает, что метод реализован не в Kotlin.
Идентификация лица
Не менее важная функция — определение личности найденного лица в кадре. Face SDK позволяет реализовать это с помощью модуля Recognizer. Инициализация:
Мы используем конфигурационный файл method8v7_recognizer.xml, который имеет самую высокую скорость распознавания, но при этом качество распознавания ниже, чем у методов 6v7 и 7v7.
Перед тем, как идентифицировать лицо, необходимо создать список лиц, используя который мы будем находить соответствие по образцу фотографии. Для реализации, нужно создать Vector из объектов Template:
Для создания Template используется метод recognizer.processing(), в качестве параметра передаётся RawSample. После того, как список с шаблонами лиц сформирован, его необходимо добавить в Recognizer и сохранить полученный TemplatesIndex, который нужен для быстрого поиска в больших базах:
На этом этапе, нами был сформирован объект Recognizer, который содержит всю необходимую информацию, чтобы произвести идентификацию:
Функция recognizer.search() вернёт нам результат, где мы можем получить индекс найденного элемента, сопоставить его со списком лиц из базы данных и идентифицировать персону. Кроме этого, мы можем узнать величину сходства, действительное число от 0 до 1. Данная информация предоставлена в классе Recognizer.MatchResult, переменная scope:
Заключение
Нет сомнения, что в будущем подобные системы будут использоваться повсеместно: подходя к подъезду, дверь будет автоматически открываться, а кофемашина в офисе будет выбирать вашу любимую степень помола.
В Android SDK, постепенно добавляется API, который позволяет разработчику работать с системой идентификации лиц, однако сейчас всё находится на начальном этапе развития. А если говорить о системе контроля доступа с использованием планшета на Android, библиотеки Face SDK и 3D камеры Intel RealSense, хочется отметить большую гибкость и расширяемость. Нет привязки к устройству, камеру можно подключить к любому современному смартфону. Можно расширить линейку поддерживаемых 3D камер, а также подключить несколько штук к одному устройству. Есть возможность адаптировать написанное приложение под Android Things, и использовать его в своем умном доме. Если посмотреть на возможности библиотеки Face SDK, то с её помощью мы можем добавить идентификацию лиц в непрерывном видеопотоке, определять пол, возраст и эмоции. Эти возможности дают простор для множества экспериментов. А мы на своём опыте можем сказать: не бойтесь экспериментов и бросайте вызов себе!