Недавнее представление Google бета-версии ML Kit for Firebase на Google I / O 2018 включает машинное обучение на устройстве и в облаке для их платформы мобильной разработки Firebase. ML Kit для Firebase включает готовую к работе поддержку для нескольких распространенных вариантов использования:

  • Распознавание текста
  • Обнаружение лиц
  • Сканирование штрих-кодов
  • Маркировка изображений
  • Распознавание достопримечательностей

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

В этой статье мы рассмотрим ML Kit для Firebase, создав два небольших тестовых приложения для iOS (ML Kit доступен как для Android, так и для iOS):

  1. Замена лица: использует распознавание лиц для поиска лиц на изображении и наложения эмодзи, который показывает, насколько каждый человек улыбается.
  2. Сканер кредитных карт: использует распознавание текста для извлечения номера кредитной карты, имени держателя кредитной карты и даты истечения срока действия с лицевой стороны кредитной карты.

Замена лица

Наше приложение Face Replace начнется с захвата изображения, которое включает одно или несколько лиц. Мы будем использовать UIImagePickerController с типом источника, установленным на .camera, чтобы предоставить нашему приложению целевое изображение.

Когда у нас есть изображение, очень просто обнаружить на нем лица. Однако, прежде чем мы это сделаем, важно убедиться, что свойство imageOrientation UIImage равно .up. Если это не .up, обязательно исправьте ориентацию изображения, прежде чем пытаться его обработать, иначе ML Kit не сможет обнаружить какие-либо лица (вы можете использовать код, похожий на this, прежде чем передавать его в ML Kit) .

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

  1. Мы создаем экземпляр службы Firebase Vision и настраиваем наш VisionFaceDetectorOptions.
  2. Мы создаем экземпляр VisionFaceDetector с нашими параметрами. Обратите внимание, что это свойство, а не локальная переменная, поскольку в противном случае локальная переменная будет nil к тому времени, когда она нам понадобится.
  3. Мы создаем VisionImage, который будет передан в VisionFaceDetector
  4. Вызов VisionFaceDetector detect(in:) выполняет тяжелую работу по сканированию указанного изображения на предмет лиц. Обработчик завершения вызывается с необязательным массивом объектов VisionFace, а также с необязательным объектом ошибки. Любая ошибка проверяется и представляется пользователю.
  5. Мы перебираем каждый VisionFace и проверяем, есть ли у каждого из них связанные данные вероятности улыбки. Если это так, мы используем CGRect из VisionFace для создания метки, которая будет накладывать соответствующие смайлики на лицо на изображении (поскольку изображение масштабируется при отображении на экране, мы масштабируем рамку для смайликов, чтобы они помещались в правильное расположение). Для простоты мы инкапсулировали логику преобразования smilingProbability в соответствующие смайлы в функции FaceReplaceViewController.newEmojiLabel(frame:, smilingProbability:).
  6. Если лицо на изображении повернуто относительно оси Y, это обозначается знаком VisionFace.headEulerAngleY в градусах. Мы создадим CGAffineTransform, чтобы повернуть метку на соответствующее количество радианов, а затем добавим метку как часть UIImageView.

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

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

Сканер кредитных карт

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

Когда у нас есть изображение кредитной карты, очень просто обнаружить текст на этом изображении. Опять же, важно убедиться, что свойство imageOrientation в UIImage равно .up, иначе результаты будут бессмысленными.

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

  1. Мы создаем экземпляр службы Firebase Vision и используем его для создания VisionTextDetector. Обратите внимание, что это присвоено свойству, поэтому оно не становится nil.
  2. Вызов VisionTextDetector detect(in:) использует VisionImage, созданный из UIImage. и это то, что на самом деле выполняет обнаружение текста. Обработчик завершения вызывается с необязательным массивом объектов VisionText, а также с необязательным объектом ошибки. Любая ошибка проверяется и представляется пользователю. Каждый VisionText объект включает String с обнаруженным текстом и CGRect с местоположением текста на изображении.
  3. Теперь, когда у нас есть весь текст на изображении, нам просто нужно выяснить, какой текст является номером кредитной карты, каким является имя держателя кредитной карты, а какой является сроком действия. Эта логика заключена в методы CreditCardInfoExtractor.cardholderName(in:, imageSize:), CreditCardInfoExtractor.creditCardNumber(in:, imageSize:) и CreditCardInfoExtractor.creditCardExpirationDate(in:, imageSize:), которые используют регулярные выражения и приблизительное расположение обнаруженного текста на изображении для классификации обнаруженного текста (т. Е. Номера кредитных карт находятся ближе к середине изображения, а имена владельцев кредитных карт и даты истечения срока действия указаны внизу).

Этот процесс был в некоторой степени успешным в определении необходимой нам информации:

Обратите внимание, что в этом случае приложение неправильно определило «VALID THRU» как имя держателя карты. Имя владельца кредитной карты было правильно определено, но наше приложение выбрало неправильную текстовую строку из двух слов в качестве имени, поскольку не могло различить их. Чтобы улучшить это, мы могли бы рассмотреть возможность включения некоторой информации о ширине обнаруженного текста, поскольку номера кредитов, как правило, довольно широкие, имена немного уже, а даты истечения срока действия еще более узкие. Это может в некоторой степени помочь, но вряд ли будет 100% точным для всех типов кредитных карт.

Но самая большая проблема в том, что ML Kit не всегда точно распознает текст. Например, число 0 в номере кредитной карты и дате истечения срока действия иногда сообщается как буквы D или O. Это не соответствует нашему регулярному выражению, которое было закодировано для определения серии из четырех цифр для номера кредитной карты. Мы могли бы заставить регулярные выражения искать буквы или цифры, но это увеличивает вероятность ложных совпадений.

Заключение

Объявление Google о ML Kit для Firebase на Google I / O 2018, которое все еще находилось в стадии бета-тестирования, определенно стало благом для мобильных разработчиков. Он может включать в себя некоторые довольно удивительные приложения на основе машинного обучения с очень небольшим количеством кода.

Кросс-платформенный характер ML Kit для Firebase, в отличие, очевидно, от Apple Core ML, также является шагом вперед для этой более широкой аудитории разработчиков Android и iOS, поскольку он позволит еще большему количеству этих разработчиков воспользоваться преимуществами машинного обучения в своей работе. приложения (в том числе созданные для Android и iOS). ML Kit для Firebase обеспечит мощную основу, на которой разработчики смогут исследовать новые идеи и новые методы, все они основаны на мощи работы Google в области искусственного интеллекта и теперь включены в арсенал каждого разработчика.