TensorFlow Lite nei servizi di Google Play

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à:

  1. 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'
    
  2. Inizializza il delegato GPU con setEnableGpuDelegateSupport . Ad esempio, puoi inizializzare il delegato GPU per TfLiteVision con quanto segue:

    Kotlin

        TfLiteVision.initialize(context, TfLiteInitializationOptions.builder().setEnableGpuDelegateSupport(true).build())
        

    Giava

        TfLiteVision.initialize(context, TfLiteInitializationOptions.builder().setEnableGpuDelegateSupport(true).build());
        
  3. Abilita l'opzione del delegato GPU con BaseOptions :

    Kotlin

        val baseOptions = BaseOptions.builder().useGpu().build()
        

    Giava

        BaseOptions baseOptions = BaseOptions.builder().useGpu().build();
        
  4. Configura le opzioni usando .setBaseOptions . Ad esempio, puoi configurare la GPU in ObjectDetector 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:

  1. 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'
    
  2. 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());
        
  3. Imposta il delegato GPU nelle opzioni dell'interprete per utilizzare DelegateFactory chiamando addDelegateFactory() all'interno di InterpreterApi.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:

  1. Esamina la sezione Limitazioni di questa pagina per assicurarti che il tuo caso d'uso sia supportato.
  2. 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.
  3. 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.
  4. 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 .
  5. Aggiungi import org.tensorflow.lite.InterpreterApi; e import org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime; a qualsiasi file di origine utilizzando le classi org.tensorflow.lite.Interpreter o org.tensorflow.lite.InterpreterApi .
  6. Se una qualsiasi delle chiamate risultanti a InterpreterApi.create() ha un solo argomento, aggiungere new InterpreterApi.Options() all'elenco degli argomenti.
  7. Aggiungi .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY) all'ultimo argomento di qualsiasi chiamata a InterpreterApi.create() .
  8. Sostituisci tutte le altre occorrenze della classe org.tensorflow.lite.Interpreter con org.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 .