Interaktywny przewodnik po segmentacji obrazów w Pythonie

Zadanie MediaPipe Interactive Image Segmenter przyjmuje lokalizację na obrazie, szacuje granice obiektu w tej lokalizacji i zwraca podział obiektu na segmenty jako dane obrazu. Te instrukcje pokazują, jak używać narzędzia do segmentacji interaktywnych obrazów w języku Python. Więcej informacji o możliwościach, modelach i opcjach konfiguracji tego zadania znajdziesz w sekcji Omówienie.

Przykładowy kod

Przykładowy kod segmentatora interaktywnych obrazów zawiera pełną implementację tego zadania w Pythonie. Ten kod pomoże Ci przetestować to zadanie i rozpocząć tworzenie własnej aplikacji do interaktywnego dzielenia obrazu. Możesz wyświetlać, uruchamiać i edytować przykładowy kod interaktywnego segmentatora obrazu, korzystając tylko z przeglądarki.

Konfiguracja

W tej sekcji opisaliśmy najważniejsze kroki konfigurowania środowiska programistycznego i projektów kodu na potrzeby korzystania z segmentatora interaktywnych obrazów. Ogólne informacje o konfigurowaniu środowiska programistycznego na potrzeby korzystania z zadań MediaPipe, w tym wymagania dotyczące wersji platformy, znajdziesz w przewodniku po konfigurowaniu Pythona. Kod źródłowy tego przykładu znajdziesz na GitHub.

Pakiety

Zadanie MediaPipe Interactive Image Segmenter wymaga pakietu mediapipe. Wymagane zależności możesz zainstalować za pomocą tego polecenia:

$ python -m pip install mediapipe

Importy

Aby uzyskać dostęp do funkcji zadania Segmenter interaktywnych obrazów, zaimportuj te klasy:

import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import vision

Model

Zadanie MediaPipe Interactive Image Segmenter wymaga wytrenowanego modelu zgodnego z tym zadaniem. Więcej informacji o dostępnych wytrenowanych modelach usługi Interaktywny segmentator obrazów znajdziesz w sekcji Modele w opisie zadania.

Wybierz i pobierz model, a potem zapisz go w katalogu projektu:

model_path = '/absolute/path/to/model.tflite'

W parametrze model_asset_path podaj ścieżkę do modelu, jak pokazano poniżej:

base_options = BaseOptions(model_asset_path=model_path)

Tworzenie zadania

Do konfigurowania zadania MediaPipe Interactive Image Segmenter służy funkcja create_from_options. Funkcja create_from_options przyjmuje wartości dla opcji konfiguracji. Więcej informacji o opcjach konfiguracji znajdziesz w artykule Opcje konfiguracji. Poniższy kod pokazuje, jak skompilować i skonfigurować to zadanie.

BaseOptions = mp.tasks.BaseOptions
InteractiveSegmenter = mp.tasks.vision.InteractiveSegmenter
InteractiveSegmenterOptions = mp.tasks.vision.InteractiveSegmenterOptions
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a image segmenter instance with the image mode:
options = InteractiveSegmenterOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.task'),
    running_mode=VisionRunningMode.IMAGE,
    output_type=InteractiveSegmenterOptions.OutputType.CATEGORY_MASK)
with InteractiveSegmenter.create_from_options(options) as segmenter:
# segmenter is initialized and ready to use

Opcje konfiguracji

W tym zadaniu dostępne są te opcje konfiguracji aplikacji Pythona:

Nazwa opcji Opis Zakres wartości Wartość domyślna
output_category_mask 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
output_confidence_masks 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
display_names_locale 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

Przygotuj dane

Przygotuj dane wejściowe jako plik obrazu lub tablicę numpy, a następnie przekształć je w obiekt mediapipe.Image.

# Load the input image from an image file.
mp_image = mp.Image.create_from_file('/path/to/image')

# Load the input image from a numpy array.
mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=numpy_image)

Przykład kodu pokazujący przygotowanie danych do użycia przez narzędzie Interactive Image Segmenter znajdziesz w przykładowym kodzie.

Uruchamianie zadania

Segmentator interaktywnych obrazów używa funkcji segment do wywoływania wnioskowania. W przypadku podziału obrazu obejmuje to wstępne przetwarzanie danych wejściowych, uruchamianie modelu podziału i przetwarzanie podziałów na maski w post-processingu.

Poniższy przykładowy kod pokazuje, jak wykonać przetwarzanie za pomocą modelu zadania.

RegionOfInterest = vision.InteractiveSegmenterRegionOfInterest
# Perform image segmentation on the provided single image.
# The image segmenter must be created with the image mode.
roi = RegionOfInterest(format=RegionOfInterest.Format.KEYPOINT,
                          keypoint=NormalizedKeypoint(x, y))
segmented_masks = segmenter.segment(mp_image, roi)

Pełniejszy przykład działania funkcji wnioskowania w Interactive Image Segmenter znajdziesz w przykładzie kodu.

Obsługa i wyświetlanie wyników

Wyniki działania narzędzia Interactive Image Segmenter to lista danych Image, która może zawierać maskę kategorii, maski ufności lub oba te elementy, w zależności od tego, co zostało określone podczas konfigurowania zadania. Jeśli ustawisz parametr output_category_mask na True, dane wyjściowe będą zawierać listę z maską w jednym segmencie w formacie uint8. Wartość piksela wskazuje, czy jest to część obiektu w obszarze zainteresowania. Indeks kategorii rozpoznany na podstawie obrazu wejściowego. Jeśli ustawisz parametr output_confidence_masks na True, dane wyjściowe będą zawierać listę kanałów z wartościami pikseli w zakresie [0,1], które reprezentują wynik zaufania piksela należącego do obiektu w obszarze zainteresowania.

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.

Pies stojący na stosie liści Zarysowany kształt psa z poprzedniego obrazu

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.