Objekte in Bildern mit ML Kit erkennen: Android

1. Hinweis

ML Kit ist ein mobiles SDK, mit dem Sie die geräteinternen Machine Learning-Kompetenzen von Google in Android- und iOS-Apps nutzen können. Mit den leistungsstarken und dennoch einfach zu verwendenden Vision und Natural Language APIs können Sie gängige Herausforderungen in Ihren Apps bewältigen oder ganz neue Nutzererfahrungen schaffen. Alle basieren auf den erstklassigen ML-Modellen von Google und sind kostenlos.

Die APIs von ML Kit werden alle auf dem Gerät ausgeführt. So sind Echtzeitanwendungen möglich, bei denen Sie beispielsweise einen Live-Kamerastream verarbeiten möchten. Das bedeutet auch, dass die Funktion offline verfügbar ist.

In diesem Codelab erfahren Sie, wie Sie Ihrer vorhandenen Android-App die Objekterkennung und -verfolgung (Object Detection and Tracking, ODT) für ein bestimmtes Bild hinzufügen. Hinweis: In diesem Codelab werden einige Vereinfachungen vorgenommen, um die Verwendung von ML Kit ODT hervorzuheben.

Umfang

In diesem Codelab erstellen 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 das 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 oder höher)
  • Android Studio-Emulator oder ein physisches Android-Gerät
  • Beispielcode
  • Grundkenntnisse in der Android-Entwicklung mit 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 ein Stammordner (mlkit-android-main) mit allen erforderlichen Ressourcen entpackt. Für dieses Codelab benötigen Sie nur die Quellen im Unterverzeichnis object-detection.

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

  • android_studio_folder.pngstarter: Der Startcode, auf dem Sie in diesem Codelab aufbauen.
  • android_studio_folder.pngfinal: Der vollständige Code der fertigen Beispiel-App.

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

App in Android Studio importieren

Importieren Sie zuerst die Starter-App in Android Studio.

Öffnen Sie Android Studio, wählen Sie Import Project (Gradle, Eclipse ADT, etc.) (Projekt importieren (Gradle, Eclipse ADT usw.)) aus und wählen Sie den Ordner starter aus dem zuvor heruntergeladenen Quellcode aus.

7c0f27882a2698ac.png

Abhängigkeiten für die Objekterkennung und das Objekt-Tracking von ML Kit hinzufügen

Mit den ML Kit-Abhängigkeiten können Sie das ML Kit ODT SDK in Ihre App einbinden. Fügen Sie der app/build.gradle-Datei 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 den Gradle-Dateien synchronisieren.

Wählen Sie in der Android Studio-Symbolleiste Projekt mit Gradle-Dateien synchronisieren ( b451ab2d04d835f9.png) aus.

Wenn diese Schaltfläche deaktiviert ist, importieren Sie nur starter/app/build.gradle , nicht das gesamte Repository.

4. Start-App ausführen

Nachdem Sie das Projekt in Android Studio importiert und die Abhängigkeiten für die ML Kit Object Detection und das Tracking 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 testen

Die App sollte auf Ihrem Android-Gerät gestartet werden. Es enthält einige Boilerplate-Code, mit dem Sie ein Foto aufnehmen oder ein vordefiniertes Bild auswählen und in eine Objekterkennungs- und -verfolgungspipeline einspeisen können, die Sie in diesem Codelab erstellen. Sehen wir uns die App kurz an, bevor wir Code schreiben.

Unten befindet sich eine Schaltfläche ( c6d965d639c3646.png), über die Sie Folgendes tun können:

  • Öffnen Sie die Kamera-App auf Ihrem Gerät oder Emulator.
  • ein Foto in der Kamera App aufnehmen
  • das aufgenommene Bild in der Startanwendung empfängt
  • Bild anzeigen

Testen Sie die Schaltfläche Foto aufnehmen, folgen Sie der Anleitung, um ein Foto aufzunehmen, nehmen Sie das Foto an und sehen Sie sich an, ob es in der Start-App angezeigt wird.

Wiederholen Sie die Schritte einige Male, um zu sehen, wie es funktioniert:

9ec541980dbe2d31.png 8312dde41425ba4b.png fa8492bfc1914ff0.png

Zweitens: Es stehen drei voreingestellte Bilder zur Auswahl. Sie können diese Bilder später verwenden, um den Code für die Objekterkennung zu testen, wenn Sie einen Android-Emulator verwenden.

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 Starter-App die Funktion hinzu, mit der Objekte in Bildern erkannt werden. Wie Sie im vorherigen Schritt gesehen haben, enthält die Starter App Boilerplate-Code zum Aufnehmen von Fotos mit der Kamera-App auf dem Gerät. In der App gibt es außerdem drei vordefinierte Bilder, mit denen Sie die Objekterkennung ausprobieren können, wenn Sie das Codelab in einem Android-Emulator ausführen.

Wenn Sie ein Bild ausgewählt haben, entweder aus den voreingestellten Bildern oder indem Sie ein Foto mit der Kamera-App aufgenommen 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.

On-Device-Objekterkennung für ein Bild einrichten und ausführen

Die Einrichtung von ML Kit ODT mit drei APIs umfasst nur drei einfache Schritte:

  • Bild vorbereiten: InputImage
  • Erstellen Sie ein Detektorobjekt: ObjectDetection.getClient(options)
  • Verbinden Sie die beiden Objekte oben: process(image)

Sie werden in der Funktion runObjectDetection(bitmap: Bitmap) in der Datei MainActivity.kt festgelegt.

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

Derzeit ist die Funktion leer. Fahren Sie mit den folgenden Schritten fort, um ML Kit ODT zu implementieren. Während des Vorgangs werden Sie von Android Studio aufgefordert, 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, mit der eine InputImage aus einer Bitmap erstellt werden kann. Anschließend können Sie eine 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 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 rufen dann einen Detektor ab. Es gibt drei Konfigurationsoptionen (die Optionen in fett werden in diesem Codelab verwendet):

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

Dieses Codelab bezieht sich auf die Erkennung und Klassifizierung mehrerer Objekte in einem einzelnen Bild. Fügen Sie das jetzt hinzu:

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

Schritt 3: Bilder an den Detector übergeben

Die Objekterkennung und -klassifizierung erfolgt asynchron:

  • Sie senden ein Bild (über process()) an den Detektor.
  • Der Detector arbeitet ziemlich hart daran.
  • Der Detector meldet das Ergebnis über einen Callback an Sie zurück.

Der folgende Code tut genau das: Er kopiert den Code und fügt ihn dem vorhandenen Code in fun runObjectDetection(bitmap:Bitmap)): hinzu.

// 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 werden Sie vom Detector über Folgendes informiert:

  • Die Gesamtzahl der erkannten Objekte. Jedes erkannte Objekt wird mit folgenden Informationen beschrieben:
  • trackingId: Eine Ganzzahl, mit der Sie das Element rahmenübergreifend verfolgen (wird in diesem Codelab NICHT verwendet).
  • boundingBox: den Begrenzungsrahmen des Objekts.
  • labels: eine Liste der Label für das erkannte Objekt (nur, wenn die Klassifizierung aktiviert ist):
  • index (Index dieses Labels abrufen)
  • text (Text dieses Labels abrufen, einschließlich „Fashion Goods“, „Food“, „Home Goods“, „Place“ und „Plant“)
  • confidence ( Gleitkommazahl zwischen 0,0 und 1,0, wobei 1,0 100 % entspricht)

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

Fügen Sie sie der Klasse MainActivity 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 akzeptieren.

Führen Sie das Codelab aus, indem Sie in der Android Studio-Symbolleiste auf Ausführen ( execute.png) klicken. Wählen Sie ein vordefiniertes Bild aus oder machen Sie ein Foto und sehen Sie sich dann 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

Das bedeutet, dass der Detektor drei Objekte erkannt hat:

  • Die Kategorien sind Lebensmittel und Haushaltswaren.
  • Für den zweiten Eintrag wird keine Kategorie zurückgegeben, da es sich um eine unbekannte Klasse handelt.
  • Nein, trackingId ist nicht erforderlich, da dies der Modus für die Erkennung einzelner Bilder ist.
  • Die Position innerhalb des Rechtecks boundingBox (z.B. (481, 2021) bis (2426, 3376))
  • Der Detektor ist ziemlich sicher, dass das erste Bild Essen zeigt (90% Wahrscheinlichkeit – es war Salat).

Technisch gesehen ist das alles, was Sie für die ML Kit Object Detection benötigen. Glückwunsch!

Auf der Benutzeroberfläche befinden Sie sich noch in der Phase, in der Sie angefangen haben. Sie können jedoch die erkannten Ergebnisse auf der Benutzeroberfläche nutzen, z. B. den Begrenzungsrahmen zeichnen, um die Nutzerfreundlichkeit zu verbessern. Fahren Sie mit dem nächsten Schritt fort: die erkannten Ergebnisse nachbearbeiten.

6. Nachbearbeitung der Erkennungsergebnisse

In den vorherigen Schritten haben Sie das erkannte Ergebnis in logcat ausgegeben: einfach und schnell.

In diesem Abschnitt verwenden Sie das Ergebnis im Bild:

  • Begrenzungsrahmen auf dem Bild zeichnen
  • den Namen der Kategorie und den Konfidenzwert innerhalb des Begrenzungsrahmens zeichnen

Visualisierungstools

Im Codelab finden Sie einige Vorlagencodes, mit denen Sie das Erkennungsergebnis visualisieren können. Mit diesen Dienstprogrammen können Sie den Visualisierungscode vereinfachen:

  • data class BoxWithText(val box: Rect, val text: String): Dies ist eine Datenklasse, in der ein Ergebnis der Objekterkennung zur Visualisierung gespeichert wird. box ist der Begrenzungsrahmen, in dem sich das Objekt befindet, und text ist der String für das Erkennungsergebnis, der zusammen mit dem Begrenzungsrahmen des Objekts angezeigt werden soll.
  • fun drawDetectionResult(bitmap: Bitmap, detectionResults: List<BoxWithText>): Bitmap Mit dieser Methode werden die Ergebnisse der Objekterkennung in detectionResults auf der Eingabe bitmap gezeichnet und die geänderte Kopie zurückgegeben.

Hier ein Beispiel für die Ausgabe der drawDetectionResult-Dienstprogrammmethode:

58c6f1d4ddb00dfa.png

ML Kit-Erkennungsergebnis visualisieren

Mit den Visualisierungs-Dienstprogrammen können Sie das Ergebnis der ML Kit-Objekterkennung auf dem Eingabebild zeichnen.

Gehen Sie zu der Stelle, an der Sie debugPrint() aufrufen, und fügen Sie das folgende Code-Snippet darunter 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)
}
  • Sie beginnen damit, die DetectedObject von ML Kit zu parsen und eine Liste von BoxWithText-Objekten zu erstellen, um das Visualisierungsergebnis anzuzeigen.
  • Anschließend zeichnen Sie das Erkennungsergebnis mithilfe der Dienstprogrammmethode 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 Schaltfläche 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 ein vordefiniertes Bild. Die Ergebnisse der Erkennung sollten angezeigt werden. Drücken Sie noch einmal auf die Schaltfläche oder wählen Sie ein anderes Bild aus, um die neueste ML Kit ODT-Version noch einmal zu testen.

a03109cb30d5014d.png

7. Glückwunsch!

Sie haben Ihrer App mit ML Kit Funktionen zur Objekterkennung hinzugefügt:

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

Das ist alles, was du brauchst, um loszulegen.

Im weiteren Verlauf können Sie das Modell optimieren. Das Standardmodell kann nur fünf Kategorien erkennen, also nicht einmal Messer, Gabel und Flasche. In den anderen Codelabs in unserem Lernpfad „On-Device Machine Learning – Objekterkennung“ erfahren Sie, wie Sie ein benutzerdefiniertes Modell trainieren.

Behandelte Themen

  • ML Kit-Objekterkennung und -Tracking in Ihrer Android-App verwenden
  • On-Device-Objekterkennung und -Tracking in ML Kit verwenden, um Objekte in Bildern zu erkennen

Nächste Schritte

  • Mit ML Kit ODT mehr herausfinden – mit mehr Bildern und Livevideos, um die Genauigkeit und Leistung der Erkennung und Klassifizierung zu testen
  • Im Artikel On-Device-Maschinelles Lernen – Lernpfad „Objekterkennung“ erfahren Sie, wie Sie ein benutzerdefiniertes Modell trainieren.
  • ML Kit ODT in Ihrer eigenen Android-App anwenden

Weitere Informationen