L'attività Classificatore di immagini MediaPipe ti consente di eseguire la classificazione delle immagini. Puoi utilizzare questa attività per identificare cosa rappresenta un'immagine tra un insieme di categorie definite al momento dell'addestramento. Queste istruzioni mostrano come utilizzare Image Classifier con le app per Android. L'esempio di codice descritto in queste istruzioni è disponibile su GitHub.
Puoi vedere questa operazione in azione guardando la demo web. Per ulteriori informazioni sulle funzionalità, sui modelli e sulle opzioni di configurazione di questa attività, consulta la Panoramica.
Esempio di codice
Il codice di esempio di MediaPipe Tasks è una semplice implementazione di un'app di classificazione delle immagini per Android. L'esempio utilizza la fotocamera di un dispositivo Android fisico per classificare continuamente gli oggetti e può anche utilizzare immagini e video dalla galleria del dispositivo per classificarli in modo statico.
Puoi utilizzare l'app come punto di partenza per la tua app per Android o farvi riferimento quando modifichi un'app esistente. Il codice di esempio di Image Classifier è ospitato su GitHub.
Scarica il codice
Le istruzioni riportate di seguito mostrano come creare una copia locale del codice di esempio utilizzando lo strumento a riga di comando git.
Per scaricare il codice di esempio:
- Clona il repository git utilizzando il seguente comando:
git clone https://github.com/google-ai-edge/mediapipe-samples
- Se vuoi, configura l'istanza Git in modo da utilizzare il controllo sparse,
in modo da avere solo i file per l'app di esempio Image Classifier:
cd mediapipe git sparse-checkout init --cone git sparse-checkout set examples/image_classification/android
Dopo aver creato una versione locale del codice di esempio, puoi importare il progetto in Android Studio ed eseguire l'app. Per istruzioni, consulta la Guida alla configurazione per Android.
Componenti chiave
I seguenti file contengono il codice fondamentale per questa applicazione di esempio di classificazione delle immagini:
- ImageClassifierHelper.kt: inizializza il classificatore di immagini e gestisce il modello e la selezione del delegato.
- MainActivity.kt: implementa l'applicazione, inclusa la chiamata di
ImageClassificationHelper
eClassificationResultsAdapter
. - ClassificationResultsAdapter.kt: gestisce e formatta i risultati.
Configurazione
Questa sezione descrive i passaggi chiave per configurare l'ambiente di sviluppo e i progetti di codice per utilizzare Image Classifier. Per informazioni generali sulla configurazione dell'ambiente di sviluppo per l'utilizzo delle attività MediaPipe, inclusi i requisiti della versione della piattaforma, consulta la guida alla configurazione per Android.
Dipendenze
Image Classifier utilizza la libreria com.google.mediapipe:tasks-vision
. Aggiungi questa dipendenza al file build.gradle
del tuo progetto di sviluppo di app per Android. Importa le dipendenze richieste con il seguente codice:
dependencies {
...
implementation 'com.google.mediapipe:tasks-vision:latest.release'
}
Modello
L'attività Classificatore di immagini MediaPipe richiede un modello addestrato compatibile con questa attività. Per ulteriori informazioni sui modelli addestrati disponibili per Image Classifier, consulta la sezione Modelli della panoramica dell'attività.
Seleziona e scarica il modello, quindi memorizzalo nella directory del progetto:
<dev-project-root>/src/main/assets
Utilizza il metodo BaseOptions.Builder.setModelAssetPath()
per specificare il percorso utilizzato dal modello. A questo metodo viene fatto riferimento nell'esempio di codice nella sezione successiva.
Nel
codice di esempio del classificatore delle immagini,
il modello è definito nel
file ImageClassifierHelper.kt
.
Crea l'attività
Puoi utilizzare la funzione createFromOptions
per creare l'attività. La funzione createFromOptions
accetta opzioni di configurazione, tra cui la modalità di esecuzione, la lingua dei nomi visualizzati, il numero massimo di risultati, la soglia di confidenza e un elenco consentiti o vietati per le categorie. Per ulteriori informazioni sulle opzioni di configurazione, consulta Panoramica della configurazione.
L'attività di classificazione delle immagini supporta tre tipi di dati di input: immagini fisse, file video e streaming video dal vivo. Devi specificare la modalità di esecuzione corrispondente al tipo di dati di input quando crei l'attività. Scegli la scheda corrispondente al tipo di dati di input per scoprire come creare l'attività ed eseguire l'inferenza.
Immagine
ImageClassifierOptions options = ImageClassifierOptions.builder() .setBaseOptions( BaseOptions.builder().setModelAssetPath("model.tflite").build()) .setRunningMode(RunningMode.IMAGE) .setMaxResults(5) .build(); imageClassifier = ImageClassifier.createFromOptions(context, options);
Video
ImageClassifierOptions options = ImageClassifierOptions.builder() .setBaseOptions( BaseOptions.builder().setModelAssetPath("model.tflite").build()) .setRunningMode(RunningMode.VIDEO) .setMaxResults(5) .build(); imageClassifier = ImageClassifier.createFromOptions(context, options);
Live streaming
ImageClassifierOptions options = ImageClassifierOptions.builder() .setBaseOptions( BaseOptions.builder().setModelAssetPath("model.tflite").build()) .setRunningMode(RunningMode.LIVE_STREAM) .setMaxResults(5) .setResultListener((result, inputImage) -> { // Process the classification result here. }) .setErrorListener((result, inputImage) -> { // Process the classification errors here. }) .build() imageClassifier = ImageClassifier.createFromOptions(context, options)
L'implementazione del codice di esempio di Image Classifier consente all'utente di passare da una modalità di elaborazione all'altra. L'approccio rende il codice di creazione delle attività più complicato e potrebbe non essere appropriato per il tuo caso d'uso. Puoi visualizzare questo codice nella funzione setupImageClassifier()
del file ImageClassifierHelper.kt
.
Opzioni di configurazione
Questa attività offre le seguenti opzioni di configurazione per le app per Android:
Nome opzione | Descrizione | Intervallo di valori | Valore predefinito |
---|---|---|---|
runningMode |
Imposta la modalità di esecuzione dell'attività. Esistono tre
modalità: IMMAGINE: la modalità per l'inserimento di singole immagini. VIDEO: la modalità per i fotogrammi decodificati di un video. LIVE_STREAM: la modalità per un live streaming di dati di input, ad esempio da una videocamera. In questa modalità, resultListener deve essere chiamato per configurare un ascoltatore per ricevere i risultati in modo asincrono. |
{IMAGE, VIDEO, LIVE_STREAM } |
IMAGE |
displayNamesLocale |
Imposta la lingua delle etichette da utilizzare per i nomi visualizzati forniti nei metadati del modello dell'attività, se disponibile. Il valore predefinito è en per
l'inglese. Puoi aggiungere etichette localizzate ai metadati di un modello personalizzato
utilizzando l'API TensorFlow Lite Metadata Writer |
Codice delle impostazioni internazionali | it |
maxResults |
Imposta il numero massimo facoltativo di risultati di classificazione con il punteggio più alto da restituire. Se < 0, verranno restituiti tutti i risultati disponibili. | Qualsiasi numero positivo | -1 |
scoreThreshold |
Imposta la soglia del punteggio di previsione che sostituisce quella fornita nei metadati del modello (se presenti). I risultati inferiori a questo valore vengono rifiutati. | Qualsiasi stato mobile | Non impostato |
categoryAllowlist |
Imposta l'elenco facoltativo dei nomi delle categorie consentite. Se non è vuoto,
i risultati di classificazione il cui nome della categoria non è presente in questo insieme verranno
eliminati. I nomi di categorie duplicati o sconosciuti vengono ignorati.
Questa opzione è mutuamente esclusiva con categoryDenylist e l'utilizzo di entrambe genera un errore. |
Qualsiasi stringa | Non impostato |
categoryDenylist |
Imposta l'elenco facoltativo dei nomi di categorie non consentiti. Se non è vuoto, i risultati di classificazione il cui nome della categoria è presente in questo insieme verranno esclusi. I nomi di categorie duplicati o sconosciuti vengono ignorati. Questa opzione è mutuamente esclusa da categoryAllowlist e l'utilizzo di entrambe genera un errore. |
Qualsiasi stringa | Non impostato |
resultListener |
Imposta l'ascoltatore dei risultati in modo da ricevere i risultati della classificazione
in modo asincrono quando l'Image Classifier è in modalità
live streaming. Può essere utilizzato solo quando la modalità di esecuzione è impostata su LIVE_STREAM |
N/D | Non impostato |
errorListener |
Imposta un listener di errore facoltativo. | N/D | Non impostato |
Preparazione dei dati
Image Classifier funziona con immagini, file video e video in live streaming. L'attività gestisce la preelaborazione dei dati di input, tra cui ridimensionamento, rotazione e normalizzazione dei valori.
Devi convertire l'immagine o il frame di input in un oggetto com.google.mediapipe.framework.image.MPImage
prima di trasmetterlo al classificatore di immagini.
Immagine
import com.google.mediapipe.framework.image.BitmapImageBuilder; import com.google.mediapipe.framework.image.MPImage; // Load an image on the user’s device as a Bitmap object using BitmapFactory. // Convert an Android’s Bitmap object to a MediaPipe’s Image object. Image mpImage = new BitmapImageBuilder(bitmap).build();
Video
import com.google.mediapipe.framework.image.BitmapImageBuilder; import com.google.mediapipe.framework.image.MPImage; // Load a video file on the user's device using MediaMetadataRetriever // From the video’s metadata, load the METADATA_KEY_DURATION and // METADATA_KEY_VIDEO_FRAME_COUNT value. You’ll need them // to calculate the timestamp of each frame later. // Loop through the video and load each frame as a Bitmap object. // Convert the Android’s Bitmap object to a MediaPipe’s Image object. Image mpImage = new BitmapImageBuilder(frame).build();
Live streaming
import com.google.mediapipe.framework.image.MediaImageBuilder; import com.google.mediapipe.framework.image.MPImage; // Create a CameraX’s ImageAnalysis to continuously receive frames // from the device’s camera. Configure it to output frames in RGBA_8888 // format to match with what is required by the model. // For each Android’s ImageProxy object received from the ImageAnalysis, // extract the encapsulated Android’s Image object and convert it to // a MediaPipe’s Image object. android.media.Image mediaImage = imageProxy.getImage() Image mpImage = new MediaImageBuilder(mediaImage).build();
Nel codice di esempio del classificatore di immagini, la preparazione dei dati viene gestita nel file ImageClassifierHelper.kt
.
Esegui l'attività
Per attivare le inferenze, puoi chiamare la funzione classify
corrispondente alla modalità di esecuzione. L'API Image Classifier restituisce le possibili categorie per l'oggetto all'interno dell'immagine o dell'inquadratura di input.
Immagine
ImageClassifierResult classifierResult = imageClassifier.classify(image);
Video
// Calculate the timestamp in milliseconds of the current frame. long frame_timestamp_ms = 1000 * video_duration * frame_index / frame_count; // Run inference on the frame. ImageClassifierResult classifierResult = imageClassifier.classifyForVideo(image, frameTimestampMs);
Live streaming
// Run inference on the frame. The classifications results will be available // via the `resultListener` provided in the `ImageClassifierOptions` when // the image classifier was created. imageClassifier.classifyAsync(image, frameTimestampMs);
Tieni presente quanto segue:
- Quando esegui l'operazione in modalità video o live streaming, devi anche fornire il timestamp del frame di input all'attività di classificazione delle immagini.
- Quando viene eseguita in modalità immagine o video, l'attività Image Classifier blocca il thread corrente fino al termine dell'elaborazione dell'immagine o del frame di input. Per evitare di bloccare l'interfaccia utente, esegui l'elaborazione in un THREAD in background.
- Quando viene eseguita in modalità live streaming, l'attività di classificazione delle immagini non blocca il thread corrente, ma restituisce immediatamente. Evocherà il suo ascoltatore dei risultati con il risultato del rilevamento ogni volta che ha terminato l'elaborazione di un frame di input. Se la funzione
classifyAsync
viene chiamata quando l'attività Classificatore di immagini è impegnata a elaborare un altro frame, l'attività ignora il nuovo frame di input.
Nel codice di esempio di Image Classifier, le funzioni classify
sono definite nel file ImageClassifierHelper.kt
.
Gestire e visualizzare i risultati
Dopo l'esecuzione dell'inferenza, l'attività Image Classifier restituisce un oggetto ImageClassifierResult
contenente l'elenco delle possibili categorie per gli oggetti all'interno dell'immagine o del frame di input.
Di seguito è riportato un esempio dei dati di output di questa attività:
ImageClassifierResult:
Classifications #0 (single classification head):
head index: 0
category #0:
category name: "/m/01bwb9"
display name: "Passer domesticus"
score: 0.91406
index: 671
category #1:
category name: "/m/01bwbt"
display name: "Passer montanus"
score: 0.00391
index: 670
Questo risultato è stato ottenuto eseguendo il classificatore di uccelli su:
Nel codice di esempio di Image Classifier, la classe ClassificationResultsAdapter
nel file ClassificationResultsAdapter.kt
gestisce i risultati:
fun updateResults(imageClassifierResult: ImageClassifierResult? = null) {
categories = MutableList(adapterSize) { null }
if (imageClassifierResult != null) {
val sortedCategories = imageClassifierResult.classificationResult()
.classifications()[0].categories().sortedBy { it.index() }
val min = kotlin.math.min(sortedCategories.size, categories.size)
for (i in 0 until min) {
categories[i] = sortedCategories[i]
}
}
}