Interaktywny przewodnik po segmentacji obrazu na Androidzie

Zadanie MediaPipe Interactive Image segmenter pobiera lokalizację na obrazie i określa granice obiektu w tej lokalizacji i zwraca jego segmentację jako zdjęcia. Te instrukcje pokazują, jak korzystać z interaktywnego segmentowania obrazów Aplikacje na Androida. Przykładowy kod opisany w tych instrukcjach jest dostępny na GitHub Więcej informacji o funkcjach, modelach i opcjach konfiguracji zapoznaj się z Przeglądem.

Przykładowy kod

Przykład kodu MediaPipe Tasks to prosta implementacja interaktywnego segmentowania obrazów na Androida. Przykład obejmuje obrazy wybrane z galerii urządzenia.

Możesz użyć tej aplikacji jako punktu wyjścia dla własnej aplikacji na Androida lub odnieść się do niej podczas modyfikowania istniejącej aplikacji. Przykładowy kod Interactive Image Segmenter jest hostowany GitHub

Pobieranie kodu

Poniżej znajdziesz instrukcje tworzenia lokalnej kopii przykładu. za pomocą narzędzia wiersza poleceń git.

Aby pobrać przykładowy kod:

  1. Sklonuj repozytorium git za pomocą tego polecenia:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. Opcjonalnie możesz skonfigurować instancję git tak, aby wykorzystywała rozproszony proces płatności, masz więc tylko pliki z przykładowej aplikacji Interactive Image Segmenter:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/interactive_segmentation/android
    

Po utworzeniu lokalnej wersji przykładowego kodu możesz zaimportować projekt w Android Studio i uruchom aplikację. Instrukcje znajdziesz w Przewodnik po konfiguracji na Androida

Kluczowe elementy

Te pliki zawierają kluczowy kod dla tego obrazu przykładowa aplikacja do podziału na segmenty:

Konfiguracja

W tej sekcji opisujemy najważniejsze czynności związane z konfigurowaniem środowiska programistycznego oraz w projektach kodu, w których można używać interaktywnego segmentowania obrazów. Ogólne informacje na temat: skonfigurować środowisko programistyczne do korzystania z zadań MediaPipe, w tym wymagań wersji platformy, patrz Przewodnik po konfiguracji na Androida

Zależności

Interaktywny podział obrazów na segmenty korzysta z biblioteki com.google.mediapipe:tasks-vision. Dodaj to zależności od pliku build.gradle Projekt tworzenia aplikacji na Androida. Zaimportuj wymagane zależności za pomocą: ten kod:

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

Model

Zadanie MediaPipe Interactive Image segmenter wymaga wytrenowanego modelu zgodnego z tym zadanie. Więcej informacji o dostępnych wytrenowanych modelach na potrzeby interaktywnego segmentowania obrazów znajdziesz w artykule zapoznaj się z omówieniem zadania sekcją Modele.

Wybierz i pobierz model, a następnie zapisz go w katalogu projektu:

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

Użyj metody BaseOptions.Builder.setModelAssetPath(), aby podać ścieżkę używane przez model. Ta metoda zostanie opisana w przykładowym kodzie w następnym .

W narzędziu Interactive Image segmenter. przykładowy kod, model jest zdefiniowany w InteractiveSegmenterHelper.kt w funkcji setupInteractiveSegmenter().

Tworzenie zadania

Do utworzenia zadania możesz użyć funkcji createFromOptions. Funkcja createFromOptions akceptuje opcje konfiguracji, w tym typów danych wyjściowych maski. Więcej informacji o konfiguracji Więcej informacji znajdziesz w artykule Omówienie konfiguracji.

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);

Bardziej szczegółowy przykład konfigurowania tego zadania znajdziesz tutaj: InteractiveSegmenterHelper funkcji setupInteractiveSegmenter() klasy.

Opcje konfiguracji

To zadanie zawiera te opcje konfiguracji aplikacji na Androida:

Nazwa opcji Opis Zakres wartości Wartość domyślna
outputCategoryMask Jeśli ma wartość True, dane wyjściowe będą zawierały maskę podziału na segmenty. jako obraz uint8, gdzie każda wartość w pikselach wskazuje, czy piksel jest częścią i znajdź obiekt na danym obszarze. {True, False} False
outputConfidenceMasks Jeśli ma wartość True, dane wyjściowe będą zawierały maskę podziału na segmenty. jako obraz wartości zmiennoprzecinkowej, gdzie każda wartość zmiennoprzecinkowa odzwierciedla poziom ufności że piksel jest częścią obiektu znajdującego się na danym obszarze. {True, False} True
displayNamesLocale Ustawia język etykiet, które mają być używane w przypadku nazw wyświetlanych w kolumnie metadane modelu zadania, jeśli są dostępne. Wartość domyślna to en dla Angielski. Do metadanych modelu niestandardowego możesz dodać zlokalizowane etykiety za pomocą interfejsu TensorFlow Lite Metadata Writer API. Kod języka en
errorListener Ustawia opcjonalny detektor błędów. Nie dotyczy Nie ustawiono

Przygotuj dane

Interaktywny podział obrazów na segmenty działa z obrazami, a zadanie obsługuje wprowadzanie danych w tym m.in. zmianę rozmiaru, obrót i normalizację wartości. Musisz przekonwertować obraz wejściowy na com.google.mediapipe.framework.image.MPImage obiekt przed przekazaniem do zadanie.

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

// Load an image on the users device as a Bitmap object using BitmapFactory.

// Convert an Androids Bitmap object to a MediaPipes Image object.
MPImage mpImage = new BitmapImageBuilder(bitmap).build();
RegionOfInterest roi = RegionOfInterest.create(
    NormalizedKeypoint.create(
        normX * it.width,
        normY * it.height
    )
);

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

W przykładowym kodzie Interactive Image segmenter funkcje segment są zdefiniowane w sekcji InteractiveSegmenterHelper.kt. .

Obsługa i wyświetlanie wyników

Po przeprowadzeniu wnioskowania zadanie segmentujące obrazy interaktywne zwraca błąd ImageSegmenterResult obiekt zawierający wyniki funkcji i segmentacji. Dane wyjściowe mogą zawierać maskę kategorii, maską ufności lub obie te wartości, w zależności od ustawionej wartości skonfigurował zadanie.

W sekcjach poniżej objaśniamy dane wyjściowe tego zadania:

Maska kategorii

Te obrazy przedstawiają wizualizację danych wyjściowych zadania dla kategorii maska wartości ze wskazanym obszarem zainteresowania. Każdy piksel to uint8 wartość wskazująca, czy piksel jest częścią obiektu znajdującego się na obszarze a interesem publicznym. Czarno-białe kółko na drugim obrazie wskazuje wybrane elementy obszar zainteresowań.

Oryginalny obraz i maska kategorii. Obraz źródłowy z Pascal VOC 2012 w zbiorze danych.

Maska ufności

Wynikiem maski ufności zawierają wartości zmiennoprzecinkowe między [0, 1] dla dla każdego kanału wejściowego obrazu. Wyższe wartości oznaczają wyższy poziom ufności, że piksel obrazu jest częścią obiektu znajdującego się na danym obszarze.