Transformers documentation

Классификация изображений в режиме zero-shot

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

Классификация изображений в режиме 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
Photo of an owl

Передайте изображение и метки объектов-кандидатов в 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
Photo of a car

Используйте 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'}]
Update on GitHub