Transformers documentation
Klasifikasi gambar zero-shot
Klasifikasi gambar zero-shot
Klasifikasi gambar zero-shot adalah tugas yang melibatkan pengelompokan gambar ke dalam kategori yang berbeda menggunakan model yang tidak dilatih secara eksplisit pada data yang berisi contoh berlabel dari kategori-kategori spesifik tersebut.
Secara tradisional, klasifikasi citra memerlukan pelatihan model pada kumpulan citra berlabel tertentu, dan model ini belajar untuk “memetakan” fitur-fitur citra tertentu ke label. Ketika ada kebutuhan untuk menggunakan model tersebut pada tugas klasifikasi yang memperkenalkan kumpulan label baru, fine-tuning diperlukan untuk “mengkalibrasi ulang” model.
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 digeneralisasikan ke kategori baru dan yang belum pernah dilihat sebelumnya tanpa memerlukan data pelatihan tambahan, serta memungkinkan pengguna untuk melakukan kueri gambar dengan deskripsi teks bebas dari objek target mereka.
Dalam 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:
pip install -q "transformers[torch]" pillowPipeline klasifikasi gambar zero-shot
Cara termudah untuk mencoba inferensi dengan model yang mendukung klasifikasi gambar zero-shot adalah dengan menggunakan pipeline() yang sesuai. Instansiasi pipeline dari checkpoint di Hugging Face Hub:
>>> 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.
>>> 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-kata sederhana seperti pada contoh ini, atau lebih deskriptif.
>>> 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. Di sini kita akan menggunakan checkpoint yang sama seperti sebelumnya:
>>> from transformers import AutoProcessor, AutoModelForZeroShotImageClassification
>>> model = AutoModelForZeroShotImageClassification.from_pretrained(checkpoint)
>>> processor = AutoProcessor.from_pretrained(checkpoint)Mari kita gunakan gambar yang berbeda untuk mengubah haluan.
>>> 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 menormalisasinya, serta tokenizer yang menangani input teks.
>>> 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:
>>> 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'}]