Guida al rilevamento di oggetti per Python

L'attività di rilevamento di oggetti MediaPipe consente di rilevare la presenza e la posizione di e classi di oggetti. Queste istruzioni mostrano come utilizzare il rilevatore di oggetti dell'attività in Python. L'esempio di codice descritto in queste istruzioni è disponibile su GitHub.

Puoi vedere questa attività in azione visualizzando la demo web. Per ulteriori informazioni su funzionalità, modelli di questa attività, consulta la Panoramica.

Esempio di codice

Il codice di esempio per il rilevatore di oggetti fornisce un'implementazione completa un'attività in Python come riferimento. Questo codice ti consente di testare l'attività e ottenere a creare la tua app di classificazione del testo. Puoi visualizzare, eseguire Modificare il codice di esempio del rilevatore di oggetti usando solo il browser web.

Se implementi il rilevatore di oggetti per Raspberry Pi, consulta le Esempio di Raspberry Pi Google Cloud.

Configurazione

Questa sezione descrive i passaggi chiave per configurare l'ambiente di sviluppo e di codice per usare in modo specifico l'utilizzo del rilevatore di oggetti. Per informazioni generali su configurare l'ambiente di sviluppo per l'utilizzo delle attività di MediaPipe, tra cui: i requisiti di versione della piattaforma, consulta Guida alla configurazione per Python.

Pacchetti

L'attività Rilevamento di oggetti richiede il pacchetto pip mediapipe. Puoi installare dei pacchetti richiesti con i seguenti comandi:

$ python -m pip install mediapipe

Importazioni

Importa le seguenti classi per accedere alle funzioni attività di rilevamento di oggetti:

import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import vision

Modello

L'attività di rilevamento di oggetti MediaPipe richiede un modello addestrato che sia compatibile con dell'attività. Per ulteriori informazioni sui modelli addestrati disponibili per il rilevatore di oggetti, consulta la panoramica delle attività nella sezione Modelli.

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 model_asset_path dell'oggetto BaseOptions 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 La funzione create_from_options accetta le opzioni di configurazione, inclusa l'esecuzione modalità, nomi visualizzati, impostazioni internazionali, numero massimo di risultati, soglia di confidenza, categorie consentite e bloccate. Se non imposti un'opzione di configurazione, utilizza il valore predefinito. Per ulteriori informazioni sulle opzioni di configurazione, consulta la sezione Opzioni di configurazione.

L'attività Rilevamento di oggetti supporta diversi tipi di dati di input: immagini fisse, video e stream video in diretta. Scegli la scheda corrispondente ai dati di input per vedere 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 della creazione di un rilevatore di oggetti da utilizzare con un'immagine, consulta la sezione 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 tipi di 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 input dati, ad esempio quelli di una videocamera. In questa modalità, resultListener deve essere per impostare un listener in modo che riceva risultati in modo asincrono.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
display_names Imposta la lingua delle etichette da utilizzare per i nomi visualizzati forniti nel metadati del modello dell'attività, se disponibili. Il valore predefinito è en per 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 del rilevamento con il punteggio più alto su per tornare indietro. Qualsiasi numero positivo -1 (vengono restituiti tutti i risultati)
score_threshold Imposta la soglia del punteggio di previsione che sostituisce quella fornita in gli eventuali metadati del modello. I risultati al di sotto di questo valore vengono rifiutati. Qualsiasi numero in virgola mobile Non impostato
category_allowlist Consente di impostare l'elenco facoltativo di nomi di categorie consentiti. Se il campo non è vuoto, i risultati del rilevamento con nome categoria non incluso in questo set saranno esclusi. I nomi di categorie duplicati o sconosciuti vengono ignorati. Questa opzione si esclude a vicenda con category_denylist e utilizza entrambi generano un errore. Qualsiasi stringa Non impostato
category_denylist Consente di impostare un elenco facoltativo di nomi di categorie non consentiti. Se non è vuoto, i risultati del rilevamento con nome della categoria incluso in questo set verranno filtrati fuori. I nomi di categorie duplicati o sconosciuti vengono ignorati. Questa opzione è reciproca è esclusivo con category_allowlist e l'utilizzo di entrambi genera un errore. Qualsiasi stringa Non impostato

Preparazione dei dati

Prepara l'input come file immagine o array numpy, e poi convertilo in un oggetto mediapipe.Image. Se l'input è un file video o trasmettere in live streaming da webcam, puoi utilizzare una raccolta esterna come OpenCV per caricare i frame di input come numpy di grandi dimensioni.

I seguenti esempi spiegano e mostrano come preparare i dati per il trattamento per ognuno 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'oggetto L'attività di rilevamento 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 dell'esecuzione di un rilevatore di oggetti su un'immagine, consulta esempio di codice per maggiori dettagli.

Tieni presente quanto segue:

  • Quando è attiva la modalità video o live streaming, devi anche fornisce all'attività di rilevamento di oggetti il timestamp del frame di input.
  • Quando viene eseguita nell'immagine o nel modello video, l'attività Rilevamento di oggetti bloccare il thread corrente finché non termina di elaborare l'immagine di input o frame.
  • Durante l'esecuzione in modalità live streaming, l'attività Rilevamento di oggetti non blocca il thread corrente, ma restituisce immediatamente. Richiamerà il suo risultato con il risultato del rilevamento ogni volta che termina l'elaborazione di un frame di input. Se la funzione di rilevamento viene chiamata quando l'attività Rilevamento di oggetti è impegnato a elaborare un altro frame, il nuovo frame di input verrà ignorato.

Gestire e visualizzare i risultati

Dopo l'esecuzione dell'inferenza, l'attività Rilevamento di oggetti restituisce un Oggetto ObjectDetectionResult che descrive gli oggetti che ha trovato l'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 del rilevatore di oggetti dimostra come visualizzare il rilevamento i risultati restituiti dall'attività, controlla esempio di codice per maggiori dettagli.