# Klasifikasi gambar zero-shot

Klasifikasi gambar zero-shot adalah tugas yang melibatkan pengelompokan gambar ke dalam kategori yang berbeda menggunakan model yang tidak secara eksplisit dilatih pada data yang berisi contoh berlabel dari kategori spesifik tersebut.

Secara tradisional, klasifikasi gambar memerlukan pelatihan model pada set gambar berlabel tertentu, dan model ini belajar untuk "memetakan" fitur-fitur gambar tertentu ke label. Ketika ada kebutuhan untuk menggunakan model semacam itu untuk tugas klasifikasi yang memperkenalkan set label baru, fine-tuning diperlukan untuk "mengkalibrasi ulang" model tersebut.

Sebaliknya, model klasifikasi gambar zero-shot atau open vocabulary umumnya merupakan model multi-modal yang telah dilatih pada dataset besar berisi gambar dan deskripsi terkait. Model-model ini mempelajari representasi visi-bahasa yang selaras, yang dapat digunakan untuk berbagai tugas turunan termasuk klasifikasi gambar zero-shot.

Ini adalah pendekatan yang lebih fleksibel untuk klasifikasi gambar yang memungkinkan model untuk digeneralisasi ke kategori baru dan yang belum pernah dilihat tanpa memerlukan data pelatihan tambahan, serta memungkinkan pengguna untuk menanyakan gambar dengan deskripsi teks bebas dari objek target mereka.

Pada panduan ini, Anda akan belajar cara:

* membuat pipeline klasifikasi gambar zero-shot
* jalankan inferensi klasifikasi gambar zero-shot secara manual

Sebelum memulai, pastikan Anda telah menginstal semua pustaka yang diperlukan:

```bash
pip install -q "transformers[torch]" pillow
```

## Pipeline klasifikasi gambar zero-shot

Cara termudah untuk mencoba inferensi dengan model yang mendukung klasifikasi gambar zero-shot adalah dengan menggunakan [pipeline()](/docs/transformers/main/id/main_classes/pipelines#transformers.pipeline) yang sesuai. Buat instans pipeline dari [checkpoint di Hugging Face Hub](https://huggingface.co/models?pipeline_tag=zero-shot-image-classification&sort=downloads):

```python
>>> from transformers import pipeline

>>> checkpoint = "openai/clip-vit-large-patch14"
>>> detector = pipeline(model=checkpoint, task="zero-shot-image-classification")
```

Selanjutnya, pilih gambar yang ingin Anda klasifikasikan.

```py
>>> 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
```

     

Lewatkan gambar dan label objek kandidat ke pipeline. Di sini kami melewatkan gambar secara langsung; opsi lain yang sesuai termasuk path lokal ke gambar atau url gambar. Label kandidat dapat berupa kata sederhana seperti pada contoh ini, atau lebih deskriptif.

```py
>>> 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'}]
```

## Klasifikasi gambar zero-shot secara manual

Sekarang setelah Anda melihat cara menggunakan pipeline klasifikasi gambar zero-shot, mari kita lihat bagaimana Anda dapat menjalankan klasifikasi gambar zero-shot secara manual.

Mulai dengan memuat model dan processor terkait dari [checkpoint di Hugging Face Hub](https://huggingface.co/models?pipeline_tag=zero-shot-image-classification&sort=downloads). Di sini kita akan menggunakan checkpoint yang sama seperti sebelumnya:

```py
>>> from transformers import AutoProcessor, AutoModelForZeroShotImageClassification

>>> model = AutoModelForZeroShotImageClassification.from_pretrained(checkpoint)
>>> processor = AutoProcessor.from_pretrained(checkpoint)
```

Mari kita ambil gambar yang berbeda untuk mengubah suasana.

```py
>>> 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
```

     

Gunakan processor untuk menyiapkan input bagi model. Processor menggabungkan image processor yang menyiapkan gambar untuk model dengan cara mengubah ukuran dan menormalisasi, serta tokenizer yang menangani input teks.

```py
>>> 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)
```

Lewatkan input melalui model, lalu proses pascaproses hasilnya:

```py
>>> 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'}]
```

