Benutzerdefiniertes Modell in Ihre App einbinden

1. Hinweis

Im ersten Codelab dieser Reihe haben Sie eine sehr einfache Anwendung erstellt, die den Inhalt eines Bildes mithilfe von Image Labelling parst. Du hast ihm ein Bild eines Gänseblümchens überholt und es hat dir mitgeteilt, dass es Dinge wie ein Blütenblatt oder den Himmel gesehen hat. Im zweiten Codelab haben Sie dann zu Python gewechselt, um ein neues, benutzerdefiniertes Modell zu trainieren, das fünf verschiedene Blumenarten erkennt.

In diesem Codelab aktualisieren Sie die App aus dem ersten Lab mit dem Modell aus dem zweiten.

Sie können den vollständigen Quellcode für dieses Code-Lab abrufen, indem Sie dieses Repository klonen. Es werden Unterverzeichnisse für Android und iOS angezeigt. Der Code aus dem vorherigen Codelab ist als ImageClassifierStep1 verfügbar, wenn Sie mitarbeiten möchten. Der fertige Code für dieses Codelab ist als ImageClassifierStep2 verfügbar.

Vorbereitung

  • Sie sollten die ersten beiden Codelabs dieses Lernpfads abgeschlossen haben.

Aufgaben in diesem Kurs

  • Im vorherigen Lab trainiertes benutzerdefiniertes Modell in eine Android- oder iOS-App einbinden

Voraussetzungen

  • Android Studio, verfügbar unter developer.android.com/studio für den Android-Teil des Labs
  • Xcode, der im Apple App Store verfügbar ist, für den iOS-Teil des Labs

2. Starter-App herunterladen

Zuerst benötigen Sie die App aus dem Codelab „Erste Computer Vision-App für Android oder iOS erstellen“. Falls Sie das Lab absolviert haben, heißt es ImageClassifierStep1. Wenn Sie das Lab nicht absolvieren möchten, können Sie die fertige Version aus dem Repository klonen.

Öffne die App in Android Studio, aktualisiere sie nach Bedarf und führe dann die App aus, um sicherzugehen, dass alles funktioniert. Auf dem Bildschirm sollte Folgendes zu sehen sein:

f3703d45d1332d1d.png

Es ist eine ziemlich einfache Anwendung, aber sie zeigt einige sehr leistungsstarke Funktionen mit nur wenig Code. Wenn Sie jedoch möchten, dass diese Blume als Gänseblümchen und nicht nur als Blume erkannt wird, müssen Sie die App aktualisieren, um Ihr benutzerdefiniertes Modell aus dem Codelab „Benutzerdefiniertes Modell für Ihren Bildklassifikator erstellen“ zu verwenden.

3. build.gradle-Datei aktualisieren, um benutzerdefinierte ML Kit-Modelle zu verwenden

  1. Suchen Sie in Android Studio nach der Datei build.gradle auf App-Ebene. Am einfachsten geht dies im Project Explorer. Achten Sie darauf, dass oben Android ausgewählt ist. Sie sehen dann unten einen Ordner für Gradle Scripts.
  2. Öffnen Sie das Modul mit Ihrem App-Namen gefolgt von „.app“. wie hier gezeigt – (Modul: ImageClassifierStep1.app):

8fe1d04b40610047.png

  1. Suchen Sie unten in der Datei die Einstellung Abhängigkeiten. Dort sollten Sie die folgende Zeile sehen:
implementation 'com.google.mlkit:image-labeling:17.0.1'

Die Versionsnummer kann davon abweichen. Sie finden immer die aktuelle Versionsnummer von der ML Kit-Website unter https://developers.google.com/ml-kit/vision/image-labeling/android.

  1. Ersetzen Sie dies durch die Referenz zur benutzerdefinierten Bild-Labeling-Bibliothek. Die Versionsnummer finden Sie unter https://developers.google.com/ml-kit/vision/image-labeling/custom-models/android.
implementation 'com.google.mlkit:image-labeling-custom:16.3.1'
  1. Außerdem fügen Sie ein .tflite-Modell hinzu, das Sie im vorherigen Lab erstellt haben. Sie möchten nicht, dass dieses Modell komprimiert wird, wenn Android Studio Ihre App kompiliert. Stellen Sie daher sicher, dass Sie diese Einstellung im Abschnitt Android derselben build.gradle-Datei verwenden:
aaptOptions{
    noCompress "tflite"
}

Achten Sie darauf, dass es sich nicht in einer anderen Einstellung befindet. Es sollte direkt unter dem android-Tag verschachtelt sein. Beispiel:

62d546bff11d2a50.png

4. TFLite-Modell hinzufügen

Im vorherigen Codelab haben Sie Ihr benutzerdefiniertes Modell erstellt und als model.tflite heruntergeladen.

Suchen Sie in Ihrem Projekt nach dem Ordner assets, der derzeit flower1.jpg enthält. Kopieren Sie das Modell wie folgt in diesen Ordner:

  1. Klicken Sie in Android Studio mit der rechten Maustaste auf den Ordner Assets. Wähle im Menü, das geöffnet wird, Im Finder anzeigen aus. ("Im Explorer anzeigen" unter Windows und "In Dateien anzeigen" unter Linux).

db30b47e419a326b.png

  1. Sie werden zum Verzeichnis im Dateisystem weitergeleitet. Kopieren Sie die Datei model.tflite zusammen mit flower1.jpg. in dieses Verzeichnis.

36de0c51bec1c19e.png

Android Studio wird aktualisiert und zeigt beide Dateien in Ihrem Asset-Ordner an:

e9f4e9f394d9b357.png

Jetzt können Sie Ihren Code aktualisieren.

5. Code für das benutzerdefinierte Modell aktualisieren

Der erste Schritt besteht darin, Code zum Laden des benutzerdefinierten Modells hinzuzufügen.

  1. Fügen Sie in der Datei MainActivity Folgendes zu Ihrem onCreate direkt unter der Zeile setContentView(R.layout.activity_main) hinzu.

Dies verwendet ein LocalModel, um aus dem model.tflite-Asset zu erstellen. Wenn sich Android Studio durch Angabe von „LocalModel“ beschwert nicht verwenden, drücken Sie ALT + Eingabetaste, um die Bibliothek zu importieren. Er sollte für Sie einen Import zu com.google.mlkit.common.model.LocalModel hinzufügen.

val localModel = LocalModel.Builder()
        .setAssetFilePath("model.tflite")
        .build()

Bisher haben Sie in Ihrem btn.setOnClickListener-Handler das Standardmodell verwendet. Es wurde mit diesem Code eingerichtet:

val labeler = ImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS)

Sie ersetzen dieses Modell, um das benutzerdefinierte Modell zu verwenden.

  1. Richten Sie ein benutzerdefiniertes Optionsobjekt ein:
val options = CustomImageLabelerOptions.Builder(localModel)
        .setConfidenceThreshold(0.7f)
        .setMaxResultCount(5)
        .build()

Dadurch werden die Standardoptionen durch einen benutzerdefinierten Satz ersetzt. Der Konfidenzgrenzwert legt einen Maßstab für die Qualität der zurückzugebenden Vorhersagen fest. Wenn Sie auf das Beispiel oben in diesem Codelab zurückblicken, in dem das Bild ein Gänseblümchen war, gab es vier Vorhersagen mit jeweils einem Wert, z. B. „Himmel“. ist 0,7632.

Sie könnten Ergebnisse geringerer Qualität effektiv herausfiltern, indem Sie einen hohen Konfidenzgrenzwert verwenden. Wenn Sie diesen Wert beispielsweise auf 0,9 festlegen, wird kein Label mit einer niedrigeren Priorität zurückgegeben. setMaxResultCount() ist in Modellen mit vielen Klassen nützlich. Da dieses Modell jedoch nur 5 hat, belassen Sie es einfach bei 5.

Nachdem Sie nun Optionen für den Labelersteller haben, können Sie die Instanziierung des Labelerstellers wie folgt ändern:

val labeler = ImageLabeling.getClient(options)

Der Rest des Codes wird ohne Änderungen ausgeführt. Probier die Funktion einfach aus!

dd40c36c4edbb33.png

Hier sehen Sie, dass diese Blume jetzt als Gänseblümchen mit einer Wahrscheinlichkeit von 0,959 identifiziert wurde!

Angenommen, Sie haben ein zweites Blumenbild hinzugefügt und es so wiederholt:

8556a5fbea487842.png

Er identifiziert sie als Rose.

Sie fragen sich vielleicht, warum dort Rosen statt nur "Rose" steht. Das liegt daran, dass die Labels im Dataset durch die Ordnernamen vergeben werden. Diese Ordnernamen sind leider etwas uneinheitlich. Sie verwenden manchmal den Singular (wie „daisy“) und manchmal die Pluralform (z. B. „Rosen“). Verwechseln Sie dies nicht mit dem Modell, das versucht, die Elemente im Bild zu zählen – es ist viel einfacher und kann nur die Blumenarten identifizieren!

6. iOS Start App herunterladen

  1. Zuerst benötigen Sie die App aus dem ersten Codelab. Falls Sie das Lab absolviert haben, heißt es ImageClassifierStep1. Wenn Sie das Lab nicht durcharbeiten möchten, können Sie die fertige Version aus dem Repository klonen. Beachten Sie, dass die Pods und .xcworkspace im Repository nicht vorhanden sind. Führen Sie daher vor dem nächsten Schritt "pod install" aus. aus demselben Verzeichnis wie die .xcproject-Datei aus.
  2. Öffnen Sie ImageClassifierStep1.xcworkspace in Xcode. Sie sollten .xcworkspace und nicht .xcproject verwenden, da Sie ein ML Kit mit Pods gebündelt haben und diese vom Arbeitsbereich geladen werden.

Für den Rest dieses Labs führen wir die App im iPhone-Simulator aus, der die Build-Ziele aus dem Codelab unterstützen sollte. Wenn Sie Ihr eigenes Gerät verwenden möchten, müssen Sie möglicherweise das Build-Ziel in Ihren Projekteinstellungen an Ihre iOS-Version anpassen.

Führen Sie sie aus. Sie sehen in etwa Folgendes:

9e151ed18f99fb98.png

Beachten Sie die sehr allgemeinen Klassifizierungen – Crème, Blume, Himmel. Das Modell, das Sie im vorherigen Codelab erstellt haben, wurde darauf trainiert, fünf Blumensorten zu erkennen, darunter auch diese – ein Gänseblümchen.

Im weiteren Verlauf dieses Codelabs sehen Sie sich an, was erforderlich ist, um Ihre App mit dem benutzerdefinierten Modell zu aktualisieren.

7. Benutzerdefinierte ML Kit Image Labeler-Pods verwenden

In der ersten Anwendung wurde eine Pod-Datei verwendet, um die Basisbibliotheken und das Modell des ML Kit Image Labeler abzurufen. Sie müssen sie aktualisieren, um die benutzerdefinierten Labellingsbibliotheken für Bilder verwenden zu können.

  1. Suchen Sie in Ihrem Projektverzeichnis nach der Datei podfile. Wenn Sie sie öffnen, sehen Sie in etwa Folgendes:
platform :ios, '10.0'

target 'ImageClassifierStep1' do
        pod 'GoogleMLKit/ImageLabeling'
end
  1. Ändern Sie die Pod-Deklaration von ImageLabeling in ImageLabelingCustom so:
platform :ios, '10.0'

target 'ImageClassifierStep1' do
        pod 'GoogleMLKit/ImageLabelingCustom'
end
  1. Wechseln Sie danach über das Terminal zum Verzeichnis, das die Podfile-Datei und die .xcworkspace-Datei enthält, und führen Sie pod install aus.

bb5d78eb7c7ab975.png

Nach kurzer Zeit werden die MLKitImageLabeling-Bibliotheken entfernt und die benutzerdefinierten Bibliotheken hinzugefügt. Sie können jetzt die .xcworkspace öffnen, um den Code zu bearbeiten.

8. TFLite-Modell zu Xcode hinzufügen

Im vorherigen Codelab haben Sie ein benutzerdefiniertes Modell erstellt und es als model.tflite heruntergeladen. Wenn Sie diese nicht zur Hand haben, gehen Sie zurück und führen Sie dieses Codelab aus oder lesen Sie den Colab-Code hier. Wenn Sie keinen Zugriff auf Google Colab haben, finden Sie das Notebook unter diesem Link.

  1. Ziehen Sie bei geöffnetem Arbeitsbereich in Xcode die Datei „model.tflite“ in Ihr Projekt. Sie sollte sich im selben Ordner wie die übrigen Dateien (z. B. ViewController.swift oder Main.storyboard) befinden.
  2. Ein Dialogfeld mit Optionen zum Hinzufügen der Datei wird angezeigt. Achten Sie darauf, dass Zu Zielen hinzufügen ausgewählt ist. Andernfalls wird das Modell nicht mit der App gebündelt, wenn es auf einem Gerät bereitgestellt wird.

Die Option „Zu Zielen hinzufügen“ den Eintrag ImageClassifierStep1, wenn Sie damit begonnen haben und dieses Lab Schritt für Schritt durcharbeiten, oder ImageClassifierStep2 (wie gezeigt), wenn Sie zum fertigen Code gesprungen sind.

5b6a7f40c73f0f1f.png

Dadurch wird sichergestellt, dass Sie das Modell laden können. Wie Sie dazu vorgehen, erfahren Sie im nächsten Schritt.

9. Code für das benutzerdefinierte Modell aktualisieren

  1. Öffnen Sie Ihre ViewController.swift-Datei. Möglicherweise wird ein Fehler beim Import von MLKitImageLabeling angezeigt. ganz oben in der Datei. Das liegt daran, dass Sie die generischen Image-Labeling-Bibliotheken beim Aktualisieren der Pod-Datei entfernt haben. Sie können diese Zeile löschen und Folgendes eingeben:
import MLKitVision
import MLKit
import MLKitImageLabelingCommon
import MLKitImageLabelingCustom

Es kann leicht sein, diese schnell zu lesen und zu glauben, dass sie denselben Code wiederholen! Aber es ist „allgemein“, und „Benutzerdefiniert“ am Ende!

  1. Als Nächstes laden Sie das benutzerdefinierte Modell, das Sie im vorherigen Schritt hinzugefügt haben. Suchen Sie die Funktion getLabels(). Fügen Sie unter der Zeile visionImage.orientation = image.imageOrientation diese Zeilen hinzu:
// Add this code to use a custom model
let localModelFilePath = Bundle.main.path(forResource: "model", ofType: "tflite")
let localModel = LocalModel(path: localModelFilePath!)
  1. Suchen Sie den Code zum Angeben der Optionen für den generischen ImageLabeler. Da diese Bibliotheken entfernt wurden, erhalten Sie wahrscheinlich eine Fehlermeldung:
let options = ImageLabelerOptions()

Ersetzen Sie ihn durch diesen Code, um ein CustomImageLabelerOptions-Objekt zu verwenden, das das lokale Modell angibt:

let options = CustomImageLabelerOptions(localModel: localModel)

Geschafft! Versuchen Sie jetzt, Ihre App auszuführen. Wenn Sie versuchen, das Bild zu klassifizieren, sollte dies genauer sein und Ihnen mitteilen, dass Sie mit hoher Wahrscheinlichkeit ein Gänseblümchen sehen.

238cd21748a97cf4.png

Angenommen, Sie haben ein zweites Blumenbild hinzugefügt und es so wiederholt:

75f3970a6b509bfe.png

Die App hat erfolgreich erkannt, dass dieses Bild dem Label „Rosen“ entspricht.

10. Glückwunsch!

Sie haben nun eine App erstellt, in der ein generisches Modell zum Erkennen des Inhalts eines Bildes verwendet wird. Nun haben Sie Ihr eigenes ML-Modell erstellt, um bestimmte Dinge wie Blumen zu erkennen. Anschließend haben Sie Ihre App aktualisiert, um Ihr benutzerdefiniertes Modell zu verwenden.

Die daraus resultierende App ist natürlich stark eingeschränkt, da sie auf gebündelten Bild-Assets basiert. Der ML-Teil funktioniert jedoch gut. Du könntest zum Beispiel mit der AndroidX-Kamera Frames aus einem Livefeed aufnehmen und sie klassifizieren, um zu sehen, welche Blumen dein Smartphone erkennt.

Von hier aus sind die Möglichkeiten endlos – und wenn Sie Ihre eigenen Daten für etwas anderes als Blumen haben, haben Sie die Grundlagen für die Entwicklung einer App, die diese mithilfe von Computer Vision erkennt. Dies sind nur die ersten Schritte in einer viel größeren Welt.