Objekte in Bildern mit ML Kit erkennen: Android

1. Hinweis

ML Kit ist ein mobiles SDK, mit dem Sie das Fachwissen von Google zum maschinellen Lernen auf Android- und iOS-Apps nutzen können. Mit der leistungsstarken und nutzerfreundlichen Vision API und der Natural Language API können Sie häufige Herausforderungen in Ihren Apps lösen oder völlig neue Nutzerumgebungen schaffen. Alle basieren auf den erstklassigen ML-Modellen von Google und werden kostenlos angeboten.

Die APIs von ML Kit laufen alle auf dem Gerät. Dies ermöglicht Echtzeitanwendungsfälle, wenn Sie beispielsweise einen Live-Kamerastream verarbeiten möchten. Das bedeutet auch, dass die Funktion offline verfügbar ist.

In diesem Codelab werden Sie durch einfache Schritte geführt, mit denen Sie in einer vorhandenen Android-App die Objekterkennung und -verfolgung (Object Detection and Tracking, ODT) für ein bestimmtes Bild hinzufügen können. Bitte beachten Sie, dass in diesem Codelab einige Tastenkombinationen erforderlich sind, um die Verwendung von ML Kit ODT hervorzuheben.

Inhalt

In diesem Codelab entwickeln Sie eine Android-App mit ML Kit. Ihre App verwendet die ML Kit Object Detection and Tracking API, um Objekte in einem bestimmten Bild zu erkennen.Am Ende sollte etwas Ähnliches wie in dem Bild auf der rechten Seite zu sehen sein.

Aufgaben in diesem Lab

  • ML Kit SDK in Ihre Android-Anwendung einbinden
  • ML Kit Object Detection and Tracking API

Voraussetzungen

  • Eine aktuelle Version von Android Studio (Version 4.1.2 und höher)
  • Android Studio-Emulator oder ein physisches Android-Gerät
  • Beispielcode
  • Grundkenntnisse der Android-Entwicklung in Kotlin

In diesem Codelab geht es um ML Kit. Auf irrelevante Konzepte wird nicht genauer eingegangen und entsprechende Codeblöcke können Sie einfach kopieren und einfügen.

2. Einrichten

Code herunterladen

Klicken Sie auf den folgenden Link, um den gesamten Code für dieses Codelab herunterzuladen:

Entpacken Sie die heruntergeladene ZIP-Datei. Dadurch wird der Stammordner (mlkit-android-main) mit allen benötigten Ressourcen entpackt. Für dieses Codelab benötigen Sie nur die Quellen im Unterverzeichnis object-detection.

Das Unterverzeichnis „Objekterkennung“ im Repository „mlkit-android“ enthält zwei Verzeichnisse:

  • android_studio_folder.pngstarter: Code wird gestartet, auf dem Sie für dieses Codelab aufbauen.
  • android_studio_folder.pngfinal: Der Code für die fertige Beispiel-App wurde fertiggestellt.

3. ML Kit Object Detection and Tracking API zum Projekt hinzufügen

App in Android Studio importieren

Importieren wir zuerst die Starter-App in Android Studio.

Öffnen Sie Android Studio, wählen Sie Projekt importieren (Gradle, Eclipse ADT usw.) und dann den Ordner starter aus dem Quellcode aus, den Sie zuvor heruntergeladen haben.

7c0f27882a2698ac.png

Abhängigkeiten für ML Kit-Objekterkennung und -Tracking hinzufügen

Mit den ML Kit-Abhängigkeiten können Sie das ML Kit ODT SDK in Ihre App integrieren. Fügen Sie am Ende der Datei app/build.gradle Ihres Projekts die folgenden Zeilen hinzu:

build.gradle

dependencies {
  // ...
  implementation 'com.google.mlkit:object-detection:16.2.4'
}

Projekt mit Gradle-Dateien synchronisieren

Damit alle Abhängigkeiten für Ihre App verfügbar sind, sollten Sie Ihr Projekt jetzt mit Gradle-Dateien synchronisieren.

Wählen Sie in der Android Studio-Symbolleiste Sync Project with Gradle Files ( b451ab2d04d835f9.png) aus.

(Wenn diese Schaltfläche deaktiviert ist, stellen Sie sicher, dass Sie nur starter/app/build.gradle und nicht das gesamte Repository importieren.)

4. Start-App ausführen

Nachdem Sie das Projekt in Android Studio importiert und die Abhängigkeiten für die ML Kit-Objekterkennung und -verfolgung hinzugefügt haben, können Sie die App zum ersten Mal ausführen.

Verbinden Sie Ihr Android-Gerät über USB mit Ihrem Host oder Starten Sie den Android Studio-Emulator und klicken Sie in der Android Studio-Symbolleiste auf Ausführen ( execute.png).

App ausführen und kennenlernen

Die App sollte auf deinem Android-Gerät gestartet werden. Sie enthält Boilerplate-Code, mit dem Sie ein Foto aufnehmen oder ein voreingestelltes Bild auswählen und an eine Pipeline zur Objekterkennung und -verfolgung übergeben können, die Sie in diesem Codelab erstellen. Schauen wir uns die App etwas genauer an, bevor wir Code schreiben.

Erstens gibt es unten eine Schaltfläche ( c6d965d639c3646.png), mit der Sie Folgendes tun können:

  • die in Ihr Gerät/Ihren Emulator integrierte Kamera-App aufrufen
  • ein Foto mit der Kamera-App aufnehmen
  • Das aufgenommene Bild in der Starter App empfangen
  • zeig das Bild an

Probieren Sie die Schaltfläche Foto aufnehmen aus, folgen Sie der Anleitung, um ein Foto aufzunehmen, akzeptieren Sie das Foto und sehen Sie sich an, wie es in der Starter-App angezeigt wird.

Wiederholen Sie den Vorgang einige Male, um zu sehen, wie es funktioniert:

9ec541980dbe2d31.png 8312dde41425ba4b.png fa8492bfc1914ff0.png

Zweitens gibt es drei voreingestellte Bilder, aus denen Sie auswählen können. Sie können diese Bilder später verwenden, um den Objekterkennungscode zu testen, wenn Sie mit einem Android-Emulator arbeiten.

Wählen Sie ein Bild aus den drei voreingestellten Bildern aus. Das Bild wird in der größeren Ansicht angezeigt:

1dd41b3ec978f1d9.png

5. Objekterkennung auf dem Gerät hinzufügen

In diesem Schritt fügen Sie der Start-App die Funktion zum Erkennen von Objekten in Bildern hinzu. Wie Sie im vorherigen Schritt gesehen haben, enthält die Starter-App Boilerplate-Code, mit dem Sie mit der Kamera-App auf dem Gerät Fotos aufnehmen können. Die App enthält außerdem drei voreingestellte Images, an denen Sie die Objekterkennung ausprobieren können, wenn Sie das Codelab auf einem Android-Emulator ausführen.

Wenn Sie entweder aus den voreingestellten Bildern oder durch Aufnehmen eines Fotos mit der Kamera-App ein Bild ausgewählt haben, decodiert der Boilerplate-Code dieses Bild in eine Bitmap-Instanz, zeigt es auf dem Bildschirm an und ruft die runObjectDetection-Methode mit dem Bild auf.

In diesem Schritt fügen Sie der Methode runObjectDetection Code für die Objekterkennung hinzu.

Objekterkennung auf dem Gerät für ein Bild einrichten und ausführen

Es sind nur drei einfache Schritte mit drei APIs erforderlich, um ML Kit ODT einzurichten:

  • Bild vorbereiten: InputImage
  • Detektorobjekt erstellen: ObjectDetection.getClient(options)
  • Verbinde die beiden oben genannten Objekte: process(image)

Das können Sie in der Funktion runObjectDetection(bitmap: Bitmap) in der Datei MainActivity.kt tun.

/**
 * ML Kit Object Detection Function
 */
private fun runObjectDetection(bitmap: Bitmap) {
}

Im Moment ist die Funktion leer. Fahren Sie mit den folgenden Schritten fort, um ML Kit ODT zu implementieren. Android Studio fordert Sie dann auf, die erforderlichen Importe hinzuzufügen:

  • com.google.mlkit.vision.common.InputImage
  • com.google.mlkit.vision.objects.ObjectDetection
  • com.google.mlkit.vision.objects.defaults.ObjectDetectorOptions

Schritt 1: InputImage erstellen

ML Kit bietet eine einfache API zum Erstellen eines InputImage aus einem Bitmap. Anschließend können Sie ein InputImage in die ML Kit APIs einspeisen.

// Step 1: create ML Kit's InputImage object
val image = InputImage.fromBitmap(bitmap, 0)

Fügen Sie den obigen Code oben in runObjectDetection(bitmap:Bitmap) ein.

Schritt 2: Detektorinstanz erstellen

ML Kit folgt dem Builder-Designmuster. Sie übergeben die Konfiguration an den Builder und beziehen dann einen Detektor davon. Es gibt drei Optionen, die konfiguriert werden können (in diesem Codelab werden die fett formatierten verwendet):

  • Detektormodus (Einzelbild oder Stream)
  • Erkennungsmodus (einzelne oder mehrere Objekterkennung)
  • Klassifizierungsmodus (an oder deaktiviert)

Dieses Codelab ist für die Erkennung mehrerer Bilder in einem Bild und Klassifizierung. Jetzt hinzufügen:

// Step 2: acquire detector object
val options = ObjectDetectorOptions.Builder()
   .setDetectorMode(ObjectDetectorOptions.SINGLE_IMAGE_MODE)
   .enableMultipleObjects()
   .enableClassification()
   .build()
val objectDetector = ObjectDetection.getClient(options)

Schritt 3: Dem Detektor Bilder senden

Die Objekterkennung und -klassifizierung ist die asynchrone Verarbeitung:

  • Sie senden über process() ein Bild an den Detektor.
  • Der Detektor arbeitet ziemlich hart daran.
  • Der Detektor meldet Ihnen das Ergebnis per Rückruf.

Mit dem folgenden Code ist genau das möglich (kopieren und an den vorhandenen Code in fun runObjectDetection(bitmap:Bitmap)): anhängen).

// Step 3: feed given image to detector and setup callback
objectDetector.process(image)
   .addOnSuccessListener {
       // Task completed successfully
        debugPrint(it)
   }
   .addOnFailureListener {
       // Task failed with an exception
       Log.e(TAG, it.message.toString())
   }

Nach Abschluss des Vorgangs erhältst du eine Benachrichtigung über Folgendes:

  • Die Gesamtzahl der erkannten Objekte. Jedes erkannte Objekt wird folgendermaßen beschrieben:
  • trackingId: Eine Ganzzahl, die Sie für das Tracking von Frames verwenden (wird in diesem Codelab NICHT verwendet).
  • boundingBox: der Begrenzungsrahmen des Objekts.
  • labels: ist eine Liste von Labels für das erkannte Objekt (nur wenn die Klassifizierung aktiviert ist):
  • index (Index dieses Labels abrufen)
  • text (Text dieses Labels abrufen, einschließlich "Modeartikel", "Lebensmittel", "Einrichtungsgegenstände", "Ort", "Pflanze")
  • confidence ( eine Gleitkommazahl zwischen 0,0 und 1,0 mit 1,0 bedeutet 100%)

Sie haben wahrscheinlich bemerkt, dass der Code eine Art printf-Verarbeitung für das erkannte Ergebnis mit debugPrint() durchführt.

Fügen Sie sie in MainActivity Kurs hinzu:

private fun debugPrint(detectedObjects: List<DetectedObject>) {
   detectedObjects.forEachIndexed { index, detectedObject ->
       val box = detectedObject.boundingBox

       Log.d(TAG, "Detected object: $index")
       Log.d(TAG, " trackingId: ${detectedObject.trackingId}")
       Log.d(TAG, " boundingBox: (${box.left}, ${box.top}) - (${box.right},${box.bottom})")
       detectedObject.labels.forEach {
           Log.d(TAG, " categories: ${it.text}")
           Log.d(TAG, " confidence: ${it.confidence}")
       }
   }
}

Jetzt können Sie Bilder zur Erkennung annehmen.

Führen Sie das Codelab aus, indem Sie in der Android Studio-Symbolleiste auf Run ( execute.png) klicken. Wählen Sie ein voreingestelltes Bild aus oder nehmen Sie ein Foto auf und schauen Sie sich das Logcat-Fenster( 16bd6ea224cf8cf1.png) in der IDE an.

Die Ausgabe sollte etwa so aussehen:

D/MLKit Object Detection: Detected object: 0
D/MLKit Object Detection:  trackingId: null
D/MLKit Object Detection:  boundingBox: (481, 2021) - (2426,3376)
D/MLKit Object Detection:  categories: Food
D/MLKit Object Detection:  confidence: 0.90234375
D/MLKit Object Detection: Detected object: 1
D/MLKit Object Detection:  trackingId: null
D/MLKit Object Detection:  boundingBox: (2639, 2633) - (3058,3577)
D/MLKit Object Detection: Detected object: 2
D/MLKit Object Detection:  trackingId: null
D/MLKit Object Detection:  boundingBox: (3, 1816) - (615,2597)
D/MLKit Object Detection:  categories: Home good
D/MLKit Object Detection:  confidence: 0.75390625

...was bedeutet, dass der Detektor drei Objekte erkannt hat:

  • Die Kategorien sind Essen und Gute Wohnung.
  • Für die zweite Klasse wird keine Kategorie zurückgegeben, da es sich um eine unbekannte Klasse handelt.
  • Nein trackingId (da dies der Einzelbilderkennungsmodus ist).
  • Die Position im boundingBox-Rechteck (z.B. (481, 2021) – (2426, 3376))
  • Der Detektor ist ziemlich sicher, dass das erste ein Lebensmittel ist (90% Konfidenz – es war Salat).

Aus technischer Sicht ist das alles, was Sie brauchen, um die ML Kit-Objekterkennung zum Laufen zu bringen – Sie haben im Moment alles. Glückwunsch!

Im Hinblick auf die Benutzeroberfläche befinden Sie sich noch in der Anfangsphase, können aber die erkannten Ergebnisse auf der Benutzeroberfläche nutzen und beispielsweise den Begrenzungsrahmen zeichnen, um die Nutzererfahrung zu verbessern. Gehen wir zum nächsten Schritt und verarbeiten Sie die erkannten Ergebnisse nach.

6. Nachverarbeitung der Erkennungsergebnisse

In den vorherigen Schritten geben Sie das erkannte Ergebnis einfach und schnell in logcat aus.

In diesem Abschnitt nutzen Sie das Ergebnis im Bild:

  • Begrenzungsrahmen auf einem Bild zeichnen
  • Kategoriename und Konfidenz innerhalb des Markierungsrahmens zeichnen

Visualisierungsdienstprogramme

Das Codelab enthält Boilerplate-Code, mit dem Sie das Erkennungsergebnis visualisieren können. Nutzen Sie diese Dienstprogramme, um unseren Visualisierungscode einfach zu gestalten:

  • data class BoxWithText(val box: Rect, val text: String) Dies ist eine Datenklasse zum Speichern eines Objekterkennungsergebnisses zur Visualisierung. box ist der Begrenzungsrahmen, an dem sich das Objekt befindet, und text ist der String des Erkennungsergebnisses, der zusammen mit dem Begrenzungsrahmen des Objekts angezeigt werden soll.
  • fun drawDetectionResult(bitmap: Bitmap, detectionResults: List<BoxWithText>): Bitmap Diese Methode bezieht die Ergebnisse der Objekterkennung in detectionResults für die Eingabe-bitmap und gibt die geänderte Kopie davon zurück.

Hier ist ein Beispiel für eine Ausgabe der Methode drawDetectionResult des Dienstprogramms:

58c6f1d4ddb00dfa.png

ML Kit-Erkennungsergebnis visualisieren

Zeichnen Sie mit den Visualisierungsdienstprogrammen das Ergebnis der ML Kit-Objekterkennung auf dem Eingabebild.

Rufen Sie debugPrint() auf und fügen Sie darunter das folgende Code-Snippet ein:

// Parse ML Kit's DetectedObject and create corresponding visualization data
val detectedObjects = it.map { obj ->
    var text = "Unknown"

    // We will show the top confident detection result if it exist
    if (obj.labels.isNotEmpty()) {
        val firstLabel = obj.labels.first()
        text = "${firstLabel.text}, ${firstLabel.confidence.times(100).toInt()}%"
    }
    BoxWithText(obj.boundingBox, text)
}

// Draw the detection result on the input bitmap
val visualizedResult = drawDetectionResult(bitmap, detectedObjects)

// Show the detection result on the app screen
runOnUiThread {
    inputImageView.setImageBitmap(visualizedResult)
}
  • Zuerst parsen Sie die DetectedObject des ML Kit und erstellen eine Liste mit BoxWithText-Objekten, um das Visualisierungsergebnis anzuzeigen.
  • Anschließend zeichnen Sie das Erkennungsergebnis mit der Methode drawDetectionResult über das Eingabebild und zeigen es auf dem Bildschirm an.

Ausführen

Klicken Sie jetzt in der Android Studio-Symbolleiste auf Ausführen ( execute.png).

Sobald die App geladen ist, drücken Sie die Taste mit dem Kamerasymbol, richten Sie die Kamera auf ein Objekt, nehmen Sie ein Foto auf, akzeptieren Sie das Foto (in der Kamera-App) oder tippen Sie einfach auf voreingestellte Bilder. Sie sollten die Erkennungsergebnisse sehen: Drücken Sie die Taste erneut oder wählen Sie ein anderes Bild aus, um die aktuelle Version von ML Kit ODT mehrmals zu wiederholen.

a03109cb30d5014d.png

7. Glückwunsch!

Sie haben ML Kit verwendet, um Ihrer App Funktionen zur Objekterkennung hinzuzufügen:

  • 3 Schritte mit 3 APIs
  • Eingabebild erstellen
  • Detektor erstellen
  • Bild an Detektor senden

Das ist alles, was Sie brauchen, um loszulegen.

Vielleicht möchten Sie das Modell im weiteren Verlauf verbessern: Wie Sie sehen, kann das Standardmodell nur fünf Kategorien erkennen – das Modell kennt nicht einmal Messer, Gabel und Flasche. Sehen Sie sich das andere Codelab im Lernpfad „Maschinelles Lernen auf dem Gerät – Objekterkennung“ an, um zu erfahren, wie Sie ein benutzerdefiniertes Modell trainieren.

Behandelte Themen

  • Android-App Objekterkennung und -tracking mit ML Kit hinzufügen
  • Mit der Objekterkennung und -verfolgung auf dem Gerät in ML Kit Objekte in Bildern erkennen

Nächste Schritte

  • Mit ML Kit ODT können Sie mehr entdecken – mit mehr Bildern und Live-Videos zur Erkennung und Genauigkeit und Leistung der Klassifizierung
  • Im Lernpfad Maschinelles Lernen auf dem Gerät – Objekterkennung erfahren Sie, wie ein benutzerdefiniertes Modell trainiert wird.
  • ML Kit ODT in Ihrer eigenen Android-App anwenden

Weitere Informationen