Przewodnik po klasyfikacji obrazów w Pythonie

Zadanie MediaPipe Image Classifier umożliwia klasyfikację obrazów. Za pomocą pozwala określić, co obraz reprezentuje w grupie kategorii zdefiniowanych podczas trenowania. Te instrukcje pokazują, jak używać klasyfikatora obrazów za pomocą Pythona.

Aby zobaczyć, jak to zadanie działa, wejdź na stronę wersji demonstracyjnej. 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 klasy Image Classifier zapewnia pełną implementację w Pythonie. Ten kod pomoże Ci przetestować to zadanie i uzyskać możesz utworzyć własny klasyfikator obrazów. Możesz wyświetlać, uruchamiać i edytować Klasyfikator obrazów przykład kod tylko za pomocą przeglądarki.

Jeśli implementujesz klasyfikator obrazów dla Raspberry Pi, zapoznaj się z Przykład Raspberry Pi

Konfiguracja

W tej sekcji opisujemy najważniejsze czynności związane z konfigurowaniem środowiska programistycznego oraz w projektach kodu, w których używany jest Klasyfikator obrazów. Ogólne informacje na temat: skonfigurować środowisko programistyczne do korzystania z zadań MediaPipe, w tym wymagań wersji platformy znajdziesz w przewodniku konfiguracji dla Pythona.

Pakiety

Klasyfikator obrazów wykonuje zadania związane z pakietem pip mediapipe. Możesz zainstalować w zależności od tego:

$ 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 zgodnego z tym zadanie. Więcej informacji o dostępnych wytrenowanych modelach na potrzeby klasyfikatora obrazów znajdziesz tutaj zapoznaj się z omówieniem zadania sekcją Modele.

Wybierz i pobierz model, a następnie zapisz go w katalogu lokalnym. Za pomocą zalecane EfficientNet-Lite0 model atrybucji.

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 uruchomione tryb, język wyświetlanych nazw, maksymalna liczba wyników, próg ufności, listy dozwolonych kategorii i odrzuconych. Więcej informacji o konfiguracji Więcej informacji znajdziesz w artykule Omówienie konfiguracji.

Zadanie Klasyfikator obrazów obsługuje 3 typy danych wejściowych: nieruchome obrazy i pliki wideo i transmisje wideo na żywo. Wybierz kartę odpowiadającą typowi danych wejściowych, aby jak utworzyć zadanie i przeprowadzić 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 tutaj kod przykład.

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
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
max_results Ustawia opcjonalną maksymalną liczbę wyników klasyfikacji na . Jeśli < 0 – zostaną zwrócone wszystkie dostępne wyniki. Dowolne liczby dodatnie -1
score_threshold Ustawia próg wyniku prognozy, który zastępuje próg podany w polu metadane modelu (jeśli występują). 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 nazwa kategorii nie znajduje się w tym zbiorze, zostaną zostały odfiltrowane. Zduplikowane lub nieznane nazwy kategorii są ignorowane. Ta opcja nie działa z usługą category_denylist i korzysta z funkcji skutkuje to błędem. Dowolne ciągi Nie ustawiono
category_denylist Ustawia opcjonalną listę nazw kategorii, które nie są dozwolone. Jeśli niepuste, wyniki klasyfikacji, których nazwa kategorii znajduje się w tym zbiorze, zostaną odfiltrowane na zewnątrz. Zduplikowane lub nieznane nazwy kategorii są ignorowane. Ta opcja jest wzajemna tylko w polu category_allowlist, co spowoduje błąd. Dowolne ciągi Nie ustawiono
result_callback Konfiguruje detektor wyników, aby otrzymywać wyniki klasyfikacji asynchronicznie, gdy w transmisji na żywo działa Klasyfikator obrazów. i trybu uzyskiwania zgody. 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 graficzny lub tablicę numpy, a następnie przekonwertuj je na mediapipe.Image obiekt. Jeśli dane wejściowe to plik wideo lub transmisja na żywo z kamery internetowej, możesz użyć zewnętrznej biblioteki, takiej jak OpenCV, który wczytuje klatki wejściowe w formacie numpy tablice.

W przykładach poniżej pokazujemy, jak przygotować dane do przetwarzania każdy 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ć funkcję, możesz wywołać funkcję klasyfikacji odpowiadającą Twojemu trybowi działającemu danych. 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)
    

Pamiętaj:

  • Gdy pracujesz w trybie wideo lub w trybie transmisji na żywo, musisz też musisz przekazać do zadania Klasyfikator obrazów sygnaturę czasową ramki wejściowej.
  • Jeśli zostanie uruchomione w obrazie lub modelu wideo, zadanie klasyfikatora obrazów będzie zablokuj bieżący wątek do czasu zakończenia przetwarzania obrazu wejściowego lub ramki.
  • W trybie transmisji na żywo zadanie klasyfikacji obrazów nie jest blokowane. w bieżącym wątku, ale wraca natychmiast. Wywoła swój wynik detektor z wynikiem klasyfikacji za każdym razem, gdy proces się zakończy przetwarzania ramki wejściowej. Jeśli funkcja classifyAsync jest wywoływana podczas zadanie Klasyfikator obrazów jest zajęte przetwarzaniem kolejnej klatki, zadanie je zignoruje do nowej ramki wejściowej.

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

Obsługa i wyświetlanie wyników

Po uruchomieniu wnioskowania zadanie Klasyfikator obrazów zwraca błąd ImageClassifierResult obiekt zawierający listę możliwych kategorii obiektów na obrazie lub w 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. dnia:

Przykładowy kod klasyfikatora obrazów pokazuje, jak wyświetlić klasyfikację wyników zwróconych przez zadanie, patrz kod przykład .