L'attività MediaPipe Object Detector consente di rilevare la presenza e la posizione di più classi di oggetti. Queste istruzioni mostrano come utilizzare il compito Rilevatore di oggetti in Python. L'esempio di codice descritto in queste istruzioni è disponibile su GitHub.
Puoi vedere questa operazione in azione guardando la demo web. Per saperne di più sulle funzionalità, sui modelli e sulle opzioni di configurazione di questa attività, consulta la Panoramica.
Esempio di codice
Il codice di esempio per il Rilevamento di oggetti fornisce un'implementazione completa di questa attività in Python come riferimento. Questo codice ti aiuta a testare questa attività e a iniziare a creare la tua app di classificazione del testo. Puoi visualizzare, eseguire e modificare il codice di esempio di Rilevamento oggetti utilizzando solo il browser web.
Se stai implementando il Rilevamento di oggetti per Raspberry Pi, consulta l'app di esempio per Raspberry Pi.
Configurazione
Questa sezione descrive i passaggi chiave per configurare l'ambiente di sviluppo e i progetti di codice in modo specifico per utilizzare Rilevamento oggetti. 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 Python.
Pacchetti
L'attività Rilevamento oggetti richiede il pacchetto pip mediapipe. Puoi installare i pacchetti richiesti con i seguenti comandi:
$ python -m pip install mediapipe
Importazioni
Importa le seguenti classi per accedere alle funzioni dell'attività Rilevamento oggetti:
import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import vision
Modello
L'attività MediaPipe Object Detector richiede un modello addestrato compatibile con questa attività. Per ulteriori informazioni sui modelli addestrati disponibili per Rilevamento di oggetti, consulta la sezione Modelli della panoramica dell'attività.
Seleziona e scarica un modello, quindi archivialo in una directory locale:
model_path = '/absolute/path/to/lite-model_efficientdet_lite0_detection_metadata_1.tflite'
Utilizza il parametro BaseOptions
dell'oggetto model_asset_path
per specificare il percorso
del modello da utilizzare. Per un esempio di codice, consulta la sezione successiva.
Crea l'attività
Utilizza la funzione create_from_options
per creare l'attività. La funzione
create_from_options
accetta opzioni di configurazione, tra cui la modalità di esecuzione, la lingua dei nomi visualizzati, il numero massimo di risultati, la soglia di attendibilità, la lista consentita delle categorie e la lista di rifiuto. Se non imposti un'opzione di configurazione,
la task utilizza il valore predefinito. Per ulteriori informazioni sulle opzioni di configurazione, consulta la sezione Opzioni di configurazione.
L'attività Rilevamento oggetti supporta diversi tipi di dati di input: immagini fisse, file video e stream video dal vivo. Scegli la scheda corrispondente al tipo di dati di input per scoprire come creare l'attività ed eseguire l'inferenza.
Immagine
import mediapipe as mp BaseOptions = mp.tasks.BaseOptions ObjectDetector = mp.tasks.vision.ObjectDetector ObjectDetectorOptions = mp.tasks.vision.ObjectDetectorOptions VisionRunningMode = mp.tasks.vision.RunningMode options = ObjectDetectorOptions( base_options=BaseOptions(model_asset_path='/path/to/model.tflite'), max_results=5, running_mode=VisionRunningMode.IMAGE) with ObjectDetector.create_from_options(options) as detector: # The detector is initialized. Use it here. # ...
Video
import mediapipe as mp BaseOptions = mp.tasks.BaseOptions ObjectDetector = mp.tasks.vision.ObjectDetector ObjectDetectorOptions = mp.tasks.vision.ObjectDetectorOptions VisionRunningMode = mp.tasks.vision.RunningMode options = ObjectDetectorOptions( base_options=BaseOptions(model_asset_path='/path/to/model.tflite'), max_results=5, running_mode=VisionRunningMode.VIDEO) with ObjectDetector.create_from_options(options) as detector: # The detector is initialized. Use it here. # ...
Live streaming
import mediapipe as mp BaseOptions = mp.tasks.BaseOptions DetectionResult = mp.tasks.components.containers.detections.DetectionResult ObjectDetector = mp.tasks.vision.ObjectDetector ObjectDetectorOptions = mp.tasks.vision.ObjectDetectorOptions VisionRunningMode = mp.tasks.vision.RunningMode def print_result(result: DetectionResult, output_image: mp.Image, timestamp_ms: int): print('detection result: {}'.format(result)) options = ObjectDetectorOptions( base_options=BaseOptions(model_asset_path='/path/to/model.tflite'), running_mode=VisionRunningMode.LIVE_STREAM, max_results=5, result_callback=print_result) with ObjectDetector.create_from_options(options) as detector: # The detector is initialized. Use it here. # ...
Per un esempio completo di creazione di un Rilevamento oggetti da utilizzare con un'immagine, consulta l'esempio di codice.
Opzioni di configurazione
Questa attività ha le seguenti opzioni di configurazione per le applicazioni Python:
Nome opzione | Descrizione | Intervallo di valori | Valore predefinito |
---|---|---|---|
running_mode |
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 |
display_names |
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 |
max_results |
Imposta il numero massimo facoltativo di risultati di rilevamento con il punteggio più alto da restituire. | Qualsiasi numero positivo | -1 (vengono restituiti tutti i risultati) |
score_threshold |
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 |
category_allowlist |
Imposta l'elenco facoltativo dei nomi delle categorie consentite. Se non è vuoto,
i risultati di rilevamento 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 category_denylist e l'utilizzo di entrambe genera un errore. |
Qualsiasi stringa | Non impostato |
category_denylist |
Imposta l'elenco facoltativo dei nomi di categorie non consentiti. Se non è vuoto, i risultati di rilevamento 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 category_allowlist e l'utilizzo di entrambe genera un errore. |
Qualsiasi stringa | Non impostato |
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.
Gli esempi riportati di seguito 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 una delle funzioni di rilevamento per attivare le inferenze. L'attività ObjectDetector restituirà gli oggetti rilevati all'interno dell'immagine o del frame di input.
Immagine
# Perform object detection on the provided single image. detection_result = detector.detect(mp_image)
Video
# Calculate the timestamp of the current frame frame_timestamp_ms = 1000 * frame_index / video_file_fps # Perform object detection on the video frame. detection_result = detector.detect_for_video(mp_image, frame_timestamp_ms)
Live streaming
# Send the latest frame to perform object detection. # Results are sent to the `result_callback` provided in the `ObjectDetectorOptions`. detector.detect_async(mp_image, frame_timestamp_ms)
Per un esempio completo di esecuzione di un Rilevamento oggetti su un'immagine, consulta l'esempio di codice per maggiori dettagli.
Tieni presente quanto segue:
- Quando esegui l'analisi in modalità video o live streaming, devi anche fornire all'attività di rilevamento degli oggetti il timestamp del frame di input.
- Quando viene eseguito nel modello di immagine o video, il compito del rilevatore di oggetti blocca il thread corrente fino al termine dell'elaborazione dell'immagine o del frame di input.
- Quando viene eseguita in modalità live streaming, l'attività di rilevamento degli oggetti 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 di rilevamento viene chiamata quando l'attività di rilevamento degli oggetti è impegnata a elaborare un altro frame, il nuovo frame di input verrà ignorato.
Gestire e visualizzare i risultati
Dopo aver eseguito l'inferenza, l'attività Rilevamento oggetti restituisce un oggetto ObjectDetectionResult
che descrive gli oggetti trovati nell'immagine di input.
Di seguito è riportato un esempio dei dati di output di questa attività:
ObjectDetectorResult:
Detection #0:
Box: (x: 355, y: 133, w: 190, h: 206)
Categories:
index : 17
score : 0.73828
class name : dog
Detection #1:
Box: (x: 103, y: 15, w: 138, h: 369)
Categories:
index : 17
score : 0.73047
class name : dog
L'immagine seguente mostra una visualizzazione dell'output dell'attività:
Il codice di esempio di Rilevamento oggetti mostra come visualizzare i risultati di rilevamento restituiti dall'attività. Per maggiori dettagli, consulta l'esempio di codice.