Transformers documentation
Görsel özellik çıkarımı
Görsel özellik çıkarımı
Görsel özellik çıkarımı, bir görsel verildiğinde anlamsal olarak anlamlı özelliklerin çıkarılması görevidir. Bu, görsel benzerliği ve görsel geri getirme gibi birçok kullanım alanına sahiptir. Ayrıca, çoğu bilgisayarla görme modeli, görev özel başlığın (görsel sınıflandırma, nesne algılama vb.) kaldırılarak özelliklerin elde edilebildiği görsel özellik çıkarımı için kullanılabilir. Bu özellikler daha üst düzeyde çok faydalıdır: kenar algılama, köşe algılama ve benzeri. Modelin ne kadar derin olduğuna bağlı olarak, gerçek dünyaya dair bilgiler de (örneğin bir kedinin nasıl göründüğü) içerebilirler. Bu nedenle, bu çıktılar belirli bir veri setinde yeni sınıflandırıcılar eğitmek için kullanılabilir.
Bu kılavuzda şunları yapacaksınız:
image-feature-extractionhattının üzerine basit bir görsel benzerlik sistemi oluşturmayı öğrenin.- Sadece model çıkarımıyla aynı görevi gerçekleştirin.
image-feature-extraction Pipeline ile Görüntü Benzerliği
Balık ağlarının üzerinde oturan iki kedi görselimiz var, bunlardan biri üretilmiştir.
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")Pipeline'ın çalışmasını görelim. Önce pipeline'ı başlatın. Hiçbir model geçmezseniz, pipeline google/vit-base-patch16-224 ile otomatik olarak başlatılır. Benzerlik hesaplamak istiyorsanız, pool değerini True olarak ayarlayın.
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)pipe ile çıkarım yapmak için her iki görseli de ona iletin.
outputs = pipe([image_real, image_gen])
Çıktı, bu iki görselin havuzlanmış gömme değerlerini içerir.
# get the length of a single output
print(len(outputs[0][0]))
# show outputs
print(outputs)
# 768
# [[[-0.03909236937761307, 0.43381670117378235, -0.06913255900144577,Benzerlik puanını almak için bunları bir benzerlik fonksiyonuna iletmemiz gerekir.
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])Poollama yapılmadan önceki son gizli durumları almak istiyorsanız, pool parametresi için herhangi bir değer geçirmemeye özen gösterin; bu parametre varsayılan olarak False olarak ayarlanmıştır. Bu gizli durumlar, modelin özelliklerine dayalı yeni sınıflandırıcılar veya modeller eğitmek için faydalıdır.
pipe = pipeline(task="image-feature-extraction", model="google/vit-base-patch16-224", device=device)
outputs = pipe(image_real)Çıktılar havuzlanmamış (unpooled) olduğundan, ilk boyutu parti boyutunu (batch size), son iki boyutu ise gömme (embedding) şeklini temsil eden son gizli durumları (last hidden states) alırız.
import numpy as np
print(np.array(outputs).shape)
# (1, 197, 768)AutoModel ile Özellikler ve Benzerlikler Alın
Özellikleri almak için transformers'in AutoModel sınıfını da kullanabiliriz. AutoModel, görev özel bir başlık olmadan herhangi bir transformers modelini yükler ve bu sayede özellikleri alabiliriz.
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)Basit bir çıkarım (inference) fonksiyonu yazalım. Girdileri önce processor’a, ardından onun çıktılarını model’e ileteceğiz.
def infer(image):
inputs = processor(image, return_tensors="pt").to(device)
outputs = model(**inputs)
return outputs.pooler_outputGörselleri bu fonksiyona doğrudan iletebilir ve gömme değerlerini alabiliriz.
embed_real = infer(image_real) embed_gen = infer(image_gen)
Gömceler üzerinde benzerliği tekrar elde edebiliriz.
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>)