Nachdem Sie Ihr eigenes Modell mit AutoML Vision Edge trainiert haben, führen Sie folgende Schritte aus: können Sie in Ihrer App Objekte in Bildern erkennen.
Es gibt zwei Möglichkeiten, mit AutoML Vision Edge trainierte Modelle einzubinden: bündeln Sie das Modell, indem Sie es im Asset-Ordner Ihrer App ablegen. Alternativ können Sie dynamisch von Firebase herunterladen.
Optionen für Modellbündelung | |
---|---|
In deiner App enthalten |
|
Mit Firebase gehostet |
|
Hinweis
Wenn Sie ein Modell herunterladen möchten, müssen Sie Firebase zu Ihrem Android-Projekt hinzufügen, falls noch nicht geschehen. Dies ist nicht erforderlich, wenn Sie das Modell als Paket anbieten.
Fügen Sie die Abhängigkeiten für die TensorFlow Lite Task-Bibliothek zum Gradle-Datei auf App-Ebene, in der Regel
app/build.gradle
:So bündeln Sie ein Modell mit Ihrer App:
dependencies { // ... // Object detection with a bundled Auto ML model implementation 'org.tensorflow:tensorflow-lite-task-vision:0.0.0-nightly-SNAPSHOT' }
Fügen Sie zum dynamischen Herunterladen eines Modells aus Firebase auch das Firebase ML hinzu. Abhängigkeit:
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.
- Fügen Sie Ihr Modell in das App-Paket ein:
- Wenn Sie in Ihrem Projekt noch keinen Assets-Ordner haben, erstellen Sie einen. Klicken Sie dazu mit der rechten Maustaste auf den Ordner
app/
und dann auf Neu > Ordner > Assets-Ordner. - Kopieren Sie Ihre
tflite
-Modelldatei mit eingebetteten Metadaten in die Assets Ordner.
- Wenn Sie in Ihrem Projekt noch keinen Assets-Ordner haben, erstellen Sie einen. Klicken Sie dazu mit der rechten Maustaste auf den Ordner
Fügen Sie der Datei
build.gradle
Ihrer App Folgendes hinzu, um sicherzustellen, Gradle komprimiert die Modelldatei beim Erstellen der App nicht:android { // ... aaptOptions { noCompress "tflite" } }
Die Modelldatei ist im App-Paket enthalten und verfügbar als unbearbeitetes Asset.
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 bei der Veröffentlichung 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 die Aufgabe zum Herunterladen des Modells und geben Sie die Bedingungen an, unter denen der Download zulässig sein soll. Wenn das Modell nicht auf dem Gerät installiert ist oder ein neueres Modell Version des Modells verfügbar ist, lädt die Aufgabe asynchron das aus Firebase verwenden:
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 die Download-Aufgabe im Initialisierungscode, aber Sie können jederzeit tun, bevor Sie das Modell verwenden müssen.
Objektdetektor aus Ihrem Modell erstellen
Nachdem Sie die Modellquellen konfiguriert haben, erstellen Sie ein ObjectDetector
-Objekt aus einer
von ihnen.
Wenn Sie nur ein lokal gebündeltes Modell haben, erstellen Sie einfach einen Objektdetektor aus Ihrem Modelldatei erstellen und den Konfidenzwert konfigurieren Schwellenwert, den Sie verlangen möchten (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 extern 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.
Sie müssen dies nur vor der Ausführung des Objektdetektors bestätigen. Wenn Sie ein remote gehostetes und ein lokal gebündeltes Modell haben, sinnvoll, diese Prüfung beim Instanziieren des Objektdetektors auszuführen: Objektdetektor vom Remote-Modell, falls es heruntergeladen wurde, und vom lokalen modellieren.
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 gehostetes Modell haben, sollten Sie die modellbezogenen
wie z. B. das Ausgrauen oder Ausblenden eines Teils der Benutzeroberfläche, bis
bestätigen Sie, dass das Modell heruntergeladen wurde. Hängen Sie hierzu einen Listener an.
zur download()
-Methode des Modellmanagers hinzu.
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 mit einem Label versehen möchten, ein TensorImage
-Objekt aus Ihrem
Bild. Mit der Methode fromBitmap
können Sie ein TensorImage
-Objekt aus einem Bitmap
-Objekt erstellen:
Java
TensorImage image = TensorImage.fromBitmap(bitmap);
Kotlin
val image = TensorImage.fromBitmap(bitmap)
Wenn sich Ihre Bilddaten nicht in einem Bitmap
befinden, können Sie ein Pixelarray laden, wie in
die TensorFlow Lite-Dokumentation.
3. Objektdetektor ausführen
Um Objekte in einem Bild zu erkennen, übergeben Sie das Objekt TensorImage
an die
Die Methode detect()
von ObjectDetector
.
Java
List<Detection> results = objectDetector.detect(image);
Kotlin
val results = objectDetector.detect(image)
4. Informationen zu Objekten mit Label abrufen
Wenn die Objekterkennung erfolgreich ist, wird eine Liste mit Detection
zurückgegeben.
Objekte. Jedes Detection
-Objekt steht für etwas, das im
Bild. Sie können den Begrenzungsrahmen und die Labels jedes Objekts 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 mit Labels versehen möchten, gehen Sie so vor: um optimale Framerates zu erzielen:
- Aufrufe an den Bildbeschrifter drosseln Wenn während der Ausführung des Bildestikkers ein neuer Videoframe verfügbar wird, legen Sie ihn ab. Siehe
VisionProcessorBase
in der Beispielanwendung „Kurzanleitung“ finden Sie ein Beispiel. - Wenn Sie die Ausgabe des Bildlabelerstellers verwenden, um Grafiken
das Eingabebild, rufen Sie zuerst das Ergebnis ab und rendern Sie das Bild
in einem Schritt übereinanderlegen. Dadurch rendern Sie auf der Anzeigeoberfläche
für jeden Eingabe-Frame nur einmal. Siehe
CameraSourcePreview
undGraphicOverlay
-Klassen in der Schnellstart-Beispiel-App für ein Beispiel. -
Wenn Sie die Camera2 API verwenden, nehmen Sie Bilder in
ImageFormat.YUV_420_888
-Format.Wenn Sie die ältere Camera API verwenden, nehmen Sie Bilder in
ImageFormat.NV21
-Format.