Przewodnik po klasyfikacji obrazów w Pythonie

Zadanie MediaPipe Image Classifier umożliwia klasyfikację obrazów. Możesz użyć tego zadania, aby określić, co obraz reprezentuje w zbiorze kategorii zdefiniowanych w czasie trenowania. Te instrukcje pokazują, jak używać klasyfikatora obrazów w Pythonie.

Aby zobaczyć, jak działa to zadanie, obejrzyj prezentację internetową. Więcej informacji o możliwościach, modelach i opcjach konfiguracji dostępnych w tym zadaniu znajdziesz w omówieniu.

Przykładowy kod

Przykładowy kod klasyfikatora obrazów zapewnia pełną implementację tego zadania w Pythonie. Pomaga on przetestować to zadanie i rozpocząć tworzenie własnego klasyfikatora obrazów. Przykładowy kod klasyfikatora obrazów możesz wyświetlać, uruchamiać i edytować w przeglądarce.

Jeżeli implementujesz klasyfikator obrazów dla Raspberry Pi, zajrzyj do przykładowej aplikacji Raspberry Pi.

Konfiguracja

W tej sekcji znajdziesz najważniejsze czynności, które musisz wykonać, aby skonfigurować środowisko programistyczne i projekty kodu pod kątem użycia klasyfikatora obrazów. 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.

Pakiety

Klasyfikator obrazów wykonuje zadania związane z pakietem pip mediapipe. Możesz zainstalować zależność w taki sposób:

$ python -m pip install mediapipe
``` ### Imports

Import the following classes to access the Image Classifier task functions:

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

Model

Zadanie MediaPipe Image Classifier wymaga wytrenowanego modelu, który jest zgodny z tym zadaniem. Więcej informacji o dostępnych wytrenowanych modelach na potrzeby klasyfikatora obrazów znajdziesz w omówieniu zadania w sekcji Modele.

Wybierz i pobierz model, a następnie zapisz go w katalogu lokalnym. Możesz użyć zalecanego modelu EfficientNet-Lite0.

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

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

base_options = BaseOptions(model_asset_path=model_path)

Tworzenie zadania

Utwórz zadanie za pomocą funkcji create_from_options. Funkcja create_from_options akceptuje opcje konfiguracji, w tym tryb działania, język nazw wyświetlanych, maksymalną liczbę wyników, próg ufności, listę dozwolonych kategorii i listę odrzuconych. Więcej informacji o opcjach konfiguracji znajdziesz w artykule Omówienie konfiguracji.

Zadanie Klasyfikator obrazów obsługuje 3 typy danych wejściowych: obrazy, pliki wideo i strumieni wideo na żywo. Wybierz kartę odpowiadającą typowi danych wejściowych, aby zobaczyć, jak utworzyć zadanie i uruchomić wnioskowanie.

Obraz

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
ImageClassifier = mp.tasks.vision.ImageClassifier
ImageClassifierOptions = mp.tasks.vision.ImageClassifierOptions
VisionRunningMode = mp.tasks.vision.RunningMode

options = ImageClassifierOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.tflite'),
    max_results=5,
    running_mode=VisionRunningMode.IMAGE)

with ImageClassifier.create_from_options(options) as classifier:
  # The classifier is initialized. Use it here.
  # ...
    

Wideo

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
ImageClassifier = mp.tasks.vision.ImageClassifier
ImageClassifierOptions = mp.tasks.vision.ImageClassifierOptions
VisionRunningMode = mp.tasks.vision.RunningMode

options = ImageClassifierOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.tflite'),
    max_results=5,
    running_mode=VisionRunningMode.VIDEO)

with ImageClassifier.create_from_options(options) as classifier:
  # The classifier is initialized. Use it here.
  # ...
    

Transmisja na żywo

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
ImageClassifierResult = mp.tasks.vision.ImageClassifier.ImageClassifierResult
ImageClassifier = mp.tasks.vision.ImageClassifier
ImageClassifierOptions = mp.tasks.vision.ImageClassifierOptions
VisionRunningMode = mp.tasks.vision.RunningMode

def print_result(result: ImageClassifierResult, output_image: mp.Image, timestamp_ms: int):
    print('ImageClassifierResult result: {}'.format(result))

options = ImageClassifierOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.tflite'),
    running_mode=VisionRunningMode.LIVE_STREAM,
    max_results=5,
    result_callback=print_result)

with ImageClassifier.create_from_options(options) as classifier:
  # The classifier is initialized. Use it here.
  # ...
    

Pełny przykład tworzenia klasyfikatora obrazów do użycia z obrazem znajdziesz w przykładowym kodzie.

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. Dostępne są 3 tryby:

IMAGE: ten tryb używany do przesyłania pojedynczego obrazu.

WIDEO: tryb zdekodowanych klatek filmu.

TRANSMISJA NA ŻYWO: tryb transmisji danych wejściowych, np. z kamery. W tym trybie musisz wywołać funkcję resultListener, aby skonfigurować detektor do asynchronicznego otrzymywania wyników.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
display_names_locale Określa język etykiet, które mają być używane w przypadku 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 dodać zlokalizowane etykiety do metadanych modelu niestandardowego za pomocą interfejsu TensorFlow Lite Metadata Writer API. Kod języka en
max_results Określa opcjonalną maksymalną liczbę zwracanych wyników klasyfikacji z najlepszymi wynikami. Jeśli wartość jest mniejsza niż 0, zwracane są wszystkie dostępne wyniki. Dowolne liczby dodatnie -1
score_threshold Ustawia próg wyniku prognozy, który zastępuje próg podany w metadanych modelu (jeśli występuje). Wyniki poniżej tej wartości zostały odrzucone. Dowolna liczba zmiennoprzecinkowa Nie ustawiono
category_allowlist Ustawia opcjonalną listę dozwolonych nazw kategorii. Jeśli pole nie jest puste, wyniki klasyfikacji, których nazwy kategorii nie znajdują się w tym zbiorze, zostaną odfiltrowane. Zduplikowane lub nieznane nazwy kategorii są ignorowane. Ta opcja wzajemnie się wyklucza z metodą category_denylist i jej użycie powoduje błąd. Dowolne ciągi Nie ustawiono
category_denylist Ustawia opcjonalną listę nazw kategorii, które nie są dozwolone. Jeśli pole nie jest puste, wyniki klasyfikacji, których nazwa kategorii znajduje się w tym zbiorze, zostaną odfiltrowane. Zduplikowane lub nieznane nazwy kategorii są ignorowane. Ta opcja wyklucza się z metodą category_allowlist i jej użycie powoduje błąd. Dowolne ciągi Nie ustawiono
result_callback Konfiguruje detektor wyników tak, aby asynchronicznie otrzymywał wyniki klasyfikacji, gdy klasyfikator obrazów jest w trybie transmisji na żywo. Tej opcji można używać tylko wtedy, gdy tryb działania jest ustawiony na LIVE_STREAM Nie dotyczy Nie ustawiono

Przygotuj dane

Przygotuj dane wejściowe jako plik obrazu lub tablicę numpy, a następnie przekonwertuj je na obiekt mediapipe.Image. Jeśli dane wejściowe to plik wideo lub transmisja na żywo z kamery internetowej, możesz użyć zewnętrznej biblioteki, np. OpenCV, by wczytać klatki wejściowe w postaci tablic numpy.

Poniższe przykłady wyjaśniają i pokazują, jak przygotować dane do przetwarzania w przypadku każdego z dostępnych typów danych

Obraz

import mediapipe as mp

# 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

import mediapipe as mp

# Use OpenCV’s VideoCapture to load the input video.

# Load the frame rate of the video using OpenCV’s CV_CAP_PROP_FPS
# You’ll need it 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

import mediapipe as mp

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

Uruchamianie zadania

Aby aktywować wnioskowania, możesz wywołać funkcję klasyfikacji odpowiadającą Twojemu trybowi działającemu. Interfejs Image Classifier API zwróci możliwe kategorie obiektu w obrazie lub ramce wejściowej.

Obraz

# Perform image classification on the provided single image.
classification_result = classifier.classify(mp_image)
    

Wideo

# Calculate the timestamp of the current frame
frame_timestamp_ms = 1000 * frame_index / video_file_fps

# Perform image classification on the video frame.
classification_result = classifier.classify_for_video(mp_image, frame_timestamp_ms)
    

Transmisja na żywo


# Send the latest frame to perform image classification.
# Results are sent to the `result_callback` provided in the `ImageClassifierOptions`.
classifier.classify_async(mp_image, frame_timestamp_ms)
    

Uwaga:

  • Gdy pracujesz w trybie wideo lub w trybie transmisji na żywo, musisz też podać do zadania Klasyfikator obrazów sygnaturę czasową klatki wejściowej.
  • Gdy zadanie jest wykonywane w obrazie lub modelu wideo, zadanie klasyfikacji obrazów zablokuje bieżący wątek, dopóki nie zakończy przetwarzania obrazu lub klatki wejściowej.
  • W trybie transmisji na żywo zadanie klasyfikacji obrazów nie blokuje bieżącego wątku, ale zostaje natychmiast przywrócone. Wywołuje swój detektor wyników z wynikiem klasyfikacji za każdym razem, gdy zakończy przetwarzanie ramki wejściowej. Jeśli funkcja classifyAsync jest wywoływana, gdy zadanie klasyfikatora obrazów jest zajęte przetwarzaniem kolejnej klatki, zadanie zignoruje nową ramkę wejściową.

Pełny przykład tworzenia klasyfikatora obrazów do użycia z obrazem znajdziesz w przykładowym kodzie.

Obsługa i wyświetlanie wyników

Po uruchomieniu wnioskowania zadanie Klasyfikator obrazów zwraca obiekt ImageClassifierResult zawierający listę możliwych kategorii obiektów w obrazie lub ramce wejściowej.

Poniżej znajdziesz przykładowe dane wyjściowe tego zadania:

ImageClassifierResult:
 Classifications #0 (single classification head):
  head index: 0
  category #0:
   category name: "/m/01bwb9"
   display name: "Passer domesticus"
   score: 0.91406
   index: 671
  category #1:
   category name: "/m/01bwbt"
   display name: "Passer montanus"
   score: 0.00391
   index: 670

Ten wynik uzyskano po uruchomieniu Bird Classifier na:

Przykładowy kod klasyfikatora obrazów pokazuje, jak wyświetlić wyniki klasyfikacji zwrócone przez zadanie. Szczegóły znajdziesz w przykładowym kodzie.