Leitfaden zur Objekterkennung für Android

Mit der Aufgabe „Objektdetektor“ können Sie die Anwesenheit und den Standort mehrerer Klassen von -Objekten. Ein Objektdetektor kann beispielsweise Hunde in einem Bild. In dieser Anleitung erfahren Sie, wie Sie die Aufgabe „Objektdetektor“ Android Das in dieser Anleitung beschriebene Codebeispiel ist auf GitHub Sie können diese Aufgabe in Aktion sehen, indem Sie Web-Demo: Weitere Informationen zu Funktionen, Modellen und Konfigurationsoptionen Sehen Sie sich die Übersicht an.

Codebeispiel

Der Beispielcode für MediaPipe Tasks ist eine einfache Implementierung eines Objektdetektors. für Android. In diesem Beispiel wird die Kamera eines physischen Android-Geräts verwendet, um Objekte kontinuierlich erkennen und auch Bilder und Videos aus dem Gerätegalerie verwenden, um Objekte statisch zu erkennen.

Du kannst die App als Ausgangspunkt für deine eigene Android-App verwenden oder darauf verweisen wenn Sie eine vorhandene App ändern. Der Beispielcode für die Objekterkennung wird auf GitHub

Code herunterladen

In der folgenden Anleitung erfahren Sie, wie Sie eine lokale Kopie des Beispiels erstellen. mit dem Befehlszeilentool git erstellen.

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

So laden Sie den Beispielcode herunter:

  1. Klonen Sie das Git-Repository mit dem folgenden Befehl:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. Konfigurieren Sie optional Ihre Git-Instanz für den Sparse-Checkout. Sie haben also nur die Dateien für die Beispiel-App „Objektdetektor“:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/object_detection/android
    

Nachdem Sie eine lokale Version des Beispielcodes erstellt haben, können Sie das Projekt importieren in Android Studio ein und führen die App aus. Anweisungen finden Sie in der Einrichtungsleitfaden für Android

Schlüsselkomponenten

Die folgenden Dateien enthalten den wichtigen Code für den Objektdetektor Beispielanwendung:

  • ObjectDetectorHelper.kt Initialisiert den Objektdetektor und verarbeitet das Modell und delegieren Auswahl
  • MainActivity.kt Implementiert die Anwendung und stellt die Komponenten der Benutzeroberfläche zusammen
  • OverlayView.kt Verarbeitet die Ergebnisse und zeigt sie an

Einrichtung

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

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

Abhängigkeiten

Der Objektdetektor verwendet die Bibliothek com.google.mediapipe:tasks-vision. Dieses Element hinzufügen Abhängigkeit zur build.gradle-Datei Ihres Android-App-Entwicklungsprojekt Importieren Sie die erforderlichen Abhängigkeiten mit den folgenden Code:

dependencies {
    implementation 'com.google.mediapipe:tasks-vision:latest.release'
}

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 das Modell aus, laden Sie es herunter und speichern Sie es dann in Ihrem Projektverzeichnis:

<dev-project-root>/src/main/assets

Verwenden Sie die Methode BaseOptions.Builder.setModelAssetPath(), um den Pfad anzugeben. die vom Modell verwendet werden. Ein Codebeispiel finden Sie im nächsten Abschnitt.

Aufgabe erstellen

Zum Erstellen der Aufgabe können Sie die Funktion createFromOptions verwenden. Die Die Funktion createFromOptions akzeptiert Konfigurationsoptionen, einschließlich der Ausführung Modus, Anzeigenamen, Sprache, maximale Anzahl von Ergebnissen, Konfidenzgrenzwert, Zulassungsliste und Sperrliste auswählen. Ist keine Konfigurationsoption angegeben, wird der Standardwert verwendet. Weitere Informationen zu den Konfigurationsoptionen Siehe Konfigurationsübersicht.

Die Aufgabe „Objekterkennung“ unterstützt drei Eingabedatentypen: Standbilder, Videodateien und Live-Videostreams. Sie müssen den Laufmodus für beim Erstellen der Aufgabe Ihren Eingabedatentyp. Wählen Sie die Registerkarte für um zu sehen, wie die Aufgabe erstellt und eine Inferenz ausgeführt wird.

Bild

ObjectDetectorOptions options =
  ObjectDetectorOptions.builder()
    .setBaseOptions(BaseOptions.builder().setModelAssetPath(‘model.tflite’).build())
    .setRunningMode(RunningMode.IMAGE)
    .setMaxResults(5)
    .build();
objectDetector = ObjectDetector.createFromOptions(context, options);
    

Video

ObjectDetectorOptions options =
  ObjectDetectorOptions.builder()
    .setBaseOptions(BaseOptions.builder().setModelAssetPath(‘model.tflite’).build())
    .setRunningMode(RunningMode.VIDEO)
    .setMaxResults(5)
    .build();
objectDetector = ObjectDetector.createFromOptions(context, options);
    

Livestream

ObjectDetectorOptions options =
  ObjectDetectorOptions.builder()
    .setBaseOptions(BaseOptions.builder().setModelAssetPath(model.tflite).build())
    .setRunningMode(RunningMode.LIVE_STREAM)
    .setMaxResults(5)
    .setResultListener((result, inputImage) -> {
      // Process the detection result here.
    })
    .setErrorListener((result, inputImage) -> {
      // Process the classification errors here.
    })
   .build();
objectDetector = ObjectDetector.createFromOptions(context, options);
    

Mit der Implementierung des Beispielcodes für die Objekterkennung können Nutzer zwischen Verarbeitungsmodi. Dieser Ansatz macht den Code zur Aufgabenerstellung komplizierter und ist möglicherweise für Ihren Anwendungsfall ungeeignet. Sie sehen diesen Code in der ObjectDetectorHelper Klasse setupObjectDetector().

Konfigurationsoptionen

Diese Aufgabe bietet die folgenden Konfigurationsoptionen für Android-Apps:

Option Beschreibung Wertebereich Standardwert
runningMode 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
displayNamesLocales 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
maxResults Legt die optionale maximale Anzahl der am besten bewerteten Erkennungsergebnisse fest auf zurückgeben. Beliebige positive Zahlen -1 (alle Ergebnisse werden zurückgegeben)
scoreThreshold 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
categoryAllowlist 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 categoryDenylist gegenseitig aus und verwendet führt beides zu einem Fehler. Alle Strings Nicht festgelegt
categoryDenylist 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 categoryAllowlist und die Verwendung beider führt zu einem Fehler. Alle Strings Nicht festgelegt
resultListener Legt den Ergebnis-Listener fest, der die Erkennungsergebnisse empfängt asynchron, wenn sich der Objektdetektor im Livestream befindet . Du kannst diese Option nur verwenden, wenn du „runningMode“ auf „LIVE_STREAM“ setzt. Nicht zutreffend Nicht festgelegt

Daten vorbereiten

Sie müssen das Eingabebild oder den Eingabe-Frame in ein com.google.mediapipe.framework.image.MPImage-Objekt vor der Übergabe an den Objektdetektor.

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

Bild

import com.google.mediapipe.framework.image.BitmapImageBuilder;
import com.google.mediapipe.framework.image.MPImage;

// Load an image on the users device as a Bitmap object using BitmapFactory.

// Convert an Androids Bitmap object to a MediaPipes Image object.
Image mpImage = new BitmapImageBuilder(bitmap).build();
    

Video

import com.google.mediapipe.framework.image.BitmapImageBuilder;
import com.google.mediapipe.framework.image.MPImage;

// Load a video file on the user's device using MediaMetadataRetriever

// From the videos metadata, load the METADATA_KEY_DURATION and
// METADATA_KEY_VIDEO_FRAME_COUNT values. Use these values
// to calculate the timestamp of each frame later.

// Loop through the video and load each frame as a Bitmap object.

// Convert the Androids Bitmap object to a MediaPipes Image object.
Image mpImage = new BitmapImageBuilder(frame).build();
    

Livestream

import com.google.mediapipe.framework.image.MediaImageBuilder;
import com.google.mediapipe.framework.image.MPImage;

// Create a CameraXs ImageAnalysis to continuously receive frames
// from the devices camera. Configure it to output frames in RGBA_8888
// format to match with what is required by the model.

// For each Androids ImageProxy object received from the ImageAnalysis,
// extract the encapsulated Androids Image object and convert it to
// a MediaPipes Image object.
android.media.Image mediaImage = imageProxy.getImage()
MPImage mpImage = new MediaImageBuilder(mediaImage).build();
    

Im Beispielcode für die Objekterkennung wird die Datenvorbereitung in der ObjectDetectorHelper Klasse in detectImage(), detectVideoFile(), detectLivestreamFrame() Funktionen.

Aufgabe ausführen

Je nach Art der Daten, mit denen Sie arbeiten, verwenden Sie ObjectDetector.detect...()-Methode, die für diesen Datentyp spezifisch ist. Verwenden Sie detect() für einzelne Bilder, detectForVideo() für Frames in Videodateien und detectAsync() für Videostreams. Wenn Sie Erkennungen auf einem Video-Stream gesehen haben, führen Sie die Erkennungen in einem separaten Thread aus, um sodass der Benutzeroberflächen-Thread blockiert wird.

Die folgenden Codebeispiele zeigen einfache Beispiele für die Ausführung des Objektdetektors in diesen verschiedenen Datenmodi:

Bild

ObjectDetectorResult detectionResult = objectDetector.detect(image);
    

Video

// Calculate the timestamp in milliseconds of the current frame.
long frame_timestamp_ms = 1000 * video_duration * frame_index / frame_count;

// Run inference on the frame.
ObjectDetectorResult detectionResult =
    objectDetector.detectForVideo(image, frameTimestampMs);
    

Livestream

// Run inference on the frame. The detection results will be available
// via the `resultListener` provided in the `ObjectDetectorOptions` when
// the object detector was created.
objectDetector.detectAsync(image, frameTimestampMs);
    

Das Codebeispiel „Objektdetektor“ zeigt die Implementierungen dieser Modi im Detail detect(), detectVideoFile(), und detectAsync(). Der Beispielcode ermöglicht es Nutzern, zwischen Verarbeitungsmodi zu wechseln. Dies ist für Ihren Anwendungsfall möglicherweise nicht erforderlich.

Wichtige Hinweise:

  • Im Video- oder Livestreammodus musst du außerdem der Objekterkennungsaufgabe den Zeitstempel des Eingabe-Frames.
  • Bei der Ausführung im Bild- oder Videomodus wird die Objekterkennungsaufgabe den aktuellen Thread blockieren, bis die Verarbeitung des Eingabebildes abgeschlossen ist, Frame. Um das Blockieren des aktuellen Threads zu vermeiden, führen Sie die Verarbeitung in einem im Hintergrund.
  • 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 ObjectDetectorResult-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 OverlayView .