Transformers documentation

Classificação de imagens zero-shot

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v5.22.2).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Classificação de imagens zero-shot

A classificação de imagens zero-shot é uma tarefa que envolve classificar imagens em diferentes categorias usando um modelo que não foi explicitamente treinado com dados contendo exemplos rotulados dessas categorias específicas.

Tradicionalmente, a classificação de imagens exige o treinamento de um modelo em um conjunto específico de imagens rotuladas, e esse modelo aprende a “mapear” certas características de imagem para rótulos. Quando surge a necessidade de usar esse modelo para uma tarefa de classificação que introduz um novo conjunto de rótulos, é necessário fazer fine-tuning para “recalibrar” o modelo.

Em contraste, modelos de classificação de imagem zero-shot ou de vocabulário aberto são tipicamente modelos multimodais treinados em um grande conjunto de dados de imagens e descrições associadas. Esses modelos aprendem representações alinhadas de visão e linguagem que podem ser usadas em muitas tarefas de nível inferior, incluindo a classificação de imagem zero-shot.

Essa é uma abordagem mais flexível para classificação de imagens que permite que os modelos generalizem para novas categorias não vistas, sem a necessidade de dados de treinamento adicionais, e permite que os usuários consultem imagens com descrições de texto livre dos seus objetos-alvo.

Neste guia, você aprenderá como:

  • criar um pipeline de classificação de imagem zero-shot
  • executar manualmente a inferência de classificação de imagem zero-shot

Antes de começar, verifique se você tem todas as bibliotecas necessárias instaladas:

pip install -q "transformers[torch]" pillow

Pipeline de classificação de imagens zero-shot

A maneira mais simples de testar a inferência com um modelo que suporta classificação de imagem zero-shot é usar o pipeline() correspondente. Instancie um pipeline a partir de um checkpoint no Hugging Face Hub:

>>> from transformers import pipeline

>>> checkpoint = "openai/clip-vit-large-patch14"
>>> detector = pipeline(model=checkpoint, task="zero-shot-image-classification")

Em seguida, escolha uma imagem que você deseja classificar.

>>> from PIL import Image
>>> import requests

>>> url = "https://unsplash.com/photos/g8oS8-82DxI/download?ixid=MnwxMjA3fDB8MXx0b3BpY3x8SnBnNktpZGwtSGt8fHx8fDJ8fDE2NzgxMDYwODc&force=true&w=640"
>>> image = Image.open(requests.get(url, stream=True).raw)

>>> image
Photo of an owl

Passe a imagem e os rótulos de objetos candidatos para o pipeline. Aqui, passamos a imagem diretamente; outras opções adequadas incluem um caminho local para uma imagem ou uma URL de imagem. Os rótulos candidatos podem ser palavras simples, como neste exemplo, ou mais descritivos.

>>> predictions = detector(image, candidate_labels=["fox", "bear", "seagull", "owl"])
>>> predictions
[{'score': 0.9996670484542847, 'label': 'owl'},
 {'score': 0.000199399160919711, 'label': 'seagull'},
 {'score': 7.392891711788252e-05, 'label': 'fox'},
 {'score': 5.96074532950297e-05, 'label': 'bear'}]

Classificação de imagens zero-shot manualmente

Agora que você viu como usar o pipeline de classificação de imagem zero-shot, vamos ver como executar a classificação de imagem zero-shot manualmente.

Comece carregando o modelo e o processador associado de um checkpoint no Hugging Face Hub. Aqui, usaremos o mesmo checkpoint de antes:

>>> from transformers import AutoProcessor, AutoModelForZeroShotImageClassification

>>> model = AutoModelForZeroShotImageClassification.from_pretrained(checkpoint)
>>> processor = AutoProcessor.from_pretrained(checkpoint)

Vamos usar uma imagem diferente para variar.

>>> from PIL import Image
>>> import requests

>>> url = "https://unsplash.com/photos/xBRQfR2bqNI/download?ixid=MnwxMjA3fDB8MXxhbGx8fHx8fHx8fHwxNjc4Mzg4ODEx&force=true&w=640"
>>> image = Image.open(requests.get(url, stream=True).raw)

>>> image
Photo of a car

Use o processor para preparar as entradas do modelo. O processor combina um image processor que prepara a imagem para o modelo redimensionando e normalizando-a, e um tokenizer que cuida das entradas de texto.

>>> candidate_labels = ["tree", "car", "bike", "cat"]
# follows the pipeline prompt template to get same results
>>> candidate_labels = [f'This is a photo of {label}.' for label in candidate_labels]
>>> inputs = processor(images=image, text=candidate_labels, return_tensors="pt", padding=True)

Passe as entradas pelo modelo e faça o pós-processamento dos resultados:

>>> import torch

>>> with torch.no_grad():
...     outputs = model(**inputs)

>>> logits = outputs.logits_per_image[0]
>>> probs = logits.softmax(dim=-1).numpy()
>>> scores = probs.tolist()

>>> result = [
...     {"score": score, "label": candidate_label}
...     for score, candidate_label in sorted(zip(probs, candidate_labels), key=lambda x: -x[0])
... ]

>>> result
[{'score': 0.998572, 'label': 'car'},
 {'score': 0.0010570387, 'label': 'bike'},
 {'score': 0.0003393686, 'label': 'tree'},
 {'score': 3.1572064e-05, 'label': 'cat'}]
Update on GitHub