Transformers documentation

Görüntü sınıflandırma

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örüntü sınıflandırma

Görüntü sınıflandırma, bir görüntüye etiket veya sınıf atar. Metin veya ses sınıflandırmadan farklı olarak girdiler, bir görüntüyü oluşturan piksel değerleridir. Görüntü sınıflandırmanın doğal afet sonrası hasar tespiti, ürün sağlığı izleme veya hastalık belirtilerini taramak için tıbbi görüntülere yardımcı olma gibi birçok uygulaması vardır.

Bu kılavuz şunları gösterir:

  1. Bir görüntüdeki yiyecek öğesini sınıflandırmak için Food-101 veri setinde ViT modelini ince ayarlayın.
  2. İnce ayarladığınız modeli çıkarım için kullanın.

Bu görevle uyumlu tüm mimarileri ve denetim noktalarını görmek için görev sayfasını kontrol etmenizi öneririz.

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

pip install transformers datasets evaluate accelerate pillow torchvision scikit-learn trackio

Modelinizi yükleyip toplulukla paylaşmak 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()

Food-101 veri setini yükle

Önce 🤗 Datasets kütüphanesinden Food-101 veri setinin daha küçük bir alt kümesini yükleyerek başlayın. Bu, tam veri setinde eğitim için daha fazla zaman harcamadan önce deneyler yapmanıza ve her şeyin çalıştığını doğrulamanıza olanak tanır.

>>> from datasets import load_dataset

>>> food = load_dataset("ethz/food101", split="train[:5000]")

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

>>> food = food.train_test_split(test_size=0.2)

Sonra bir örneğe göz atın:

>>> food["train"][0]
{'image': <PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=512x512 at 0x7F52AFC8AC50>,
 'label': 79}

Veri setindeki her örnek iki alana sahiptir:

  • image: Yiyecek öğesinin PIL görüntüsü
  • label: yiyecek öğesinin etiket sınıfı

Modelin etiket adını etiket kimliğinden almasını kolaylaştırmak için, etiket adını bir tam sayıya ve tam sayıyı etiket adına eşleyen bir sözlük oluşturun:

>>> labels = food["train"].features["label"].names
>>> label2id, id2label = dict(), dict()
>>> for i, label in enumerate(labels):
...     label2id[label] = str(i)
...     id2label[str(i)] = label

Şimdi etiket kimliğini etiket adına dönüştürebilirsiniz:

>>> id2label[str(79)]
'prime_rib'

Ön işleme

Bir sonraki adım, görüntüyü bir tensöre dönüştürmek için bir ViT görüntü işleyicisi yüklemektir:

>>> from transformers import AutoImageProcessor

>>> checkpoint = "google/vit-base-patch16-224-in21k"
>>> image_processor = AutoImageProcessor.from_pretrained(checkpoint)

Modelin aşırı öğrenmeye karşı daha dayanıklı hale gelmesi için görüntülere bazı görüntü dönüşümleri uygulayın. Burada transforms modülünü kullanacaksınız, ancak istediğiniz herhangi bir görüntü kütüphanesini de kullanabilirsiniz.

Görselin rastgele bir kısmını kırpın, yeniden boyutlandırın ve görsel ortalaması ile standart sapmasıyla normalize edin:

>>> from torchvision.transforms import RandomResizedCrop, Compose, Normalize, ToTensor

>>> normalize = Normalize(mean=image_processor.image_mean, std=image_processor.image_std)
>>> size = (
...     image_processor.size["shortest_edge"]
...     if "shortest_edge" in image_processor.size
...     else (image_processor.size["height"], image_processor.size["width"])
... )
>>> _transforms = Compose([RandomResizedCrop(size), ToTensor(), normalize])

Ardından, dönüşümleri uygulayıp görüntünün pixel_values - modele girdi olarak verilen değerler - değerlerini döndüren bir ön işleme işlevi oluşturun:

>>> def transforms(examples):
...     examples["pixel_values"] = [_transforms(img.convert("RGB")) for img in examples["image"]]
...     del examples["image"]
...     return examples

Tüm veri setine ön işleme fonksiyonunu uygulamak için 🤗 Datasets with_transform yöntemini kullanın. Dönüşümler, veri setinin bir öğesini yüklediğinizde anında uygulanır:

>>> food = food.with_transform(transforms)

Şimdi DefaultDataCollator kullanarak örneklerden oluşan bir batch oluşturun. 🤗 Transformers'taki diğer veri toplayıcıların aksine, DefaultDataCollator padding gibi ek ön işleme uygulamaz.

>>> from transformers import DefaultDataCollator

>>> data_collator = DefaultDataCollator()

Değerlendir

Eğitim sırasında bir metrik kullanmak, model performansınızı değerlendirmek için genellikle faydalıdır. 🤗 Evaluate kütüphanesiyle bir değerlendirme yöntemini hızla yükleyebilirsiniz. Bu görev için accuracy metrikini yükleyin (metrik yükleme ve hesaplama yöntemleri hakkında daha fazla bilgi için 🤗 Evaluate hızlı turuna bakın):

>>> import evaluate

>>> accuracy = evaluate.load("accuracy")

Ardından, tahminlerinizi ve etiketlerinizi compute işlevine geçirerek doğruluğu hesaplayan bir işlev oluşturun:

>>> import numpy as np


>>> def compute_metrics(eval_pred):
...     predictions, labels = eval_pred
...     predictions = np.argmax(predictions, axis=1)
...     return accuracy.compute(predictions=predictions, references=labels)

compute_metrics fonksiyonunuz artık hazır ve eğitiminizi yapılandırırken bu fonksiyona geri döneceksiniz.

Eğit

Trainer ile bir modeli ince ayar yapma konusunda deneyiminiz yoksa, temel öğreticiyi burada inceleyebilirsiniz!

Artık modelinizi eğitmeye hazırsınız! ViT'yi AutoModelForImageClassification ile yükleyin. Etiket sayısını, beklenen etiket sayısını ve etiket eşlemelerini belirtin:

>>> from transformers import AutoModelForImageClassification, TrainingArguments, Trainer

>>> model = AutoModelForImageClassification.from_pretrained(
...     checkpoint,
...     num_labels=len(labels),
...     id2label=id2label,
...     label2id=label2id,
... )

Bu noktada yalnızca üç adım kaldı:

  1. Eğitim hiperparametrelerinizi TrainingArguments içinde tanımlayın. Kullanılmayan sütunları kaldırmamanız önemlidir, çünkü bu işlem image sütununu düşürür. image sütunu olmadan pixel_values oluşturamazsınız. Bu davranışı önlemek için remove_unused_columns=False ayarlayın! Tek diğer zorunlu parametre, modelinizi nereye kaydedeceğinizi belirten output_dir'dir. Modelinizi Hub'a push_to_hub=True ayarlayarak yükleyeceksiniz (modelinizi yüklemek için Hugging Face'e giriş yapmış olmanız gerekir). Her epoch sonunda Trainer doğruluğu değerlendirir ve eğitim kontrol noktasını kaydeder.
  2. Eğitim argümanlarını, model, veri seti, tokenizer, veri toplayıcı ve compute_metrics fonksiyonuyla birlikte Trainer'a iletin.
  3. Modelinizi ince ayar yapmak için train() çağrın.
>>> training_args = TrainingArguments(
...     output_dir="my_awesome_food_model",
...     remove_unused_columns=False,
...     eval_strategy="epoch",
...     save_strategy="epoch",
...     learning_rate=5e-5,
...     per_device_train_batch_size=16,
...     gradient_accumulation_steps=4,
...     per_device_eval_batch_size=16,
...     num_train_epochs=3,
...     warmup_steps=0.1,
...     logging_steps=10,
...     report_to="trackio",
...     run_name="food101",
...     load_best_model_at_end=True,
...     metric_for_best_model="accuracy",
...     push_to_hub=True,
... )

>>> trainer = Trainer(
...     model=model,
...     args=training_args,
...     data_collator=data_collator,
...     train_dataset=food["train"],
...     eval_dataset=food["test"],
...     processing_class=image_processor,
...     compute_metrics=compute_metrics,
... )

>>> trainer.train()

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

>>> trainer.push_to_hub()

Görsel sınıflandırma için bir modeli nasıl ince ayar yapacağınızın daha ayrıntılı bir örneği için ilgili PyTorch defterine göz atın.

Çıkarım

Harika, bir model ayarladıktan sonra artık çıkarım için kullanabilirsiniz!

Çıkarım yapmak istediğiniz bir görüntü yükleyin:

>>> ds = load_dataset("ethz/food101", split="validation[:10]")
>>> image = ds["image"][0]
image of beignets

Eğitimini tamamladığınız modeli çıkarım için denemenin en basit yolu, onu bir pipeline() içinde kullanmaktır. Modelinizle görüntü sınıflandırma için bir pipeline örneği oluşturun ve görüntünüzü ona iletin:

>>> from transformers import pipeline

>>> classifier = pipeline("image-classification", model="my_awesome_food_model")
>>> classifier(image)
[{'score': 0.31856709718704224, 'label': 'beignets'},
 {'score': 0.015232225880026817, 'label': 'bruschetta'},
 {'score': 0.01519392803311348, 'label': 'chicken_wings'},
 {'score': 0.013022331520915031, 'label': 'pork_chop'},
 {'score': 0.012728818692266941, 'label': 'prime_rib'}]

İsterseniz pipeline sonuçlarını manuel olarak da yeniden üretebilirsiniz:

Görseli ön işlemek ve input değerini PyTorch tensörleri olarak döndürmek için bir görsel işleyici yükleyin:

>>> from transformers import AutoImageProcessor
>>> import torch

>>> image_processor = AutoImageProcessor.from_pretrained("my_awesome_food_model")
>>> inputs = image_processor(image, return_tensors="pt")

Girdilerinizi modele iletin ve logitleri döndürün:

>>> from transformers import AutoModelForImageClassification

>>> model = AutoModelForImageClassification.from_pretrained("my_awesome_food_model")
>>> with torch.no_grad():
...     logits = model(**inputs).logits

En yüksek olasılığa sahip tahmini etiketi alın ve onu bir etikete dönüştürmek için modelin id2label eşlemesini kullanın:

>>> predicted_label = logits.argmax(-1).item()
>>> model.config.id2label[predicted_label]
'beignets'
Update on GitHub