1. Introduzione
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.
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
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:
- Apri Android Studio . Dopo il caricamento, seleziona "Apri un progetto esistente" da questo popup:
- Nel selettore di file, scegli
TFLClassify/build.gradle
dalla directory di lavoro.
- 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".
- 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.
- Quando il progetto e il telefono sono pronti, puoi eseguirli su un dispositivo reale selezionando
TFL_Classify.start
e premendo il pulsante Esegui sulla barra degli strumenti:
- Ora consenti alla demo di TensorFlow di accedere alla fotocamera:
- Sullo smartphone verrà visualizzata la seguente schermata, con numeri casuali che sostituiscono i risultati effettivi.
5. Aggiungi TensorFlow Lite all'app per Android
- Seleziona il modulo
start
in Esplora progetto a sinistra:
- Fai clic con il tasto destro del mouse sul modulo
start
o fai clic suFile
, quindi suNew
>Other
>TensorFlow Lite Model
- Seleziona la posizione del modello in cui hai scaricato in precedenza l'oggetto
FlowerModel.tflite
con addestramento personalizzato.
- Fai clic su
Finish
. - 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.
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:
- 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
- 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
- Espandi tutti gli elementi sotto i moduli iniziali:
7. Esegui il modello personalizzato con TensorFlow Lite
- 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)
...
}
- All'interno del metodo di analisi per l'analizzatore CameraX, dobbiamo convertire l'input della fotocamera
ImageProxy
in unBitmap
e creare un oggettoTensorImage
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))
...
}
- 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
...
}
- Converti i risultati ordinati e filtrati in oggetti di dati
Recognition
pronti per essere utilizzati daRecyclerView
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))
}
...
}
- 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.
- Esegui l'app su un dispositivo reale selezionando
TFL_Classify.start
e premi il pulsante Esegui sulla barra degli strumenti:
- Sullo smartphone viene visualizzata la seguente schermata, con numeri casuali che sostituiscono i risultati effettivi:
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.
- 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'
- 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()
}
...
}
- 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)
}
}
- Esegui l'app su un dispositivo reale selezionando
TFL_Classify.start
e premi il pulsante Esegui sulla barra degli strumenti:
9. E adesso?
Ecco alcuni link per saperne di più:
- Prova altri modelli TFLite compatibili con l'associazione dei modelli ML di tfhub.dev.
- Scopri di più su TFLite nella documentazione su tensorflow.org e sul repo di codice.
- Prova altri modelli preaddestrati TFLite, tra cui un rilevatore di hotword vocale e una versione on-device della risposta intelligente.
- Scopri di più su TensorFlow in generale nella nostra documentazione introduttiva.