Transformers documentation
Classification d'images en zéro tir
Classification d'images en zéro tir
La classification d’images en zéro tirage est une tâche qui consiste à classer des images dans différentes catégories à l’aide d’un modèle qui n’a pas été explicitement entraîné sur des données contenant des exemples étiquetés de ces catégories spécifiques.
Traditionnellement, la classification d’images nécessite l’entraînement d’un modèle sur un ensemble spécifique d’images étiquetées, et ce modèle apprend à « associer » certaines caractéristiques d’images à des étiquettes. Lorsque l’on doit utiliser un tel modèle pour une tâche de classification qui introduit un nouvel ensemble d’étiquettes, un fine-tuning est nécessaire pour « recalibrer » le modèle.
En revanche, les modèles de classification d’images en zéro tirage ou à vocabulaire ouvert sont généralement des modèles multimodaux entraînés sur un large jeu de données d’images et de descriptions associées. Ces modèles apprennent des représentations alignées vision-langage qui peuvent être utilisées pour de nombreuses tâches en aval, y compris la classification d’images en zéro tirage.
Il s'agit d'une approche plus flexible de la classification d'images, qui permet aux modèles de généraliser à de nouvelles catégories inconnues sans nécessiter de données d'entraînement supplémentaires, et qui permet aux utilisateurs d'interroger des images à l'aide de descriptions textuelles libres de leurs objets cibles.
Dans ce guide, vous apprendrez à :
- créer un pipeline de classification d'images en zéro tir
- exécuter manuellement une inférence de classification d’images en zéro tir
Avant de commencer, assurez-vous d'avoir installé toutes les bibliothèques nécessaires :
pip install -q "transformers[torch]" pillowPipeline de classification d'images en zéro tir
La manière la plus simple d’essayer l’inférence avec un modèle prenant en charge la classification d’images en zéro tirage est d’utiliser le pipeline() correspondant. Instanciez un pipeline à partir d’un point de contrôle sur le Hugging Face Hub :
>>> from transformers import pipeline
>>> checkpoint = "openai/clip-vit-large-patch14"
>>> detector = pipeline(model=checkpoint, task="zero-shot-image-classification")Ensuite, choisissez une image que vous souhaitez classifier.
>>> 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
Transmettez l'image et les étiquettes d'objets candidats au pipeline. Ici, nous transmettons l'image directement ; d'autres options appropriées incluent un chemin local vers une image ou une URL d'image. Les étiquettes candidates peuvent être de simples mots comme dans cet exemple, ou plus descriptives.
>>> 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'}]Classification d'images en zéro-shot à la main
Maintenant que vous avez vu comment utiliser le pipeline de classification d’images en zéro tir, voyons comment exécuter manuellement la classification d’images en zéro tir.
Commencez par charger le modèle et le processeur associés depuis un point de contrôle sur le Hugging Face Hub. Ici, nous utiliserons le même point de contrôle que précédemment :
>>> from transformers import AutoProcessor, AutoModelForZeroShotImageClassification
>>> model = AutoModelForZeroShotImageClassification.from_pretrained(checkpoint)
>>> processor = AutoProcessor.from_pretrained(checkpoint)Prenons une autre image pour changer.
>>> 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
Utilisez le processeur pour préparer les entrées du modèle. Le processeur combine un processeur d’images qui prépare l’image pour le modèle en la redimensionnant et en la normalisant, ainsi qu’un tokeniseur qui gère les entrées textuelles.
>>> 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)Faites passer les entrées à travers le modèle, puis post-traitez les résultats :
>>> 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'}]