Transformers documentation

Görsel açıklama

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v5.22.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Görsel açıklama

Görsel açıklama (image captioning), verilen bir görsel için bir açıklama üretme görevidir. Bu görevin yaygın gerçek dünya uygulamaları arasında, farklı durumlarda hareket etmelerine yardımcı olarak görme engelli bireylere destek olmak yer alır. Bu nedenle, görsel açıklama, görselleri tanımlayarak bireyler için içerik erişilebilirliğini iyileştirmeye yardımcı olur.

Bu kılavuz size şunları gösterecektir:

  • Bir görüntü açıklama modelini ince ayar yapın.
  • İnce ayarlanmış modeli çıkarım için kullanın.

Başlamadan önce, gerekli tüm kütüphanelerin yüklendiğinden emin olun:

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

Modelinizi yükleyip toplulukla paylaşabilmeniz için Hugging Face hesabınıza giriş yapmanızı öneririz. İstendiğinde giriş yapmak için token'ınızı girin:

from huggingface_hub import notebook_login

notebook_login()

Pokémon BLIP altyazı veri setini yükleyin

🤗 Dataset kütüphanesini, {image-caption} çiftlerinden oluşan bir veri setini yüklemek için kullanın. PyTorch'ta kendi görüntü açıklama veri setinizi oluşturmak için bu defterdeki adımları izleyebilirsiniz.

from datasets import load_dataset

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

Veri setinin iki özelliği vardır: image ve text.

Birçok görüntü açıklama veri seti, her görüntü için birden fazla açıklama içerir. Bu durumlarda, yaygın bir strateji, eğitim sırasında mevcut açıklamalardan rastgele bir tane örneklemektir.

Veri setinin eğitim bölümünü train_test_split yöntemiyle eğitim ve test kümesine ayırın:

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

Eğitim setinden birkaç örnek görselleştirelim.

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

Veri setini ön işleme

Veri setinin iki modu (görsel ve metin) olduğundan, ön işleme hattı görselleri ve açıklamaları ön işler.

Bunu yapmak için, ince ayarını yapacağınız modelle ilişkili işlemci sınıfını yükleyin.

from transformers import AutoProcessor

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

İşleyici, görüntüyü dahili olarak ön işler (bu, yeniden boyutlandırma ve piksel ölçeklemeyi içerir) ve başlığı belirteçlere ayırır.

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)

Veri seti hazır olduğuna göre, şimdi modeli ince ayar için yapılandırabilirsiniz.

Bir temel model yükleyin

“microsoft/git-base” modelini bir AutoModelForCausalLM nesnesine yükleyin.

from transformers import AutoModelForCausalLM

model = AutoModelForCausalLM.from_pretrained(checkpoint)

Değerlendir

Görsel açıklama modelleri genellikle Rouge Score veya Word Error Rate ile değerlendirilir. Bu kılavuzda Word Error Rate (WER) kullanacaksınız.

Bunu yapmak için 🤗 Evaluate kütüphanesini kullanıyoruz. WER'in olası kısıtlamaları ve diğer tuzakları için bu kılavuza başvurun.

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}

Eğit

Şimdi, modeli ince ayar yapmaya hazırsınız. Bunun için 🤗 Trainer kullanacaksınız.

Önce, eğitim argümanlarını TrainingArguments kullanarak tanımlayın.

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,
)

Ardından bunları veri setleri ve model ile birlikte 🤗 Trainer'a iletin.

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

Eğitime başlamak için Trainer nesnesinde train() fonksiyonunu çağırmanız yeterlidir.

trainer.train()

Eğitim ilerledikçe eğitim kaybının (training loss) sorunsuz bir şekilde düşmesini görmelisiniz.

Eğitim tamamlandıktan sonra, modelinizi herkesin kullanabilmesi için push_to_hub() yöntemiyle Hub'a paylaşın:

trainer.push_to_hub()

Çıkarım

Modeli test etmek için test_ds içinden örnek bir görüntü alın.

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

Model için görüntüyü hazırlayın.

from accelerate import Accelerator

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

generate çağrısını yapın ve tahminleri çözümlen.

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

Görünüşe göre ince ayarı yapılmış model oldukça iyi bir başlık üretti!

Update on GitHub