TensorFlow Lite è disponibile nel runtime dei servizi Google Play per tutti i dispositivi Android che eseguono la versione corrente dei servizi Play. Questo runtime ti consente di eseguire modelli di machine learning (ML) senza raggruppare staticamente le librerie TensorFlow Lite nella tua app.
Con l'API dei servizi di Google Play puoi ridurre le dimensioni delle tue app e ottenere prestazioni migliori dall'ultima versione stabile delle librerie. TensorFlow Lite nei servizi Google Play è il modo consigliato per utilizzare TensorFlow Lite su Android.
Puoi iniziare con il runtime dei servizi di riproduzione con Quickstart , che fornisce una guida dettagliata per implementare un'applicazione di esempio. Se stai già utilizzando TensorFlow Lite autonomo nella tua app, fai riferimento alla sezione Migrazione da TensorFlow Lite autonomo per aggiornare un'app esistente per utilizzare il runtime dei servizi di riproduzione. Per ulteriori informazioni sui servizi di Google Play, visitare il sito Web dei servizi di Google Play .
Utilizzo del runtime dei servizi di riproduzione
TensorFlow Lite nei servizi Google Play è disponibile tramite TensorFlow Lite Task API e TensorFlow Lite Interpreter API . La Libreria attività fornisce interfacce modello predefinite ottimizzate per attività di apprendimento automatico comuni utilizzando dati visivi, audio e di testo. L'API dell'interprete TensorFlow Lite, fornita dal runtime TensorFlow e dalle librerie di supporto, fornisce un'interfaccia più generica per la creazione e l'esecuzione di modelli ML.
Le sezioni seguenti forniscono istruzioni su come implementare le API Interprete e Libreria attività nei servizi di Google Play. Sebbene sia possibile per un'app utilizzare sia le API dell'interprete che le API della libreria delle attività, la maggior parte delle app dovrebbe utilizzare solo un set di API.
Utilizzo delle API della libreria delle attività
L'API Task TensorFlow Lite racchiude l'API Interpreter e fornisce un'interfaccia di programmazione di alto livello per attività di machine learning comuni che utilizzano dati visivi, audio e di testo. È necessario utilizzare l'API delle attività se l'applicazione richiede una delle attività supportate .
1. Aggiungi le dipendenze del progetto
La dipendenza dal tuo progetto dipende dal tuo caso d'uso di machine learning. Le API delle attività contengono le seguenti librerie:
- Libreria di visione:
org.tensorflow:tensorflow-lite-task-vision-play-services
- Libreria audio:
org.tensorflow:tensorflow-lite-task-audio-play-services
- Libreria di testo:
org.tensorflow:tensorflow-lite-task-text-play-services
Aggiungi una delle dipendenze al codice del progetto dell'app per accedere all'API dei servizi di riproduzione per TensorFlow Lite. Ad esempio, utilizzare quanto segue per implementare un'attività di visione:
dependencies {
...
implementation 'org.tensorflow:tensorflow-lite-task-vision-play-services:0.4.2'
...
}
2. Aggiungere l'inizializzazione di TensorFlow Lite
Inizializzare il componente TensorFlow Lite dell'API dei servizi di Google Play prima di utilizzare le API TensorFlow Lite. L'esempio seguente inizializza la libreria di visione:
Kotlin
init { TfLiteVision.initialize(context) } }
3. Esegui inferenze
Dopo aver inizializzato il componente TensorFlow Lite, chiamare il metodo detect()
per generare inferenze. Il codice esatto all'interno del metodo detect()
varia a seconda della libreria e del caso d'uso. Quanto segue è per un semplice caso d'uso di rilevamento di oggetti con la libreria TfLiteVision
:
Kotlin
fun detect(...) { if (!TfLiteVision.isInitialized()) { Log.e(TAG, "detect: TfLiteVision is not initialized yet") return } if (objectDetector == null) { setupObjectDetector() } ... }
A seconda del formato dei dati, potrebbe essere necessario anche preelaborare e convertire i dati all'interno del metodo detect()
prima di generare inferenze. Ad esempio, i dati dell'immagine per un rilevatore di oggetti richiedono quanto segue:
val imageProcessor = ImageProcessor.Builder().add(Rot90Op(-imageRotation / 90)).build()
val tensorImage = imageProcessor.process(TensorImage.fromBitmap(image))
val results = objectDetector?.detect(tensorImage)
Utilizzo delle API dell'interprete
Le API Interpreter offrono maggiore controllo e flessibilità rispetto alle API Task Library. È necessario utilizzare le API Interpreter se l'attività di machine learning non è supportata dalla libreria attività o se è necessaria un'interfaccia più generica per la creazione e l'esecuzione di modelli ML.
1. Aggiungi le dipendenze del progetto
Aggiungi le seguenti dipendenze al codice del progetto dell'app per accedere all'API dei servizi di riproduzione per TensorFlow Lite:
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. Aggiungere l'inizializzazione di TensorFlow Lite
Inizializza il componente TensorFlow Lite dell'API dei servizi di Google Play prima di utilizzare le API TensorFlow Lite:
Kotlin
val initializeTask: Task<Void> by lazy { TfLite.initialize(this) }
Giava
Task<Void> initializeTask = TfLite.initialize(context);
3. Creare un interprete e impostare l'opzione di runtime
Crea un interprete utilizzando InterpreterApi.create()
e configuralo per utilizzare il runtime dei servizi di Google Play, chiamando InterpreterApi.Options.setRuntime()
, come mostrato nel codice di esempio seguente:
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) }
Giava
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())); });
Dovresti usare l'implementazione sopra perché evita di bloccare il thread dell'interfaccia utente di Android. Se hai bisogno di gestire più da vicino l'esecuzione dei thread, puoi aggiungere una chiamata Tasks.await()
alla creazione dell'interprete:
Kotlin
import androidx.lifecycle.lifecycleScope ... lifecycleScope.launchWhenStarted { // uses coroutine initializeTask.await() }
Giava
@BackgroundThread InterpreterApi initializeInterpreter() { Tasks.await(initializeTask); return InterpreterApi.create(...); }
4. Esegui inferenze
Usando l'oggetto interpreter
che hai creato, chiama il metodo run()
per generare un'inferenza.
Kotlin
interpreter.run(inputBuffer, outputBuffer)
Giava
interpreter.run(inputBuffer, outputBuffer);
Accelerazione hardware
TensorFlow Lite consente di accelerare le prestazioni del modello utilizzando processori hardware specializzati, come le unità di elaborazione grafica (GPU). È possibile sfruttare questi processori specializzati utilizzando driver hardware chiamati delegati . Puoi utilizzare i seguenti delegati di accelerazione hardware con TensorFlow Lite nei servizi di Google Play:
Delegato GPU (consigliato) : questo delegato viene fornito tramite i servizi di Google Play e viene caricato dinamicamente, proprio come le versioni dei servizi di riproduzione dell'API delle attività e dell'API interprete.
Delegato NNAPI : questo delegato è disponibile come dipendenza dalla libreria inclusa nel progetto di sviluppo Android ed è incluso nell'app.
Per ulteriori informazioni sull'accelerazione hardware con TensorFlow Lite, vedere la pagina dei delegati di TensorFlow Lite .
Verifica della compatibilità del dispositivo
Non tutti i dispositivi supportano l'accelerazione hardware GPU con TFLite. Per mitigare errori e potenziali arresti anomali, usa il metodo TfLiteGpu.isGpuDelegateAvailable
per verificare se un dispositivo è compatibile con il delegato GPU.
Utilizzare questo metodo per confermare se un dispositivo è compatibile con la GPU e utilizzare la CPU o il delegato NNAPI come fallback quando la GPU non è supportata.
useGpuTask = TfLiteGpu.isGpuDelegateAvailable(context)
Una volta che hai una variabile come useGpuTask
, puoi usarla per determinare se i dispositivi usano il delegato GPU. Gli esempi seguenti mostrano come eseguire questa operazione sia con la Libreria attività che con le API Interpreter.
Con il compito API
Kotlin
lateinit val optionsTask = useGpuTask.continueWith { task -> val baseOptionsBuilder = BaseOptions.builder() if (task.result) { baseOptionsBuilder.useGpu() } ObjectDetectorOptions.builder() .setBaseOptions(baseOptionsBuilder.build()) .setMaxResults(1) .build() }
Giava
Task<ObjectDetectorOptions> optionsTask = useGpuTask.continueWith({ task -> BaseOptions baseOptionsBuilder = BaseOptions.builder(); if (task.getResult()) { baseOptionsBuilder.useGpu(); } return ObjectDetectorOptions.builder() .setBaseOptions(baseOptionsBuilder.build()) .setMaxResults(1) .build() });
Con l'interprete Api
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) }
Giava
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 con API Task Library
Per utilizzare il delegato GPU con le API delle attività:
Aggiorna le dipendenze del progetto per utilizzare il delegato GPU dai servizi di riproduzione:
implementation 'com.google.android.gms:play-services-tflite-gpu:16.1.0'
Inizializza il delegato GPU con
setEnableGpuDelegateSupport
. Ad esempio, puoi inizializzare il delegato GPU perTfLiteVision
con quanto segue:Kotlin
TfLiteVision.initialize(context, TfLiteInitializationOptions.builder().setEnableGpuDelegateSupport(true).build())
Giava
TfLiteVision.initialize(context, TfLiteInitializationOptions.builder().setEnableGpuDelegateSupport(true).build());
Abilita l'opzione del delegato GPU con
BaseOptions
:Kotlin
val baseOptions = BaseOptions.builder().useGpu().build()
Giava
BaseOptions baseOptions = BaseOptions.builder().useGpu().build();
Configura le opzioni usando
.setBaseOptions
. Ad esempio, puoi configurare la GPU inObjectDetector
con quanto segue:Kotlin
val options = ObjectDetectorOptions.builder() .setBaseOptions(baseOptions) .setMaxResults(1) .build()
Giava
ObjectDetectorOptions options = ObjectDetectorOptions.builder() .setBaseOptions(baseOptions) .setMaxResults(1) .build();
GPU con API interprete
Per utilizzare il delegato GPU con le API interprete:
Aggiorna le dipendenze del progetto per utilizzare il delegato GPU dai servizi di riproduzione:
implementation 'com.google.android.gms:play-services-tflite-gpu:16.1.0'
Abilita l'opzione del delegato GPU nell'inizializzazione di TFlite:
Kotlin
TfLite.initialize(context, TfLiteInitializationOptions.builder() .setEnableGpuDelegateSupport(true) .build())
Giava
TfLite.initialize(context, TfLiteInitializationOptions.builder() .setEnableGpuDelegateSupport(true) .build());
Imposta il delegato GPU nelle opzioni dell'interprete per utilizzare
DelegateFactory
chiamandoaddDelegateFactory()
all'interno diInterpreterApi.Options()
:Kotlin
val interpreterOption = InterpreterApi.Options() .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY) .addDelegateFactory(GpuDelegateFactory())
Giava
Options interpreterOption = InterpreterApi.Options() .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY) .addDelegateFactory(new GpuDelegateFactory());
Migrazione da TensorFlow Lite autonomo
Se stai pianificando di migrare la tua app da TensorFlow Lite autonomo all'API Play Services, consulta le seguenti indicazioni aggiuntive per aggiornare il codice del tuo progetto di app:
- Esamina la sezione Limitazioni di questa pagina per assicurarti che il tuo caso d'uso sia supportato.
- Prima di aggiornare il codice, esegui controlli delle prestazioni e dell'accuratezza dei tuoi modelli, in particolare se utilizzi versioni di TensorFlow Lite precedenti alla versione 2.1, in modo da avere una base da confrontare con la nuova implementazione.
- Se hai migrato tutto il codice per utilizzare l'API dei servizi di riproduzione per TensorFlow Lite, dovresti rimuovere le dipendenze della libreria di runtime TensorFlow Lite esistente (voci con
org.tensorflow: tensorflow-lite :*
) dal tuo file build.gradle in modo da può ridurre le dimensioni dell'app. - Identifica tutte le occorrenze della creazione di un
new Interpreter
nel codice e modificalo in modo che utilizzi la chiamata InterpreterApi.create(). Questa nuova API è asincrona, il che significa che nella maggior parte dei casi non è una sostituzione drop-in ed è necessario registrare un listener per quando la chiamata viene completata. Fare riferimento allo snippet di codice nel codice del passaggio 3 . - Aggiungi
import org.tensorflow.lite.InterpreterApi;
eimport org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime;
a qualsiasi file di origine utilizzando le classiorg.tensorflow.lite.Interpreter
oorg.tensorflow.lite.InterpreterApi
. - Se una qualsiasi delle chiamate risultanti a
InterpreterApi.create()
ha un solo argomento, aggiungerenew InterpreterApi.Options()
all'elenco degli argomenti. - Aggiungi
.setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY)
all'ultimo argomento di qualsiasi chiamata aInterpreterApi.create()
. - Sostituisci tutte le altre occorrenze della classe
org.tensorflow.lite.Interpreter
conorg.tensorflow.lite.InterpreterApi
.
Se si desidera utilizzare TensorFlow Lite autonomo e l'API dei servizi di riproduzione affiancati, è necessario utilizzare TensorFlow Lite 2.9 (o versioni successive). TensorFlow Lite 2.8 e versioni precedenti non sono compatibili con la versione dell'API dei servizi di riproduzione.
Limitazioni
TensorFlow Lite nei servizi Google Play presenta le seguenti limitazioni:
- Il supporto per i delegati dell'accelerazione hardware è limitato ai delegati elencati nella sezione Accelerazione hardware . Non sono supportati altri delegati di accelerazione.
- L'accesso a TensorFlow Lite tramite API native non è supportato. Solo le API Java TensorFlow Lite sono disponibili tramite i servizi di Google Play.
- Le API TensorFlow Lite sperimentali o obsolete, incluse le operazioni personalizzate, non sono supportate.
Supporto e feedback
Puoi fornire feedback e ottenere supporto tramite TensorFlow Issue Tracker. Segnala i problemi e le richieste di supporto utilizzando il modello di problema per TensorFlow Lite nei servizi di Google Play.
Termini di servizio
L'utilizzo di TensorFlow Lite nelle API dei servizi di Google Play è soggetto ai Termini di servizio delle API di Google .
Privacy e raccolta dati
Quando utilizzi TensorFlow Lite nelle API dei servizi Google Play, l'elaborazione dei dati di input, come immagini, video, testo, avviene completamente sul dispositivo e TensorFlow Lite nelle API dei servizi Google Play non invia tali dati ai server di Google. Di conseguenza, puoi utilizzare le nostre API per elaborare i dati che non dovrebbero lasciare il dispositivo.
TensorFlow Lite nelle API dei servizi di Google Play può contattare i server di Google di tanto in tanto per ricevere cose come correzioni di bug, modelli aggiornati e informazioni sulla compatibilità dell'acceleratore hardware. TensorFlow Lite nelle API dei servizi di Google Play invia anche a Google metriche sulle prestazioni e sull'utilizzo delle API nella tua app. Google utilizza questi dati di metrica per misurare le prestazioni, eseguire il debug, mantenere e migliorare le API e rilevare l'uso improprio o l'abuso, come ulteriormente descritto nella nostra Informativa sulla privacy .
È tua responsabilità informare gli utenti della tua app sull'elaborazione da parte di Google di TensorFlow Lite nei dati delle metriche delle API dei servizi di Google Play, come richiesto dalla legge applicabile.
I dati che raccogliamo includono quanto segue:
- Informazioni sul dispositivo (come produttore, modello, versione del sistema operativo e build) e acceleratori hardware ML disponibili (GPU e DSP). Utilizzato per la diagnostica e l'analisi dell'utilizzo.
- Identificatore del dispositivo utilizzato per la diagnostica e l'analisi dell'utilizzo.
- Informazioni sull'app (nome del pacchetto, versione dell'app). Utilizzato per la diagnostica e l'analisi dell'utilizzo.
- Configurazione dell'API (ad esempio quali delegati vengono utilizzati). Utilizzato per la diagnostica e l'analisi dell'utilizzo.
- Tipo di evento (come creazione dell'interprete, inferenza). Utilizzato per la diagnostica e l'analisi dell'utilizzo.
- Codici di errore. Usato per la diagnostica.
- Metriche delle prestazioni. Usato per la diagnostica.
Prossimi passi
Per ulteriori informazioni sull'implementazione dell'apprendimento automatico nell'applicazione mobile con TensorFlow Lite, vedere la Guida per gli sviluppatori di TensorFlow Lite . È possibile trovare modelli TensorFlow Lite aggiuntivi per la classificazione delle immagini, il rilevamento di oggetti e altre applicazioni su TensorFlow Hub .