L'attività Classificatore di immagini di MediaPipe consente di eseguire la classificazione sulle immagini. Puoi utilizzare questa attività per identificare ciò che un'immagine rappresenta in un insieme di categorie definite durante l'addestramento. Queste istruzioni mostrano come usare il classificatore di immagini con Python.
Puoi vedere questa attività in azione visualizzando 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 per Image Classifier fornisce un'implementazione completa di questa attività in Python come riferimento. Questo codice ti consente di testare l'attività e iniziare a creare il tuo classificatore di immagini. Puoi visualizzare, eseguire e modificare il codice di esempio del classificatore di immagini utilizzando semplicemente il tuo browser web.
Se implementi il classificatore di immagini per Raspberry Pi, consulta l'app di esempio per Raspberry Pi.
Imposta
Questa sezione descrive i passaggi chiave per configurare l'ambiente di sviluppo e i progetti di codice per l'utilizzo specifico del classificatore di immagini. Per informazioni generali sulla configurazione dell'ambiente di sviluppo per l'utilizzo delle attività MediaPipe, inclusi i requisiti di versione della piattaforma, consulta la Guida alla configurazione per Python.
Pacchetti
Il classificatore di immagini esegue l'attività relativa al pacchetto pip mediapipe. Puoi installare la dipendenza con quanto segue:
$ python -m pip install mediapipe
``` ### Imports
Import the following classes to access the Image Classifier task functions:
```python
import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import vision
Modello
L'attività classificatore di immagini MediaPipe richiede un modello addestrato compatibile con questa attività. Per maggiori informazioni sui modelli addestrati disponibili per il classificatore di immagini, consulta la panoramica delle attività nella sezione Modelli.
Seleziona e scarica un modello, quindi archivialo in una directory locale. Puoi utilizzare il modello consigliato EfficientNet-Lite0.
model_path = '/absolute/path/to/efficientnet_lite0_int8_2.tflite'
Specifica il percorso del modello all'interno del parametro Model Name, come mostrato di seguito:
base_options = BaseOptions(model_asset_path=model_path)
Crea l'attività
Utilizza la funzione create_from_options
per creare l'attività. La funzione create_from_options
accetta opzioni di configurazione, tra cui modalità di esecuzione, impostazioni internazionali dei nomi visualizzati, numero massimo di risultati, soglia di confidenza, elenco di categorie consentite e lista bloccata. Per ulteriori informazioni sulle opzioni di configurazione, consulta Panoramica della configurazione.
L'attività Classificatore di immagini supporta tre tipi di dati di input: immagini fisse, file video e stream video in diretta. Scegli la scheda corrispondente al tipo di dati di input per vedere come creare l'attività ed eseguire l'inferenza.
Immagine
import mediapipe as mp BaseOptions = mp.tasks.BaseOptions ImageClassifier = mp.tasks.vision.ImageClassifier ImageClassifierOptions = mp.tasks.vision.ImageClassifierOptions VisionRunningMode = mp.tasks.vision.RunningMode options = ImageClassifierOptions( base_options=BaseOptions(model_asset_path='/path/to/model.tflite'), max_results=5, running_mode=VisionRunningMode.IMAGE) with ImageClassifier.create_from_options(options) as classifier: # The classifier is initialized. Use it here. # ...
Video
import mediapipe as mp BaseOptions = mp.tasks.BaseOptions ImageClassifier = mp.tasks.vision.ImageClassifier ImageClassifierOptions = mp.tasks.vision.ImageClassifierOptions VisionRunningMode = mp.tasks.vision.RunningMode options = ImageClassifierOptions( base_options=BaseOptions(model_asset_path='/path/to/model.tflite'), max_results=5, running_mode=VisionRunningMode.VIDEO) with ImageClassifier.create_from_options(options) as classifier: # The classifier is initialized. Use it here. # ...
Live streaming
import mediapipe as mp BaseOptions = mp.tasks.BaseOptions ImageClassifierResult = mp.tasks.vision.ImageClassifier.ImageClassifierResult ImageClassifier = mp.tasks.vision.ImageClassifier ImageClassifierOptions = mp.tasks.vision.ImageClassifierOptions VisionRunningMode = mp.tasks.vision.RunningMode def print_result(result: ImageClassifierResult, output_image: mp.Image, timestamp_ms: int): print('ImageClassifierResult result: {}'.format(result)) options = ImageClassifierOptions( base_options=BaseOptions(model_asset_path='/path/to/model.tflite'), running_mode=VisionRunningMode.LIVE_STREAM, max_results=5, result_callback=print_result) with ImageClassifier.create_from_options(options) as classifier: # The classifier is initialized. Use it here. # ...
Per un esempio completo della creazione di un classificatore di immagini da utilizzare con un'immagine, vedi l'esempio di codice.
Opzioni di configurazione
Questa attività include le seguenti opzioni di configurazione per le applicazioni Python:
Nome opzione | Descrizione | Intervallo di valori | Valore predefinito |
---|---|---|---|
running_mode |
Imposta la modalità di esecuzione per l'attività. Esistono tre
modalità: IMAGE: la modalità per gli input di immagini singole. 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 impostare un listener in modo da ricevere i risultati in modo asincrono. |
{IMAGE, VIDEO, LIVE_STREAM } |
IMAGE |
display_names_locale |
Imposta la lingua delle etichette da utilizzare per i nomi visualizzati forniti nei metadati del modello dell'attività, se disponibili. Il valore predefinito è en per l'inglese. Puoi aggiungere etichette localizzate ai metadati di un modello personalizzato utilizzando l'API TensorFlow Metadata Writer |
Codice impostazioni internazionali | it |
max_results |
Imposta il numero massimo facoltativo di risultati della classificazione con il punteggio più alto da restituire. Se < 0, vengono restituiti tutti i risultati disponibili. | Qualsiasi numero positivo | -1 |
score_threshold |
Imposta la soglia del punteggio della previsione che sostituisce quella fornita nei metadati del modello (se presente). I risultati al di sotto di questo valore vengono rifiutati. | Qualsiasi numero in virgola mobile | Non impostata |
category_allowlist |
Consente di impostare l'elenco facoltativo di nomi di categorie consentiti. Se non è vuoto, i risultati della classificazione il cui nome della categoria non è incluso in questo set verranno filtrati. I nomi di categorie duplicati o sconosciuti vengono ignorati.
Questa opzione si esclude a vicenda con category_denylist e utilizza
entrambi i risultati in un errore. |
Qualsiasi stringa | Non impostata |
category_denylist |
Consente di impostare un elenco facoltativo di nomi di categorie non consentiti. Se il campo non è vuoto, i risultati della classificazione con nome della categoria incluso in questo set verranno filtrati. I nomi di categorie duplicati o sconosciuti vengono ignorati. Questa opzione si esclude a vicenda con category_allowlist e utilizza entrambi i risultati in un errore. |
Qualsiasi stringa | Non impostata |
result_callback |
Imposta il listener dei risultati in modo che riceva i risultati della classificazione
in modo asincrono quando il classificatore di immagini è in modalità
live streaming. Può essere utilizzato solo quando la modalità di corsa è impostata su LIVE_STREAM |
N/A | Non impostata |
preparazione dei dati
Prepara l'input come file immagine o array numpy, quindi convertilo in un
oggetto mediapipe.Image
. Se l'input è un file video o un live streaming da una
webcam, puoi utilizzare una libreria esterna come
OpenCV per caricare i frame di input come
array numpy.
I seguenti esempi spiegano e mostrano come preparare i dati per l'elaborazione per ciascuno dei tipi di dati disponibili
Immagine
import mediapipe as mp # Load the input image from an image file. mp_image = mp.Image.create_from_file('/path/to/image') # Load the input image from a numpy array. mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=numpy_image)
Video
import mediapipe as mp # Use OpenCV’s VideoCapture to load the input video. # Load the frame rate of the video using OpenCV’s CV_CAP_PROP_FPS # You’ll need it to calculate the timestamp for each frame. # Loop through each frame in the video using VideoCapture#read() # Convert the frame received from OpenCV to a MediaPipe’s Image object. mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=numpy_frame_from_opencv)
Live streaming
import mediapipe as mp # Use OpenCV’s VideoCapture to start capturing from the webcam. # Create a loop to read the latest frame from the camera using VideoCapture#read() # Convert the frame received from OpenCV to a MediaPipe’s Image object. mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=numpy_frame_from_opencv)
Esegui l'attività
Puoi chiamare la funzione di classificazione corrispondente alla tua modalità di esecuzione per attivare le inferenze. L'API Image Classifier restituirà le possibili categorie per l'oggetto all'interno dell'immagine o del frame di input.
Immagine
# Perform image classification on the provided single image. classification_result = classifier.classify(mp_image)
Video
# Calculate the timestamp of the current frame frame_timestamp_ms = 1000 * frame_index / video_file_fps # Perform image classification on the video frame. classification_result = classifier.classify_for_video(mp_image, frame_timestamp_ms)
Live streaming
# Send the latest frame to perform image classification. # Results are sent to the `result_callback` provided in the `ImageClassifierOptions`. classifier.classify_async(mp_image, frame_timestamp_ms)
Tieni presente quanto riportato di seguito:
- Quando utilizzi la modalità video o live streaming, devi anche fornire all'attività di classificazione delle immagini il timestamp del frame di input.
- Quando viene eseguita nell'immagine o nel modello video, l'attività Classificatore di immagini blocca il thread corrente fino a quando non termina l'elaborazione dell'immagine o del frame di input.
- Quando viene eseguita in modalità live streaming, l'attività Classificatore di immagini non blocca
il thread corrente, ma restituisce immediatamente. Richiamo il proprio listener
con il risultato della classificazione ogni volta che termina
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.
Per un esempio completo della creazione di un classificatore di immagini da utilizzare con un'immagine, vedi l'esempio di codice.
Gestire e visualizzare i risultati
Dopo l'esecuzione dell'inferenza, l'attività Classificatore di immagini restituisce un oggetto ImageClassifierResult
che contiene l'elenco di 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 la classe Bird Classifier su:
Il codice di esempio del classificatore di immagini mostra come visualizzare i risultati della classificazione restituiti dall'attività. Per i dettagli, consulta l'esempio di codice.