Przewodnik po segmentacji obrazów w Pythonie

Zadanie MediaPipe Image segmenter umożliwia podział obrazów na regiony na podstawie wstępnie zdefiniowanych kategorii, w których można zastosować efekty wizualne, np. rozmycie tła. Te instrukcje pokazują, jak korzystać z narzędzia Image segmenter w języku Python. Dla: więcej informacji o możliwościach, modelach i opcjach konfiguracji to zadanie znajdziesz w artykule Omówienie.

Przykładowy kod

Przykładowy kod segmentacji obrazów zapewnia pełną implementację tego parametru w Pythonie. Ten kod pomoże Ci przetestować to zadanie i uzyskać rozpoczął tworzenie własnej aplikacji do segmentowania obrazów. Możesz wyświetlać, uruchamiać edytuj segmenter obrazów przykładowy kod tylko za pomocą przeglądarki.

Konfiguracja

W tej sekcji opisujemy najważniejsze czynności związane z konfigurowaniem środowiska programistycznego oraz w projektach kodu, w których używa się 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 Pythona Kod źródłowy tego przykładu znajdziesz na stronie GitHub

Pakiety

Zadanie MediaPipe Image segmenter wymaga pakietu mediapipe. Możesz zainstalować wymagane zależności za pomocą tego polecenia:

$ python -m pip install mediapipe

Importy

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

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

Model

Zadanie MediaPipe Image segmenter wymaga wytrenowanego modelu zgodnego z tym zadanie. Więcej informacji na temat dostępnych wytrenowanych modeli dla narzędzia do segmentowania obrazów znajdziesz w artykule zapoznaj się z omówieniem zadania 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 Nazwa modelu, jak pokazano poniżej:

base_options = BaseOptions(model_asset_path=model_path)

Tworzenie zadania

Zadanie segmentowania obrazów MediaPipe używa funkcji create_from_options do: skonfigurować zadanie. Funkcja create_from_options akceptuje wartości obsługi opcji konfiguracyjnych. Więcej informacji o konfigurowaniu zadań znajdziesz zapoznaj się z sekcją Opcje konfiguracji.

Przykłady pokazują również odmiany konstrukcji zadań dla obrazów, plików wideo i transmisji wideo na żywo.

Obraz

BaseOptions = mp.tasks.BaseOptions
ImageSegmenter = mp.tasks.vision.ImageSegmenter
ImageSegmenterOptions = mp.tasks.vision.ImageSegmenterOptions
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a image segmenter instance with the image mode:
options = ImageSegmenterOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.task'),
    running_mode=VisionRunningMode.IMAGE,
    output_category_mask=True)
with ImageSegmenter.create_from_options(options) as segmenter:
  

Wideo

BaseOptions = mp.tasks.BaseOptions
ImageSegmenter = mp.tasks.vision.ImageSegmenter
ImageSegmenterOptions = mp.tasks.vision.ImageSegmenterOptions
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a image segmenter instance with the video mode:
options = ImageSegmenterOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.task'),
    running_mode=VisionRunningMode.VIDEO,
    output_category_mask=True)
with ImageSegmenter.create_from_options(options) as segmenter:
  

Transmisja na żywo

BaseOptions = mp.tasks.BaseOptions
ImageSegmenter = mp.tasks.vision.ImageSegmenter
ImageSegmenterOptions = mp.tasks.vision.ImageSegmenterOptions
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a image segmenter instance with the live stream mode:
def print_result(result: List[Image], output_image: Image, timestamp_ms: int):
    print('segmented masks size: {}'.format(len(result)))

options = ImageSegmenterOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.task'),
    running_mode=VisionRunningMode.VIDEO,
    output_category_mask=True)
with ImageSegmenter.create_from_options(options) as segmenter:
    

Opcje konfiguracji

To zadanie zawiera te opcje konfiguracji aplikacji w Pythonie:

Nazwa opcji Opis Zakres wartości Wartość domyślna
running_mode Ustawia tryb działania zadania. Są trzy tryby:

IMAGE: tryb wprowadzania pojedynczego obrazu.

WIDEO: tryb zdekodowanych klatek filmu.

LIVE_STREAM: tryb transmisji danych wejściowych na przykład z kamery. W tym trybie detektor wyników musi mieć wartość wywołano, aby skonfigurować detektor i otrzymywać wyniki asynchronicznie.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
output_category_mask 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 zwycięską kategorię . {True, False} False
output_confidence_masks 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 punktację danej kategorii. {True, False} True
display_names_locale 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
result_callback Konfiguruje detektor wyników, który ma otrzymywać wyniki segmentacji asynchronicznie, gdy segmenter obrazów działa w trybie LIVE_STREAM. Tej opcji można używać tylko wtedy, gdy tryb działania jest ustawiony na LIVE_STREAM Nie dotyczy Nie dotyczy

Przygotuj dane

Przygotuj dane wejściowe jako plik obrazu lub tablicę numpy, a potem przekonwertować go na obiekt mediapipe.Image. Jeśli dane wejściowe to plik wideo lub transmitowania na żywo z kamery internetowej, możesz użyć biblioteki zewnętrznej, OpenCV, który wczytuje klatki wejściowe w formacie numpy tablice.

Obraz

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

Wideo

# Use OpenCV’s VideoCapture to load the input video.
# Load the frame rate of the video using OpenCV’s CV_CAP_PROP_FPS
# You need the frame rate to calculate the timestamp for each frame.
# Loop through each frame in the video using VideoCapture#read()

# Convert the frame received from OpenCV to a MediaPipe’s Image object.
mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=numpy_frame_from_opencv)
    

Transmisja na żywo

# Use OpenCV’s VideoCapture to start capturing from the webcam.
# Create a loop to read the latest frame from the camera using VideoCapture#read()

# Convert the frame received from OpenCV to a MediaPipe’s Image object.
mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=numpy_frame_from_opencv)
    

Przykładowy kod pokazujący przygotowywanie danych na potrzeby segmentowania obrazów znajdziesz w przykładowego kodu.

Uruchamianie zadania

Segmentacja obrazów korzysta z tych atrybutów: segment, segment_for_video i segment_async w celu aktywowania zależności. Przy segmentacji obrazu obejmuje to wstępne przetwarzanie danych wejściowych, uruchamianie modelu segmentacji i obróbka wtórna; nieprzetworzony model wysyła dane do posegmentowanych masek.

Poniższe przykłady kodu pokazują, jak wykonywać przetwarzanie za pomocą modelu zadań.

Obraz

# Perform image segmentation on the provided single image.
# The image segmenter must be created with the image mode.
segmented_masks = segmenter.segment(mp_image)
    

Wideo

# Perform image segmentation on the provided single image.
# The image segmenter must be created with the video mode.
segmented_masks = segmenter.segment_for_video(mp_image, frame_timestamp_ms)
    

Transmisja na żywo

# Send live image data to perform image segmentation.
# The results are accessible via the `result_callback` provided in
# the `ImageSegmenterOptions` object.
# The image segmenter must be created with the live stream mode.
segmenter.segment_async(mp_image, frame_timestamp_ms)
    

Pamiętaj:

  • Gdy pracujesz w trybie wideo lub w trybie transmisji na żywo, musisz też podaj w zadaniu segmentowanie obrazów sygnaturę czasową ramki wejściowej.
  • Po uruchomieniu w obrazie lub modelu wideo zadanie segmentacji obrazów będzie zablokuj bieżący wątek do czasu zakończenia przetwarzania obrazu wejściowego lub ramki.

Bardziej kompletny przykład uruchamiania wnioskowania przez segmentację obrazów znajdziesz tutaj: przykładowego kodu.

Obsługa i wyświetlanie wyników

Segmentacja obrazów generuje listę danych typu Image. Jeśli output_type to CATEGORY_MASK, wynik to lista zawierającej pojedynczą maskę z pojedynczym segmentem w postaci obrazu uint8. Pikselowy piksel wskazuje rozpoznany indeks kategorii obrazu wejściowego. Jeśli output_type to CONFIDENCE_MASK, wynikiem jest wektor o rozmiarze numeru kategorii. Każdy Maska posegmentowana to obraz pływający z zakresu [0,1], reprezentujący wskaźnik ufności piksela należącego do danej kategorii.

W sekcjach poniżej znajdziesz przykłady danych wyjściowych z tego zadania:

Poziom ufności kategorii

Te obrazy przedstawiają wizualizację danych wyjściowych zadania dla kategorii maską ufności. Dane wyjściowe maski ufności zawierają wartości zmiennoprzecinkowe między [0, 1]

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

Wartość kategorii

Te obrazy przedstawiają wizualizację danych wyjściowych zadania dla kategorii maską wartości. Zakres maski kategorii wynosi [0, 255] i każda wartość piksela reprezentuje indeks zwycięskiej kategorii danych wyjściowych modelu. Zwycięska kategoria indeks ma najwyższy wynik spośród kategorii, które model może rozpoznać.

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