Mithilfe von LiteRT-Metadaten können Entwickler um die Integration unter Android zu aktivieren. Für die meisten Entwickler Die grafische Benutzeroberfläche der Android Studio ML Model Binding die am einfachsten zu verwenden sind. Wenn Sie weitere Anpassungen benötigen oder die Befehlszeile verwenden LiteRT Codegen ist ebenfalls verfügbar.
Android Studio-ML-Modellbindung verwenden
Bei mit Metadaten verbesserten LiteRT-Modellen:
Entwickler können mithilfe der ML-Modellbindung von Android Studio die automatische Konfiguration
Einstellungen für das Projekt festlegen und Wrapper-Klassen basierend auf dem Modell generieren
Metadaten. Dank des Wrapper-Codes ist keine direkte Interaktion mit
ByteBuffer
Stattdessen können Entwickelnde mit dem LiteRT-Modell interagieren.
mit typisierten Objekten wie Bitmap
und Rect
.
LiteRT-Modell in Android Studio importieren
Klicken Sie mit der rechten Maustaste auf das Modul, in dem Sie das TFLite-Modell verwenden möchten, oder klicken Sie auf
File
, dannNew
>Other
>LiteRT Model
Wählen Sie den Speicherort Ihrer TFLite-Datei aus. Beachten Sie, dass das Tool die Abhängigkeit des Moduls für Sie mit ML-Modellbindung und automatisch in das Modul Ihres Android-Moduls
build.gradle
-Datei.Optional: Klicken Sie das zweite Kästchen zum Importieren von TensorFlow-GPU an, wenn Sie die GPU-Beschleunigung nutzen möchten.
Klicken Sie auf
Finish
.Nach Abschluss des Imports wird der folgende Bildschirm angezeigt. Zu Beginn Wählen Sie mithilfe des Modells Kotlin oder Java aus, kopieren Sie den Code und fügen Sie ihn
Sample Code
Abschnitt. Du kehrst zu diesem Bildschirm zurück, indem du doppelt Das TFLite-Modell im Verzeichnisml
in Android Studio.
Modellinferenz beschleunigen
ML-Modellbindung bietet Entwicklern die Möglichkeit, ihren Code durch die Verwendung von Bevollmächtigten und die Anzahl der Threads.
Schritt 1: Prüfen Sie, ob die Datei build.gradle
des Moduls Folgendes enthält:
Abhängigkeit:
dependencies {
...
// TFLite GPU delegate 2.3.0 or above is required.
implementation 'com.google.ai.edge.litert:litert-gpu:2.3.0'
}
Schritt 2: Erkennen, ob die auf dem Gerät ausgeführte GPU mit der TensorFlow-GPU kompatibel ist delegieren, wenn das Modell nicht mit mehreren CPU-Threads ausgeführt wird:
Kotlin
import org.tensorflow.lite.gpu.CompatibilityList import org.tensorflow.lite.gpu.GpuDelegate val compatList = CompatibilityList() val options = if(compatList.isDelegateSupportedOnThisDevice) { // if the device has a supported GPU, add the GPU delegate Model.Options.Builder().setDevice(Model.Device.GPU).build() } else { // if the GPU is not supported, run on 4 threads Model.Options.Builder().setNumThreads(4).build() } // Initialize the model as usual feeding in the options object val myModel = MyModel.newInstance(context, options) // Run inference per sample code
Java
import org.tensorflow.lite.support.model.Model import org.tensorflow.lite.gpu.CompatibilityList; import org.tensorflow.lite.gpu.GpuDelegate; // Initialize interpreter with GPU delegate Model.Options options; CompatibilityList compatList = CompatibilityList(); if(compatList.isDelegateSupportedOnThisDevice()){ // if the device has a supported GPU, add the GPU delegate options = Model.Options.Builder().setDevice(Model.Device.GPU).build(); } else { // if the GPU is not supported, run on 4 threads options = Model.Options.Builder().setNumThreads(4).build(); } MyModel myModel = new MyModel.newInstance(context, options); // Run inference per sample code
Modellschnittstellen mit LiteRT-Codegenerator generieren
Für ein um Metadaten optimiertes LiteRT-Modell:
können Entwickler mit dem Android-Wrapper-Code-Generator LiteRT
plattformspezifischen Wrapper-Code. Dank des Wrapper-Codes ist keine Interaktion erforderlich
direkt mit ByteBuffer
. Stattdessen können Entwickelnde
mit dem TensorFlow-Format interagieren,
Lite-Modell mit typisierten Objekten wie Bitmap
und Rect
.
Die Nützlichkeit des Codegenerators hängt von der Vollständigkeit der
Metadateneintrag des LiteRT-Modells. Weitere Informationen finden Sie im Abschnitt „<Codegen usage>
“.
in den relevanten Feldern
metadata_schema.fbs
um zu sehen, wie das Codegen-Tool jedes Feld parst.
Wrapper-Code generieren
Sie müssen die folgenden Tools in Ihrem Terminal installieren:
pip install tflite-support
Anschließend kann der Codegenerator mit der folgenden Syntax verwendet werden:
tflite_codegen --model=./model_with_metadata/mobilenet_v1_0.75_160_quantized.tflite \
--package_name=org.tensorflow.lite.classify \
--model_class_name=MyClassifierModel \
--destination=./classify_wrapper
Der resultierende Code befindet sich im Zielverzeichnis. Wenn Sie mit Google Colab oder einer anderen Remote-App ist es vielleicht einfacher, das Ergebnis als ZIP-Datei zu komprimieren an Ihr Android Studio-Projekt an:
# Zip up the generated code
!zip -r classify_wrapper.zip classify_wrapper/
# Download the archive
from google.colab import files
files.download('classify_wrapper.zip')
Generierten Code verwenden
Schritt 1: Generierten Code importieren
Entpacken Sie den generierten Code gegebenenfalls in einer Verzeichnisstruktur. Die Wurzel von
Es wird davon ausgegangen, dass der generierte Code SRC_ROOT
ist.
Öffnen Sie das Android Studio-Projekt, in dem Sie LiteRT verwenden möchten.
und importieren Sie das generierte Modul mit: And File -> Neu -> Modul importieren ->
SRC_ROOT
auswählen
Im obigen Beispiel würden das importierte Verzeichnis und das importierte Modul
classify_wrapper
Schritt 2: build.gradle
-Datei der App aktualisieren
Führen Sie im App-Modul, das das generierte Bibliotheksmodul verwendet, folgende Schritte aus:
Fügen Sie im Bereich „Android“ Folgendes hinzu:
aaptOptions {
noCompress "tflite"
}
Fügen Sie im Abschnitt „Abhängigkeiten“ Folgendes hinzu:
implementation project(":classify_wrapper")
Schritt 3: Modell verwenden
// 1. Initialize the model
MyClassifierModel myImageClassifier = null;
try {
myImageClassifier = new MyClassifierModel(this);
} catch (IOException io){
// Error reading the model
}
if(null != myImageClassifier) {
// 2. Set the input with a Bitmap called inputBitmap
MyClassifierModel.Inputs inputs = myImageClassifier.createInputs();
inputs.loadImage(inputBitmap));
// 3. Run the model
MyClassifierModel.Outputs outputs = myImageClassifier.run(inputs);
// 4. Retrieve the result
Map<String, Float> labeledProbability = outputs.getProbability();
}
Modellinferenz beschleunigen
Der generierte Code bietet Entwicklern die Möglichkeit, ihren Code zu beschleunigen. durch die Nutzung von Bevollmächtigten und die Anzahl der Threads. Diese können beim Initialisieren des Modellobjekts festgelegt werden, Parameter:
Context
: Kontext aus der Android-Aktivität oder dem Android-Dienst- (Optional)
Device
: TFLite-Beschleunigungsdelegat. Hier einige Beispiele: GPUDelegate - (Optional)
numThreads
: Anzahl der Threads, die zum Ausführen des Modells verwendet werden – ist „1“.
Um beispielsweise einen GPU-Delegaten und bis zu drei Threads zu verwenden, können Sie wie folgt aussehen:
try {
myImageClassifier = new MyClassifierModel(this, Model.Device.GPU, 3);
} catch (IOException io){
// Error reading the model
}
Fehlerbehebung
Wenn der Fehler „java.io.FileNotFoundException: This file can not be open as a file deskriptor; wahrscheinlich komprimiert.“ Fehler, fügen Sie folgende Zeilen ein: im Android-Abschnitt des App-Moduls, das das Library-Modul verwendet:
aaptOptions {
noCompress "tflite"
}