Интерактивное руководство по сегментации изображений для Android

Задача MediaPipe Interactive Image Segmenter берет местоположение на изображении, оценивает границы объекта в этом месте и возвращает сегментацию объекта в виде данных изображения. В этих инструкциях показано, как использовать интерактивный сегментатор изображений с приложениями Android. Пример кода, описанный в этой инструкции, доступен на GitHub . Дополнительные сведения о возможностях, моделях и параметрах конфигурации этой задачи см. в разделе Обзор .

Пример кода

Пример кода задач MediaPipe — это простая реализация приложения интерактивного сегментатора изображений для Android. Пример работает с изображениями, выбранными из галереи устройства.

Вы можете использовать это приложение в качестве отправной точки для своего собственного приложения для Android или обращаться к нему при изменении существующего приложения. Пример кода Interactive Image Segmenter размещен на GitHub .

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

Следующие инструкции показывают, как создать локальную копию кода примера с помощью инструмента командной строки git .

Чтобы загрузить пример кода:

  1. Клонируйте репозиторий git, используя следующую команду:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. При желании настройте свой экземпляр git на использование разреженной проверки, чтобы у вас были только файлы для примера приложения интерактивного сегментатора изображений:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/interactive_segmentation/android
    

После создания локальной версии кода примера вы можете импортировать проект в Android Studio и запустить приложение. Инструкции см. в Руководстве по установке для Android .

Ключевые компоненты

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

  • InteractiveSegmentationHelper.kt — инициализирует задачу интерактивного сегментирования изображений и обрабатывает выбор модели и делегата.
  • OverlayView.kt — обрабатывает и форматирует результаты сегментации.

Настраивать

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

Зависимости

Интерактивный сегментатор изображений использует библиотеку com.google.mediapipe:tasks-vision . Добавьте эту зависимость в файл build.gradle вашего проекта разработки приложения для Android. Импортируйте необходимые зависимости с помощью следующего кода:

dependencies {
    ...
    implementation 'com.google.mediapipe:tasks-vision:latest.release'
}

Модель

Для задачи интерактивного сегментатора изображений MediaPipe требуется обученная модель, совместимая с этой задачей. Дополнительную информацию о доступных обученных моделях для Interactive Image Segmenter смотрите в разделе «Модели обзора задач».

Выберите и загрузите модель, а затем сохраните ее в каталоге вашего проекта:

<dev-project-root>/src/main/assets

Используйте метод BaseOptions.Builder.setModelAssetPath() чтобы указать путь, используемый моделью. Этот метод показан в примере кода в следующем разделе.

В примере кода Interactive Image Segmenter модель определяется в классе InteractiveSegmenterHelper.kt в функции setupInteractiveSegmenter() .

Создать задачу

Вы можете использовать функцию createFromOptions для создания задачи. Функция createFromOptions принимает параметры конфигурации, включая типы вывода маски. Дополнительные сведения о параметрах конфигурации см. в разделе Обзор конфигурации .

InteractiveSegmenterOptions options =
  InteractiveSegmenterOptions.builder()
    .setBaseOptions(
      BaseOptions.builder().setModelAssetPath("model.tflite").build())
    .setOutputCategoryMask(true)
    .setOutputConfidenceMasks(false)
    .setResultListener((result, inputImage) -> {
         // Process the segmentation result here.
    })
    .setErrorListener((result, inputImage) -> {
         // Process the segmentation errors here.
    })    .build();
interactivesegmenter = InteractiveSegmenter.createFromOptions(context, options);

Более подробный пример настройки этой задачи см. в функции setupInteractiveSegmenter() класса InteractiveSegmenterHelper .

Варианты конфигурации

Эта задача имеет следующие параметры конфигурации для приложений Android:

Название опции Описание Диапазон значений Значение по умолчанию
outputCategoryMask Если установлено значение True , выходные данные включают маску сегментации в виде изображения uint8, где каждое значение пикселя указывает, является ли пиксель частью объекта, расположенного в интересующей области. { True, False } False
outputConfidenceMasks Если установлено значение True , выходные данные включают маску сегментации в виде изображения с плавающим значением, где каждое значение с плавающей запятой представляет уверенность в том, что пиксель является частью объекта, расположенного в интересующей области. { True, False } True
displayNamesLocale Задает язык меток, которые будут использоваться для отображаемых имен, представленных в метаданных модели задачи, если они доступны. По умолчанию — en для английского языка. Вы можете добавить локализованные метки к метаданным пользовательской модели с помощью API записи метаданных TensorFlow Lite. Код региона ru
errorListener Устанавливает дополнительный прослушиватель ошибок. Н/Д Не задано

Подготовьте данные

Интерактивный сегментатор изображений работает с изображениями, и эта задача выполняет предварительную обработку входных данных, включая изменение размера, поворот и нормализацию значений. Вам необходимо преобразовать входное изображение в объект com.google.mediapipe.framework.image.MPImage перед передачей его задаче.

import com.google.mediapipe.framework.image.BitmapImageBuilder;
import com.google.mediapipe.framework.image.MPImage;

// Load an image on the user’s device as a Bitmap object using BitmapFactory.

// Convert an Android’s Bitmap object to a MediaPipe’s Image object.
Image mpImage = new BitmapImageBuilder(bitmap).build();

В примере кода Interactive Image Segmenter подготовка данных обрабатывается в классе InteractiveSegmenterHelper с помощью функции segment() .

Запустить задачу

Вызовите функцию segment , чтобы выполнить прогноз и сгенерировать сегменты. Задача «Интерактивный сегментатор изображений» возвращает идентифицированные области сегментов входного изображения.

RegionOfInterest roi = RegionOfInterest.create(
    NormalizedKeypoint.create(
        normX * it.width,
        normY * it.height
    )
);

ImageSegmenterResult segmenterResult = interactivesegmenter.segment(image, roi);

В примере кода Interactive Image Segmenter функции segment определены в файле InteractiveSegmenterHelper.kt .

Обработка и отображение результатов

После выполнения вывода задача «Интерактивный сегментатор изображений» возвращает объект ImageSegmenterResult , который содержит результаты задачи сегментации. Содержимое выходных данных может включать маску категории, маску достоверности или и то, и другое, в зависимости от того, что вы установили при настройке задачи.

В следующих разделах дополнительно объясняются выходные данные этой задачи:

Маска категории

На следующих изображениях показана визуализация результатов задачи для маски значений категории с указанием интересующей области. Каждый пиксель представляет собой значение uint8 , указывающее, является ли пиксель частью объекта, расположенного в интересующей области. Черно-белый кружок на втором изображении указывает выбранную область интереса.

Вывод исходного изображения и маски категории. Исходное изображение из набора данных Pascal VOC 2012 .

Маска уверенности

Выходные данные маски доверия содержат значения с плавающей запятой между [0, 1] для каждого входного канала изображения. Более высокие значения указывают на более высокую уверенность в том, что пиксель изображения является частью объекта, расположенного в интересующей области.