Mit der Aufgabe „MediaPipe Image Classifier“ können Sie Bilder klassifizieren. Mit dieser Aufgabe können Sie ermitteln, was ein Bild aus einer Reihe von Kategorien darstellt, die zum Zeitpunkt des Trainings definiert wurden. In dieser Anleitung erfahren Sie, wie Sie den Bildklassifikator mit Python verwenden.
In der Webdemo können Sie diese Aufgabe in Aktion sehen. Weitere Informationen zu den Funktionen, Modellen und Konfigurationsoptionen dieser Aufgabe finden Sie in der Übersicht.
Codebeispiel
Der Beispielcode für den Bildklassifikator bietet zu Ihrer Information eine vollständige Implementierung dieser Aufgabe in Python. Mit diesem Code können Sie diese Aufgabe testen und mit dem Erstellen eines eigenen Bildklassifikators beginnen. Sie können den Beispielcode für den Bildklassifikator nur in Ihrem Webbrowser ansehen, ausführen und bearbeiten.
Informationen zur Implementierung des Bildklassifikators für Raspberry Pi finden Sie in der Beispiel-App für Raspberry Pi.
Einrichtung
In diesem Abschnitt werden die wichtigsten Schritte zum Einrichten Ihrer Entwicklungsumgebung und Codeprojekte speziell für die Verwendung des Bildklassifikators beschrieben. Allgemeine Informationen zum Einrichten der Entwicklungsumgebung für die Verwendung von MediaPipe-Aufgaben, einschließlich der Anforderungen für Plattformversionen, finden Sie im Einrichtungsleitfaden für Python.
Pakete
Die Bildklassifikatoraufgabe im mediapipe-PIP-Paket. Sie können die Abhängigkeit so installieren:
$ 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
Modell
Für die Aufgabe „MediaPipe Image Classifier“ ist ein trainiertes Modell erforderlich, das mit dieser Aufgabe kompatibel ist. Weitere Informationen zu verfügbaren trainierten Modellen für den Bildklassifikator finden Sie in der Aufgabenübersicht im Abschnitt „Modelle“.
Wählen Sie ein Modell aus, laden Sie es herunter und speichern Sie es dann in einem lokalen Verzeichnis. Sie können das empfohlene EffizienteNet-Lite0-Modell verwenden.
model_path = '/absolute/path/to/efficientnet_lite0_int8_2.tflite'
Geben Sie den Pfad des Modells innerhalb des Parameters Model Name an, wie unten gezeigt:
base_options = BaseOptions(model_asset_path=model_path)
Aufgabe erstellen
Verwenden Sie die Funktion create_from_options
, um die Aufgabe zu erstellen. Die Funktion create_from_options
akzeptiert Konfigurationsoptionen wie den Ausführungsmodus, die Sprache für Anzeigenamen, die maximale Anzahl von Ergebnissen, den Konfidenzgrenzwert, die Zulassungsliste für Kategorien und die Sperrliste. Weitere Informationen zu Konfigurationsoptionen finden Sie unter Konfigurationsübersicht.
Die Aufgabe „Bildklassifikator“ unterstützt drei Eingabedatentypen: Standbilder, Videodateien und Live-Videostreams. Wählen Sie den Tab aus, der Ihrem Eingabedatentyp entspricht, um zu sehen, wie Sie die Aufgabe erstellen und eine Inferenz ausführen.
Bild
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. # ...
Video
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. # ...
Livestream
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. # ...
Ein vollständiges Beispiel zum Erstellen eines Bildklassifikators zur Verwendung mit einem Bild finden Sie im Codebeispiel.
Konfigurationsoptionen
Diese Aufgabe bietet die folgenden Konfigurationsoptionen für Python-Anwendungen:
Option | Beschreibung | Wertebereich | Standardwert |
---|---|---|---|
running_mode |
Legt den Ausführungsmodus für die Task fest. Es gibt drei Modi: IMAGE: Der Modus für Einzelbildeingaben. VIDEO: Der Modus für decodierte Frames eines Videos. LIVE_STREAM: Der Modus für einen Livestream mit Eingabedaten, z. B. von einer Kamera. In diesem Modus muss resultListener aufgerufen werden, um einen Listener einzurichten, der Ergebnisse asynchron empfängt. |
{IMAGE, VIDEO, LIVE_STREAM } |
IMAGE |
display_names_locale |
Legt die Sprache der Labels fest, die für Anzeigenamen verwendet werden sollen, die in den Metadaten des Aufgabenmodells angegeben sind, sofern verfügbar. Der Standardwert für Englisch ist en . Mit der TensorFlow Lite Metadata Writer API können Sie den Metadaten eines benutzerdefinierten Modells lokalisierte Labels hinzufügen |
Gebietsschemacode | en |
max_results |
Legt die optionale maximale Anzahl der am besten bewerteten Klassifizierungsergebnisse fest, die zurückgegeben werden sollen. Wenn < 0, werden alle verfügbaren Ergebnisse zurückgegeben. | Beliebige positive Zahlen | -1 |
score_threshold |
Legt den Schwellenwert für die Vorhersagepunktzahl fest, der den in den Modellmetadaten angegebenen Wert überschreibt (falls vorhanden). Ergebnisse unter diesem Wert werden abgelehnt. | Beliebiger Gleitkommawert | Nicht festgelegt |
category_allowlist |
Legt die optionale Liste der zulässigen Kategorienamen fest. Wenn das Feld nicht leer ist, werden Klassifizierungsergebnisse herausgefiltert, deren Kategoriename nicht in diesem Satz enthalten ist. Doppelte oder unbekannte Kategorienamen werden ignoriert.
Diese Option schließt sich mit category_denylist gegenseitig aus und die Verwendung beider führt zu einem Fehler. |
Alle Strings | Nicht festgelegt |
category_denylist |
Legt die optionale Liste der unzulässigen Kategorienamen fest. Ist dieses Feld nicht leer, werden Klassifizierungsergebnisse herausgefiltert, deren Kategoriename in diesem Satz enthalten ist. Doppelte oder unbekannte Kategorienamen werden ignoriert. Diese Option schließt sich mit category_allowlist gegenseitig aus und die Verwendung beider führt zu einem Fehler. |
Alle Strings | Nicht festgelegt |
result_callback |
Legt fest, dass der Ergebnis-Listener die Klassifizierungsergebnisse asynchron empfängt, wenn sich der Bildklassifikator im Livestreammodus befindet. Kann nur verwendet werden, wenn der Ausführungsmodus auf LIVE_STREAM festgelegt ist |
– | Nicht festgelegt |
Daten vorbereiten
Bereiten Sie die Eingabe als Bilddatei oder als NumPy-Array vor und konvertieren Sie sie in ein mediapipe.Image
-Objekt. Wenn Ihre Eingabe eine Videodatei oder ein Livestream von einer Webcam ist, können Sie eine externe Bibliothek wie OpenCV verwenden, um die Eingabeframes als NumPy-Arrays zu laden.
Die folgenden Beispiele zeigen, wie Daten für jeden der verfügbaren Datentypen für die Verarbeitung vorbereitet werden.
Bild
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)
Video
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)
Livestream
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)
Aufgabe ausführen
Sie können die Klassifizierungsfunktion aufrufen, die Ihrem Ausführungsmodus entspricht, um Inferenzen auszulösen. Die Image Classifier API gibt die möglichen Kategorien für das Objekt im Eingabebild oder -frame zurück.
Bild
# Perform image classification on the provided single image. classification_result = classifier.classify(mp_image)
Video
# 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)
Livestream
# 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)
Wichtige Hinweise:
- Im Video- oder Livestreammodus müssen Sie außerdem der Aufgabe des Bildklassifikators den Zeitstempel des Eingabeframes zur Verfügung stellen.
- Bei der Ausführung im Bild- oder Videomodell blockiert die Aufgabe des Bildklassifikators den aktuellen Thread, bis die Verarbeitung des Eingabebilds oder ‐frames abgeschlossen ist.
- Im Livestreammodus blockiert die Aufgabe „Bildklassifikator“ nicht den aktuellen Thread, sondern kehrt sofort zurück. Sobald die Verarbeitung eines Eingabeframes abgeschlossen ist, wird der zugehörige Ergebnis-Listener mit dem Klassifizierungsergebnis aufgerufen. Wenn die Funktion
classifyAsync
aufgerufen wird, während die Aufgabe des Bildklassifikators mit der Verarbeitung eines anderen Frames beschäftigt ist, ignoriert die Aufgabe den neuen Eingabeframe.
Ein vollständiges Beispiel zum Erstellen eines Bildklassifikators zur Verwendung mit einem Bild finden Sie im Codebeispiel.
Ergebnisse verarbeiten und anzeigen
Beim Ausführen einer Inferenz gibt die Aufgabe des Bildklassifikators ein ImageClassifierResult
-Objekt zurück, das die Liste der möglichen Kategorien für die Objekte im Eingabebild oder -frame enthält.
Im Folgenden sehen Sie ein Beispiel für die Ausgabedaten dieser Aufgabe:
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
Dieses Ergebnis wurde erhalten, indem der Vogelklassifikator auf folgenden Geräten ausgeführt wurde:
Der Beispielcode für Bildklassifikatoren veranschaulicht, wie die von der Aufgabe zurückgegebenen Klassifizierungsergebnisse angezeigt werden. Weitere Informationen finden Sie im Codebeispiel.