Utilizzando LiteRT Metadata, gli sviluppatori possono generare codice wrapper per abilitare l'integrazione su Android. Per la maggior parte degli sviluppatori, l'interfaccia grafica di Android Studio ML Model Binding è la più facile da usare. Se hai bisogno di una maggiore personalizzazione o utilizzi strumenti a riga di comando, è disponibile anche LiteRT Codegen.
Utilizzare il binding del modello ML di Android Studio
Per i modelli LiteRT migliorati con i metadati, gli sviluppatori possono utilizzare Android Studio ML Model Binding per configurare automaticamente le impostazioni del progetto e generare classi wrapper in base ai metadati del modello. Il codice wrapper elimina
la necessità di interagire direttamente con ByteBuffer. Gli sviluppatori possono invece interagire con il modello LiteRT con oggetti tipizzati come Bitmap e Rect.
Importare un modello LiteRT in Android Studio
Fai clic con il tasto destro del mouse sul modulo in cui vuoi utilizzare il modello TFLite o fai clic su
File, poi suNew>Other>LiteRT Model.Seleziona la posizione del file TFLite. Tieni presente che gli strumenti configureranno la dipendenza del modulo per tuo conto con il binding del modello ML e tutte le dipendenze verranno inserite automaticamente nel file
build.gradledel modulo Android.(Facoltativo) Seleziona la seconda casella di controllo per importare TensorFlow GPU se vuoi utilizzare l'accelerazione GPU.
Fai clic su
Finish.Dopo l'importazione, viene visualizzata la seguente schermata. Per iniziare a utilizzare il modello, seleziona Kotlin o Java, copia e incolla il codice nella sezione
Sample Code. Puoi tornare a questa schermata facendo doppio clic sul modello TFLite nella directorymldi Android Studio.
Accelerare l'inferenza del modello
Il binding del modello ML consente agli sviluppatori di accelerare il codice tramite l'utilizzo di delegati e del numero di thread.
Passaggio 1: Controlla il file del modulo build.gradle per verificare che contenga la seguente
dipendenza:
dependencies {
...
// For the LiteRT GPU delegate, we need
// 'com.google.ai.edge.litert:litert-gpu' version 1.*.
implementation 'com.google.ai.edge.litert:litert-gpu:1.4.1'
}
Passaggio 2: Rileva se la GPU in esecuzione sul dispositivo è compatibile con il delegato GPU TensorFlow, in caso contrario esegui il modello utilizzando più thread della CPU:
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
Generare interfacce del modello con il generatore di codice LiteRT
Per il modello LiteRT migliorato con metadati,
gli sviluppatori possono utilizzare il generatore di codice wrapper Android LiteRT per creare codice wrapper specifico per la piattaforma. Il codice wrapper elimina la necessità di interagire direttamente
con ByteBuffer. Gli sviluppatori possono invece interagire con il modello TensorFlow Lite
con oggetti tipizzati come Bitmap e Rect.
L'utilità del generatore di codice dipende dalla completezza della voce di metadati del modello LiteRT. Consulta la sezione <Codegen usage> nei campi pertinenti di
metadata_schema.fbs
per scoprire come lo strumento di generazione del codice analizza ogni campo.
Genera codice wrapper
Dovrai installare i seguenti strumenti nel terminale:
pip install tflite-support
Una volta completato, il generatore di codici può essere utilizzato con la seguente sintassi:
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
Il codice risultante si troverà nella directory di destinazione. Se utilizzi Google Colab o un altro ambiente remoto, potrebbe essere più facile comprimere il risultato in un archivio zip e scaricarlo nel progetto Android Studio:
# 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')
Utilizzo del codice generato
Passaggio 1: importa il codice generato
Decomprimi il codice generato, se necessario, in una struttura di directory. La radice del
codice generato è SRC_ROOT.
Apri il progetto Android Studio in cui vuoi utilizzare il modello LiteRT e
importa il modulo generato tramite File -> Nuovo -> Importa modulo -> seleziona
SRC_ROOT
Utilizzando l'esempio precedente, la directory e il modulo importato verranno chiamati
classify_wrapper.
Passaggio 2: aggiorna il file build.gradle dell'app
Nel modulo dell'app che utilizzerà il modulo della libreria generato:
Nella sezione Android, aggiungi quanto segue:
aaptOptions {
noCompress "tflite"
}
Nella sezione delle dipendenze, aggiungi quanto segue:
implementation project(":classify_wrapper")
Passaggio 3: utilizza il modello
// 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();
}
Accelerare l'inferenza del modello
Il codice generato offre agli sviluppatori un modo per accelerare il codice tramite l'utilizzo di delegati e del numero di thread. Questi possono essere impostati durante l'inizializzazione dell'oggetto modello, poiché richiede tre parametri:
Context: contesto dell'attività o del servizio Android- (Facoltativo)
Device: delegato di accelerazione TFLite. Ad esempio: GPUDelegate - (Facoltativo)
numThreads: numero di thread utilizzati per eseguire il modello. Il valore predefinito è 1.
Ad esempio, per utilizzare un delegato GPU e fino a tre thread, puoi inizializzare il modello nel seguente modo:
try {
myImageClassifier = new MyClassifierModel(this, Model.Device.GPU, 3);
} catch (IOException io){
// Error reading the model
}
Risoluzione dei problemi
Se viene visualizzato l'errore "java.io.FileNotFoundException: This file can not be opened as a file descriptor; it is probably compressed", inserisci le seguenti righe nella sezione android del modulo dell'app che utilizzerà il modulo della libreria:
aaptOptions {
noCompress "tflite"
}