Функция распознавания образов в приложении: как и для чего применять

Технология распознавания образов все активнее входит в наш обиход. Компании и учреждения используют ее для решения самых разных задач: от обеспечения безопасности до исследования удовлетворенности клиентов. Инвестиции в продукты, в основе которых — данная функция, обещают вырасти до 39 миллиардов долларов к 2021 году. Вот лишь несколько примеров, как распознавание образов используется в разных сферах:

Здравоохранение. Болезнь никого не красит. Но есть заболевания, при которых изменения внешности особенно заметны. Сравнивая внешний вид пациента с изображениями из базы данных, врачи точнее ставят диагноз и даже определяют силу боли, которую испытывает пациент. Приложения типа AiCure фиксируют, принял ли пациент лекарства. А Orcam MyEye — настоящее спасение для слабовидящих: приложение сообщает пользователю обо всем, что «видит».

Приложение с распознаванием образов для контроля принятия лекарств. Источник: www.ncbi.nlm.nih.gov

Туризм. Увидели интересное фото в инстаграме и хотите пообедать в том же кафе? Как вам идея загрузить фото в приложение, которое приведет в нужное место? На оснований фотогорафий из инстаграмма сервис Jetpac City Guides еще и рейтинги лучших мест для туристов создает.

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

Коммерция. Здесь функция распознавания образов используется активнее всего. Онлайн-магазины eBay и Boohoo помогают пользователям найти «именно тот» товар даже если покупатель не может вспомнить, как называется вещь. А такие приложения, как Lookwish и NICE, позволяют еще и «примерить» нужную вещь.

Думаете, все это только для очень крупных и богатых компаний? Действительно, внедрить машинное обучение (на котором зиждется распознавание образов) с нуля может оказаться хлопотным занятием. К счастью, существуют библиотеки, которые предоставляют возможность использовать уже готовые модели при разработке ваших продуктов. Одна из них — Firebase ML Kit. И дальше мы расскажем вам, как использовать ее при создании своего приложения.

Что такое Firebase ML Kit и как это работает

ML Kit — это SDK, предоставляющая возможность использовать уже готовые решения machine learning от Google для iOS и Android в простом виде. Независимо от того, есть ли у вас опыт использования machine learning, вы можете реализовывать нужные вам функции в нескольких строках кода. Если же вы являетесь опытным разработчиком в сфере машинного обучения, то вы можете загрузить собственные модели TensorFlow.

ML Kit может работать как в режиме онлайн (при этом вы получаете ,свободный доступ к гораздо более солидной базе данных, но с ограничением по запросам: бесплатно лишь первая тысяча), так и оффлайн. Такие функции, как распознавание текста, штрих-кодов и образов, доступны как онлайн, так и оффлайн. Распознавание ориентиров (известные дома, реки, улицы и т.д.) доступно только в режиме онлайн, а распознавание лиц — только оффлайн на устройстве.

Как интегрировать функцию распознавания образов в приложение

В качестве примера, начнем с распознавания текста оффлайн:

>
private fun runTextSearchOnDevice(bitmap: Bitmap){
        val image = FirebaseVisionImage.fromBitmap(bitmap)
        val textDetector = FirebaseVision.getInstance().onDeviceTextRecognizer
        textDetector.processImage(image).addOnSuccessListener{
            processTextSearchFromDevice(it)}.addOnFailureListener{
            Toast.makeText(this, it.toString(), Toast.LENGTH_SHORT).show()}}>

В методе `processTextSearchFromDevice` мы обрабатываем данные, предоставленные нам Firebase. Каждой функции соответствуют разные типы моделей, которые можно рассмотреть в документации. В нашей ситуации мы получили массив объектов, содержащих координаты текста в объекте `Rect` и, конечно, сам текст, который был распознан Firebase. Для использования онлайн код практически такой же:

>
 val options = FirebaseVisionCloudTextRecognizerOptions.Builder()
           .setLanguageHints(resources.getStringArray(R.array.textRecognitionLanguages).toList())
                .build()
        val textDetector = FirebaseVision.getInstance().getCloudTextRecognizer(options)>

В настройках мы теперь можем добавлять языки, которые теоретически будут распознаваться Firebase. Результатом будет тот же массив объектов. Если вы планируете распознавать документ, для удобства можно использовать `getCloudDocumentTextRecognizer`.

Для распознавания лиц подход практически такой же:

>
val image = FirebaseVisionImage.fromBitmap(bitmap)
        val faceDetector = FirebaseVision.getInstance().getVisionFaceDetector(getFaceDetectorOptions())
        faceDetector.detectInImage(image).addOnSuccessListener{...}>

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

>
FirebaseVisionFaceDetectorOptions.Builder()
            .setModeType(FirebaseVisionFaceDetectorOptions.ACCURATE_MODE)
            .setLandmarkType(FirebaseVisionFaceDetectorOptions.NO_LANDMARKS)
            .setClassificationType(FirebaseVisionFaceDetectorOptions.NO_CLASSIFICATIONS)
            .build()>

В результате Firebase выдаст нам массив объектов с координатами сгруппированных лиц а также, если мы дали разрешение, то и массив ‘landmarks’ с координатами.

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

>
val labelDetector = FirebaseVision.getInstance().visionLabelDetector
        labelDetector.detectInImage(image).addOnSuccessListener{...}>

А вот так онлайн:

>
 val options = FirebaseVisionCloudDetectorOptions.Builder()
                .setModelType(FirebaseVisionCloudDetectorOptions.LATEST_MODEL)
                .setMaxResults(15)
                .build()
        val labelDetector = FirebaseVision.getInstance().getVisionCloudLabelDetector(options)
        labelDetector.detectInImage(image).addOnSuccessListener{...}>

В настройках можно указать максимальное количество результатов и какую модель использовать (стабильную либо последнюю доступную). В результате получаем массив объектов с названием (что, по мнению Firebase, изображено на фото) и точность в диапазоне от 0,01 до 1,0.

Как видите, ничего сложного, и для большинства случаев достаточно бесплатного (локального) ML Kit.

Подведем итог

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

Для внедрения функции распознавания образов в приложение не обязательно инвестировать большие средства. Вы можете полностью или частично воспользоваться готовыми решениями, одно из которых — Firebase ML Kit. Надеемся, изложенный нами алгоритм действий позволит сделать это, не прилагая чрезмерных усилий. Если же вы хотите быть полностью уверенными в результате — обращайтесь к нам. Мы с радостью поможем вам в разработке веб-сервисов и мобильных приложений.