A tarefa do MediaPipe Object Detector permite detectar a presença e a localização de várias classes de objetos. Estas instruções mostram como usar a tarefa do Detector de objetos em Python. O exemplo de código descrito nestas instruções está disponível no GitHub.
Confira esta tarefa em ação na demonstração na Web. Para mais informações sobre os recursos, modelos e opções de configuração desta tarefa, consulte a Visão geral.
Exemplo de código
O código de exemplo do Detector de objetos oferece uma implementação completa dessa tarefa em Python para sua referência. Esse código ajuda a testar essa tarefa e a começar a criar seu próprio app de classificação de texto. É possível visualizar, executar e editar o código de exemplo do detector de objetos usando apenas o navegador da Web.
Se você estiver implementando o detector de objetos para Raspberry Pi, consulte o app de exemplo do Raspberry Pi.
Configuração
Esta seção descreve as principais etapas para configurar seu ambiente de desenvolvimento e projetos de código especificamente para usar o Detector de objetos. Para informações gerais sobre como configurar o ambiente de desenvolvimento para usar as tarefas do MediaPipe, incluindo os requisitos da versão da plataforma, consulte o Guia de configuração para Python.
Pacotes
A tarefa do detector de objetos exige o pacote mediapipe pip. É possível instalar os pacotes necessários com os seguintes comandos:
$ python -m pip install mediapipe
Importações
Importe as classes a seguir para acessar as funções de tarefa do Detector de objetos:
import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import vision
Modelo
A tarefa do MediaPipe Object Detector requer um modelo treinado compatível com essa tarefa. Para mais informações sobre os modelos treinados disponíveis para o Detector de objetos, consulte a seção "Modelos" da visão geral da tarefa.
Selecione e faça o download de um modelo e o armazene em um diretório local:
model_path = '/absolute/path/to/lite-model_efficientdet_lite0_detection_metadata_1.tflite'
Use o parâmetro model_asset_path
do objeto BaseOptions
para especificar o caminho
do modelo a ser usado. Para conferir um exemplo de código, consulte a próxima seção.
Criar a tarefa
Use a função create_from_options
para criar a tarefa. A
função create_from_options
aceita opções de configuração, incluindo modo de
execução, localidade de nomes de exibição, número máximo de resultados, limite de confiança, lista de permissões de categoria e lista de rejeição. Se você não definir uma opção de configuração,
a tarefa vai usar o valor padrão. Para mais informações sobre as opções de configuração,
consulte a seção Opções de configuração.
A tarefa do detector de objetos oferece suporte a vários tipos de dados de entrada: imagens estáticas, arquivos de vídeo e transmissões de vídeo ao vivo. Escolha a guia correspondente ao tipo de dados de entrada para saber como criar a tarefa e executar a inferência.
Imagem
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. # ...
Vídeo
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. # ...
Transmissão ao vivo
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. # ...
Para conferir um exemplo completo de como criar um detector de objetos para uso com uma imagem, consulte o exemplo de código.
Opções de configuração
Esta tarefa tem as seguintes opções de configuração para aplicativos Python:
Nome da opção | Descrição | Intervalo de valor | Valor padrão |
---|---|---|---|
running_mode |
Define o modo de execução da tarefa. Há três
modos: IMAGE: o modo para entradas de imagem única. VÍDEO: o modo para quadros decodificados de um vídeo. LIVE_STREAM: o modo de uma transmissão ao vivo de dados de entrada, como de uma câmera. Nesse modo, o resultListener precisa ser chamado para configurar um listener para receber resultados de forma assíncrona. |
{IMAGE, VIDEO, LIVE_STREAM } |
IMAGE |
display_names |
Define o idioma dos rótulos a serem usados para os nomes de exibição fornecidos nos metadados do modelo da tarefa, se disponível. O padrão é en para
o inglês. É possível adicionar rótulos localizados aos metadados de um modelo personalizado
usando a API Writer de metadados do TensorFlow Lite.
|
Código de localidade | en |
max_results |
Define o número máximo opcional de resultados de detecção com a maior pontuação a serem retornados. | Qualquer número positivo | -1 (todos os resultados são retornados) |
score_threshold |
Define o limite de pontuação de previsão que substitui o fornecido nos metadados do modelo (se houver). Resultados abaixo desse valor são rejeitados. | Qualquer ponto flutuante | Não definido |
category_allowlist |
Define a lista opcional de nomes de categorias permitidos. Se não estiver vazio,
os resultados de detecção cujo nome da categoria não estiver neste conjunto serão
filtrados. Nomes de categorias duplicados ou desconhecidos são ignorados.
Essa opção é mutuamente exclusiva com category_denylist , e o uso
de ambas resulta em um erro. |
Qualquer string | Não definido |
category_denylist |
Define a lista opcional de nomes de categorias não permitidos. Se
não estiver vazio, os resultados de detecção cujo nome de categoria estiver neste conjunto serão filtrados. Nomes de categorias duplicados ou desconhecidos são ignorados. Essa opção é mutuamente
exclusiva de category_allowlist , e o uso das duas resulta em um erro. |
Qualquer string | Não definido |
Preparar dados
Prepare a entrada como um arquivo de imagem ou uma matriz NumPy
e converta-a em um objeto mediapipe.Image
. Se a entrada for um arquivo de vídeo
ou uma transmissão ao vivo de uma webcam, use uma biblioteca externa, como o
OpenCV, para carregar os frames de entrada como matrizes
numpy.
Os exemplos a seguir explicam e mostram como preparar dados para processamento para cada um dos tipos de dados disponíveis:
Imagem
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)
Vídeo
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)
Transmissão ao vivo
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)
Executar a tarefa
É possível chamar uma das funções de detecção para acionar inferências. A tarefa do detector de objetos vai retornar os objetos detectados na imagem ou no frame de entrada.
Imagem
# Perform object detection on the provided single image. detection_result = detector.detect(mp_image)
Vídeo
# 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)
Transmissão ao vivo
# 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)
Para conferir um exemplo completo de execução de um detector de objetos em uma imagem, consulte o exemplo de código.
Observe o seguinte:
- Ao executar no modo de vídeo ou de transmissão ao vivo, também é necessário fornecer à tarefa do detector de objetos o carimbo de data/hora do frame de entrada.
- Ao ser executada no modelo de imagem ou vídeo, a tarefa do detector de objetos bloqueia a linha de execução atual até que ela termine de processar a imagem de entrada ou o frame.
- Quando executada no modo de transmissão ao vivo, a tarefa do Detector de objetos não bloqueia a linha de execução atual, mas retorna imediatamente. Ele vai invocar o listener de resultado com o resultado da detecção sempre que terminar de processar um frame de entrada. Se a função de detecção for chamada quando a tarefa do Detector de objetos estiver ocupada processando outro frame, o novo frame de entrada será ignorado.
Processar e mostrar resultados
Ao executar a inferência, a tarefa do detector de objetos retorna um
objeto ObjectDetectionResult
que descreve os objetos encontrados na
imagem de entrada.
Confira a seguir um exemplo dos dados de saída desta tarefa:
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
A imagem a seguir mostra uma visualização da saída da tarefa:
O código de exemplo do Detector de objetos demonstra como mostrar os resultados de detecção retornados pela tarefa. Consulte o exemplo de código para mais detalhes.