Leitfaden zur Objekterkennung für Python

Mit der Aufgabe „MediaPipe Object Detector“ können Sie das Vorhandensein und den Standort mehrerer Klassen von -Objekten. In dieser Anleitung erfahren Sie, wie Sie den Objektdetektor verwenden in Python. Das in dieser Anleitung beschriebene Codebeispiel ist auf GitHub

In unserer Webdemo können Sie diese Aufgabe in Aktion sehen. Weitere Informationen zu den Funktionen, Modellen und Die Konfigurationsoptionen dieser Aufgabe finden Sie in der Übersicht.

Codebeispiel

Der Beispielcode für den Objektdetektor bietet eine vollständige Implementierung dieses in Python. Dieser Code hilft Ihnen, diese Aufgabe zu testen und mit der Entwicklung einer eigenen App zur Textklassifizierung. Sie können Daten abrufen, ausführen und Bearbeiten Sie den Beispielcode für die Objekterkennung. ganz einfach in Ihrem Webbrowser.

Wenn Sie den Objektdetektor für Raspberry Pi implementieren, finden Sie weitere Informationen in der Beispiel für Raspberry Pi App.

Einrichtung

In diesem Abschnitt werden die wichtigsten Schritte zum Einrichten Ihrer Entwicklungsumgebung und Codeprojekte speziell für die Verwendung der Objekterkennung. Allgemeine Informationen zu Einrichten Ihrer Entwicklungsumgebung für die Verwendung von MediaPipe-Aufgaben, einschließlich Plattformversionsanforderungen finden Sie in der Einrichtungsleitfaden für Python

<ph type="x-smartling-placeholder">

Pakete

Für die Aufgabe „Objektdetektor“ ist das pip-Paket „mediapipe“ erforderlich. Sie können die erforderliche Pakete mit den folgenden Befehlen:

$ python -m pip install mediapipe

Importe

Importieren Sie die folgenden Klassen, um auf die Aufgabenfunktionen der Objekterkennung zuzugreifen:

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

Modell

Für die Aufgabe „MediaPipe Object Detector“ ist ein trainiertes Modell erforderlich, das mit dieser für die Aufgabe. Weitere Informationen zu verfügbaren trainierten Modellen für die Objekterkennung finden Sie unter 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:

model_path = '/absolute/path/to/lite-model_efficientdet_lite0_detection_metadata_1.tflite'

Verwenden Sie den model_asset_path-Parameter des BaseOptions-Objekts, um den Pfad anzugeben. des zu verwendenden Modells. Ein Codebeispiel finden Sie im nächsten Abschnitt.

Aufgabe erstellen

Verwenden Sie die Funktion create_from_options, um die Aufgabe zu erstellen. Die Die Funktion create_from_options akzeptiert Konfigurationsoptionen, einschließlich der Ausführung Modus, Anzeigenamen, Sprache, maximale Anzahl von Ergebnissen, Konfidenzgrenzwert, Liste der Kategorien zulassen und ablehnen. Wenn Sie keine Konfigurationsoption festlegen, verwendet die Aufgabe den Standardwert. Weitere Informationen zu den Konfigurationsoptionen Weitere Informationen finden Sie im Abschnitt Konfigurationsoptionen.

Die Aufgabe „Objekterkennung“ unterstützt mehrere Eingabedatentypen: Standbilder, Videos Dateien und Live-Videostreams. Wählen Sie die Registerkarte, die Ihren Eingabedaten entspricht. um zu sehen, wie die Aufgabe erstellt und eine Inferenz ausgeführt wird.

Bild

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
ObjectDetector = mp.tasks.vision.ObjectDetector
ObjectDetectorOptions = mp.tasks.vision.ObjectDetectorOptions
VisionRunningMode = mp.tasks.vision.RunningMode

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

with ObjectDetector.create_from_options(options) as detector:
  # The detector is initialized. Use it here.
  # ...
    

Video

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
ObjectDetector = mp.tasks.vision.ObjectDetector
ObjectDetectorOptions = mp.tasks.vision.ObjectDetectorOptions
VisionRunningMode = mp.tasks.vision.RunningMode

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

with ObjectDetector.create_from_options(options) as detector:
  # The detector is initialized. Use it here.
  # ...
    

Livestream

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
DetectionResult = mp.tasks.components.containers.detections.DetectionResult
ObjectDetector = mp.tasks.vision.ObjectDetector
ObjectDetectorOptions = mp.tasks.vision.ObjectDetectorOptions
VisionRunningMode = mp.tasks.vision.RunningMode

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

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

with ObjectDetector.create_from_options(options) as detector:
  # The detector is initialized. Use it here.
  # ...
    

Ein vollständiges Beispiel für die Erstellung eines Objektdetektors zur Verwendung mit einem Bild finden Sie in der Codebeispiel an.

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 Eingabe zum Beispiel von einer Kamera. In diesem Modus muss der resultListener wird aufgerufen, um einen Listener für den Empfang von Ergebnissen einzurichten asynchron programmiert.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
display_names Legt die Sprache der Labels fest, die für Anzeigenamen in der Metadaten des Aufgabenmodells, falls verfügbar. Standardwert ist en für Englisch. Sie können den Metadaten eines benutzerdefinierten Modells lokalisierte Labels hinzufügen mit der TensorFlow Lite Metadata Writer API Gebietsschemacode de
max_results Legt die optionale maximale Anzahl der am besten bewerteten Erkennungsergebnisse fest auf zurückgeben. Beliebige positive Zahlen -1 (alle Ergebnisse werden zurückgegeben)
score_threshold Legt den Schwellenwert für die Vorhersagepunktzahl fest, der den Wert in die Modellmetadaten (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, Erkennungsergebnisse, deren Kategoriename nicht in dieser Liste enthalten ist, werden herausgefiltert. Doppelte oder unbekannte Kategorienamen werden ignoriert. Diese Option schließt sich mit category_denylist gegenseitig aus und verwendet führt beides zu einem Fehler. Alle Strings Nicht festgelegt
category_denylist Legt die optionale Liste der unzulässigen Kategorienamen fest. Wenn nicht leer ist, werden Erkennungsergebnisse gefiltert, deren Kategoriename in dieser Gruppe enthalten ist aus. Doppelte oder unbekannte Kategorienamen werden ignoriert. Diese Option ausschließlich mit category_allowlist und die Verwendung beider führt zu einem Fehler. Alle Strings Nicht festgelegt

Daten vorbereiten

Bereiten Sie Ihre Eingabe als Bilddatei oder als NumPy-Array vor. Konvertieren Sie es dann in ein mediapipe.Image-Objekt. Wenn Sie eine Videodatei eingegeben haben oder über eine Webcam streamen, kannst du eine externe Mediathek wie OpenCV, um die Eingabeframes als NumPy zu laden Arrays.

Die folgenden Beispiele zeigen, wie Daten für die Verarbeitung vorbereitet werden. für jeden der verfügbaren Datentypen:

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 eine der Erkennungsfunktionen aufrufen, um Inferenzen auszulösen. Das Objekt Die Detektoraufgabe gibt die im Eingabebild oder ‐frame erkannten Objekte zurück.

Bild

# Perform object detection on the provided single image.
detection_result = detector.detect(mp_image)
    

Video

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

# Perform object detection on the video frame.
detection_result = detector.detect_for_video(mp_image, frame_timestamp_ms)
    

Livestream

# Send the latest frame to perform object detection.
# Results are sent to the `result_callback` provided in the `ObjectDetectorOptions`.
detector.detect_async(mp_image, frame_timestamp_ms)
    

Ein vollständiges Beispiel für die Ausführung eines Objektdetektors für ein Bild finden Sie in der Codebeispiel.

Wichtige Hinweise:

  • Im Video- oder Livestreammodus musst du außerdem Geben Sie der Objekterkennungsaufgabe den Zeitstempel des Eingabe-Frames an.
  • Bei der Ausführung im Bild- oder Videomodell wird die Objekterkennungsaufgabe den aktuellen Thread blockieren, bis die Verarbeitung des Eingabebildes abgeschlossen ist, Frame.
  • Im Livestreammodus blockiert die Aufgabe „Objekterkennung“ nicht im aktuellen Thread zu lesen, aber sofort wieder zurück. Das Ergebnis wird aufgerufen. Listener mit dem Erkennungsergebnis, sobald er die Verarbeitung eines Eingabe-Frame. Ob die Erkennungsfunktion aufgerufen wird, wenn die Aufgabe der Objekterkennung verarbeitet wird, wird der neue Eingabeframe ignoriert.

Ergebnisse verarbeiten und anzeigen

Beim Ausführen der Inferenz gibt die Objekterkennungsaufgabe eine ObjectDetectionResult-Objekt, das die gefundenen Objekte beschreibt das Eingabebild.

Im Folgenden sehen Sie ein Beispiel für die Ausgabedaten dieser Aufgabe:

ObjectDetectorResult:
 Detection #0:
  Box: (x: 355, y: 133, w: 190, h: 206)
  Categories:
   index       : 17
   score       : 0.73828
   class name  : dog
 Detection #1:
  Box: (x: 103, y: 15, w: 138, h: 369)
  Categories:
   index       : 17
   score       : 0.73047
   class name  : dog

Die folgende Abbildung zeigt eine Visualisierung der Aufgabenausgabe:

Im Beispielcode für die Objekterkennung wird veranschaulicht, wie die Erkennung der Aufgabe zurückgegebene Ergebnisse finden Sie in der Codebeispiel .