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. Hai passato una foto di una margherita e ti ha restituito che vedeva cose come un petalo o il cielo. Poi, nel secondo codelab, sei passato a Python per addestrare un nuovo modello personalizzato che riconosce cinque diversi tipi di fiori.
In questo codelab aggiornerai l'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 sottodirectory per Android e iOS. Il codice del codelab precedente è disponibile come ImageClassifierStep1 se vuoi seguirlo. Il codice completato per questo codelab è disponibile come ImageClassifierStep2.
Prerequisiti
- Devi aver completato i primi due codelab di questo percorso di apprendimento
Cosa creerai e imparerai
- Integra un modello personalizzato, addestrato nel lab precedente, in un'app Android o iOS
Che cosa ti serve
- Android Studio, disponibile all'indirizzo developer.android.com/studio per la parte Android del lab
- Xcode, disponibile nell'App Store di Apple, per la parte iOS del lab
2. Scarica l'app di base
Per prima cosa, ti servirà l'app del codelab Creare la prima app di Computer Vision su Android o iOS. Se hai completato il lab, si chiamerà ImageClassifierStep1. Se non vuoi completare il lab, puoi clonare la versione completata dal repository
Apri l'app in Android Studio, esegui gli aggiornamenti necessari e, quando è pronta, esegui l'app per assicurarti che funzioni. Il risultato dovrebbe essere simile a questo:

È un'app piuttosto primitiva, ma mostra alcune funzionalità molto potenti con un po' di codice. Tuttavia, se vuoi che questo fiore venga riconosciuto come una margherita e non solo come un fiore, dovrai aggiornare l'app per utilizzare il modello personalizzato del codelab Creare un modello personalizzato per il classificatore di immagini.
3. Aggiorna build.gradle per utilizzare i modelli ML Kit personalizzati
- Utilizzando Android Studio, trova il file
build.gradlea livello di app. Il modo più semplice per farlo è nell'esploratore di progetti. Assicurati che sia selezionata l'opzione Android nella parte superiore e vedrai una cartella per gli script Gradle nella parte inferiore. - Apri quello per il modulo, con il nome dell'app seguito da ".app" come mostrato qui: (Modulo: ImageClassifierStep1.app):

- Nella parte inferiore del file, trova l'impostazione dependencies. Dovresti vedere questa riga:
implementation 'com.google.mlkit:image-labeling:17.0.1'
Il numero di versione potrebbe essere diverso. Trova sempre l'ultimo numero di versione dal sito di ML Kit all'indirizzo: https://developers.google.com/ml-kit/vision/image-labeling/android
- Sostituisci questa riga con il riferimento alla libreria di etichettatura delle immagini personalizzata. Il numero di versione è disponibile all'indirizzo: https://developers.google.com/ml-kit/vision/image-labeling/custom-models/android
implementation 'com.google.mlkit:image-labeling-custom:16.3.1'
- Inoltre, aggiungerai un modello .tflite che hai creato nel lab precedente. Non vuoi che questo modello venga compresso quando Android Studio compila l'app, quindi assicurati di utilizzare questa impostazione nella sezione Android dello stesso file
build.gradle:
aaptOptions{
noCompress "tflite"
}
Assicurati che non sia all'interno di altre impostazioni. Deve essere nidificato direttamente sotto il tag android. Ad esempio:

4. Aggiungi il modello TFLite
Nel codelab precedente hai creato il modello personalizzato e lo hai scaricato come model.tflite.
Nel progetto, trova la cartella assets che attualmente contiene flower1.jpg. Copia il modello in questa cartella come segue:
- Fai clic con il tasto destro del mouse sulla cartella Assets in Android Studio. Nel menu visualizzato, seleziona Reveal in Finder. ("Mostra in Esplora risorse" su Windows e "Mostra in File" su Linux.)

- Verrà visualizzata la directory nel file system. Copia il file
model.tflitein questa directory, insieme aflower1.jpg.

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

Ora puoi aggiornare il codice.
5. Aggiorna il codice per il modello personalizzato
Il primo passo consiste nell'aggiungere del codice per caricare il modello personalizzato.
- Nel file
MainActivity, aggiungi quanto segue aonCreate, immediatamente sotto la rigasetContentView(R.layout.activity_main).
Verrà utilizzato un LocalModel per la creazione dall'asset model.tflite. Se Android Studio segnala un errore trasformando "LocalModel" in rosso, premi ALT + Invio per importare la libreria. Dovrebbe aggiungere un'importazione a com.google.mlkit.common.model.LocalModel.
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)
Lo sostituirai per utilizzare il modello personalizzato.
- Configura un oggetto di opzioni personalizzate:
val options = CustomImageLabelerOptions.Builder(localModel)
.setConfidenceThreshold(0.7f)
.setMaxResultCount(5)
.build()
Le opzioni predefinite vengono sostituite con un set personalizzato. La soglia di affidabilità imposta una barra per la qualità delle previsioni da restituire. Se torni all'esempio nella parte superiore di questo codelab, dove l'immagine era una margherita, avevi 4 previsioni, ognuna con un valore accanto, ad esempio "Cielo" con .7632.
Puoi filtrare efficacemente i risultati di qualità inferiore utilizzando una soglia di affidabilità elevata. Se imposti questo valore su 0,9, ad esempio, non verrà restituita alcuna etichetta con una priorità inferiore. setMaxResultCount() è utile nei modelli con molte classi, ma poiché questo modello ne ha solo 5, lo lascerai a 5.
Ora che hai le opzioni per l'etichettatore, puoi modificare l'istanza dell'etichettatore in:
val labeler = ImageLabeling.getClient(options)
Il resto del codice verrà eseguito senza modifiche. Provaci anche tu.

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 l'abbia eseguita di nuovo:

Lo identifica come una rosa.
Ti starai chiedendo perché dice rose anziché solo "rosa". Questo perché nel set di dati le etichette sono indicate dai nomi delle cartelle e, purtroppo, questi nomi sono un po' incoerenti, a volte utilizzano il singolare (ad esempio "margherita") e a volte il plurale (ad esempio "rose"). Non confondere questo con il modello che tenta di contare gli elementi nell'immagine: è molto più primitivo e può identificare solo i tipi di fiori.
6. Scarica l'app di base per iOS
- Per prima cosa, ti servirà l'app del primo codelab. Se hai completato il lab, si chiamerà ImageClassifierStep1. Se non vuoi completare il lab, puoi clonare la versione completata dal repository. Tieni presente che i pod e .xcworkspace non sono presenti nel repository, quindi prima di continuare con il passaggio successivo assicurati di eseguire "pod install" dalla stessa directory di .xcproject.
- Apri
ImageClassifierStep1.xcworkspacein Xcode. Tieni presente che devi utilizzare .xcworkspace e non .xcproject perché hai raggruppato ML Kit utilizzando i pod e il workspace li caricherà.
Per il resto di questo lab, eseguirò l'app nel simulatore iPhone che dovrebbe supportare le destinazioni di compilazione del codelab. Se vuoi utilizzare il tuo dispositivo, potresti dover modificare la destinazione di compilazione nelle impostazioni del progetto in modo che corrisponda alla tua versione di iOS.
Eseguila e vedrai qualcosa di simile a questo:

Nota le classificazioni molto generiche: petalo, fiore, cielo. Il modello che hai creato nel codelab precedente è stato addestrato per rilevare 5 varietà di fiori, inclusa questa: una margherita.
Per il resto di questo codelab, vedrai cosa serve per eseguire l'upgrade dell'app con il modello personalizzato.
7. Utilizza i pod di etichettatura delle immagini di ML Kit personalizzati
La prima app utilizzava un file pod per ottenere le librerie e il modello di base di etichettatura delle immagini di ML Kit. Dovrai aggiornarlo per utilizzare le librerie di etichettatura delle immagini personalizzate.
- Trova il file denominato
podfilenella directory del progetto. Aprilo e vedrai qualcosa di simile a questo:
platform :ios, '10.0'
target 'ImageClassifierStep1' do
pod 'GoogleMLKit/ImageLabeling'
end
- Modifica la dichiarazione del pod da
ImageLabelingaImageLabelingCustom, come segue:
platform :ios, '10.0'
target 'ImageClassifierStep1' do
pod 'GoogleMLKit/ImageLabelingCustom'
end
- Al termine, utilizza il terminale per accedere alla directory contenente il file pod (e .xcworkspace) ed esegui
pod install.

Dopo alcuni istanti, le librerie MLKitImageLabeling verranno rimosse e quelle personalizzate verranno aggiunte. Ora puoi aprire .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 ce l'hai a portata di mano, torna indietro ed esegui il codelab o il codice Colab qui. Se non hai accesso a Google Colab, il notebook è disponibile a questo link
- Con il workspace aperto in Xcode, trascina model.tflite nel progetto. Dovrebbe trovarsi nella stessa cartella degli altri file, ad esempio
ViewController.swiftoMain.storyboard. - Verrà visualizzata una finestra di dialogo con le opzioni per l'aggiunta del file. Assicurati che sia selezionata l'opzione Aggiungi a destinazioni, altrimenti il modello non verrà raggruppato con l'app quando viene eseguito il deployment su un dispositivo.
Tieni presente che la voce "Aggiungi a destinazioni" avrà ImageClassifierStep1 se hai iniziato da lì e stai continuando passo dopo passo in questo lab o ImageClassifierStep2 (come mostrato) se hai saltato al codice completato.

In questo modo potrai caricare il modello. Nel passaggio successivo vedrai come fare.
9. Aggiorna il codice per il modello personalizzato
- Apri il file
ViewController.swift. Potresti visualizzare un errore su "import MLKitImageLabeling" nella parte superiore del file. Questo perché hai rimosso le librerie di etichettatura delle immagini generiche quando hai aggiornato il file pod. Puoi eliminare questa riga e aggiornarla con la seguente:
import MLKitVision
import MLKit
import MLKitImageLabelingCommon
import MLKitImageLabelingCustom
Potrebbe essere facile leggere rapidamente questi codici e pensare che ripetano lo stesso codice. Ma alla fine c'è "Common" e "Custom".
- Poi caricherai il modello personalizzato che hai aggiunto nel passaggio precedente. Trova la funzione
getLabels(). Sotto la rigavisionImage.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!)
- Trova il codice per specificare le opzioni per l'ImageLabeler generico. Probabilmente ti darà un errore perché queste librerie sono state rimosse:
let options = ImageLabelerOptions()
Sostituisci questo codice con il seguente per utilizzare un CustomImageLabelerOptions e che specifica il modello locale:
let options = CustomImageLabelerOptions(localModel: localModel)
…e il gioco è fatto. Prova a eseguire l'app ora. Quando provi a classificare l'immagine, dovrebbe essere più precisa e dirti che stai guardando una margherita con un'alta probabilità.

Supponiamo che tu abbia aggiunto una seconda immagine di fiori e che l'abbia eseguita di nuovo:

L'app ha rilevato correttamente che questa immagine corrispondeva all'etichetta "rose".
10. Complimenti!
Ora 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 personalizzato per riconoscere elementi specifici, come i fiori, e poi all'aggiornamento dell'app per utilizzare il modello personalizzato.
L'app risultante è, ovviamente, molto limitata perché si basava su asset immagine raggruppati. Tuttavia, la parte ML funziona correttamente. Ad esempio, puoi utilizzare AndroidX Camera per acquisire frame da un feed live e classificarli per vedere quali fiori riconosce il tuo smartphone.
Da qui le possibilità sono infinite e, se hai i tuoi dati per qualcosa di diverso dai fiori, hai le basi di ciò che ti serve per creare un'app che li riconosca utilizzando Computer Vision. Questi sono solo i primi passi in un mondo molto più ampio e speriamo che ti sia piaciuto completarli.