Обнаружение объектов на изображениях с помощью ML Kit: Android

1. Прежде чем начать

ML Kit — это мобильный SDK, который привносит опыт Google в области машинного обучения на устройствах в приложения для Android и iOS. Вы можете использовать мощные, но простые в использовании API-интерфейсы Vision и Natural Language для решения типичных проблем в ваших приложениях или создания совершенно нового пользовательского интерфейса. Все они основаны на лучших в своем классе моделях машинного обучения Google и предлагаются вам бесплатно.

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

Эта лаборатория кода проведет вас через простые шаги по добавлению функции обнаружения и отслеживания объектов (ODT) для заданного изображения в существующее приложение для Android. Обратите внимание, что в этой кодовой лаборатории используются некоторые ярлыки, чтобы выделить использование ML Kit ODT.

Что ты построишь

В этой лаборатории кода вы собираетесь создать приложение для Android с помощью ML Kit. Ваше приложение будет использовать API обнаружения и отслеживания объектов ML Kit для обнаружения объектов на заданном изображении. В конце вы должны увидеть что-то похожее на изображение справа.

Что вы узнаете

  • Как интегрировать ML Kit SDK в ваше приложение для Android
  • API обнаружения и отслеживания объектов ML Kit

Что вам понадобится

  • Последняя версия Android Studio (v4.1.2+).
  • Эмулятор Android Studio или физическое устройство Android
  • Пример кода
  • Базовые знания разработки Android на Kotlin.

Эта лаборатория ориентирована на ML Kit. Нерелевантные концепции и блоки кода замалчиваются и предоставляются для простого копирования и вставки.

2. Настройте

Загрузите код

Щелкните следующую ссылку, чтобы загрузить весь код для этой лаборатории кода:

Распакуйте загруженный zip-файл. Это распакует корневую папку ( mlkit-android-main ) со всеми необходимыми вам ресурсами. Для этой лаборатории кода вам понадобятся только исходники в подкаталоге object-detection .

Подкаталог обнаружения объектов в репозитории mlkit-android содержит два каталога:

  • android_studio_folder.png starter — Начальный код, который вы используете для этой лаборатории кода.
  • android_studio_folder.png Final — Готовый код готового примера приложения.

3. Добавьте в проект API обнаружения и отслеживания объектов ML Kit.

Импортируйте приложение в Android Studio.

Начнем с импорта стартового приложения в Android Studio.

Откройте Android Studio, выберите «Импортировать проект» (Gradle, Eclipse ADT и т. д.) и выберите starter папку из исходного кода, который вы загрузили ранее.

7c0f27882a2698ac.png

Добавьте зависимости для обнаружения и отслеживания объектов ML Kit.

Зависимости ML Kit позволяют интегрировать ML Kit ODT SDK в ваше приложение. Добавьте следующие строки в конец файла app/build.gradle вашего проекта:

build.gradle

dependencies {
  // ...
  implementation 'com.google.mlkit:object-detection:16.2.4'
}

Синхронизируйте свой проект с файлами gradle

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

Выберите «Синхронизировать проект с файлами Gradle » ( b451ab2d04d835f9.png ) на панели инструментов Android Studio.

(Если эта кнопка отключена, убедитесь, что вы импортируете только starter/app/build.gradle , а не весь репозиторий.)

4. Запустите стартовое приложение.

Теперь, когда вы импортировали проект в Android Studio и добавили зависимости для обнаружения и отслеживания объектов ML Kit, вы готовы запустить приложение в первый раз.

Подключите устройство Android через USB к хосту или запустите эмулятор Android Studio и нажмите « Выполнить» ( выполнить.png ) на панели инструментов Android Studio.

Запустите и изучите приложение

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

Во-первых, есть кнопка ( c6d965d639c3646.png ) внизу, чтобы:

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

Попробуйте кнопку «Сделать фото» , следуйте инструкциям, чтобы сделать снимок, примите снимок и посмотрите, как он отображается в стартовом приложении .

Повторите несколько раз, чтобы увидеть, как это работает:

9ec541980dbe2d31.png8312dde41425ba4b.pngfa8492bfc1914ff0.png

Во-вторых, есть 3 предустановленных изображения, которые вы можете выбрать. Вы можете использовать эти изображения позже, чтобы протестировать код обнаружения объектов, если вы работаете на эмуляторе Android.

Выберите изображение из 3 предустановленных изображений. Посмотрите, что изображение отображается в увеличенном виде:

1dd41b3ec978f1d9.png

5. Добавьте обнаружение объектов на устройстве.

На этом этапе вы добавите в стартовое приложение функцию обнаружения объектов на изображениях. Как вы видели на предыдущем шаге, стартовое приложение содержит шаблонный код для съемки фотографий с помощью приложения камеры на устройстве. В приложении также есть 3 предустановленных изображения, на которых вы можете попробовать обнаружить объекты, если запускаете лабораторию кода на эмуляторе Android.

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

На этом этапе вы добавите код в метод runObjectDetection для обнаружения объектов!

Настройка и запуск обнаружения объектов на устройстве на изображении

Для настройки ML Kit ODT нужно всего 3 простых шага с 3 API:

  • подготовить изображение: InputImage
  • создайте объект детектора: ObjectDetection.getClient(options)
  • соедините два объекта выше: process(image)

Вы достигаете этого внутри функции runObjectDetection(bitmap: Bitmap) в файле MainActivity.kt .

/**
 * ML Kit Object Detection Function
 */
private fun runObjectDetection(bitmap: Bitmap) {
}

Сейчас функция пуста. Перейдите к следующим шагам, чтобы внедрить ODT ML Kit! Попутно Android Studio предложит вам добавить необходимый импорт:

  • com.google.mlkit.vision.common.InputImage
  • com.google.mlkit.vision.objects.ObjectDetection
  • com.google.mlkit.vision.objects.defaults.ObjectDetectorOptions

Шаг 1. Создайте входное изображение

ML Kit предоставляет простой API для создания InputImage из Bitmap . Затем вы можете передать InputImage в API ML Kit.

// Step 1: create ML Kit's InputImage object
val image = InputImage.fromBitmap(bitmap, 0)

Добавьте приведенный выше код в начало runObjectDetection(bitmap:Bitmap) .

Шаг 2. Создайте экземпляр детектора

ML Kit соответствует шаблону проектирования Builder . Вы передаете конфигурацию застройщику, а затем приобретаете у него детектор . Существует 3 варианта настройки (параметры, выделенные жирным шрифтом, используются в этой кодовой лаборатории):

  • режим детектора ( одиночное изображение или поток )
  • режим обнаружения (обнаружение одного или нескольких объектов )
  • режим классификации ( вкл. или выкл .)

Эта кодовая лаборатория предназначена для обнаружения и классификации одного изображения — нескольких объектов. Добавьте это сейчас:

// Step 2: acquire detector object
val options = ObjectDetectorOptions.Builder()
   .setDetectorMode(ObjectDetectorOptions.SINGLE_IMAGE_MODE)
   .enableMultipleObjects()
   .enableClassification()
   .build()
val objectDetector = ObjectDetection.getClient(options)

Шаг 3. Подайте изображение(я) в детектор.

Обнаружение и классификация объектов — это асинхронная обработка:

  • Вы отправляете изображение в детектор (через process() ).
  • Детектор очень усердно работает над этим.
  • Детектор сообщает вам результат посредством обратного вызова.

Следующий код делает именно это ( скопируйте и добавьте его к существующему коду внутри fun runObjectDetection(bitmap:Bitmap)):

// Step 3: feed given image to detector and setup callback
objectDetector.process(image)
   .addOnSuccessListener {
       // Task completed successfully
        debugPrint(it)
   }
   .addOnFailureListener {
       // Task failed with an exception
       Log.e(TAG, it.message.toString())
   }

По завершении детектор уведомит вас:

  • Общее количество обнаруженных объектов. Каждый обнаруженный объект описывается:
  • trackingId : целое число, которое вы используете для отслеживания между кадрами (НЕ используется в этой лаборатории кода).
  • boundingBox : ограничивающая рамка объекта.
  • labels: список меток для обнаруженного объекта (только при включенной классификации):
  • index (Получить индекс этой метки)
  • text (Получите текст этой этикетки, включая «Модные товары», «Еда», «Товары для дома», «Место», «Растение»)
  • confidence (плавающее значение от 0,0 до 1,0, где 1,0 означает 100%)

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

Добавьте его в класс MainActivity :

private fun debugPrint(detectedObjects: List<DetectedObject>) {
   detectedObjects.forEachIndexed { index, detectedObject ->
       val box = detectedObject.boundingBox

       Log.d(TAG, "Detected object: $index")
       Log.d(TAG, " trackingId: ${detectedObject.trackingId}")
       Log.d(TAG, " boundingBox: (${box.left}, ${box.top}) - (${box.right},${box.bottom})")
       detectedObject.labels.forEach {
           Log.d(TAG, " categories: ${it.text}")
           Log.d(TAG, " confidence: ${it.confidence}")
       }
   }
}

Теперь вы готовы принимать изображения для обнаружения!

Давайте запустим кодовую лабораторию, нажав « Выполнить» ( выполнить.png ) на панели инструментов Android Studio. Попробуйте выбрать предустановленное изображение или сделать фотографию, а затем посмотреть на окно logcat( 16bd6ea224cf8cf1.png ) внутри IDE.

Вы должны увидеть что-то похожее на это:

D/MLKit Object Detection: Detected object: 0
D/MLKit Object Detection:  trackingId: null
D/MLKit Object Detection:  boundingBox: (481, 2021) - (2426,3376)
D/MLKit Object Detection:  categories: Food
D/MLKit Object Detection:  confidence: 0.90234375
D/MLKit Object Detection: Detected object: 1
D/MLKit Object Detection:  trackingId: null
D/MLKit Object Detection:  boundingBox: (2639, 2633) - (3058,3577)
D/MLKit Object Detection: Detected object: 2
D/MLKit Object Detection:  trackingId: null
D/MLKit Object Detection:  boundingBox: (3, 1816) - (615,2597)
D/MLKit Object Detection:  categories: Home good
D/MLKit Object Detection:  confidence: 0.75390625

...это значит, что детектор увидел 3 объекта:

  • Категории: Еда и Товары для дома .
  • Для второго класса не возвращается категория, поскольку это неизвестный класс.
  • Нет trackingId (поскольку это режим обнаружения одного изображения).
  • Позиция внутри boundingBox (например, (481, 2021) – (2426, 3376))
  • Детектор вполне уверен, что первое — это еда (вероятность 90 % — это был салат ).

Технически это все, что вам нужно для работы ML Kit Object Detection: все это у вас уже есть! Поздравляем!

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

6. Постобработка результатов обнаружения

На предыдущих шагах вы печатаете обнаруженный результат в logcat : просто и быстро.

В этом разделе вы будете использовать результат в изображении:

  • нарисовать ограничивающую рамку на изображении
  • нарисуйте имя категории и уверенность внутри ограничительной рамки

Понимание утилит визуализации

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

  • data class BoxWithText(val box: Rect, val text: String) Это класс данных для хранения результата обнаружения объекта для визуализации. box — это ограничивающая рамка, в которой находится объект, а text — это строка результата обнаружения, которая отображается вместе с ограничивающей рамкой объекта.
  • fun drawDetectionResult(bitmap: Bitmap, detectionResults: List<BoxWithText>): Bitmap Этот метод рисует результаты обнаружения объекта в detectionResults на входном bitmap и возвращает его измененную копию.

Вот пример вывода метода утилиты drawDetectionResult :

58c6f1d4ddb00dfa.png

Визуализируйте результат обнаружения ML Kit

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

Перейдите туда, где вы вызываете debugPrint() , и добавьте под ним следующий фрагмент кода:

// Parse ML Kit's DetectedObject and create corresponding visualization data
val detectedObjects = it.map { obj ->
    var text = "Unknown"

    // We will show the top confident detection result if it exist
    if (obj.labels.isNotEmpty()) {
        val firstLabel = obj.labels.first()
        text = "${firstLabel.text}, ${firstLabel.confidence.times(100).toInt()}%"
    }
    BoxWithText(obj.boundingBox, text)
}

// Draw the detection result on the input bitmap
val visualizedResult = drawDetectionResult(bitmap, detectedObjects)

// Show the detection result on the app screen
runOnUiThread {
    inputImageView.setImageBitmap(visualizedResult)
}
  • Вы начинаете с анализа DetectedObject набора ML Kit и создания списка объектов BoxWithText для отображения результата визуализации.
  • Затем вы рисуете результат обнаружения поверх входного изображения с помощью служебного метода drawDetectionResult и показываете его на экране.

Запустить его

Теперь нажмите «Выполнить» ( выполнить.png ) на панели инструментов Android Studio.

После загрузки приложения нажмите кнопку со значком камеры, наведите камеру на объект, сделайте снимок, примите фотографию (в приложении «Камера») или вы можете легко нажать на любое предустановленное изображение. Вы должны увидеть результаты обнаружения; нажмите кнопку еще раз или выберите другое изображение, чтобы повторить его пару раз, чтобы испытать новейшую версию ML Kit ODT!

a03109cb30d5014d.png

7. Поздравляем!

Вы использовали ML Kit, чтобы добавить в свое приложение возможности обнаружения объектов:

  • 3 шага с 3 API
  • Создать входное изображение
  • Создать детектор
  • Отправить изображение в детектор

Это все, что вам нужно, чтобы запустить его!

По мере продвижения вы, возможно, захотите улучшить модель: как вы видите, модель по умолчанию может распознавать только 5 категорий — модель даже не знает ножа, вилки и бутылки. Ознакомьтесь с другой кодовой лабораторией в нашем курсе «Машинное обучение на устройстве — обнаружение объектов», чтобы узнать, как можно обучать пользовательскую модель.

Что мы рассмотрели

  • Как добавить обнаружение и отслеживание объектов ML Kit в ваше приложение для Android
  • Как использовать обнаружение и отслеживание объектов на устройстве в ML Kit для обнаружения объектов на изображениях

Следующие шаги

Узнать больше