Transformers documentation

Подпись изображений

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

Подпись изображений

Генерация подписей к изображениям — это задача предсказания описания для заданного изображения. Среди распространённых практических применений можно выделить помощь людям с нарушениями зрения, что позволяет им ориентироваться в различных ситуациях. Таким образом, генерация подписей к изображениям способствует повышению доступности контента, описывая изображения для пользователей.

В этом руководстве показано, как:

  • Настройте модель описания изображений.
  • Используйте дообученную модель для инференса.

Прежде чем начать, убедитесь, что у вас установлены все необходимые библиотеки:

pip install transformers datasets evaluate -q
pip install jiwer -q

Мы рекомендуем вам войти в свой аккаунт Hugging Face, чтобы вы могли загрузить свою модель и поделиться ею с сообществом. При появлении запроса введите токен для входа:

from huggingface_hub import notebook_login

notebook_login()

Загрузите набор данных подписей BLIP для Pokémon

Используйте библиотеку 🤗 Dataset для загрузки набора данных, состоящего из пар {image-caption}. Чтобы создать собственный набор данных для подписывания изображений в PyTorch, вы можете воспользоваться этим ноутбуком.

from datasets import load_dataset

ds = load_dataset("lambdalabs/pokemon-blip-captions")
ds
DatasetDict({
    train: Dataset({
        features: ['image', 'text'],
        num_rows: 833
    })
})

Набор данных содержит две характеристики: image и text.

Многие наборы данных для описания изображений содержат несколько подписей на одно изображение. В таких случаях распространённой стратегией является случайный выбор одной из доступных подписей в процессе обучения.

Разделите обучающую часть набора данных на обучающую и тестовую с помощью метода train_test_split:

ds = ds["train"].train_test_split(test_size=0.1)
train_ds = ds["train"]
test_ds = ds["test"]

Давайте визуализируем несколько примеров из обучающей выборки.

from textwrap import wrap
import matplotlib.pyplot as plt
import numpy as np


def plot_images(images, captions):
    plt.figure(figsize=(20, 20))
    for i in range(len(images)):
        ax = plt.subplot(1, len(images), i + 1)
        caption = captions[i]
        caption = "\n".join(wrap(caption, 12))
        plt.title(caption)
        plt.imshow(images[i])
        plt.axis("off")


sample_images_to_visualize = [np.array(train_ds[i]["image"]) for i in range(5)]
sample_captions = [train_ds[i]["text"] for i in range(5)]
plot_images(sample_images_to_visualize, sample_captions)
Sample training images

Предобработка набора данных

Поскольку набор данных содержит две модальности (изображения и текст), конвейер предобработки будет обрабатывать как изображения, так и подписи.

Для этого загрузите класс процессора, связанный с моделью, которую вы собираетесь дообучить.

from transformers import AutoProcessor

checkpoint = "microsoft/git-base"
processor = AutoProcessor.from_pretrained(checkpoint)

Процессор внутренним образом выполняет предварительную обработку изображения (включая изменение размера и масштабирование пикселей) и токенизирует подпись.

def transforms(example_batch):
    images = [x for x in example_batch["image"]]
    captions = [x for x in example_batch["text"]]
    inputs = processor(images=images, text=captions, padding="max_length")
    inputs.update({"labels": inputs["input_ids"]})
    return inputs


train_ds.set_transform(transforms)
test_ds.set_transform(transforms)

Когда набор данных готов, можно настроить модель для дообучения.

Загрузка базовой модели

Загрузите “microsoft/git-base” в объект AutoModelForCausalLM.

from transformers import AutoModelForCausalLM

model = AutoModelForCausalLM.from_pretrained(checkpoint)

Оценка

Модели описания изображений обычно оцениваются с помощью Rouge Score или Word Error Rate. В этом руководстве вы будете использовать Word Error Rate (WER).

Для этого мы используем библиотеку 🤗 Evaluate. О возможных ограничениях и других подводных камнях метрики WER см. в этом руководстве.

from evaluate import load
import torch

wer = load("wer")


def compute_metrics(eval_pred):
    logits, labels = eval_pred
    predicted = logits.argmax(-1)
    decoded_labels = processor.batch_decode(labels, skip_special_tokens=True)
    decoded_predictions = processor.batch_decode(predicted, skip_special_tokens=True)
    wer_score = wer.compute(predictions=decoded_predictions, references=decoded_labels)
    return {"wer_score": wer_score}

Обучение

Теперь вы готовы приступить к дообучению модели. Для этого вы будете использовать 🤗 Trainer.

Сначала определите аргументы обучения с помощью TrainingArguments.

from transformers import TrainingArguments, Trainer

model_name = checkpoint.split("/")[1]

training_args = TrainingArguments(
    output_dir=f"{model_name}-pokemon",
    learning_rate=5e-5,
    num_train_epochs=50,
    fp16=True,
    per_device_train_batch_size=32,
    per_device_eval_batch_size=32,
    gradient_accumulation_steps=2,
    save_total_limit=3,
    eval_strategy="steps",
    eval_steps=50,
    save_strategy="steps",
    save_steps=50,
    logging_steps=50,
    remove_unused_columns=False,
    push_to_hub=True,
    label_names=["labels"],
    load_best_model_at_end=True,
)

Затем передайте их вместе с наборами данных и моделью в 🤗 Trainer.

trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=train_ds,
    eval_dataset=test_ds,
    compute_metrics=compute_metrics,
)

Чтобы начать обучение, просто вызовите train() на объекте Trainer.

trainer.train()

По мере обучения вы должны наблюдать плавное снижение функции потерь.

После завершения обучения используйте метод push_to_hub(), чтобы опубликовать модель на Hub и дать всем возможность её использовать:

trainer.push_to_hub()

Вывод

Возьмите пример изображения из test_ds, чтобы протестировать модель.

from PIL import Image
import requests

url = "https://huggingface.co/datasets/sayakpaul/sample-datasets/resolve/main/pokemon.png"
image = Image.open(requests.get(url, stream=True).raw)
image
Test image

Подготовьте изображение для модели.

from accelerate import Accelerator

device = Accelerator().device
inputs = processor(images=image, return_tensors="pt").to(device)
pixel_values = inputs.pixel_values

Вызовите generate и декодируйте предсказания.

generated_ids = model.generate(pixel_values=pixel_values, max_length=50)
generated_caption = processor.batch_decode(generated_ids, skip_special_tokens=True)[0]
print(generated_caption)
a drawing of a pink and blue pokemon

Похоже, дообученная модель сгенерировала довольно хороший описательный текст!

Update on GitHub