Wenn Ihre App benutzerdefinierte TensorFlow Lite- Modelle verwendet, können Sie Firebase ML verwenden, um Ihre Modelle bereitzustellen. Durch die Bereitstellung von Modellen mit Firebase können Sie die anfängliche Downloadgröße Ihrer App reduzieren und die ML-Modelle Ihrer App aktualisieren, ohne eine neue Version Ihrer App zu veröffentlichen. Und mit Remote Config und A/B Testing können Sie unterschiedliche Modelle dynamisch für unterschiedliche Benutzergruppen bereitstellen.
TensorFlow Lite-Modelle
TensorFlow Lite-Modelle sind ML-Modelle, die für die Ausführung auf Mobilgeräten optimiert sind. So erhalten Sie ein TensorFlow Lite-Modell:
- Verwenden Sie ein vorgefertigtes Modell, z. B. eines der offiziellen TensorFlow Lite-Modelle .
- Konvertieren Sie ein TensorFlow-Modell, Keras-Modell oder eine konkrete Funktion in TensorFlow Lite.
Bevor Sie beginnen
- Fügen Sie Ihrem Android-Projekt Firebase hinzu , falls Sie dies noch nicht getan haben .
- Fügen Sie in Ihrer Modul-Gradle-Datei (auf App-Ebene) (normalerweise
<project>/<app-module>/build.gradle
) die Abhängigkeit für die Firebase ML-Modell-Downloader-Android-Bibliothek hinzu. Wir empfehlen die Verwendung der Firebase Android BoM zur Steuerung der Bibliotheksversionierung.Außerdem müssen Sie im Rahmen der Einrichtung des Firebase ML-Modelldownloaders das TensorFlow Lite SDK zu Ihrer App hinzufügen.
Kotlin+KTX
dependencies { // Import the BoM for the Firebase platform implementation platform('com.google.firebase:firebase-bom:32.1.0') // Add the dependency for the Firebase ML model downloader library // When using the BoM, you don't specify versions in Firebase library dependencies implementation 'com.google.firebase:firebase-ml-modeldownloader-ktx'
// Also add the dependency for the TensorFlow Lite library and specify its version implementation 'org.tensorflow:tensorflow-lite:2.3.0' }Durch die Verwendung der Firebase Android BoM verwendet Ihre App immer kompatible Versionen von Firebase Android-Bibliotheken.
(Alternative) Fügen Sie Firebase-Bibliotheksabhängigkeiten hinzu , ohne die Stückliste zu verwenden
Wenn Sie die Firebase-Stückliste nicht verwenden möchten, müssen Sie jede Firebase-Bibliotheksversion in ihrer Abhängigkeitszeile angeben.
Beachten Sie, dass wir bei Verwendung mehrerer Firebase-Bibliotheken in Ihrer App dringend empfehlen, die BoM zum Verwalten von Bibliotheksversionen zu verwenden, wodurch sichergestellt wird, dass alle Versionen kompatibel sind.
dependencies { // Add the dependency for the Firebase ML model downloader library // When NOT using the BoM, you must specify versions in Firebase library dependencies implementation 'com.google.firebase:firebase-ml-modeldownloader-ktx:24.1.2'
// Also add the dependency for the TensorFlow Lite library and specify its version implementation 'org.tensorflow:tensorflow-lite:2.3.0' }Java
dependencies { // Import the BoM for the Firebase platform implementation platform('com.google.firebase:firebase-bom:32.1.0') // Add the dependency for the Firebase ML model downloader library // When using the BoM, you don't specify versions in Firebase library dependencies implementation 'com.google.firebase:firebase-ml-modeldownloader'
// Also add the dependency for the TensorFlow Lite library and specify its version implementation 'org.tensorflow:tensorflow-lite:2.3.0' }Durch die Verwendung der Firebase Android BoM verwendet Ihre App immer kompatible Versionen von Firebase Android-Bibliotheken.
(Alternative) Fügen Sie Firebase-Bibliotheksabhängigkeiten hinzu , ohne die Stückliste zu verwenden
Wenn Sie die Firebase-Stückliste nicht verwenden möchten, müssen Sie jede Firebase-Bibliotheksversion in ihrer Abhängigkeitszeile angeben.
Beachten Sie, dass wir bei Verwendung mehrerer Firebase-Bibliotheken in Ihrer App dringend empfehlen, die BoM zum Verwalten von Bibliotheksversionen zu verwenden, wodurch sichergestellt wird, dass alle Versionen kompatibel sind.
dependencies { // Add the dependency for the Firebase ML model downloader library // When NOT using the BoM, you must specify versions in Firebase library dependencies implementation 'com.google.firebase:firebase-ml-modeldownloader:24.1.2'
// Also add the dependency for the TensorFlow Lite library and specify its version implementation 'org.tensorflow:tensorflow-lite:2.3.0' }- Deklarieren Sie im Manifest Ihrer App, dass eine INTERNET-Berechtigung erforderlich ist:
<uses-permission android:name="android.permission.INTERNET" />
1. Stellen Sie Ihr Modell bereit
Stellen Sie Ihre benutzerdefinierten TensorFlow-Modelle entweder mit der Firebase-Konsole oder den Python- und Node.js-SDKs von Firebase Admin bereit. Siehe Bereitstellen und Verwalten von benutzerdefinierten Modellen .
Nachdem Sie Ihrem Firebase-Projekt ein benutzerdefiniertes Modell hinzugefügt haben, können Sie in Ihren Apps mit dem von Ihnen angegebenen Namen auf das Modell verweisen. Sie können jederzeit ein neues TensorFlow Lite-Modell bereitstellen und das neue Modell auf die Geräte der Benutzer herunterladen, indem Sie
getModel()
aufrufen (siehe unten).2. Laden Sie das Modell auf das Gerät herunter und initialisieren Sie einen TensorFlow Lite-Interpreter
Um Ihr TensorFlow Lite-Modell in Ihrer App zu verwenden, verwenden Sie zunächst das Firebase ML SDK, um die neueste Version des Modells auf das Gerät herunterzuladen. Instanziieren Sie dann einen TensorFlow Lite-Interpreter mit dem Modell.Rufen Sie zum Starten des Modell-Downloads die
getModel()
Methode des Modell-Downloaders auf und geben Sie den Namen an, den Sie dem Modell beim Hochladen zugewiesen haben, ob Sie immer das neueste Modell herunterladen möchten und unter welchen Bedingungen Sie das Herunterladen zulassen möchten.Sie können zwischen drei Download-Verhaltensweisen wählen:
Download-Typ Beschreibung LOCAL_MODEL Holen Sie sich das lokale Modell vom Gerät. Wenn kein lokales Modell verfügbar ist, verhält sich dies wie LATEST_MODEL
. Verwenden Sie diesen Downloadtyp, wenn Sie nicht nach Modellaktualisierungen suchen möchten. Beispielsweise verwenden Sie Remote Config, um Modellnamen abzurufen, und Sie laden Modelle immer unter neuen Namen hoch (empfohlen).LOCAL_MODEL_UPDATE_IN_BACKGROUND Holen Sie sich das lokale Modell vom Gerät und starten Sie die Aktualisierung des Modells im Hintergrund. Wenn kein lokales Modell verfügbar ist, verhält sich dies wie LATEST_MODEL
.NEUSTE MODELL Holen Sie sich das neueste Modell. Wenn das lokale Modell die neueste Version ist, wird das lokale Modell zurückgegeben. Andernfalls laden Sie das neueste Modell herunter. Dieses Verhalten wird blockiert, bis die neueste Version heruntergeladen wird (nicht empfohlen). Verwenden Sie dieses Verhalten nur in Fällen, in denen Sie ausdrücklich die neueste Version benötigen. Sie sollten modellbezogene Funktionen deaktivieren, z. B. Teile Ihrer Benutzeroberfläche ausgrauen oder ausblenden, bis Sie bestätigen, dass das Modell heruntergeladen wurde.
Kotlin+KTX
val conditions = CustomModelDownloadConditions.Builder() .requireWifi() // Also possible: .requireCharging() and .requireDeviceIdle() .build() FirebaseModelDownloader.getInstance() .getModel("your_model", DownloadType.LOCAL_MODEL_UPDATE_IN_BACKGROUND, conditions) .addOnSuccessListener { model: CustomModel? -> // Download complete. Depending on your app, you could enable the ML // feature, or switch from the local model to the remote model, etc. // The CustomModel object contains the local path of the model file, // which you can use to instantiate a TensorFlow Lite interpreter. val modelFile = model?.file if (modelFile != null) { interpreter = Interpreter(modelFile) } }
Java
CustomModelDownloadConditions conditions = new CustomModelDownloadConditions.Builder() .requireWifi() // Also possible: .requireCharging() and .requireDeviceIdle() .build(); FirebaseModelDownloader.getInstance() .getModel("your_model", DownloadType.LOCAL_MODEL_UPDATE_IN_BACKGROUND, conditions) .addOnSuccessListener(new OnSuccessListener<CustomModel>() { @Override public void onSuccess(CustomModel model) { // Download complete. Depending on your app, you could enable the ML // feature, or switch from the local model to the remote model, etc. // The CustomModel object contains the local path of the model file, // which you can use to instantiate a TensorFlow Lite interpreter. File modelFile = model.getFile(); if (modelFile != null) { interpreter = new Interpreter(modelFile); } } });
Viele Apps starten die Download-Aufgabe in ihrem Initialisierungscode, aber Sie können dies jederzeit tun, bevor Sie das Modell verwenden müssen.
3. Führe Rückschlüsse auf Eingabedaten durch
Holen Sie sich die Eingabe- und Ausgabeformen Ihres Modells
Der Modellinterpreter von TensorFlow Lite verwendet als Eingabe und erzeugt als Ausgabe ein oder mehrere multidimensionale Arrays. Diese Arrays enthalten entweder
byte
-,int
-,long
- oderfloat
-Werte. Bevor Sie Daten an ein Modell übergeben oder sein Ergebnis verwenden können, müssen Sie die Anzahl und die Abmessungen ("Form") der von Ihrem Modell verwendeten Arrays kennen.Wenn Sie das Modell selbst erstellt haben oder wenn das Ein- und Ausgabeformat des Modells dokumentiert ist, verfügen Sie möglicherweise bereits über diese Informationen. Wenn Sie die Form und den Datentyp der Eingabe und Ausgabe Ihres Modells nicht kennen, können Sie den TensorFlow Lite-Interpreter verwenden, um Ihr Modell zu untersuchen. Zum Beispiel:
Python
import tensorflow as tf interpreter = tf.lite.Interpreter(model_path="your_model.tflite") interpreter.allocate_tensors() # Print input shape and type inputs = interpreter.get_input_details() print('{} input(s):'.format(len(inputs))) for i in range(0, len(inputs)): print('{} {}'.format(inputs[i]['shape'], inputs[i]['dtype'])) # Print output shape and type outputs = interpreter.get_output_details() print('\n{} output(s):'.format(len(outputs))) for i in range(0, len(outputs)): print('{} {}'.format(outputs[i]['shape'], outputs[i]['dtype']))
Beispielausgabe:
1 input(s): [ 1 224 224 3] <class 'numpy.float32'> 1 output(s): [1 1000] <class 'numpy.float32'>
Führen Sie den Interpreter aus
Nachdem Sie das Format der Eingabe und Ausgabe Ihres Modells bestimmt haben, rufen Sie Ihre Eingabedaten ab und führen Sie alle Transformationen an den Daten durch, die erforderlich sind, um eine Eingabe mit der richtigen Form für Ihr Modell zu erhalten.Wenn Sie beispielsweise ein Bildklassifizierungsmodell mit einer Eingabeform von
[1 224 224 3]
Gleitkommawerten haben, könnten Sie einen Eingabe-ByteBuffer
aus einemBitmap
Objekt generieren, wie im folgenden Beispiel gezeigt:Kotlin+KTX
val bitmap = Bitmap.createScaledBitmap(yourInputImage, 224, 224, true) val input = ByteBuffer.allocateDirect(224*224*3*4).order(ByteOrder.nativeOrder()) for (y in 0 until 224) { for (x in 0 until 224) { val px = bitmap.getPixel(x, y) // Get channel values from the pixel value. val r = Color.red(px) val g = Color.green(px) val b = Color.blue(px) // Normalize channel values to [-1.0, 1.0]. This requirement depends on the model. // For example, some models might require values to be normalized to the range // [0.0, 1.0] instead. val rf = (r - 127) / 255f val gf = (g - 127) / 255f val bf = (b - 127) / 255f input.putFloat(rf) input.putFloat(gf) input.putFloat(bf) } }
Java
Bitmap bitmap = Bitmap.createScaledBitmap(yourInputImage, 224, 224, true); ByteBuffer input = ByteBuffer.allocateDirect(224 * 224 * 3 * 4).order(ByteOrder.nativeOrder()); for (int y = 0; y < 224; y++) { for (int x = 0; x < 224; x++) { int px = bitmap.getPixel(x, y); // Get channel values from the pixel value. int r = Color.red(px); int g = Color.green(px); int b = Color.blue(px); // Normalize channel values to [-1.0, 1.0]. This requirement depends // on the model. For example, some models might require values to be // normalized to the range [0.0, 1.0] instead. float rf = (r - 127) / 255.0f; float gf = (g - 127) / 255.0f; float bf = (b - 127) / 255.0f; input.putFloat(rf); input.putFloat(gf); input.putFloat(bf); } }
Weisen Sie dann einen
ByteBuffer
zu, der groß genug ist, um die Ausgabe des Modells aufzunehmen, und übergeben Sie den Eingabepuffer und den Ausgabepuffer an dierun()
Methode des TensorFlow Lite-Interpreters. Zum Beispiel für eine Ausgabeform von[1 1000]
Gleitkommawerten:Kotlin+KTX
val bufferSize = 1000 * java.lang.Float.SIZE / java.lang.Byte.SIZE val modelOutput = ByteBuffer.allocateDirect(bufferSize).order(ByteOrder.nativeOrder()) interpreter?.run(input, modelOutput)
Java
int bufferSize = 1000 * java.lang.Float.SIZE / java.lang.Byte.SIZE; ByteBuffer modelOutput = ByteBuffer.allocateDirect(bufferSize).order(ByteOrder.nativeOrder()); interpreter.run(input, modelOutput);
Wie Sie die Ausgabe verwenden, hängt vom verwendeten Modell ab.
Wenn Sie beispielsweise eine Klassifizierung durchführen, können Sie im nächsten Schritt die Indizes des Ergebnisses den Labels zuordnen, die sie darstellen:
Kotlin+KTX
modelOutput.rewind() val probabilities = modelOutput.asFloatBuffer() try { val reader = BufferedReader( InputStreamReader(assets.open("custom_labels.txt"))) for (i in probabilities.capacity()) { val label: String = reader.readLine() val probability = probabilities.get(i) println("$label: $probability") } } catch (e: IOException) { // File not found? }
Java
modelOutput.rewind(); FloatBuffer probabilities = modelOutput.asFloatBuffer(); try { BufferedReader reader = new BufferedReader( new InputStreamReader(getAssets().open("custom_labels.txt"))); for (int i = 0; i < probabilities.capacity(); i++) { String label = reader.readLine(); float probability = probabilities.get(i); Log.i(TAG, String.format("%s: %1.4f", label, probability)); } } catch (IOException e) { // File not found? }
Anhang: Modellsicherheit
Unabhängig davon, wie Sie Ihre TensorFlow Lite-Modelle Firebase ML zur Verfügung stellen, speichert Firebase ML sie im standardmäßigen serialisierten Protobuf-Format im lokalen Speicher.
Theoretisch bedeutet dies, dass jeder Ihr Modell kopieren kann. In der Praxis sind die meisten Modelle jedoch so anwendungsspezifisch und durch Optimierungen verschleiert, dass das Risiko ähnlich ist wie bei Wettbewerbern, die Ihren Code zerlegen und wiederverwenden. Dennoch sollten Sie sich dieses Risikos bewusst sein, bevor Sie ein benutzerdefiniertes Modell in Ihrer App verwenden.
Auf Android API Level 21 (Lollipop) und neuer wird das Modell in ein Verzeichnis heruntergeladen, das von der automatischen Sicherung ausgeschlossen ist.
Auf Android-API-Ebene 20 und älter wird das Modell in ein Verzeichnis mit dem Namen
com.google.firebase.ml.custom.models
im privaten internen App-Speicher heruntergeladen. Wenn Sie die Dateisicherung mitBackupAgent
aktiviert haben, können Sie dieses Verzeichnis ausschließen.Sofern nicht anders angegeben, sind die Inhalte dieser Seite unter der Creative Commons Attribution 4.0 License und Codebeispiele unter der Apache 2.0 License lizenziert. Weitere Informationen finden Sie in den Websiterichtlinien von Google Developers. Java ist eine eingetragene Marke von Oracle und/oder seinen Partnern.
Zuletzt aktualisiert: 2023-06-02 (UTC).
[{ "type": "thumb-down", "id": "missingTheInformationINeed", "label":"Benötigte Informationen nicht gefunden" },{ "type": "thumb-down", "id": "tooComplicatedTooManySteps", "label":"Zu umständlich/zu viele Schritte" },{ "type": "thumb-down", "id": "outOfDate", "label":"Nicht mehr aktuell" },{ "type": "thumb-down", "id": "translationIssue", "label":"Problem mit der Übersetzung" },{ "type": "thumb-down", "id": "samplesCodeIssue", "label":"Problem mit Beispielen/Code" },{ "type": "thumb-down", "id": "otherDown", "label":"Sonstiges" }] [{ "type": "thumb-up", "id": "easyToUnderstand", "label":"Leicht verständlich" },{ "type": "thumb-up", "id": "solvedMyProblem", "label":"Mein Problem wurde gelöst" },{ "type": "thumb-up", "id": "otherUp", "label":"Sonstiges" }] - Deklarieren Sie im Manifest Ihrer App, dass eine INTERNET-Berechtigung erforderlich ist: