A tarefa do MediaPipe Image Classifier permite que você faça a classificação de imagens. É possível usar essa tarefa para identificar o que uma imagem representa entre um conjunto de categorias definidas no tempo de treinamento. Estas instruções mostram como usar o classificador de imagem com Python.
Para saber como essa tarefa funciona, acesse a demonstração na Web. Para mais informações sobre os recursos, modelos e opções de configuração dessa tarefa, consulte a Visão geral.
Exemplo de código
O código de exemplo do Image Classifier fornece uma implementação completa dessa tarefa em Python para sua referência. Esse código ajuda você a testar a tarefa e começar a criar seu próprio classificador de imagens. É possível visualizar, executar e editar o código de exemplo do classificador de imagem usando apenas seu navegador da Web.
Se você estiver implementando o classificador de imagem para o Raspberry Pi, consulte o app de exemplo Raspberry Pi.
Configuração
Nesta seção, descrevemos as principais etapas para configurar seu ambiente de desenvolvimento e projetos de código especificamente para usar o classificador de imagem. Para informações gerais sobre como configurar seu ambiente de desenvolvimento para usar tarefas do MediaPipe, incluindo requisitos de versão da plataforma, consulte o Guia de configuração do Python.
Pacotes
A tarefa do classificador de imagem ao pacote pip mediapipe. É possível instalar a dependência com o seguinte:
$ 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
Modelo
A tarefa do classificador de imagem do MediaPipe requer um modelo treinado que seja compatível com essa tarefa. Para mais informações sobre modelos treinados disponíveis para o classificador de imagem, consulte a visão geral da tarefa seção Modelos.
Selecione e faça o download de um modelo e armazene-o em um diretório local. Você pode usar o modelo EfficientNet-Lite0 recomendado.
model_path = '/absolute/path/to/efficientnet_lite0_int8_2.tflite'
Especifique o caminho do modelo dentro do parâmetro "Nome do modelo", conforme mostrado abaixo:
base_options = BaseOptions(model_asset_path=model_path)
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 o modo de
execução, a localidade dos nomes de exibição, o número máximo de resultados, o limite de confiança, as listas de permissões de categorias e de bloqueio. Para mais informações sobre as opções de configuração, consulte Visão geral da configuração.
A tarefa Classificador de imagem é compatível com três tipos de dados de entrada: imagens estáticas, arquivos de vídeo e streams de vídeo ao vivo. Escolha a guia correspondente ao tipo de dados de entrada para ver como criar a tarefa e executar a inferência.
Imagem
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. # ...
Vídeo
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. # ...
Transmissão ao vivo
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. # ...
Para conferir um exemplo completo de como criar um classificador de imagem para usar 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: IMAGEM: o modo para entradas de imagem única. VÍDEO: é o modo para frames 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, resultListener precisa ser chamado para configurar um listener para receber resultados de forma assíncrona. |
{IMAGE, VIDEO, LIVE_STREAM } |
IMAGE |
display_names_locale |
Define o idioma dos rótulos a serem usados nos nomes de exibição fornecidos nos
metadados do modelo da tarefa, se disponíveis. O padrão é en para
inglês. É possível adicionar rótulos localizados aos metadados de um modelo personalizado
usando a API TensorFlow Lite Metadata Writer. |
Código da localidade | en |
max_results |
Define o número máximo opcional de resultados da classificação com maior pontuação a serem retornados. Se < 0, todos os resultados disponíveis serão retornados. | Qualquer número positivo | -1 |
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 flutuação | Não definido |
category_allowlist |
Define a lista opcional de nomes de categorias permitidos. Se não estiver vazio, os resultados da classificação com nome de categoria que não estiver nesse conjunto serão filtrados. Nomes de categorias duplicados ou desconhecidos são ignorados.
Essa opção é mutuamente exclusiva com category_denylist e usar
os dois resulta em erro. |
Qualquer string | Não definido |
category_denylist |
Define a lista opcional de nomes de categorias que não são permitidos. Se não estiver vazio, os resultados da classificação com um nome de categoria nesse conjunto serão filtrados. Nomes de categorias duplicados ou desconhecidos são ignorados. Essa opção é mutuamente exclusiva com category_allowlist e usar os dois resulta em erro. |
Qualquer string | Não definido |
result_callback |
Define o listener de resultado para receber os resultados da classificação
de forma assíncrona quando o classificador de imagem estiver no modo de transmissão
ao vivo. Só pode ser usado quando o modo de corrida está definido como LIVE_STREAM |
N/A | Não definido |
preparar os dados
Prepare sua 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 OpenCV, para carregar os frames de entrada como matrizes numpy.
Os exemplos a seguir explicam e mostram como preparar dados para processamento de 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 a função de classificação correspondente ao modo de execução para acionar inferências. A API Image Classifier retornará as categorias possíveis para o objeto na imagem ou no frame de entrada.
Imagem
# Perform image classification on the provided single image. classification_result = classifier.classify(mp_image)
Vídeo
# 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)
Transmissão ao vivo
# 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)
Observe o seguinte:
- Ao executar no modo de vídeo ou de transmissão ao vivo, também é necessário fornecer à tarefa do Classificador de imagem o carimbo de data/hora do frame de entrada.
- Quando executada na imagem ou no modelo de vídeo, a tarefa do classificador de imagem bloqueia a linha de execução atual até que ela termine de processar a imagem ou o frame de entrada.
- Quando executada no modo de transmissão ao vivo, a tarefa do classificador de imagem não bloqueia
a linha de execução atual, mas retorna imediatamente. Ele invoca o listener de resultados com o resultado da classificação sempre que termina de processar um frame de entrada. Se a função
classifyAsync
for chamada quando a tarefa do Classificador de imagem estiver ocupada processando outro frame, a tarefa vai ignorar o novo frame de entrada.
Para conferir um exemplo completo de como criar um classificador de imagem para usar com uma imagem, consulte o exemplo de código.
Gerenciar e exibir resultados
Ao executar a inferência, a tarefa do classificador de imagem retorna um
objeto ImageClassifierResult
que contém a lista de categorias possíveis
para os objetos na imagem de entrada ou no frame.
Confira abaixo um exemplo dos dados de saída desta tarefa:
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
Esse resultado foi obtido executando o Bird Classifier em:
O código de exemplo do classificador de imagem demonstra como exibir os resultados de classificação retornados da tarefa. Consulte o exemplo de código para mais detalhes.