Zadanie MediaPipe Interactive Image Segmenter przyjmuje lokalizację na obrazie, szacuje granice obiektu w tej lokalizacji i zwraca segmentację obiektu jako dane obrazu. Te instrukcje pokazują, jak używać interaktywnego narzędzia do dzielenia obrazu w przypadku aplikacji na Androida. Przykład kodu opisany w tych instrukcjach jest dostępny na GitHub. Więcej informacji o możliwościach, modelach i opcjach konfiguracji związanych z tym zadaniem znajdziesz w sekcji Omówienie.
Przykładowy kod
Przykładowy kod MediaPipe Tasks to prosta implementacja aplikacji do segmentacji obrazów na Androida. Przykład działa z obrazami wybranymi z galerii urządzenia.
Możesz użyć tej aplikacji jako punktu wyjścia do stworzenia własnej aplikacji na Androida lub skorzystać z niej podczas modyfikowania istniejącej aplikacji. Przykładowy kod segmentatora interaktywnych obrazów jest hostowany na GitHub.
Pobieranie kodu
Z tych instrukcji dowiesz się, jak utworzyć lokalną kopię przykładowego kodu za pomocą narzędzia wiersza poleceń git.
Aby pobrać przykładowy kod:
- Sklonuj repozytorium Git za pomocą tego polecenia:
git clone https://github.com/google-ai-edge/mediapipe-samples
- Opcjonalnie skonfiguruj instancję git, aby używać skanowania rzadkiego, aby mieć tylko pliki przykładowej aplikacji Interactive Image Segmenter:
cd mediapipe-samples git sparse-checkout init --cone git sparse-checkout set examples/interactive_segmentation/android
Po utworzeniu lokalnej wersji przykładowego kodu możesz zaimportować projekt do Android Studio i uruchomić aplikację. Instrukcje znajdziesz w przewodniku konfiguracji Androida.
Kluczowe komponenty
Te pliki zawierają kluczowy kod przykładowej aplikacji do segmentacji obrazu:
- InteractiveSegmentationHelper.kt – inicjuje zadanie segmentacji interaktywnego obrazu i obsługuje model oraz wybór delegowany.
- OverlayView.kt – obsługuje i formatuje wyniki podziału na segmenty.
Konfiguracja
W tej sekcji opisaliśmy najważniejsze kroki konfiguracji środowiska programistycznego i projektów kodu, które należy wykonać, aby korzystać z narzędzia Interactive Image Segmenter. Ogólne informacje o konfigurowaniu środowiska programistycznego do korzystania z zadań MediaPipe, w tym wymagania dotyczące wersji platformy, znajdziesz w przewodniku konfiguracji na Androida.
Zależności
Narzędzie do segmentacji interaktywnych obrazów korzysta z biblioteki com.google.mediapipe:tasks-vision. Dodaj tę zależność do pliku build.gradle w projekcie tworzenia aplikacji na Androida. Zaimportuj wymagane zależności za pomocą tego kodu:
dependencies {
...
implementation 'com.google.mediapipe:tasks-vision:latest.release'
}
Model
Zadanie MediaPipe Interactive Image Segmenter wymaga wytrenowanego modelu zgodnego z tym zadaniem. Więcej informacji o dostępnych wytrenowanych modelach narzędzia Interactive Image Segmenter znajdziesz w sekcji Modele w omówieniu zadania.
Wybierz i pobierz model, a potem zapisz go w katalogu projektu:
<dev-project-root>/src/main/assets
Użyj metody BaseOptions.Builder.setModelAssetPath(), aby określić ścieżkę używaną przez model. Ta metoda jest przedstawiona w przykładowym kodzie w następnej sekcji.
W przykładowym kodzie segmentera interaktywnych obrazów model jest zdefiniowany w klasie InteractiveSegmenterHelper.kt w funkcji setupInteractiveSegmenter().
Tworzenie zadania
Do utworzenia zadania możesz użyć funkcji createFromOptions. Funkcja createFromOptions akceptuje opcje konfiguracji, w tym typy danych wyjściowych maski. Więcej informacji o opcjach konfiguracji 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 w funkcji setupInteractiveSegmenter() klasy InteractiveSegmenterHelper.
Opcje konfiguracji
W tym zadaniu dostępne są te opcje konfiguracji aplikacji na Androida:
| Nazwa opcji | Opis | Zakres wartości | Wartość domyślna |
|---|---|---|---|
outputCategoryMask |
Jeśli ustawisz tę opcję na True, dane wyjściowe będą zawierać maskę segmentacji w postaci obrazu uint8, gdzie każda wartość piksela wskazuje, czy dany piksel należy do obiektu znajdującego się w obszarze zainteresowania. |
{True, False} |
False |
outputConfidenceMasks |
Jeśli ustawisz tę opcję na True, dane wyjściowe będą zawierać maskę segmentacji w postaci obrazu z wartością zmiennoprzecinkową, gdzie każda wartość zmiennoprzecinkowa reprezentuje poziom pewności, że piksel należy do obiektu znajdującego się w obszarze zainteresowania. |
{True, False} |
True |
displayNamesLocale |
Określa język etykiet, których należy używać do wyświetlanych nazw podanych w metadanych modelu zadania (jeśli są dostępne). Wartość domyślna to en w przypadku języka angielskiego. Możesz dodawać zlokalizowane etykiety do metadanych modelu niestandardowego, korzystając z interfejsu TensorFlow Lite Metadata Writer API.
| Kod języka | en |
errorListener |
Ustawia opcjonalny odbiornik błędów. | Nie dotyczy | Nie ustawiono |
Przygotuj dane
Interaktywny segmentator obrazów działa na obrazach, a zadanie obsługuje wstępne przetwarzanie danych, w tym zmianę rozmiaru, obrót i normalizację wartości.
Zanim przekażesz obraz do zadania, musisz przekonwertować go na obiekt 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();
W przykładowym kodzie segmentatora interaktywnych obrazów przygotowanie danych jest obsługiwane w klasie InteractiveSegmenterHelper za pomocą funkcji segment().
Uruchamianie zadania
Wywołaj funkcję segment, aby przeprowadzić prognozę i wygenerować segmenty.
Zadanie Segmentacja interaktywnego obrazu zwraca zidentyfikowane obszary segmentów na obrazie wejściowym.
RegionOfInterest roi = RegionOfInterest.create(
NormalizedKeypoint.create(
normX * it.width,
normY * it.height
)
);
ImageSegmenterResult segmenterResult = interactivesegmenter.segment(image, roi);W przykładowym kodzie segmentatora interaktywnych obrazów funkcje segment są zdefiniowane w pliku InteractiveSegmenterHelper.kt.
Obsługa i wyświetlanie wyników
Po uruchomieniu wnioskowania zadanie Interactive Image Segmenter zwraca obiekt ImageSegmenterResult, który zawiera wyniki zadania podziału na segmenty. Treść danych wyjściowych może zawierać maskę kategorii lub maskę wiarygodności albo obie te maski, w zależności od tego, co zostało ustawione podczas konfigurowania zadania.
W następnych sekcjach znajdziesz więcej informacji o danych wyjściowych z tego zadania:
Maska kategorii
Na poniższych obrazach pokazano wizualizację wyniku zadania w przypadku maski kategorii i wartości z wskazanym punktem zainteresowania. Każdy piksel to wartość uint8, która wskazuje, czy piksel jest częścią obiektu znajdującego się w obszarze zainteresowania. Czarny i biały okrąg na drugim obrazie wskazuje wybrany obszar zainteresowania.
Wyjście oryginalnej maski obrazu i kategorii. Obraz źródłowy z danych Pascal VOC 2012.
Maska ufności
Dane wyjściowe maski ufności zawierają wartości zmiennoprzecinkowe z zakresu [0, 1] dla każdego kanału wejściowego obrazu. Wyższe wartości wskazują na większą pewność, że piksel obrazu jest częścią obiektu znajdującego się w obszarze zainteresowania.