Transformers documentation

Clasificación de imágenes sin ejemplos

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

Clasificación de imágenes sin ejemplos

La clasificación de imágenes en modo zero-shot es una tarea que consiste en clasificar imágenes en diferentes categorías utilizando un modelo que no se entrenó explícitamente con datos que contengan ejemplos etiquetados de esas categorías específicas.

Tradicionalmente, la clasificación de imágenes requiere entrenar un modelo en un conjunto específico de imágenes etiquetadas, y este modelo aprende a «mapear» ciertas características de las imágenes a etiquetas. Cuando surge la necesidad de utilizar dicho modelo para una tarea de clasificación que introduce un nuevo conjunto de etiquetas, se requiere un ajuste fino para «recalibrar» el modelo.

En cambio, los modelos de clasificación de imágenes en cero disparos o con vocabulario abierto suelen ser modelos multimodales entrenados en un gran conjunto de datos de imágenes y descripciones asociadas. Estos modelos aprenden representaciones alineadas de visión y lenguaje que pueden utilizarse para muchas tareas posteriores, incluida la clasificación de imágenes en cero disparos.

Este es un enfoque más flexible para la clasificación de imágenes que permite a los modelos generalizar a nuevas categorías no vistas sin necesidad de datos de entrenamiento adicionales y permite a los usuarios consultar imágenes con descripciones de texto libre de sus objetos objetivo.

En esta guía aprenderás a:

  • crear un pipeline de clasificación de imágenes en cero disparos
  • ejecutar manualmente la inferencia de clasificación de imágenes en cero disparos

Antes de comenzar, asegúrate de tener instaladas todas las bibliotecas necesarias:

pip install -q "transformers[torch]" pillow

Pipeline de clasificación de imágenes en cero

La forma más sencilla de probar la inferencia con un modelo que admite clasificación de imágenes en cero disparos es utilizar el pipeline() correspondiente. Instancia un pipeline a partir de un punto de control en el Hugging Face Hub:

>>> from transformers import pipeline

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

A continuación, elija una imagen que desee clasificar.

>>> 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

Pase la imagen y las etiquetas de objetos candidatos a la pipeline. Aquí pasamos la imagen directamente; otras opciones adecuadas incluyen una ruta local a una imagen o una URL de imagen. Las etiquetas candidatas pueden ser palabras simples, como en este ejemplo, o más descriptivas.

>>> 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'}]

Clasificación de imágenes sin ejemplos por mano

Ahora que has visto cómo usar el pipeline de clasificación de imágenes sin ejemplos, veamos cómo puedes ejecutar la clasificación de imágenes sin ejemplos manualmente.

Comience cargando el modelo y el procesador asociados desde un punto de control en el Hugging Face Hub. Aquí utilizaremos el mismo punto de control que antes:

>>> from transformers import AutoProcessor, AutoModelForZeroShotImageClassification

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

Tomemos una imagen 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 el procesador para preparar las entradas del modelo. El procesador combina un procesador de imágenes que prepara la imagen para el modelo mediante el redimensionado y la normalización, y un tokenizador que se encarga de las 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)

Pasa las entradas a través del modelo y realiza el posprocesado de los 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