Auf TensorFlow Lite in Google Play-Diensten kann neben der nativen API auch über Java APIs zugegriffen werden. Insbesondere ist TensorFlow Lite in Google Play-Diensten über die TensorFlow Lite Interpreter API verfügbar.
Interpreter APIs verwenden
Die TensorFlow Lite Interpreter API, die von der TensorFlow-Laufzeit bereitgestellt wird, bietet eine universelle Schnittstelle zum Erstellen und Ausführen von ML-Modellen. Führen Sie die folgenden Schritte aus, um Inferenzen mit der Interpreter API und der Laufzeit von TensorFlow Lite in den Google Play-Diensten auszuführen.
1. Projektabhängigkeiten hinzufügen
Fügen Sie dem Code Ihres App-Projekts die folgenden Abhängigkeiten hinzu, um auf die Play Services API für TensorFlow Lite zuzugreifen:
dependencies {
...
// Tensorflow Lite dependencies for Google Play services
implementation 'com.google.android.gms:play-services-tflite-java:16.0.1'
// Optional: include Tensorflow Lite Support Library
implementation 'com.google.android.gms:play-services-tflite-support:16.0.1'
...
}
2. Initialisierung von TensorFlow Lite hinzufügen
Initialisieren Sie die TensorFlow Lite-Komponente der Google Play Services API, bevor Sie die TensorFlow Lite APIs verwenden:
Kotlin
val initializeTask: Task<Void> by lazy { TfLite.initialize(this) }
Java
Task<Void> initializeTask = TfLite.initialize(context);
3. Interpreter erstellen und Laufzeitoption festlegen
Erstellen Sie mit InterpreterApi.create()
einen Interpreter und konfigurieren Sie ihn für die Verwendung der Laufzeit der Google Play-Dienste. Dazu rufen Sie InterpreterApi.Options.setRuntime()
auf, wie im folgenden Beispielcode gezeigt:
Kotlin
import org.tensorflow.lite.InterpreterApi import org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime ... private lateinit var interpreter: InterpreterApi ... initializeTask.addOnSuccessListener { val interpreterOption = InterpreterApi.Options().setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY) interpreter = InterpreterApi.create( modelBuffer, interpreterOption )} .addOnFailureListener { e -> Log.e("Interpreter", "Cannot initialize interpreter", e) }
Java
import org.tensorflow.lite.InterpreterApi import org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime ... private InterpreterApi interpreter; ... initializeTask.addOnSuccessListener(a -> { interpreter = InterpreterApi.create(modelBuffer, new InterpreterApi.Options().setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY)); }) .addOnFailureListener(e -> { Log.e("Interpreter", String.format("Cannot initialize interpreter: %s", e.getMessage())); });
Sie sollten die obige Implementierung verwenden, da dadurch der Thread der Android-Benutzeroberfläche nicht blockiert wird. Wenn Sie die Threadausführung genauer verwalten müssen, können Sie einen Tasks.await()
-Aufruf zum Erstellen von Interpretern hinzufügen:
Kotlin
import androidx.lifecycle.lifecycleScope ... lifecycleScope.launchWhenStarted { // uses coroutine initializeTask.await() }
Java
@BackgroundThread InterpreterApi initializeInterpreter() { Tasks.await(initializeTask); return InterpreterApi.create(...); }
4. Inferenzen ausführen
Rufen Sie mithilfe des von Ihnen erstellten interpreter
-Objekts die run()
-Methode auf, um eine Inferenz zu generieren.
Kotlin
interpreter.run(inputBuffer, outputBuffer)
Java
interpreter.run(inputBuffer, outputBuffer);
Hardwarebeschleunigung
TensorFlow Lite ermöglicht Ihnen, die Leistung Ihres Modells mithilfe spezieller Hardwareprozessoren wie Grafikprozessoren (GPUs) zu beschleunigen. Sie können diese speziellen Prozessoren mithilfe von Hardwaretreibern, den sogenannten Delegierten, nutzen.
Der GPU-Delegate wird über Google Play-Dienste bereitgestellt und dynamisch geladen, genau wie die Play-Dienste-Versionen der Interpreter API.
Gerätekompatibilität wird geprüft
Nicht alle Geräte unterstützen die GPU-Hardwarebeschleunigung mit TFLite. Verwenden Sie die Methode TfLiteGpu.isGpuDelegateAvailable
, um zu prüfen, ob ein Gerät mit dem GPU-Delegaten kompatibel ist, um Fehler und potenzielle Abstürze zu vermeiden.
Mit dieser Methode können Sie prüfen, ob ein Gerät mit GPU kompatibel ist, und die CPU als Fallback verwenden, wenn GPU nicht unterstützt wird.
useGpuTask = TfLiteGpu.isGpuDelegateAvailable(context)
Sobald Sie eine Variable wie useGpuTask
haben, können Sie damit bestimmen, ob Geräte den GPU-Delegaten verwenden.
Kotlin
val interpreterTask = useGpuTask.continueWith { task -> val interpreterOptions = InterpreterApi.Options() .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY) if (task.result) { interpreterOptions.addDelegateFactory(GpuDelegateFactory()) } InterpreterApi.create(FileUtil.loadMappedFile(context, MODEL_PATH), interpreterOptions) }
Java
Task<InterpreterApi.Options> interpreterOptionsTask = useGpuTask.continueWith({ task -> InterpreterApi.Options options = new InterpreterApi.Options().setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY); if (task.getResult()) { options.addDelegateFactory(new GpuDelegateFactory()); } return options; });
GPU mit Interpreter APIs
So verwenden Sie den GPU-Delegaten mit den Interpreter APIs:
Aktualisieren Sie die Projektabhängigkeiten, um den GPU-Delegaten der Play-Dienste zu verwenden:
implementation 'com.google.android.gms:play-services-tflite-gpu:16.1.0'
Aktivieren Sie die GPU-Delegate-Option in der TFlite-Initialisierung:
Kotlin
TfLite.initialize(context, TfLiteInitializationOptions.builder() .setEnableGpuDelegateSupport(true) .build())
Java
TfLite.initialize(context, TfLiteInitializationOptions.builder() .setEnableGpuDelegateSupport(true) .build());
Aktivieren Sie den GPU-Delegaten in den Interpreteroptionen: Legen Sie die Delegat-Factory auf GpuDelegateFactory fest, indem Sie
addDelegateFactory() within
InterpreterApi.Options()` aufrufen:Kotlin
val interpreterOption = InterpreterApi.Options() .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY) .addDelegateFactory(GpuDelegateFactory())
Java
Options interpreterOption = InterpreterApi.Options() .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY) .addDelegateFactory(new GpuDelegateFactory());
Von eigenständigem TensorFlow Lite migrieren
Wenn Sie Ihre App vom eigenständigen TensorFlow Lite zur Play Services API migrieren möchten, lesen Sie die folgenden zusätzlichen Hinweise zum Aktualisieren des App-Projektcodes:
- Prüfen Sie den Abschnitt Einschränkungen auf dieser Seite, um sicherzustellen, dass Ihr Anwendungsfall unterstützt wird.
- Führen Sie vor dem Aktualisieren des Codes Leistungs- und Genauigkeitsprüfungen für Ihre Modelle durch, insbesondere wenn Sie Versionen von TensorFlow Lite vor Version 2.1 verwenden. So haben Sie eine Referenz, die Sie mit der neuen Implementierung vergleichen können.
- Wenn Sie den gesamten Code zur Verwendung der Play Services API für TensorFlow Lite migriert haben, sollten Sie die vorhandenen Abhängigkeiten der Laufzeitbibliothek von TensorFlow Lite (Einträge mit
org.tensorflow:tensorflow-lite:*
) aus der Datei build.gradle entfernen, um die App-Größe zu reduzieren. - Ermitteln Sie alle Vorkommen der
new Interpreter
-Objekterstellung in Ihrem Code und ändern Sie jedes Element so, dass es den Aufruf „InterpreterApi.create()“ verwendet. Die neue Version von TfLite.initial ist asynchron, d. h., in den meisten Fällen ist es kein Drop-in-Ersatz: Sie müssen einen Listener für den Abschluss des Aufrufs registrieren. Sehen Sie sich das Code-Snippet in Schritt 3 an. - Fügen Sie allen Quelldateien mithilfe der Klassen
org.tensorflow.lite.Interpreter
oderorg.tensorflow.lite.InterpreterApi
import org.tensorflow.lite.InterpreterApi;
undimport org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime;
hinzu. - Wenn einer der resultierenden Aufrufe von
InterpreterApi.create()
nur ein einzelnes Argument hat, hängen Sienew InterpreterApi.Options()
an die Argumentliste an. - Hängen Sie
.setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY)
an das letzte Argument von Aufrufen vonInterpreterApi.create()
an. - Ersetzen Sie alle anderen Vorkommen der Klasse
org.tensorflow.lite.Interpreter
durchorg.tensorflow.lite.InterpreterApi
.
Wenn Sie das eigenständige TensorFlow Lite und die Play Services API parallel verwenden möchten, müssen Sie TensorFlow Lite 2.9 (oder höher) verwenden. TensorFlow Lite 2.8 und frühere Versionen sind nicht mit der Version der Play Services API kompatibel.