1. Prima di iniziare
ML Kit è un SDK mobile che porta l'esperienza di machine learning on-device di Google nelle app Android e iOS. Puoi utilizzare le API Vision e Natural Language, potenti ma semplici da usare, per risolvere le sfide comuni nelle tue app o creare esperienze utente completamente nuove. Tutti sono basati sui migliori modelli di ML di Google e offerti senza costi.
Tutte le API di ML Kit vengono eseguite sul dispositivo, consentendo casi d'uso in tempo reale in cui vuoi elaborare un flusso della videocamera in diretta, ad esempio. Ciò significa anche che la funzionalità è disponibile offline.
Questo codelab ti guiderà in semplici passaggi per aggiungere il rilevamento e il monitoraggio degli oggetti (ODT) per una determinata immagine alla tua app per Android esistente. Tieni presente che questo codelab utilizza alcune scorciatoie per evidenziare l'utilizzo di ML Kit ODT.
Cosa creerai
In questo codelab, creerai un'app per Android con ML Kit. La tua app utilizzerà l'API ML Kit Object Detection and Tracking per rilevare gli oggetti in una determinata immagine.Alla fine, dovresti vedere qualcosa di simile all'immagine a destra. |
|
Cosa imparerai a fare
- Come integrare l'SDK ML Kit nell'applicazione Android
- API ML Kit Object Detection and Tracking
Che cosa ti serve
- Una versione recente di Android Studio (v4.1.2 o versioni successive)
- Emulatore Android Studio o un dispositivo Android fisico
- Il codice campione
- Conoscenza di base dello sviluppo Android in Kotlin
Questo codelab è incentrato su ML Kit. Concetti e blocchi di codice non pertinenti sono trattati solo superficialmente e sono forniti solo per operazioni di copia e incolla.
2. Configurazione
Scarica il codice
Fai clic sul seguente link per scaricare tutto il codice per questo codelab:
Decomprimi il file ZIP scaricato. Verrà estratta una cartella principale (mlkit-android-main) con tutte le risorse necessarie. Per questo codelab, ti serviranno solo le origini nella sottodirectory object-detection.
La sottodirectory object-detection nel repository mlkit-android contiene due directory:
starter: il codice di partenza su cui si basa questo codelab.
final: codice completato per l'app di esempio finita.
3. Aggiungi l'API ML Kit Object Detection and Tracking al progetto
Importa l'app in Android Studio
Iniziamo importando l'app iniziale in Android Studio.
Apri Android Studio, seleziona Import Project (Gradle, Eclipse ADT, etc.) e scegli la cartella starter del codice sorgente che hai scaricato in precedenza.

Aggiungere le dipendenze per il rilevamento e il monitoraggio degli oggetti di ML Kit
Le dipendenze di ML Kit ti consentono di integrare l'SDK ML Kit ODT nella tua app. Aggiungi le seguenti righe alla fine del file app/build.gradle del tuo progetto:
build.gradle
dependencies {
// ...
implementation 'com.google.mlkit:object-detection:16.2.4'
}
Sincronizzare il progetto con i file Gradle
Per assicurarti che tutte le dipendenze siano disponibili per la tua app, a questo punto devi sincronizzare il progetto con i file Gradle.
Seleziona Sincronizza progetto con file Gradle (
) dalla barra degli strumenti di Android Studio.
(Se questo pulsante è disattivato, assicurati di importare solo starter/app/build.gradle , non l'intero repository.)
4. Esegui l'app di base
Ora che hai importato il progetto in Android Studio e aggiunto le dipendenze per il rilevamento e il monitoraggio degli oggetti di ML Kit, puoi eseguire l'app per la prima volta.
Collega il tuo dispositivo Android tramite USB all'host o avvia l'emulatore Android Studio e fai clic su Esegui (
) nella barra degli strumenti di Android Studio.
Esegui ed esplora l'app
L'app dovrebbe avviarsi sul tuo dispositivo Android. Contiene del codice boilerplate per consentirti di acquisire una foto o selezionare un'immagine preimpostata e inserirla in una pipeline di rilevamento e monitoraggio degli oggetti che creerai in questo codelab. Esploriamo un po' l'app prima di scrivere il codice.
Innanzitutto, in basso è presente un pulsante (
) per:
- apri l'app Fotocamera integrata nel dispositivo/emulatore
- scattare una foto all'interno dell'app Fotocamera
- ricevere l'immagine acquisita nell'app iniziale
- visualizzare l'immagine
Prova il pulsante Scatta foto, segui le istruzioni per scattare una foto, accetta la foto e osservala visualizzata all'interno dell'app iniziale.
Ripeti alcune volte per vedere come funziona:

In secondo luogo, puoi scegliere tra tre immagini preimpostate. Puoi utilizzare queste immagini in un secondo momento per testare il codice di rilevamento degli oggetti se esegui l'emulatore Android.
Seleziona un'immagine tra le tre preimpostate. Verifica che l'immagine venga visualizzata nella visualizzazione più grande:

5. Aggiungere il rilevamento di oggetti sul dispositivo
In questo passaggio, aggiungerai la funzionalità all'app iniziale per rilevare gli oggetti nelle immagini. Come hai visto nel passaggio precedente, l'app iniziale contiene codice boilerplate per scattare foto con l'app Fotocamera sul dispositivo. Nell'app sono presenti anche tre immagini preimpostate su cui puoi provare il rilevamento degli oggetti se esegui il codelab su un emulatore Android.
Quando selezioni un'immagine, dalle immagini preimpostate o scattando una foto con l'app Fotocamera, il codice boilerplate decodifica l'immagine in un'istanza Bitmap, la mostra sullo schermo e chiama il metodo runObjectDetection con l'immagine.
In questo passaggio, aggiungerai codice al metodo runObjectDetection per eseguire il rilevamento degli oggetti.
Configurare ed eseguire il rilevamento di oggetti sul dispositivo su un'immagine
Per configurare l'estrazione del testo da documenti di ML Kit, bastano tre semplici passaggi con tre API:
- preparare un'immagine:
InputImage - crea un oggetto rilevatore:
ObjectDetection.getClient(options) - collega i due oggetti sopra:
process(image)
Questi risultati vengono ottenuti all'interno della funzione runObjectDetection(bitmap: Bitmap) nel file MainActivity.kt.
/**
* ML Kit Object Detection Function
*/
private fun runObjectDetection(bitmap: Bitmap) {
}
Al momento la funzione è vuota. Passa ai passaggi successivi per implementare ML Kit ODT. Durante la procedura, Android Studio ti chiederà di aggiungere le importazioni necessarie:
com.google.mlkit.vision.common.InputImagecom.google.mlkit.vision.objects.ObjectDetectioncom.google.mlkit.vision.objects.defaults.ObjectDetectorOptions
Passaggio 1: crea un InputImage
ML Kit fornisce un'API semplice per creare un InputImage da un Bitmap. Poi puoi inserire un InputImage nelle API ML Kit.
// Step 1: create ML Kit's InputImage object
val image = InputImage.fromBitmap(bitmap, 0)
Aggiungi il codice riportato sopra all'inizio di runObjectDetection(bitmap:Bitmap).
Passaggio 2: crea un'istanza del rilevatore
ML Kit segue il pattern di progettazione Builder. Trasferisci la configurazione allo strumento di creazione, quindi acquisisci un detector. Esistono tre opzioni di configurazione (quelle in grassetto vengono utilizzate in questo codelab):
- modalità di rilevamento (singola immagine o flusso)
- modalità di rilevamento (singolo o multiplo rilevamento di oggetti)
- modalità di classificazione (on o off)
Questo codelab è per il rilevamento e la classificazione di più oggetti in una singola immagine. Aggiungi ora:
// Step 2: acquire detector object
val options = ObjectDetectorOptions.Builder()
.setDetectorMode(ObjectDetectorOptions.SINGLE_IMAGE_MODE)
.enableMultipleObjects()
.enableClassification()
.build()
val objectDetector = ObjectDetection.getClient(options)
Passaggio 3: fornisci una o più immagini al rilevatore
Il rilevamento e la classificazione degli oggetti sono un'elaborazione asincrona:
- Invii un'immagine al rilevatore (tramite
process()). - Il rilevatore ci lavora sodo.
- Il rilevatore ti comunica il risultato tramite un callback.
Il seguente codice esegue questa operazione (copialo e aggiungilo al codice esistente all'interno di fun runObjectDetection(bitmap:Bitmap)):
// Step 3: feed given image to detector and setup callback
objectDetector.process(image)
.addOnSuccessListener {
// Task completed successfully
debugPrint(it)
}
.addOnFailureListener {
// Task failed with an exception
Log.e(TAG, it.message.toString())
}
Al termine, il rilevatore ti invia una notifica con:
- Il numero totale di oggetti rilevati. Ogni oggetto rilevato è descritto con:
trackingId: un numero intero che utilizzi per monitorarlo tra i frame (NON utilizzato in questo codelab).boundingBox: il riquadro di delimitazione dell'oggetto.labels:un elenco di etichette per l'oggetto rilevato (solo quando la classificazione è abilitata):index(recupera l'indice di questa etichetta)text(ottieni il testo di questa etichetta, tra cui "Articoli di moda", "Alimenti", "Articoli per la casa", "Luogo", "Pianta")confidence( un valore float compreso tra 0,0 e 1,0, dove 1,0 indica il 100%)
Probabilmente avrai notato che il codice esegue un'elaborazione di tipo printf per il risultato rilevato con debugPrint().
Aggiungilo al corso MainActivity:
private fun debugPrint(detectedObjects: List<DetectedObject>) {
detectedObjects.forEachIndexed { index, detectedObject ->
val box = detectedObject.boundingBox
Log.d(TAG, "Detected object: $index")
Log.d(TAG, " trackingId: ${detectedObject.trackingId}")
Log.d(TAG, " boundingBox: (${box.left}, ${box.top}) - (${box.right},${box.bottom})")
detectedObject.labels.forEach {
Log.d(TAG, " categories: ${it.text}")
Log.d(TAG, " confidence: ${it.confidence}")
}
}
}
Ora puoi accettare le immagini per il rilevamento.
Eseguiamo il codelab facendo clic su Esegui (
) nella barra degli strumenti di Android Studio. Prova a selezionare un'immagine preimpostata o scatta una foto, quindi guarda la finestra logcat(
) all'interno dell'IDE.
Dovresti vedere qualcosa di simile a questo:
D/MLKit Object Detection: Detected object: 0
D/MLKit Object Detection: trackingId: null
D/MLKit Object Detection: boundingBox: (481, 2021) - (2426,3376)
D/MLKit Object Detection: categories: Food
D/MLKit Object Detection: confidence: 0.90234375
D/MLKit Object Detection: Detected object: 1
D/MLKit Object Detection: trackingId: null
D/MLKit Object Detection: boundingBox: (2639, 2633) - (3058,3577)
D/MLKit Object Detection: Detected object: 2
D/MLKit Object Detection: trackingId: null
D/MLKit Object Detection: boundingBox: (3, 1816) - (615,2597)
D/MLKit Object Detection: categories: Home good
D/MLKit Object Detection: confidence: 0.75390625
...il che significa che il rilevatore ha visto tre oggetti:
- Le categorie sono Alimentari e Articoli per la casa.
- Per il secondo non viene restituita alcuna categoria perché si tratta di una classe sconosciuta.
- Nessun
trackingId(perché questa è la modalità di rilevamento di una singola immagine). - La posizione all'interno del rettangolo
boundingBox(ad es. (481, 2021) - (2426, 3376)) - Il rilevatore è abbastanza sicuro che il primo sia un Alimento (90% di confidenza, era insalata).
Tecnicamente, questo è tutto ciò che ti serve per far funzionare il rilevamento degli oggetti di ML Kit: hai tutto ciò che ti serve in questo momento. Complimenti!
Dal punto di vista dell'interfaccia utente, sei ancora alla fase iniziale, ma potresti utilizzare i risultati rilevati nell'interfaccia utente, ad esempio disegnando il riquadro di selezione per creare un'esperienza migliore. Passiamo al passaggio successivo: post-elaborare i risultati rilevati.
6. Post-elaborazione dei risultati del rilevamento
Nei passaggi precedenti, stampi il risultato rilevato in logcat: semplice e veloce.
In questa sezione, utilizzerai il risultato nell'immagine:
- disegna il riquadro di delimitazione sull'immagine
- disegna il nome della categoria e la confidenza all'interno del riquadro di selezione
Informazioni sulle utilità di visualizzazione
All'interno del codelab è presente del codice boilerplate per aiutarti a visualizzare il risultato del rilevamento. Sfrutta queste utilità per semplificare il codice di visualizzazione:
data class BoxWithText(val box: Rect, val text: String)Si tratta di una classe di dati per archiviare un risultato del rilevamento degli oggetti per la visualizzazione.boxè il riquadro di delimitazione in cui si trova l'oggetto, mentretextè la stringa del risultato del rilevamento da visualizzare insieme al riquadro di delimitazione dell'oggetto.fun drawDetectionResult(bitmap: Bitmap, detectionResults: List<BoxWithText>): BitmapQuesto metodo disegna i risultati del rilevamento degli oggetti indetectionResultssull'bitmape restituisce la copia modificata.
Ecco un esempio di output del metodo di utilità drawDetectionResult:

Visualizzare il risultato del rilevamento di ML Kit
Utilizza le utilità di visualizzazione per disegnare il risultato del rilevamento di oggetti di ML Kit sopra l'immagine di input.
Vai al punto in cui chiami debugPrint() e aggiungi il seguente snippet di codice:
// Parse ML Kit's DetectedObject and create corresponding visualization data
val detectedObjects = it.map { obj ->
var text = "Unknown"
// We will show the top confident detection result if it exist
if (obj.labels.isNotEmpty()) {
val firstLabel = obj.labels.first()
text = "${firstLabel.text}, ${firstLabel.confidence.times(100).toInt()}%"
}
BoxWithText(obj.boundingBox, text)
}
// Draw the detection result on the input bitmap
val visualizedResult = drawDetectionResult(bitmap, detectedObjects)
// Show the detection result on the app screen
runOnUiThread {
inputImageView.setImageBitmap(visualizedResult)
}
- Inizi analizzando
DetectedObjectdi ML Kit e creando un elenco di oggettiBoxWithTextper visualizzare il risultato della visualizzazione. - Poi disegni il risultato del rilevamento sopra l'immagine di input, utilizzando il metodo di utilità
drawDetectionResult, e lo mostri sullo schermo.
Run it
Ora fai clic su Esegui (
) nella barra degli strumenti di Android Studio.
Una volta caricata l'app, premi il pulsante con l'icona della fotocamera, punta la fotocamera verso un oggetto, scatta una foto, accettala (nell'app Fotocamera) oppure tocca una delle immagini preimpostate. Dovresti visualizzare i risultati del rilevamento. Premi di nuovo il pulsante o seleziona un'altra immagine per ripetere l'operazione un paio di volte e provare l'ultima versione di ML Kit ODT.

7. Complimenti!
Hai utilizzato ML Kit per aggiungere funzionalità di rilevamento degli oggetti alla tua app:
- 3 passaggi con 3 API
- Crea immagine di input
- Crea rilevatore
- Inviare l'immagine al rilevatore
Questo è tutto ciò che ti serve per iniziare.
Man mano che procedi, potresti voler migliorare il modello: come puoi vedere, il modello predefinito può riconoscere solo 5 categorie e non conosce nemmeno coltello, forchetta e bottiglia. Consulta l'altro codelab del percorso di apprendimento Machine learning on-device - Rilevamento di oggetti per scoprire come addestrare un modello personalizzato.
Argomenti trattati
- Come aggiungere il rilevamento e il monitoraggio degli oggetti di ML Kit alla tua app per Android
- Come utilizzare il rilevamento e il monitoraggio degli oggetti on-device in ML Kit per rilevare gli oggetti nelle immagini
Passaggi successivi
- Esplora altre funzionalità con ML Kit ODT con più immagini e video live per sperimentare l'accuratezza e il rendimento del rilevamento e della classificazione
- Consulta il percorso di apprendimento Machine learning on-device - Rilevamento di oggetti per scoprire come addestrare un modello personalizzato.
- Applicare l'estrazione di testo da immagini di ML Kit nella tua app per Android