Integra un modello personalizzato nella tua app

1. Prima di iniziare

Nel primo codelab di questa serie, hai creato un'app molto semplice che utilizzava l'etichettatura delle immagini per analizzare i contenuti di un'immagine. Gli hai passato l'immagine di una margherita e ti ha restituito che ha visto cose come un petalo o il cielo. Poi, nel secondo Codelab, hai usato Python per addestrare un nuovo modello personalizzato che riconosce cinque diversi tipi di fiori.

In questo codelab, effettuerai l'aggiornamento dell'app del primo lab con il modello del secondo.

Puoi ottenere il codice sorgente completo per questo lab di codice clonando questo repository. Vedrai le directory secondarie per Android e iOS. Il codice del codelab precedente è disponibile come ImageClassifierStep1 se vuoi continuare. Il codice finito per questo codelab è disponibile come ImageClassifierStep2.

Prerequisiti

  • Dovresti aver completato i primi due codelab di questo percorso di apprendimento

Cosa creerai e apprenderai

  • Integra un modello personalizzato, addestrato nel lab precedente, in un'app per Android o iOS

Che cosa ti serve

  • Android Studio, disponibile all'indirizzo developer.android.com/studio per la parte del lab relativa ad Android
  • Xcode, disponibile nell'App Store di Apple, per la parte del lab su iOS

2. Scarica l'app Starter

Per prima cosa ti servirà l'app del codelab "Creare la tua prima app di visione artificiale su Android o iOS". Se hai seguito il lab, si chiamerà ImageClassifierStep1. Se non vuoi seguire il lab, puoi clonare la versione completa dal repo

Aprila in Android Studio, esegui gli aggiornamenti di cui hai bisogno e, quando è pronta, esegui l'app per assicurarti che funzioni. Il risultato dovrebbe essere simile a questo:

f3703d45d1332d1d.png

È un'app piuttosto primitiva, ma mostra alcune funzionalità molto potenti con poco codice. Tuttavia, se vuoi che questo fiore venga riconosciuto come una margherita e non solo come un fiore, dovrai aggiornare l'app in modo che utilizzi il modello personalizzato indicato nel codelab Crea un modello personalizzato per il classificatore di immagini.

3. Aggiorna build.gradle per utilizzare i modelli ML Kit personalizzati

  1. In Android Studio, trova il file build.gradle a livello di app. Il modo più semplice per farlo è in Explorer progetto. Assicurati che Android sia selezionato in alto. In basso, vedrai una cartella per Gradle Script.
  2. Apri quello relativo al Modulo, con il nome dell'app seguito da ".app" come mostrato qui - (Module: ImageClassifierStep1.app):

8fe1d04b40610047.png

  1. Nella parte inferiore del file, individua l'impostazione delle dipendenze. Lì dovresti vedere questa riga:
implementation 'com.google.mlkit:image-labeling:17.0.1'

Il numero di versione potrebbe essere diverso. Puoi trovare sempre il numero di versione più recente sul sito ML Kit all'indirizzo: https://developers.google.com/ml-kit/vision/image-labeling/android.

  1. Sostituiscila con il riferimento della libreria di etichettatura delle immagini personalizzate. Puoi trovare il numero di versione all'indirizzo: https://developers.google.com/ml-kit/vision/image-labeling/custom-models/android
implementation 'com.google.mlkit:image-labeling-custom:16.3.1'
  1. Inoltre, aggiungerai un modello .tflite che hai creato nel lab precedente. Non vuoi che questo modello venga compresso quando Android Studio compila la tua app, quindi assicurati di utilizzare questa impostazione nella sezione Android dello stesso file build.gradle:
aaptOptions{
    noCompress "tflite"
}

Assicurati che non si trovi in altre impostazioni. Dovrebbe essere nidificata direttamente sotto il tag android. Ecco un esempio:

62d546bff11d2a50.png

4. Aggiungi il modello TFLite

Nel codelab precedente hai creato il tuo modello personalizzato e lo hai scaricato come model.tflite.

Nel tuo progetto, individua la cartella degli asset che attualmente contiene flower1.jpg. Copia il modello nella cartella come segue:

  1. Fai clic con il pulsante destro del mouse sulla cartella Asset in Android Studio. Nel menu visualizzato, seleziona Mostra nel Finder. ("Mostra in Explorer" su Windows e "Mostra in File" su Linux).

db30b47e419a326b.png

  1. Passerai alla directory del file system. Copia il file model.tflite in quella directory, insieme a flower1.jpg.

36de0c51bec1c19e.png

Android Studio si aggiornerà per mostrare entrambi i file nella cartella degli asset:

e9f4e9f394d9b357.png

Ora puoi aggiornare il codice.

5. Aggiorna il codice per il modello personalizzato

Il primo passaggio consiste nell'aggiungere codice per caricare il modello personalizzato.

  1. Nel file MainActivity, aggiungi quanto segue a onCreate, immediatamente sotto la riga setContentView(R.layout.activity_main).

Verrà utilizzato un LocalModel per la creazione dall'asset model.tflite. Se Android Studio presenta un reclamo impostando "LocalModel" in rosso, premi ALT + Invio per importare la raccolta. Dovrebbe aggiungere un'importazione in com.google.mlkit.common.model.LocalModel automaticamente.

val localModel = LocalModel.Builder()
        .setAssetFilePath("model.tflite")
        .build()

In precedenza, nel gestore btn.setOnClickListener utilizzavi il modello predefinito. È stato configurato con questo codice:

val labeler = ImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS)

Sostituiscilo per utilizzare il modello personalizzato.

  1. Configura un oggetto opzioni personalizzate:
val options = CustomImageLabelerOptions.Builder(localModel)
        .setConfidenceThreshold(0.7f)
        .setMaxResultCount(5)
        .build()

Le opzioni predefinite vengono sostituite con un insieme personalizzato. La soglia di confidenza imposta una barra per la qualità delle previsioni da restituire. Se torni all'esempio nella parte superiore di questo codelab, in cui l'immagine era una margherita, sono presenti 4 previsioni, ciascuna con un valore accanto, come "Sky" che è 0,7632.

Potresti filtrare in modo efficace i risultati di qualità inferiore utilizzando una soglia di confidenza alta. Ad esempio, impostando questo valore su 0,9 non vengono restituite etichette con una priorità inferiore a quella indicata. setMaxResultCount() è utile nei modelli con molte classi, ma poiché questo modello ne ha solo 5, lasci 5 su 5.

Ora che hai a disposizione delle opzioni per l'etichettatore, puoi modificare la sua creazione in:

val labeler = ImageLabeling.getClient(options)

Il resto del codice verrà eseguito senza modifiche. Prova anche tu!

dd40c36c4edbb33.png

Qui puoi vedere che questo fiore è stato identificato come una margherita con una probabilità di 0,959.

Supponiamo che tu abbia aggiunto una seconda immagine di fiori e che tu abbia nuovamente aggiunto questa immagine:

8556a5fbea487842.png

La identifica come una rosa.

Potresti chiederti perché viene indicato rose anziché solo "rosa". Questo perché nel set di dati le etichette sono date dai nomi delle cartelle e purtroppo questi nomi sono un po' incoerenti, a volte utilizzano il singolare (come "margherita") e altre volte il plurale (come "rose"). Non confonderlo con il modello che tenta di contare gli elementi nell'immagine: è molto più primitivo di così e sa identificare solo i tipi di fiori.

6. Scarica l'app iOS Start

  1. Per prima cosa ti servirà l'app del primo codelab. Se hai seguito il lab, si chiamerà ImageClassifierStep1. Se non vuoi seguire il lab, puoi clonare la versione completa dal repo. Tieni presente che i pod e .xcworkspace non sono presenti nel repository, quindi prima di andare al passaggio successivo assicurati di eseguire "pod install" dalla stessa directory del file .xcproject.
  2. Apri ImageClassifierStep1.xcworkspace in Xcode. Tieni presente che devi utilizzare .xcworkspace e non .xcproject perché hai bundle ML Kit con pod, che verrà caricato nell'area di lavoro.

Per il resto del lab, eseguirò l'app nel simulatore per iPhone, che dovrebbe supportare le destinazioni di build del codelab. Se vuoi utilizzare il tuo dispositivo, potresti dover modificare la destinazione della build nelle impostazioni del progetto in modo che corrisponda alla versione di iOS.

Eseguilo e vedrai qualcosa di simile a questo:

9e151ed18f99fb98.png

Nota le classificazioni molto generiche: petalo, fiore, cielo. Il modello che hai creato nel codelab precedente è stato addestrato a rilevare 5 varietà di fiori, tra cui questa: la margherita.

Nella parte restante di questo codelab, darai un'occhiata a cosa serve per eseguire l'upgrade della tua app con il modello personalizzato.

7. Usa i pod di etichettatura immagini del kit ML personalizzato

La prima app ha utilizzato un file di pod per ottenere le librerie e il modello di base di ML Kit Image Labeler. Dovrai aggiornarlo per utilizzare le librerie di etichettatura delle immagini personalizzate.

  1. Trova il file denominato podfile nella directory del progetto. Aprila, vedrai qualcosa di simile a questo:
platform :ios, '10.0'

target 'ImageClassifierStep1' do
        pod 'GoogleMLKit/ImageLabeling'
end
  1. Modifica la dichiarazione del pod da ImageLabeling a ImageLabelingCustom, in questo modo:
platform :ios, '10.0'

target 'ImageClassifierStep1' do
        pod 'GoogleMLKit/ImageLabelingCustom'
end
  1. Al termine, usa il terminale per passare alla directory contenente il podfile (nonché .xcworkspace) ed esegui pod install.

bb5d78eb7c7ab975.png

Dopo qualche istante le librerie MLKitImageLabeling verranno rimosse e quelle personalizzate verranno aggiunte. Ora puoi aprire il tuo file .xcworkspace per modificare il codice.

8. Aggiungi il modello TFLite a Xcode

Nel codelab precedente hai creato un modello personalizzato e lo hai scaricato come model.tflite. Se non hai questo a portata di mano, torna indietro ed esegui il codelab o segui il codice Colab qui. Se non hai accesso a Google Colab, il blocco note è disponibile tramite questo link

  1. Con l'area di lavoro aperta in Xcode, trascina model.tflite sul tuo progetto. Dovrebbe trovarsi nella stessa cartella dei file rimanenti, come ViewController.swift o Main.storyboard.
  2. Viene visualizzata una finestra di dialogo con le opzioni per aggiungere il file. Assicurati che l'opzione Aggiungi ai target sia selezionata, altrimenti il modello non verrà bundle con l'app dopo il deployment su un dispositivo.

La casella di controllo "Aggiungi ai target" avrà ImageClassifierStep1 se hai iniziato da lì e stai continuando la procedura passo passo di questo lab oppure ImageClassifierStep2 (come mostrato) se sei passato al codice finito.

5b6a7f40c73f0f1f.png

In questo modo puoi caricare il modello. Nel prossimo passaggio scoprirai come farlo.

9. Aggiorna il codice per il modello personalizzato

  1. Apri il file ViewController.swift. Potresti visualizzare un errore nella richiesta di importazione di MLKitImageLabeling nella parte superiore del file. Questo è dovuto al fatto che hai rimosso le librerie di etichettatura generica delle immagini quando hai aggiornato il file del pod. Elimina questa riga e aggiornala con quanto segue:
import MLKitVision
import MLKit
import MLKitImageLabelingCommon
import MLKitImageLabelingCustom

Potrebbe essere facile leggerli velocemente e pensare che ripetano lo stesso codice. Ma è "comune" e "Personalizzato" alla fine!

  1. Successivamente, carica il modello personalizzato che hai aggiunto nel passaggio precedente. Trova la funzione getLabels() Sotto la riga visionImage.orientation = image.imageOrientation, aggiungi queste righe:
// Add this code to use a custom model
let localModelFilePath = Bundle.main.path(forResource: "model", ofType: "tflite")
let localModel = LocalModel(path: localModelFilePath!)
  1. Trova il codice per specificare le opzioni per ImageLabeler generico. Probabilmente restituisce un messaggio di errore poiché le librerie sono state rimosse:
let options = ImageLabelerOptions()

Sostituiscilo con questo codice per utilizzare un valore CustomImageLabelerOptions e che specifica il modello locale:

let options = CustomImageLabelerOptions(localModel: localModel)

...e questo è tutto! Prova a eseguire l'app ora. La classificazione dell'immagine dovrebbe essere più accurata e ti verrà comunicato che probabilmente stai osservando una margherita.

238cd21748a97cf4.png

Supponiamo che tu abbia aggiunto una seconda immagine di fiori e che tu abbia nuovamente aggiunto questa immagine:

75f3970a6b509bfe.png

L'app ha rilevato che questa immagine corrisponde all'etichetta "rose".

10. Complimenti!

Sei passato dalla creazione di un'app che utilizzava un modello generico per riconoscere i contenuti di un'immagine, alla creazione di un modello ML personale per riconoscere elementi specifici, come i fiori, e all'aggiornamento dell'app per l'utilizzo del modello personalizzato.

L'app risultante è, ovviamente, molto limitata perché si basava su asset immagine raggruppati. Tuttavia, la parte relativa all'ML funziona bene. Ad esempio, potresti utilizzare la fotocamera AndroidX per acquisire fotogrammi da un feed live e classificarli per vedere quali fiori riconosce il tuo telefono.

Da qui le possibilità sono infinite e se disponi di dati personali per qualcosa di diverso dai fiori, hai le basi per creare un'app che li riconosca utilizzando la visione artificiale. Questi sono solo i primi passi in un mondo molto più ampio e ci auguriamo che ti siano divertiti a esplorarli.