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 locale di modelli su un sistema incorporato come il tuo smartphone.

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

Installa Android Studio 4.1 o versioni successive

Se non l'hai ancora installato, scarica e installa AndroidStudio 4.1 o versioni successive durante l'addestramento del modello TensorFlow Lite.

Obiettivi didattici

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

Cosa creerai

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

f11c2821f2c8311d.png

Licenza: senza costi

2. Addestra un riconoscimento dei fiori con Colab

Prima di iniziare 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 Transfer Learning di TensorFlow Lite.

3. Configura la directory di lavoro

clona il repository Git

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

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

Quindi, vai alla directory in cui hai appena clonato il repository. Questa è la sezione su cui lavorerai per il resto del codelab:

cd TFLClassify

4. Configurare l'app Android skeleton

android.png

Installa Android Studio 4.1 o versioni successive

Se non è già installato, installa AndroidStudio 4.1 o versioni successive.

Aprire il progetto con Android Studio

Apri un progetto con Android Studio seguendo questa procedura:

  1. Apri Android Studio 7f2480ded53a193b.png. Dopo il caricamento, seleziona "Apri un progetto esistente" da questo popup:

f3b8bea7e3b39376.png

  1. Nel selettore di file, scegli TFLClassify/build.gradle dalla directory di lavoro.
  1. Riceverai un "Gradle Sync" di Google Cloud, la prima volta che si apre il progetto, in cui si chiede informazioni sull'uso del wrapper Gradle. Fai clic su "OK".

d68b4d7189e6c1e4.png

  1. Se non lo hai già fatto, attiva il modello sviluppatore e il debug USB sullo smartphone. La configurazione dovrà essere effettuata una sola volta. Segui queste istruzioni.
  2. Quando il progetto e il telefono sono pronti, puoi eseguirli su un dispositivo reale selezionando TFL_Classify.start e premendo il pulsante Esegui 86934b7b01ad7565.png sulla barra degli strumenti:

60a77ef126c1373d.png

  1. Ora consenti alla demo di TensorFlow di accedere alla fotocamera:

b63cba02bb36b7e3.png

  1. Sullo smartphone verrà visualizzata la seguente schermata, con numeri casuali che sostituiscono i risultati effettivi.

82c603596afa35f1.png

5. Aggiungi TensorFlow Lite all'app per Android

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

cede7f2b8b23c1a7.png

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

bf243d9fdd27e20a.png

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

cfee18cc6674a408.png

  1. Fai clic su Finish.
  2. Alla fine vedrai quanto segue. Il file FlowerModel.tflite è stato importato correttamente e mostra le informazioni di alto livello relative al modello, tra cui l'input / output e il codice campione per iniziare.

82840065f0d59def.png

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

L'elenco delle attività semplifica la navigazione verso la posizione esatta in cui è necessario aggiornare il codelab. Puoi utilizzarla anche nel tuo progetto Android per ricordarti i lavori futuri. Puoi aggiungere voci di attività utilizzando commenti al codice e digitare la parola chiave TODO. Per accedere all'elenco delle cose da fare, puoi:

  1. Un ottimo modo per sapere cosa faremo è dare un'occhiata all'elenco delle cose da fare. A tale scopo, seleziona View > dalla barra dei menu in alto. Tool Windows > TODO

5de29b413574f25c.png

  1. Per impostazione predefinita, sono elencate tutte le cose da fare in tutti i moduli, il che rende un po' difficile la confusione. Possiamo ordinare solo le attività iniziali facendo clic sul pulsante Raggruppa per sul lato del riquadro TODO e scegliere Modules

5d8fe7b102340208.png

  1. Espandi tutti gli elementi sotto i 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 l'analizzatore CameraX, dobbiamo convertire l'input della fotocamera 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 in ordine decrescente i risultati per probabilità sotto l'attributo score con la probabilità più alta per prima.
  • Prendi i primi k risultati come definiti dalla costante MAX_RESULT_DISPLAY. Facoltativamente, 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 di dati Recognition pronti per essere utilizzati da RecyclerView tramite associazione di dati:
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 vediamo 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 Esegui 86934b7b01ad7565.png sulla barra degli strumenti:

60a77ef126c1373d.png

  1. Sullo smartphone viene visualizzata la seguente schermata, con numeri casuali che sostituiscono i risultati effettivi:

f11c2821f2c8311d.png

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

TensorFlow Lite supporta diversi acceleratori hardware per velocizzare l'inferenza sui dispositivi mobili. 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 puoi fare clic su TODO 5 nell'elenco DA FARE e aggiungere 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 DA FARE. Sostituisci l'avvio semplice di flowerModel con quanto segue: ricevi un'istanza dell'elenco di compatibilità 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. Cambia l'inizializzazione del modello in modo da 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 Esegui 86934b7b01ad7565.png sulla barra degli strumenti:

60a77ef126c1373d.png

9. E adesso?

Ecco alcuni link per saperne di più: