Interaktywny przewodnik po segmentacji obrazów w Pythonie

Zadanie MediaPipe Interactive Image Segmenter pobiera lokalizację na obrazie, szacuje granice obiektu w tej lokalizacji i zwraca segmentację obiektu jako dane obrazu. Te instrukcje pokazują, jak korzystać z interaktywnego podziału obrazów na segmenty 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 interaktywnego narzędzia do segmentowania obrazów zawiera pełną implementację tego zadania w Pythonie. Ten kod pomoże Ci przetestować to zadanie i zacząć tworzyć własną aplikację do interaktywnego podziału obrazów na segmenty. Możesz wyświetlić, uruchomić i edytować przykładowy kod interaktywnego segmentu obrazów w przeglądarce internetowej.

Konfiguracja

W tej sekcji znajdziesz najważniejsze czynności, jakie należy wykonać, aby skonfigurować środowisko programistyczne i projekty kodu na potrzeby interaktywnego podziału obrazów na segmenty. Ogólne informacje o konfigurowaniu środowiska programistycznego na potrzeby zadań MediaPipe, w tym o wymaganiach dotyczących wersji platformy, znajdziesz w przewodniku konfiguracji dla 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

Importowane dane

Aby uzyskać dostęp do funkcji interaktywnego podziału obrazów na segmenty, zaimportuj następujące 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 do interaktywnego segmentowania obrazów znajdziesz w sekcji przeglądu zadań na stronie Modele.

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

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

Określ ścieżkę modelu w parametrze model_asset_path, jak poniżej:

base_options = BaseOptions(model_asset_path=model_path)

Tworzenie zadania

Do skonfigurowania zadania interaktywnego segmentacji obrazów MediaPipe służy funkcja create_from_options. Funkcja create_from_options akceptuje wartości 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

To zadanie ma następujące opcje konfiguracji aplikacji w Pythonie:

Nazwa opcji Opis Zakres wartości Wartość domyślna
output_category_mask Jeśli ustawisz wartość True, dane wyjściowe będą zawierały maskę segmentacji w postaci obrazu uint8, w którym każda wartość piksela wskazuje, czy piksel jest częścią obiektu znajdującego się w ciekawym obszarze. {True, False} False
output_confidence_masks Jeśli ma wartość True, dane wyjściowe zawierają maskę podziału w postaci obrazu z wartościami zmiennoprzecinkowymi, w których każda wartość zmiennoprzecinkowa reprezentuje stopień pewności, że piksel jest częścią obiektu znajdującego się w ciekawym obszarze. {True, False} True
display_names_locale Ustawia język etykiet, które mają być używane w przypadku nazw wyświetlanych w metadanych modelu zadania (jeśli są dostępne). Wartość domyślna w języku angielskim to en. Za pomocą TensorFlow Lite MetadataWriter API możesz dodawać zlokalizowane etykiety do metadanych modelu niestandardowego. Kod języka en

Przygotuj dane

Przygotuj dane wejściowe jako plik graficzny lub tablicę numpy, a następnie przekonwertuj je na 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ładowy kod pokazujący przygotowanie danych na potrzeby interaktywnego podziału obrazów na segmenty znajdziesz w tym artykule.

Uruchamianie zadania

Interaktywny podział obrazów na segmenty używa funkcji segment do aktywowania wnioskowania. Segmentacja obrazów obejmuje wstępne przetwarzanie danych wejściowych, uruchamianie modelu podziału na segmenty i przetwarzanie nieprzetworzonych danych wyjściowych modelu na maski podzielone na segmenty.

Poniższy przykładowy kod pokazuje, jak wykonywać przetwarzanie za pomocą modelu zadań.

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 użycia wnioskowania dotyczącego interaktywnego podziału obrazów na segmenty znajdziesz w przykładzie kodu.

Obsługa i wyświetlanie wyników

Wyniki uzyskane w przypadku interaktywnego podziału obrazów na segmenty 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 ustawione podczas konfigurowania zadania. Jeśli ustawisz output_category_mask na True, wynikiem będzie lista zawierająca maskę jednosegmentową jako obraz uint8. Liczba pikseli wskazuje, czy jest on częścią obiektu w obszarze zainteresowań. Rozpoznany indeks kategorii obrazu wejściowego. Jeśli ustawisz output_confidence_masks na True, wynikiem będzie lista kanałów zawierających wartości pikseli z zakresu [0,1] reprezentujących poziom ufności piksela należącego do obiektu w danym obszarze.

W sekcjach poniżej objaśniamy szczegółowo dane wyjściowe z tego zadania:

Maska kategorii

Na poniższych obrazach pokazano wizualizację wyników zadania w przypadku maski wartości kategorii ze wskazanym ważnym obszarem. Każdy piksel to wartość uint8 wskazująca, czy jest on częścią obiektu znajdującego się w danym obszarze. Czarno-białe kółko na drugim zdjęciu wskazuje wybrany obszar zainteresowań.

Oryginalny obraz i maska kategorii. Obraz źródłowy ze zbioru danych Pascal VOC 2012.

Maska ufności

Dane wyjściowe maski ufności zawierają wartości zmiennoprzecinkowe między [0, 1] dla każdego kanału wejściowego obrazu. Wyższe wartości oznaczają większą pewność, że piksel obrazu jest częścią obiektu znajdującego się w ciekawym obszarze.