Transformers documentation
Ekstraksi fitur gambar
Ekstraksi fitur gambar
Ekstraksi fitur gambar adalah tugas untuk mengekstrak fitur yang bermakna secara semantik dari sebuah gambar. Hal ini memiliki banyak kasus penggunaan, termasuk kesamaan gambar dan pengambilan gambar. Selain itu, sebagian besar model computer vision dapat digunakan untuk ekstraksi fitur gambar, di mana seseorang dapat menghapus head yang spesifik untuk tugas tertentu (klasifikasi gambar, deteksi objek, dll.) dan mendapatkan fiturnya. Fitur-fitur ini sangat berguna pada tingkat yang lebih tinggi: deteksi tepi, deteksi sudut, dan sebagainya. Mereka juga dapat berisi informasi tentang dunia nyata (misalnya, seperti apa seekor kucing) tergantung pada seberapa dalam model tersebut. Oleh karena itu, output ini dapat digunakan untuk melatih pengklasifikasi baru pada dataset tertentu.
Dalam panduan ini, Anda akan:
- Pelajari cara membangun sistem kesamaan gambar sederhana di atas pipeline
image-feature-extraction. - Lakukan tugas yang sama dengan inferensi model mentah.
Kemiripan Gambar menggunakan Pipeline image-feature-extraction
Kami memiliki dua gambar kucing yang duduk di atas jaring ikan, salah satunya dihasilkan secara generatif.
from PIL import Image
import requests
img_urls = ["https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/cats.png", "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/cats.jpeg"]
image_real = Image.open(requests.get(img_urls[0], stream=True).raw).convert("RGB")
image_gen = Image.open(requests.get(img_urls[1], stream=True).raw).convert("RGB")Mari kita lihat pipeline dalam aksinya. Pertama, inisialisasi pipeline. Jika Anda tidak meneruskan model apa pun, pipeline akan diinisialisasi secara otomatis dengan google/vit-base-patch16-224. Jika Anda ingin menghitung kemiripan, setel pool ke True.
import torch
from transformers import pipeline
from accelerate import Accelerator
# automatically detects the underlying device type (CUDA, CPU, XPU, MPS, etc.)
device = Accelerator().device
pipe = pipeline(task="image-feature-extraction", model="google/vit-base-patch16-384", device=device, pool=True)Untuk melakukan inferensi dengan pipe, berikan kedua gambar tersebut ke dalamnya.
outputs = pipe([image_real, image_gen])
Output berisi pooled embeddings dari dua gambar tersebut.
# get the length of a single output
print(len(outputs[0][0]))
# show outputs
print(outputs)
# 768
# [[[-0.03909236937761307, 0.43381670117378235, -0.06913255900144577,Untuk mendapatkan skor kemiripan, kita perlu meneruskannya ke fungsi kemiripan.
from torch.nn.functional import cosine_similarity
similarity_score = cosine_similarity(torch.Tensor(outputs[0]),
torch.Tensor(outputs[1]), dim=1)
print(similarity_score)
# tensor([0.6043])Jika Anda ingin mendapatkan last hidden states sebelum pooling, hindari memberikan nilai apa pun untuk parameter pool, karena secara default diatur ke False. Hidden states ini berguna untuk melatih classifier atau model baru berdasarkan fitur dari model tersebut.
pipe = pipeline(task="image-feature-extraction", model="google/vit-base-patch16-224", device=device)
outputs = pipe(image_real)Karena outputnya tidak dipooling, kita mendapatkan last hidden states di mana dimensi pertama adalah batch size, dan dua dimensi terakhir adalah bentuk embedding.
import numpy as np
print(np.array(outputs).shape)
# (1, 197, 768)Mendapatkan Fitur dan Kemiripan menggunakan AutoModel
Kita juga dapat menggunakan kelas AutoModel dari transformers untuk mendapatkan fitur. AutoModel memuat model transformers apa pun tanpa head yang spesifik untuk tugas tertentu, dan kita dapat menggunakannya untuk mendapatkan fitur.
from transformers import AutoImageProcessor, AutoModel
processor = AutoImageProcessor.from_pretrained("google/vit-base-patch16-224")
model = AutoModel.from_pretrained("google/vit-base-patch16-224").to(device)Mari kita tulis fungsi sederhana untuk inferensi. Kita akan melewatkan input ke processor terlebih dahulu, lalu melewatkan outputnya ke model.
def infer(image):
inputs = processor(image, return_tensors="pt").to(device)
outputs = model(**inputs)
return outputs.pooler_outputKita dapat meneruskan gambar secara langsung ke fungsi ini dan mendapatkan embedding-nya.
embed_real = infer(image_real) embed_gen = infer(image_gen)
Kita dapat memperoleh kembali kemiripan di atas embedding.
from torch.nn.functional import cosine_similarity
similarity_score = cosine_similarity(embed_real, embed_gen, dim=1)
print(similarity_score)
# tensor([0.6061], device='cuda:0', grad_fn=<SumBackward1>)