Riconosci i fiori con TensorFlow Lite su Android

1. Introduzione

657431be3173fa86.png android.png

Nota: questo codelab richiede un dispositivo fisico per il test

TensorFlow è un framework di machine learning multiuso. TensorFlow può essere utilizzato ovunque, dall'addestramento di modelli enormi in cluster nel cloud all'esecuzione di modelli in locale su un sistema incorporato come lo smartphone.

Questo codelab utilizza TensorFlow Lite per eseguire un modello di riconoscimento di immagini su un dispositivo Android.

Installa Android Studio 4.1 o versioni successive

Se non è già installato, scarica e installa Android Studio 4.1 o versioni successive mentre addestri il modello TensorFlow Lite.

Obiettivi didattici

  • Come addestrare il tuo classificatore di immagini personalizzato utilizzando TensorFlow Lite Model Maker.
  • Come utilizzare Android Studio per importare il modello TensorFlow Lite per integrare il modello personalizzato in un'app per Android utilizzando CameraX.
  • Come utilizzare la GPU sullo smartphone per accelerare il modello.

Cosa creerai

Una semplice app fotocamera che esegue un programma di riconoscimento delle immagini TensorFlow per identificare i fiori.

f11c2821f2c8311d.png

Licenza: Utilizzo senza costi

2. Addestra un sistema di riconoscimento dei fiori utilizzando Colab

Prima di avviare l'addestramento del modello, inizia a scaricare e installare Android Studio 4.1 o versioni successive.

Apri Colab, che mostra come addestrare un classificatore con Keras per riconoscere i fiori utilizzando il trasferimento di apprendimento di TensorFlow Lite.

3. Configurare la directory di lavoro

Clona il repository Git

Il seguente comando clonerà il repository Git contenente i file necessari per questo codelab:

git clone https://github.com/hoitab/TFLClassify.git

Poi, vai alla directory in cui hai appena clonato il repository. Qui lavorerai per il resto di questo codelab:

cd TFLClassify

4. Configurare l'app scheletro Android

android.png

Installa Android Studio 4.1 o versioni successive

Se non l'hai ancora installato, vai a installare Android Studio 4.1 o versioni successive.

Apri il progetto con Android Studio

Apri un progetto con Android Studio seguendo questi passaggi:

  1. Apri Android Studio 7f2480ded53a193b.png. Una volta caricato, seleziona "Apri un progetto esistente" da questo popup:

f3b8bea7e3b39376.png

  1. Nel selettore di file, scegli TFLClassify/build.gradle dalla directory di lavoro.
  1. La prima volta che apri il progetto, viene visualizzato un popup "Gradle Sync" che ti chiede se vuoi utilizzare Gradle Wrapper. Fai clic su "OK".

d68b4d7189e6c1e4.png

  1. Attiva la modalità sviluppatore e il debug USB sullo smartphone, se non l'hai ancora fatto. Si tratta di una configurazione una tantum. Segui queste istruzioni.
  2. Una volta che il progetto e lo smartphone sono pronti, puoi eseguirlo su un dispositivo reale selezionando TFL_Classify.start e premendo il pulsante di esecuzione 86934b7b01ad7565.png sulla barra degli strumenti:

60a77ef126c1373d.png

  1. Ora consenti alla demo di TensorFlow di accedere alla tua videocamera:

b63cba02bb36b7e3.png

  1. Sul tuo smartphone vedrai la seguente schermata con numeri casuali al posto dei risultati reali.

82c603596afa35f1.png

5. Aggiungere TensorFlow Lite all'app Android

  1. Seleziona il modulo start in Esplora progetti a sinistra:

cede7f2b8b23c1a7.png

  1. Fai clic con il tasto destro del mouse sul modulo start o fai clic su File, quindi New > Other > TensorFlow Lite Model.

bf243d9fdd27e20a.png

  1. Seleziona la posizione del modello in cui hai scaricato FlowerModel.tflite con addestramento personalizzato in precedenza.

cfee18cc6674a408.png

  1. Fai clic su Finish.
  2. Alla fine vedrai quanto segue. FlowerModel.tflite viene importato correttamente e mostra le informazioni di alto livello sul modello, inclusi input / output e alcuni codici di esempio per iniziare.

82840065f0d59def.png

6. (Facoltativo) Controllare l'elenco di tutte le cose da fare

L'elenco delle cose da fare semplifica la navigazione fino alla posizione esatta in cui devi aggiornare il codelab. Puoi anche utilizzarlo nel tuo progetto Android per ricordarti il lavoro futuro. Puoi aggiungere elementi dell'elenco delle cose da fare utilizzando i commenti del codice e digitando la parola chiave TODO. Per accedere all'elenco delle cose da fare, puoi:

  1. Un ottimo modo per vedere cosa faremo è consultare l'elenco delle cose da fare. Per farlo, seleziona dalla barra dei menu in alto View > Tool Windows > TODO.

5de29b413574f25c.png

  1. Per impostazione predefinita, elenca tutti i TODO in tutti i moduli, il che lo rende un po' confuso. Possiamo ordinare solo i TO DO iniziali facendo clic sul pulsante Raggruppa per sul lato del riquadro TO DO e scegliendo Modules

5d8fe7b102340208.png

  1. Espandi tutti gli elementi nei moduli iniziali:

8d0f14a039995b20.png

7. Esegui il modello personalizzato con TensorFlow Lite

  1. Fai clic su TODO 1 nell'elenco TODO o apri il file MainActivity.kt e individua TODO 1, inizializza il modello aggiungendo questa riga:
private class ImageAnalyzer(ctx: Context, private val listener: RecognitionListener) :
        ImageAnalysis.Analyzer {

  ...
  // TODO 1: Add class variable TensorFlow Lite Model
  private val flowerModel = FlowerModel.newInstance(ctx)

  ...
}
  1. All'interno del metodo di analisi per CameraX Analyzer, dobbiamo convertire l'input della videocamera ImageProxy in un Bitmap e creare un oggetto TensorImage per il processo di inferenza.
override fun analyze(imageProxy: ImageProxy) {
  ...
  // TODO 2: Convert Image to Bitmap then to TensorImage
  val tfImage = TensorImage.fromBitmap(toBitmap(imageProxy))
  ...
}

  1. Elabora l'immagine ed esegui le seguenti operazioni sul risultato:
  • Ordina i risultati in ordine decrescente in base alla probabilità nell'attributo score, partendo dalla probabilità più alta.
  • Prendi i primi k risultati definiti dalla costante MAX_RESULT_DISPLAY. Se vuoi, puoi variare il valore di questa variabile per ottenere più o meno risultati.
override fun analyze(imageProxy: ImageProxy) {
  ...
  // TODO 3: Process the image using the trained model, sort and pick out the top results
  val outputs = flowerModel.process(tfImage)
      .probabilityAsCategoryList.apply {
          sortByDescending { it.score } // Sort with highest confidence first
      }.take(MAX_RESULT_DISPLAY) // take the top results

  ...
}
  1. Converti i risultati ordinati e filtrati in oggetti dati Recognition pronti per essere utilizzati da RecyclerView tramite il data binding:
override fun analyze(imageProxy: ImageProxy) {
  ...
  // TODO 4: Converting the top probability items into a list of recognitions
  for (output in outputs) {
      items.add(Recognition(output.label, output.score))
  }
  ...
}
  1. Commenta o elimina le seguenti righe che aiutano a generare i risultati falsi che abbiamo visto in precedenza:
// START - Placeholder code at the start of the codelab. Comment this block of code out.
for (i in 0..MAX_RESULT_DISPLAY-1){
    items.add(Recognition("Fake label $i", Random.nextFloat()))
}
// END - Placeholder code at the start of the codelab. Comment this block of code out.
  1. Esegui l'app su un dispositivo reale selezionando TFL_Classify.start e premi il pulsante di esecuzione 86934b7b01ad7565.png sulla barra degli strumenti:

60a77ef126c1373d.png

  1. Sul tuo smartphone vedrai la seguente schermata con numeri casuali al posto dei risultati reali:

f11c2821f2c8311d.png

8. (Facoltativo) Accelera l'inferenza con il delegato GPU

TensorFlow Lite supporta diversi acceleratori hardware per velocizzare l'inferenza sul tuo dispositivo mobile. La GPU è uno degli acceleratori che TensorFlow Lite può sfruttare tramite un meccanismo di delega ed è abbastanza facile da usare.

  1. Apri build.gradle nel modulo start oppure fai clic su TODO 5 nell'elenco TODO e aggiungi la seguente dipendenza:
// TODO 5: Optional GPU Delegates    
implementation 'org.tensorflow:tensorflow-lite-gpu:2.3.0'
  1. Torna al file MainActivity.kt o fai clic su TODO 6 nell'elenco TODO. Sostituisci l'inizializzazione semplice di flowerModel con quanto segue: recupera un'istanza dell'elenco di compatibilità delle GPU e inizializza la GPU a seconda che sia una delle GPU compatibili elencate. In caso contrario, avvia 4 thread della CPU per eseguire il modello:
private class ImageAnalyzer(ctx: Context, private val listener: RecognitionListener) :
        ImageAnalysis.Analyzer {
  ...

  // TODO 1: Add class variable TensorFlow Lite Model
  // Initializing the flowerModel by lazy so that it runs in the same thread when the process
  // method is called.
  private val flowerModel: FlowerModel by lazy{

    // TODO 6. Optional GPU acceleration
    val compatList = CompatibilityList()

    val options = if(compatList.isDelegateSupportedOnThisDevice){
        Log.d(TAG, "This device is GPU Compatible ")
        Model.Options.Builder().setDevice(Model.Device.GPU).build()
    } else {
        Log.d(TAG, "This device is GPU Incompatible ")
        Model.Options.Builder().setNumThreads(4).build()
    }

  ...
}
  1. Modifica l'inizializzatore del modello per utilizzarlo aggiungendo options all'input del metodo:
private class ImageAnalyzer(ctx: Context, private val listener: RecognitionListener) :
        ImageAnalysis.Analyzer {

  private val flowerModel: FlowerModel by lazy{

    ...

    // Initialize the Flower Model
    FlowerModel.newInstance(ctx, options)
  }
}

  1. Esegui l'app su un dispositivo reale selezionando TFL_Classify.start e premi il pulsante di esecuzione 86934b7b01ad7565.png sulla barra degli strumenti:

60a77ef126c1373d.png

9. Passaggi successivi

Ecco alcuni link per saperne di più: