Guia de classificação de imagens para Python

A tarefa do MediaPipe Image Classifier permite que você faça a classificação de imagens. Você pode usar essa tarefa para identificar o que uma imagem representa entre um conjunto de categorias definidas no momento do treinamento. Estas instruções mostram como usar o classificador de imagem com Python.

Para ver essa tarefa em ação, visualizando o demonstração. Para mais informações sobre os recursos, modelos e opções de configuração do para esta tarefa, consulte a Visão geral.

Exemplo de código

O código de exemplo para o Image Classifier fornece uma implementação completa deste em Python para sua referência. Esse código ajuda a testar a tarefa começou a criar seu próprio classificador de imagens. É possível exibir, executar e editar Exemplo de classificador de imagem código usando apenas seu navegador da Web.

Se você estiver implementando o classificador de imagem para o Raspberry Pi, consulte a Exemplo do Raspberry Pi app.

Configuração

Esta seção descreve 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 a configuração do 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 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 na seção de visão geral da tarefa Modelos.

Selecione e faça o download de um modelo e armazene-o em um diretório local. Você pode usar o padrão EffectiveNet-Lite0 (link em inglês) um modelo de machine learning.

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 A função create_from_options aceita opções de configuração, incluindo modo, nome de exibição, localidade, número máximo de resultados, limite de confiança, lista de permissões e de bloqueio. Para mais informações sobre configurações opções, 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 e arquivos de vídeo e transmissões de vídeo ao vivo. Escolha a guia correspondente ao tipo dos dados de entrada para você vai aprender a 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 ver um exemplo completo de como criar um classificador de imagem para uso com uma imagem, consulte o código exemplo.

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. Existem 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 transmissão ao vivo da entrada dados de uma câmera, por exemplo. Neste modo, resultListener deve ser chamado para configurar um listener e receber resultados de forma assíncrona.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
display_names_locale Define o idioma dos rótulos a serem usados para nomes de exibição fornecidos no 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 Metadata Writer do TensorFlow Lite; Código da localidade en
max_results Define o número máximo opcional de resultados da classificação com maior pontuação como voltar. Se < 0, todos os resultados disponíveis serão retornados. Qualquer número positivo -1
score_threshold Define o limite de pontuação da previsão que substitui o fornecido no os 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, resultados de classificação cujo nome de categoria não esteja neste conjunto serão que foram filtradas. Nomes de categorias duplicados ou desconhecidos são ignorados. Essa opção é mutuamente exclusiva com category_denylist e usando os dois resultarão 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 vazio, os resultados de classificação cujo nome de categoria estiver neste conjunto serão filtrados para fora. Nomes de categorias duplicados ou desconhecidos são ignorados. Essa opção é mutuamente exclusivo com category_allowlist e usar ambos resulta em um erro. Qualquer string Não definido
result_callback Define o listener de resultados para receber os resultados da classificação. de forma assíncrona quando o classificador de imagem está na transmissão ao vivo modo Só pode ser usado quando o modo de corrida está definido como LIVE_STREAM N/A Não definido

Preparar dados

Prepare sua entrada como um arquivo de imagem ou uma matriz numpy e, em seguida, converta-a em um mediapipe.Image. Se sua entrada for um arquivo de vídeo ou uma transmissão ao vivo de um webcam, você pode usar uma biblioteca externa, como OpenCV para carregar os frames de entrada como numpy matrizes de dados.

Os exemplos a seguir explicam e mostram como preparar dados para processamento em 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 seu modo de corrida para acionar ou inferências. A API Image Classifier retornará as categorias possíveis para o na imagem ou 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 nos modos de vídeo ou de transmissão ao vivo, você também precisa forneça à tarefa Image Classifier o carimbo de data/hora do frame de entrada.
  • Ao executar na imagem ou no modelo de vídeo, a tarefa Classificador de imagem bloquear a linha de execução atual até que ela termine de processar a imagem de entrada ou frame.
  • Quando a visualização é executada no modo de transmissão ao vivo, a tarefa do classificador de imagem não bloqueia thread atual, mas retorna imediatamente. Ele vai invocar seu resultado listener com o resultado da classificação sempre que ele terminar para processar um frame de entrada. Se a função classifyAsync for chamada quando a tarefa Image Classifier estiver ocupada processando outro frame, a tarefa ignora o novo frame de entrada.

Para ver um exemplo completo de como criar um classificador de imagem para uso com uma imagem, consulte o código exemplo.

Gerenciar e exibir resultados

Ao executar a inferência, a tarefa Classificador de imagem retorna uma Objeto ImageClassifierResult que contém a lista de categorias possíveis para os objetos na imagem ou frame de entrada.

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 Image Classifier demonstra como exibir a classificação resultados retornados da tarefa, consulte o código exemplo para mais detalhes.