1. Прежде чем начать
ML Kit — это мобильный SDK, который переносит опыт Google в области машинного обучения на устройствах в приложения для Android и iOS. Вы можете использовать мощные, но простые в использовании API для обработки изображений и естественного языка, чтобы решать распространенные задачи в ваших приложениях или создавать совершенно новые пользовательские интерфейсы. Все это основано на лучших в своем классе моделях машинного обучения Google и предоставляется вам бесплатно.
Все API-интерфейсы ML Kit работают на устройстве, что позволяет использовать их в режиме реального времени, например, для обработки видеопотока с камеры. Это также означает, что функциональность доступна и в автономном режиме.
В этом практическом занятии вы шаг за шагом узнаете, как добавить функцию обнаружения и отслеживания объектов (ODT) для заданного изображения в ваше существующее Android-приложение. Обратите внимание, что в этом занятии используются некоторые упрощенные методы, чтобы продемонстрировать использование ODT из ML Kit.
Что вы построите
В этом практическом задании вы создадите Android-приложение с использованием ML Kit. Ваше приложение будет использовать API обнаружения и отслеживания объектов ML Kit для обнаружения объектов на заданном изображении. В итоге вы должны увидеть что-то похожее на изображение справа. |
|
Что вы узнаете
- Как интегрировать SDK ML Kit в ваше Android-приложение
- API для обнаружения и отслеживания объектов ML Kit
Что вам понадобится
- Последняя версия Android Studio (v4.1.2+)
- Эмулятор Android Studio или физическое устройство Android.
- Пример кода
- Базовые знания разработки под Android на Kotlin.
Данный практический урок посвящен ML Kit. Несущественные концепции и блоки кода опущены и предоставлены для простого копирования и вставки.
2. Настройка
Скачать код
Чтобы скачать весь код для этого практического занятия, перейдите по следующей ссылке:
Распакуйте загруженный zip-файл. В результате будет распакована корневая папка ( mlkit-android-main ) со всеми необходимыми ресурсами. Для этого практического занятия вам понадобятся только исходные файлы из подкаталога object-detection .
Подкаталог object-detection в репозитории mlkit-android содержит два каталога:
Стартовый код — исходный код, на основе которого вы будете строить дальнейшую работу в рамках этого практического занятия.
Завершенный код — код готового демонстрационного приложения.
3. Добавьте в проект API для обнаружения и отслеживания объектов ML Kit.
Импортируйте приложение в Android Studio.
Начнём с импорта стартового приложения в Android Studio.
Откройте Android Studio, выберите «Импорт проекта» (Gradle, Eclipse ADT и т. д.) и выберите папку starter из исходного кода, который вы скачали ранее.

Добавьте зависимости для ML Kit Object Detection and Tracking.
Зависимости ML Kit позволяют интегрировать SDK ML Kit ODT в ваше приложение. Добавьте следующие строки в конец файла app/build.gradle вашего проекта:
build.gradle
dependencies {
// ...
implementation 'com.google.mlkit:object-detection:16.2.4'
}
Синхронизируйте свой проект с файлами Gradle.
Чтобы убедиться, что все зависимости доступны вашему приложению, на этом этапе следует синхронизировать проект с файлами Gradle.
Выберите «Синхронизировать проект с файлами Gradle» (
) с панели инструментов Android Studio.
(Если эта кнопка неактивна, убедитесь, что вы импортируете только starter/app/build.gradle , а не весь репозиторий.)
4. Запустите стартовое приложение.
Теперь, когда вы импортировали проект в Android Studio и добавили зависимости для ML Kit Object Detection and Tracking, вы готовы запустить приложение в первый раз.
Подключите ваше Android-устройство через USB к хосту или запустите эмулятор Android Studio и нажмите «Запустить» (
) на панели инструментов Android Studio.
Запустите и изучите приложение.
Приложение должно запуститься на вашем устройстве Android. Оно содержит некоторый шаблонный код, позволяющий сделать снимок или выбрать предустановленное изображение и передать его в конвейер обнаружения и отслеживания объектов, который вы создадите в этом практическом занятии. Давайте немного изучим приложение, прежде чем писать код.
Во-первых, есть кнопка (
) внизу к:
- Откройте приложение камеры, встроенное в ваше устройство/эмулятор.
- сделать снимок прямо в приложении камеры
- получить захваченное изображение в стартовом приложении
- отобразить изображение
Попробуйте кнопку «Сделать фото» , следуйте инструкциям, чтобы сделать снимок, подтвердите фото и посмотрите, как оно отображается в стартовом приложении .
Повторите несколько раз, чтобы увидеть, как это работает:



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

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) {
}
В данный момент функция пуста. Переходите к следующим шагам для реализации ML Kit ODT! В процессе работы Android Studio предложит вам добавить необходимые импорты:
-
com.google.mlkit.vision.common.InputImage -
com.google.mlkit.vision.objects.ObjectDetection -
com.google.mlkit.vision.objects.defaults.ObjectDetectorOptions
Шаг 1: Создайте объект InputImage
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 . Вы передаете конфигурацию в 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%)
Вы, вероятно, заметили, что код выполняет обработку обнаруженного результата с помощью debugPrint() , используя что-то вроде printf.
Добавьте это в класс 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}")
}
}
}
Теперь вы готовы принимать изображения для обнаружения!
Давайте запустим практическое задание, нажав кнопку «Запустить» (
) на панели инструментов Android Studio. Попробуйте выбрать предустановленное изображение или сделать снимок, а затем посмотрите на окно logcat.
) внутри 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: у вас всё это есть на данный момент! Поздравляем!
Что касается пользовательского интерфейса, вы все еще находитесь на том же этапе, с которого начали, но вы можете использовать полученные результаты в интерфейсе, например, для отрисовки ограничивающей рамки, чтобы улучшить пользовательский опыт: перейдем к следующему шагу — постобработке полученных результатов!
6. Постобработка результатов обнаружения
На предыдущих этапах вы выводили результат обнаружения в logcat : это просто и быстро.
В этом разделе вы используете полученный результат для создания изображения:
- Нарисуйте ограничивающую рамку на изображении.
- Нарисуйте название категории и уровень достоверности внутри ограничивающей рамки.
Разберитесь в инструментах визуализации.
В коде лабораторной работы есть некоторый шаблонный код, который поможет вам визуализировать результаты обнаружения. Используйте эти утилиты, чтобы упростить наш код визуализации:
-
data class BoxWithText(val box: Rect, val text: String)предназначен для хранения результатов обнаружения объекта для визуализации.box— это ограничивающая рамка, в которой расположен объект, аtext— это строка с результатом обнаружения, которая будет отображаться вместе с ограничивающей рамкой объекта. -
fun drawDetectionResult(bitmap: Bitmap, detectionResults: List<BoxWithText>): BitmapЭтот метод рисует результаты обнаружения объектов изdetectionResultsна входномbitmapи возвращает его измененную копию.
Вот пример результата работы вспомогательного метода drawDetectionResult :

Визуализируйте результаты обнаружения с помощью 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, вы рисуете результат обнаружения поверх входного изображения и отображаете его на экране.
Запустите его
Теперь нажмите « Выполнить » (
) на панели инструментов Android Studio.
После загрузки приложения нажмите кнопку со значком камеры, наведите камеру на объект, сделайте снимок, подтвердите снимок (в приложении «Камера») или просто выберите любое из предустановленных изображений. Вы увидите результаты обнаружения; нажмите кнопку еще раз или выберите другое изображение, чтобы повторить несколько раз и оценить возможности новейшего набора ML Kit ODT!

7. Поздравляем!
Вы использовали ML Kit для добавления в свое приложение функций обнаружения объектов:
- 3 шага с 3 API
- Создать входное изображение
- Создать детектор
- Отправить изображение на детектор
Это всё, что вам нужно, чтобы запустить его!
По мере продвижения вы можете улучшить модель: как видите, модель по умолчанию распознает только 5 категорий — она даже не знает, что такое нож, вилка и бутылка. Ознакомьтесь с другим практическим заданием в нашем учебном курсе «Машинное обучение на устройстве — обнаружение объектов», чтобы узнать, как обучить собственную модель.
Что мы рассмотрели
- Как добавить функцию обнаружения и отслеживания объектов ML Kit в ваше Android-приложение
- Как использовать встроенную функцию обнаружения и отслеживания объектов в ML Kit для распознавания объектов на изображениях
Следующие шаги
- Изучите возможности ML Kit ODT, используя больше изображений и видео в реальном времени, чтобы оценить точность и производительность обнаружения и классификации.
- Ознакомьтесь с учебным курсом «Машинное обучение на устройстве — обнаружение объектов», чтобы узнать, как обучить собственную модель.
- Примените ML Kit ODT в своем собственном приложении для Android.