Transformers documentation
Classificação de imagens zero-shot
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]" pillowPipeline 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
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
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'}]