Transformers documentation
Классификация изображений в режиме zero-shot
Классификация изображений в режиме zero-shot
Zero-shot классификация изображений — это задача, в которой изображения распределяются по различным категориям с помощью модели, которая не обучалась явно на данных, содержащих размеченные примеры из этих конкретных категорий.
Традиционно классификация изображений требует обучения модели на конкретном наборе размеченных изображений, в ходе которого модель учится «сопоставлять» определённые признаки изображений с метками. Если возникает необходимость использовать такую модель для задачи классификации, в которой вводится новый набор меток, требуется дообучение для «перенастройки» модели.
В отличие от этого, модели классификации изображений в режиме zero-shot или с открытым словарем, как правило, являются мультимодальными моделями, обученными на большом наборе данных, содержащем изображения и связанные с ними описания. Эти модели обучают согласованные представления «зрение-язык», которые можно использовать для многих задач, включая zero-shot классификацию изображений.
Это более гибкий подход к классификации изображений, который позволяет моделям обобщать на новые и незнакомые категории без необходимости в дополнительных данных для обучения и дает пользователям возможность запрашивать изображения с помощью свободных текстовых описаний целевых объектов.
В этом руководстве вы узнаете, как:
- создать конвейер классификации изображений в режиме zero-shot
- выполнить инференс для zero-shot классификации изображений вручную
Прежде чем начать, убедитесь, что у вас установлены все необходимые библиотеки:
pip install -q "transformers[torch]" pillowКонвейер классификации изображений в режиме zero-shot
Самый простой способ попробовать инференс с моделью, поддерживающей zero-shot классификацию изображений, — использовать соответствующий pipeline(). Создайте пайплайн из чекпоинта на Hugging Face Hub:
>>> from transformers import pipeline
>>> checkpoint = "openai/clip-vit-large-patch14"
>>> detector = pipeline(model=checkpoint, task="zero-shot-image-classification")Далее выберите изображение, которое вы хотите классифицировать.
>>> 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
Передайте изображение и метки объектов-кандидатов в pipeline. В данном примере изображение передается напрямую; также допустимы локальный путь к изображению или URL изображения. Метки-кандидаты могут быть простыми словами, как в этом примере, или более подробными.
>>> 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'}]Zero-shot классификация изображений вручную
Теперь, когда вы узнали, как использовать конвейер zero-shot классификации изображений, давайте посмотрим, как выполнить zero-shot классификацию изображений вручную.
Начните с загрузки модели и соответствующего процессора из чекпоинта на Hugging Face Hub. Здесь мы будем использовать тот же чекпоинт, что и ранее:
>>> from transformers import AutoProcessor, AutoModelForZeroShotImageClassification
>>> model = AutoModelForZeroShotImageClassification.from_pretrained(checkpoint)
>>> processor = AutoProcessor.from_pretrained(checkpoint)Возьмём другое изображение, чтобы немного сменить обстановку.
>>> 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
Используйте processor для подготовки входных данных для модели. Процессор объединяет процессор изображений, который готовит изображение для модели путем изменения размера и нормализации, и токенизатор, который обрабатывает текстовые входные данные.
>>> 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)Передайте входные данные в модель и выполните постобработку результатов:
>>> 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'}]