Transformers documentation
Clasificación de imágenes sin ejemplos
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]" pillowPipeline 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
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
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'}]