Rileva oggetti nelle immagini con ML Kit: Android

1. Prima di iniziare

ML Kit è un SDK per dispositivi mobili 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 nuove esperienze utente. Tutte sono basate sui modelli di ML di Google, i migliori della categoria, e ti vengono offerti senza costi.

Tutte le API di ML Kit vengono eseguite on-device, consentendo casi d'uso in tempo reale in cui vuoi elaborare, ad esempio, un live streaming della videocamera. Ciò significa anche che la funzionalità è disponibile offline.

Questo codelab ti guiderà attraverso semplici passaggi per aggiungere il rilevamento e il monitoraggio di 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.

Che 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 nella tua app per Android
  • API ML Kit Object Detection and Tracking

Che cosa ti serve

  • Una versione recente di Android Studio (v4.1.2+)
  • Emulatore di 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à decompressa una cartella principale (mlkit-android-main) con tutte le risorse di cui avrai bisogno. Per questo codelab, avrai bisogno solo delle origini nella sottodirectory object-detection.

La sottodirectory object-detection nel repository mlkit-android contiene due directory:

  • android_studio_folder.pngstarter : codice iniziale su cui basarti per questo codelab.
  • android_studio_folder.pngfinal: codice completato per l'app di esempio finale.

3. Aggiungi l'API ML Kit Object Detection and Tracking al progetto

Importa l'app in Android Studio

Iniziamo importando l'app di base in Android Studio.

Apri Android Studio, seleziona Importa progetto (Gradle, Eclipse ADT e così via) e scegli la cartella starter dal codice sorgente che hai scaricato in precedenza.

7c0f27882a2698ac.png

Aggiungi le dipendenze per ML Kit Object Detection and Tracking

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'
}

Sincronizza 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 ( b451ab2d04d835f9.png) 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 ML Kit Object Detection and Tracking, puoi eseguire l'app per la prima volta.

Collega il tuo dispositivo Android tramite USB all'host o avvia l'emulatore di Android Studio, e fai clic su Esegui ( execute.png) nella barra degli strumenti di Android Studio.

Esegui ed esplora l'app

L'app dovrebbe essere avviata sul tuo dispositivo Android. Contiene del codice boilerplate che ti consente di acquisire una foto o selezionare un'immagine preimpostata e inserirla in una pipeline di rilevamento e monitoraggio di oggetti che creerai in questo codelab. Esploriamo un po' l'app prima di scrivere il codice.

Innanzitutto, nella parte inferiore è presente un pulsante ( c6d965d639c3646.png) per:

  • Aprire l'app Fotocamera integrata nel dispositivo/emulatore
  • Scattare una foto all'interno dell'app Fotocamera
  • Ricevere l'immagine acquisita nell'app di base
  • 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 di base.

Ripeti alcune volte per vedere come funziona:

9ec541980dbe2d31.png 8312dde41425ba4b.png fa8492bfc1914ff0.png

In secondo luogo, sono disponibili tre immagini preimpostate tra cui scegliere. Puoi utilizzare queste immagini in un secondo momento per testare il codice di rilevamento di oggetti se esegui l'app su un emulatore Android.

Seleziona un'immagine tra le tre immagini preimpostate. Vedrai che l'immagine viene visualizzata nella visualizzazione più grande:

1dd41b3ec978f1d9.png

5. Aggiungi il rilevamento di oggetti on-device

In questo passaggio, aggiungerai la funzionalità all'app di base per rilevare gli oggetti nelle immagini. Come hai visto nel passaggio precedente, l'app di base 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 di 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 il codice al metodo runObjectDetection per eseguire il rilevamento di oggetti.

Configura ed esegui il rilevamento di oggetti on-device su un'immagine

Sono necessari solo tre semplici passaggi con tre API per configurare ML Kit ODT:

  • Prepara un'immagine: InputImage
  • Crea un oggetto detector: ObjectDetection.getClient(options)
  • Collega i due oggetti sopra: process(image)

Questi passaggi vengono eseguiti 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.InputImage
  • com.google.mlkit.vision.objects.ObjectDetection
  • com.google.mlkit.vision.objects.defaults.ObjectDetectorOptions

Passaggio 1: crea un InputImage

ML Kit fornisce una semplice API 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 sopra all'inizio di runObjectDetection(bitmap:Bitmap).

Passaggio 2: crea un'istanza del detector

ML Kit segue il pattern di progettazione Builder. Passerai la configurazione al builder, quindi acquisirai un detector da quest'ultimo. Sono disponibili tre opzioni di configurazione (le opzioni in grassetto vengono utilizzate in questo codelab):

  • Modalità detector (immagine singola o stream)
  • 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. Aggiungilo 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: inserisci le immagini nel detector

Il rilevamento e la classificazione di oggetti sono elaborazioni asincrone:

  • Invii un'immagine al detector (tramite process()).
  • Il detector lavora molto.
  • Il detector ti restituisce il risultato tramite un callback.

Il seguente codice fa proprio questo (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 detector 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 (recupera il testo di questa etichetta, tra cui "Fashion Goods", "Food", "Home Goods", "Place", "Plant")
  • confidence ( un valore float compreso tra 0.0 e 1.0, dove 1.0 significa 100%)

Probabilmente avrai notato che il codice esegue un'elaborazione di tipo printf per il risultato rilevato con debugPrint().

Aggiungilo alla classe 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.

Esegui il codelab facendo clic su Esegui ( execute.png) nella barra degli strumenti di Android Studio. Prova a selezionare un'immagine preimpostata o scatta una foto, quindi guarda la finestra logcat( 16bd6ea224cf8cf1.png) 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 detector ha visto tre oggetti:

  • Le categorie sono Food e Home good.
  • Non viene restituita alcuna categoria per la seconda perché è 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 detector è abbastanza sicuro che il primo sia un Food (90% di affidabilità,era un'insalata).

Tecnicamente, questo è tutto ciò che ti serve per far funzionare ML Kit Object Detection: hai tutto 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 delimitazione per creare un'esperienza migliore: passiamo al passaggio successivo, ovvero la post-elaborazione dei risultati rilevati.

6. Post-elaborazione dei risultati del rilevamento

Nei passaggi precedenti, hai stampato 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 l'affidabilità all'interno del riquadro di delimitazione

Informazioni sulle utilità di visualizzazione

All'interno del codelab è presente del codice boilerplate che ti aiuta 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 memorizzare un risultato di rilevamento di oggetti per la visualizzazione. box è il riquadro di delimitazione in cui si trova l'oggetto e text è la stringa del risultato del rilevamento da visualizzare insieme al riquadro di delimitazione dell'oggetto.
  • fun drawDetectionResult(bitmap: Bitmap, detectionResults: List<BoxWithText>): Bitmap Questo metodo disegna i risultati del rilevamento di oggetti in detectionResults sul bitmap di input e ne restituisce la copia modificata.

Ecco un esempio di output del metodo di utilità drawDetectionResult:

58c6f1d4ddb00dfa.png

Visualizza 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 sotto:

// 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)
}
  • Inizia analizzando DetectedObject di ML Kit e creando un elenco di oggetti BoxWithText per visualizzare il risultato della visualizzazione.
  • Poi disegna il risultato del rilevamento sopra l'immagine di input, utilizzando il metodo di utilità drawDetectionResult, e lo mostra sullo schermo.

Esegui l'esecuzione

Ora fai clic su Esegui ( execute.png) 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 puoi toccare facilmente una delle immagini preimpostate. Dovresti vedere 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.

a03109cb30d5014d.png

7. Complimenti!

Hai utilizzato ML Kit per aggiungere funzionalità di rilevamento di oggetti alla tua app:

  • 3 passaggi con 3 API
  • Crea un'immagine di input
  • Crea un detector
  • Invia l'immagine al detector

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 cinque categorie: il modello non conosce nemmeno coltello, forchetta e bottiglia. Consulta l'altro codelab nel nostro percorso di apprendimento Machine learning on-device - Rilevamento di oggetti per scoprire come addestrare un modello personalizzato.

Argomenti trattati

  • Come aggiungere ML Kit Object Detection and Tracking alla tua app per Android
  • Come utilizzare il rilevamento e il monitoraggio di oggetti on-device in ML Kit per rilevare gli oggetti nelle immagini

Passaggi successivi

  • Esplora altro con ML Kit ODT con altre immagini e video in diretta per provare l'accuratezza e le prestazioni di rilevamento e classificazione
  • Consulta il percorso di apprendimento Machine learning on-device - Rilevamento di oggetti per scoprire come addestrare un modello personalizzato
  • Applica ML Kit ODT nella tua app per Android

Scopri di più