Nachdem Sie Ihr eigenes Modell mit AutoML Vision Edge trainiert haben, können Sie es in Ihrer App verwenden, um Objekte in Bildern zu erkennen.
Es gibt zwei Möglichkeiten, mit AutoML Vision Edge trainierte Modelle einzubinden: Sie können das Modell bündeln, indem Sie es in den Asset-Ordner Ihrer App einfügen, oder Sie können es dynamisch von Firebase herunterladen.
Optionen für die Kombination von Modellen | |
---|---|
In Ihrer App gebündelt |
|
Mit Firebase gehostet |
|
Hinweis
Wenn Sie ein Modell herunterladen möchten, müssen Sie Firebase Ihrem Android-Projekt hinzufügen, falls noch nicht geschehen. Dies ist nicht erforderlich, wenn Sie das Modell bündeln.
Fügen Sie die Abhängigkeiten für die TensorFlow Lite Task Library der Gradle-Datei auf Anwendungsebene Ihres Moduls hinzu. Diese Datei ist in der Regel
app/build.gradle
:So binden Sie ein Modell in Ihre App ein:
dependencies { // ... // Object detection with a bundled Auto ML model implementation 'org.tensorflow:tensorflow-lite-task-vision:0.0.0-nightly-SNAPSHOT' }
Wenn Sie ein Modell dynamisch aus Firebase herunterladen möchten, fügen Sie auch die Firebase ML-Abhängigkeit hinzu:
dependencies { // ... // Object detection with an Auto ML model deployed to Firebase implementation platform('com.google.firebase:firebase-bom:26.1.1') implementation 'com.google.firebase:firebase-ml-model-interpreter' implementation 'org.tensorflow:tensorflow-lite-task-vision:0.0.0-nightly' }
1. Modell laden
Lokale Modellquelle konfigurieren
So bündeln Sie das Modell mit Ihrer App:
- Extrahieren Sie das Modell aus dem ZIP-Archiv, das Sie aus der Google Cloud-Konsole heruntergeladen haben.
- Nehmen Sie Ihr Modell in Ihr App-Paket auf:
- Wenn Ihr Projekt keinen Assets-Ordner enthält, erstellen Sie einen. Klicken Sie dazu mit der rechten Maustaste auf den Ordner
app/
und dann auf Neu > Ordner > Assets-Ordner. - Kopieren Sie die Modelldatei
tflite
mit eingebetteten Metadaten in den Ordner „assets“.
- Wenn Ihr Projekt keinen Assets-Ordner enthält, erstellen Sie einen. Klicken Sie dazu mit der rechten Maustaste auf den Ordner
Fügen Sie der Datei
build.gradle
Ihrer App Folgendes hinzu, damit Gradle die Modelldatei beim Erstellen der App nicht komprimiert:android { // ... aaptOptions { noCompress "tflite" } }
Die Modelldatei wird in das App-Paket aufgenommen und als Roh-Asset verfügbar sein.
Von Firebase gehostete Modellquelle konfigurieren
Wenn Sie das remote gehostete Modell verwenden möchten, erstellen Sie ein RemoteModel
-Objekt und geben Sie den Namen an, den Sie dem Modell beim Veröffentlichen zugewiesen haben:
Java
// Specify the name you assigned when you deployed the model.
FirebaseCustomRemoteModel remoteModel =
new FirebaseCustomRemoteModel.Builder("your_model").build();
Kotlin
// Specify the name you assigned when you deployed the model.
val remoteModel =
FirebaseCustomRemoteModel.Builder("your_model_name").build()
Starten Sie dann den Modell-Download und geben Sie die Bedingungen an, unter denen Sie das Herunterladen zulassen möchten. Wenn das Modell nicht auf dem Gerät vorhanden ist oder eine neuere Version des Modells verfügbar ist, wird das Modell asynchron von Firebase heruntergeladen:
Java
DownloadConditions downloadConditions = new DownloadConditions.Builder()
.requireWifi()
.build();
RemoteModelManager.getInstance().download(remoteModel, downloadConditions)
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(@NonNull Task<Void> task) {
// Success.
}
});
Kotlin
val downloadConditions = DownloadConditions.Builder()
.requireWifi()
.build()
RemoteModelManager.getInstance().download(remoteModel, downloadConditions)
.addOnSuccessListener {
// Success.
}
Viele Apps starten den Downloadvorgang in ihrem Initialisierungscode, aber Sie können dies jederzeit tun, bevor Sie das Modell verwenden müssen.
Objekterkennung aus Ihrem Modell erstellen
Nachdem Sie Ihre Modellquellen konfiguriert haben, erstellen Sie ein ObjectDetector
-Objekt aus einer der Quellen.
Wenn Sie nur ein lokal gebündeltes Modell haben, erstellen Sie einfach einen Objektdetektor aus Ihrer Modelldatei und konfigurieren Sie den erforderlichen Mindestwert für den Konfidenzwert (siehe Modell bewerten):
Java
// Initialization
ObjectDetectorOptions options = ObjectDetectorOptions.builder()
.setScoreThreshold(0) // Evaluate your model in the Google Cloud console
// to determine an appropriate value.
.build();
ObjectDetector objectDetector = ObjectDetector.createFromFileAndOptions(context, modelFile, options);
Kotlin
// Initialization
val options = ObjectDetectorOptions.builder()
.setScoreThreshold(0) // Evaluate your model in the Google Cloud console
// to determine an appropriate value.
.build()
val objectDetector = ObjectDetector.createFromFileAndOptions(context, modelFile, options)
Wenn Sie ein remote gehostetes Modell haben, müssen Sie prüfen, ob es heruntergeladen wurde, bevor Sie es ausführen. Sie können den Status des Modelldownloads mit der Methode isModelDownloaded()
des Modellmanagers prüfen.
Sie müssen dies zwar nur vor dem Ausführen des Objekterkenners bestätigen, aber wenn Sie sowohl ein remote gehostetes als auch ein lokal gebündeltes Modell haben, kann es sinnvoll sein, diese Prüfung beim Instanziieren des Objekterkenners durchzuführen: Erstellen Sie einen Objekterkenner aus dem Remotemodell, wenn es heruntergeladen wurde, und andernfalls aus dem lokalen Modell.
Java
FirebaseModelManager.getInstance().isModelDownloaded(remoteModel)
.addOnSuccessListener(new OnSuccessListener<Boolean>() {
@Override
public void onSuccess(Boolean isDownloaded) {
}
});
Kotlin
FirebaseModelManager.getInstance().isModelDownloaded(remoteModel)
.addOnSuccessListener { success ->
}
Wenn Sie nur ein Remote-Modell haben, sollten Sie modellbezogene Funktionen deaktivieren, z. B. einen Teil der Benutzeroberfläche ausblenden oder ausgrauen, bis Sie bestätigen, dass das Modell heruntergeladen wurde. Dazu müssen Sie einen Listener an die download()
-Methode des Modellmanagers anhängen.
Sobald Sie wissen, dass Ihr Modell heruntergeladen wurde, erstellen Sie einen Objektdetektor aus der Modelldatei:
Java
FirebaseModelManager.getInstance().getLatestModelFile(remoteModel)
.addOnCompleteListener(new OnCompleteListener<File>() {
@Override
public void onComplete(@NonNull Task<File> task) {
File modelFile = task.getResult();
if (modelFile != null) {
ObjectDetectorOptions options = ObjectDetectorOptions.builder()
.setScoreThreshold(0)
.build();
objectDetector = ObjectDetector.createFromFileAndOptions(
getApplicationContext(), modelFile.getPath(), options);
}
}
});
Kotlin
FirebaseModelManager.getInstance().getLatestModelFile(remoteModel)
.addOnSuccessListener { modelFile ->
val options = ObjectDetectorOptions.builder()
.setScoreThreshold(0f)
.build()
objectDetector = ObjectDetector.createFromFileAndOptions(
applicationContext, modelFile.path, options)
}
2. Eingabebild vorbereiten
Erstellen Sie dann für jedes Bild, das Sie labeln möchten, ein TensorImage
-Objekt aus dem Bild. Sie können ein TensorImage
-Objekt aus einem Bitmap
mit der Methode fromBitmap
erstellen:
Java
TensorImage image = TensorImage.fromBitmap(bitmap);
Kotlin
val image = TensorImage.fromBitmap(bitmap)
Wenn Ihre Bilddaten nicht in einem Bitmap
sind, können Sie ein Pixel-Array laden, wie in der TensorFlow Lite-Dokumentation beschrieben.
3. Objektdetektor ausführen
Wenn Sie Objekte in einem Bild erkennen möchten, übergeben Sie das TensorImage
-Objekt an die detect()
-Methode von ObjectDetector
.
Java
List<Detection> results = objectDetector.detect(image);
Kotlin
val results = objectDetector.detect(image)
4. Informationen zu gekennzeichneten Objekten abrufen
Wenn der Vorgang zur Objekterkennung erfolgreich ist, wird eine Liste von Detection
-Objekten zurückgegeben. Jedes Detection
-Objekt stellt etwas dar, das im Bild erkannt wurde. Sie können den Begrenzungsrahmen und die Labels der einzelnen Objekte abrufen.
Beispiel:
Java
for (Detection result : results) {
RectF bounds = result.getBoundingBox();
List<Category> labels = result.getCategories();
}
Kotlin
for (result in results) {
val bounds = result.getBoundingBox()
val labels = result.getCategories()
}
Tipps zur Verbesserung der Echtzeitleistung
Wenn Sie Bilder in einer Echtzeitanwendung labeln möchten, sollten Sie die folgenden Richtlinien beachten, um die besten Framerates zu erzielen:
- Drosseln Sie die Aufrufe des Bildkennzeichners. Wenn ein neuer Videoframes verfügbar wird, während das Bildlabeling-Tool ausgeführt wird, verwerfen Sie den Frame. Ein Beispiel finden Sie in der Klasse
VisionProcessorBase
in der Beispiel-App für die Kurzanleitung. - Wenn Sie die Ausgabe des Bildkennzeichners verwenden, um Grafiken auf das Eingabebild zu legen, rufen Sie zuerst das Ergebnis ab und rendern Sie dann das Bild und das Overlay in einem einzigen Schritt. Dadurch wird für jeden Eingabe-Frame nur einmal auf die Displayoberfläche gerendert. Ein Beispiel finden Sie in der
CameraSourcePreview
- undGraphicOverlay
-Klasse in der Beispiel-App für die Kurzanleitung. -
Wenn Sie die Camera2 API verwenden, nehmen Sie Bilder im
ImageFormat.YUV_420_888
-Format auf.Wenn Sie die ältere Camera API verwenden, nehmen Sie Bilder im
ImageFormat.NV21
-Format auf.