Задача MediaPipe Interactive Image Segmenter берет местоположение на изображении, оценивает границы объекта в этом месте и возвращает сегментацию объекта в виде данных изображения. В этих инструкциях показано, как использовать интерактивный сегментатор изображений с приложениями Android. Пример кода, описанный в этой инструкции, доступен на GitHub . Дополнительные сведения о возможностях, моделях и параметрах конфигурации этой задачи см. в разделе Обзор .
Пример кода
Пример кода задач MediaPipe — это простая реализация приложения интерактивного сегментатора изображений для Android. Пример работает с изображениями, выбранными из галереи устройства.
Вы можете использовать это приложение в качестве отправной точки для своего собственного приложения для Android или обращаться к нему при изменении существующего приложения. Пример кода Interactive Image Segmenter размещен на GitHub .
Загрузите код
Следующие инструкции показывают, как создать локальную копию кода примера с помощью инструмента командной строки git .
Чтобы загрузить пример кода:
- Клонируйте репозиторий git, используя следующую команду:
git clone https://github.com/google-ai-edge/mediapipe-samples
- При желании настройте свой экземпляр 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(exception -> { // 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. MPImage 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]
для каждого входного канала изображения. Более высокие значения указывают на более высокую уверенность в том, что пиксель изображения является частью объекта, расположенного в интересующей области.