Tüm yazılar

#yapay zeka#clip#contrastive learning

Kâğıda "iPod" Yazınca Elmayı iPod Sanan Model: CLIP ile Kendi Görsel Arama Motorunuzu Kurun

CLIP, fotoğrafları kelimelerle aramanızı sağlayan contrastive bir model; ama elmanın üstüne yapıştırılmış bir notla kandırılabiliyor. CLIP'in nasıl öğrendiğini, 30 satır Python ile fotoğraf arşivinizde nasıl arama yapacağınızı ve sınırlarını anlatıyoruz.

Kâğıda "iPod" Yazınca Elmayı iPod Sanan Model: CLIP ile Kendi Görsel Arama Motorunuzu Kurun
İçindekiler 10

2021'de OpenAI'daki araştırmacılar ilginç bir deney yaptı. Bir Granny Smith elmasının fotoğrafını CLIP adlı modele gösterdiler; model doğru tahmin etti: elma. Sonra elmanın üstüne elle "iPod" yazan bir kâğıt yapıştırıp tekrar sordular. Model artık emindi: bu bir iPod. Bu olay, CLIP ile görsel arama yaparken modelin yazıya ne kadar güvendiğini de gözler önüne serdi.

Bu hata komik görünüyor, ama aslında modelin ne kadar güçlü olduğunu gösteriyor. CLIP görselleri ve yazıları aynı "anlam uzayına" yerleştirmeyi öğrenmiş bir model. Fotoğraftaki yazıyı okuyabildiği için o yazıya fazla güveniyor. CLIP ile görsel arama yaparken aynı yetenek, fotoğraf arşivinizde "sahilde koşan köpek" yazıp doğru fotoğrafı bulmanızı da sağlıyor; üstelik hiç etiket girmeden.

Contrastive language models yazımızda bu ailenin genel çerçevesini anlatmıştık. Bu yazıda CLIP'in içine giriyoruz: nasıl öğreniyor, kendi görsel arama motorunuzu nasıl kurarsınız ve nerede yanılıyor?

Kısaca:

  • CLIP, internetten toplanan 400 milyon görsel-metin çifti üzerinde, hangi yazının hangi görsele ait olduğunu bulmaya çalışarak eğitildi.
  • Görselleri ve metinleri aynı vektör uzayına yerleştirdiği için, bir cümleyle fotoğraf aramak iki vektörün benzerliğini ölçmekten ibaret.
  • Hiç etiketli örnek görmeden sınıflandırma yapabiliyor (sıfır atış); ImageNet'te klasik bir ResNet-50'nin başarısını yakaladı.
  • Zayıf noktaları da öğretici: fotoğraftaki yazıya aşırı güveniyor, internet verisinin önyargılarını taşıyor ve Türkçede İngilizce kadar iyi değil.

CLIP neyi öğreniyor?

Klasik görüntü sınıflandırma modelleri sabit bir etiket listesiyle eğitilir: "kedi", "köpek", "araba" gibi binlerce kategori. Model yalnızca bu kategorileri tanır. Listede olmayan bir şeyi tanıtmak için yeni etiketli veri toplamanız ve modeli yeniden eğitmeniz gerekir.

CLIP (Contrastive Language-Image Pre-training) bu yaklaşımı tersine çevirdi; CLIP ile görsel arama tam da bu tersine çevirmeden doğuyor. Etiket listesi yerine, internette görsellerin yanında zaten bulunan metinleri kullandı: fotoğraf açıklamaları, alt metinler, başlıklar. Eğitim verisi, 400 milyon görsel-metin çiftinden oluşuyordu.

Modelin iki parçası var:

  • Görsel kodlayıcı: Bir fotoğrafı bir sayı dizisine (vektöre) çevirir.
  • Metin kodlayıcı: Bir cümleyi aynı boyutta bir vektöre çevirir.

Amaç, birbirine ait görsel ve metnin vektörlerini birbirine yakın, ait olmayanlarınkini uzak yerleştirmek.

Contrastive eğitim: Büyük bir eşleştirme oyunu

CLIP'in eğitimini bir eşleştirme oyunu gibi düşünebilirsiniz. Her adımda modele bir yığın görsel ve onların açıklamaları verilir; ama sıraları karıştırılmıştır. Modelin görevi, her görselin kendi açıklamasını bulmaktır.

Teknik olarak süreç şöyle işler:

  1. Bir yığında N görsel ve onların N açıklaması vardır.
  2. Model her görselin ve her metnin vektörünü hesaplar.
  3. Her görsel ile her metin arasındaki benzerlik hesaplanır; ortaya N×N'lik bir tablo çıkar.
  4. Tablonun köşegeni (her görselin kendi açıklamasıyla eşleştiği hücreler) doğru eşleşmelerdir. Geri kalan N² − N hücre yanlış eşleşmedir.
  5. Model, doğru eşleşmelerin benzerliğini artırıp yanlışlarınkini düşürecek şekilde güncellenir.

Buradaki incelik şu: model "yanlış" örnekleri ayrıca toplamak zorunda değil. Aynı yığındaki diğer açıklamalar zaten doğal birer yanlış örnek. Yığın ne kadar büyükse oyun o kadar zorlaşır ve model o kadar ince ayrımlar öğrenir. CLIP'in eğitiminde yığın büyüklüğü 32.768'di; yani her görsel, kendi açıklamasını 32 binden fazla aday arasında bulmak zorundaydı.

Sıfır atış: Hiç görmediği kategorileri tanımak

CLIP'in en şaşırtıcı yeteneği sıfır atış (zero-shot) sınıflandırma. Modele bir fotoğraf ve birkaç aday cümle verirsiniz; model fotoğrafa en çok benzeyen cümleyi seçer.

Bir fotoğrafın kedi mi köpek mi kuş mu olduğunu anlamak için hiçbir etiketli örnek göstermeniz gerekmez. "a photo of a cat", "a photo of a dog", "a photo of a bird" cümlelerini verip hangisinin fotoğrafa en yakın olduğuna bakmanız yeterli. OpenAI'ın açıklamasına göre CLIP, ImageNet'in 1,28 milyon etiketli eğitim örneğinin hiçbirini kullanmadan, bu veriyle özel olarak eğitilmiş bir ResNet-50'nin başarısını yakaladı.

İlginç bir ayrıntı: adayları tek kelime ("cat") yerine "a photo of a cat" gibi bir cümleyle vermek sonuçları iyileştiriyor. Çünkü model, internetteki açıklamalarda kelimelerin genellikle cümle içinde geçtiği verilerle eğitildi. CLIP makalesine göre bu basit şablon bile ImageNet'te doğruluğu yaklaşık 1,3 puan artırdı. Prompt yazmanın önemi, büyük dil modellerinden önce de vardı.

30 satırda kendi görsel arama motorunuz

Teori yeterli; şimdi bir klasör dolusu fotoğrafta kelimeyle arama yapan küçük bir araç yazalım. Hugging Face'in transformers kütüphanesini kullanacağız:

pip install torch transformers pillow
from pathlib import Path

import torch
from PIL import Image
from transformers import CLIPModel, CLIPProcessor

MODEL = "openai/clip-vit-base-patch32"
model = CLIPModel.from_pretrained(MODEL)
processor = CLIPProcessor.from_pretrained(MODEL)

# 1. Fotoğrafları bir kez vektöre çevir
paths = sorted(Path("fotograflar").glob("*.jpg"))
images = [Image.open(p).convert("RGB") for p in paths]
with torch.no_grad():
    img = model.get_image_features(**processor(images=images, return_tensors="pt"))
img = img / img.norm(dim=-1, keepdim=True)

# 2. Her aramada yalnızca sorguyu vektöre çevir ve karşılaştır
def ara(sorgu, k=5):
    with torch.no_grad():
        txt = model.get_text_features(**processor(text=[sorgu], return_tensors="pt", padding=True))
    txt = txt / txt.norm(dim=-1, keepdim=True)
    skor = (img @ txt.T).squeeze(1)
    for i in skor.topk(min(k, len(paths))).indices:
        print(f"{skor[i]:.3f}  {paths[i].name}")

ara("a dog running on the beach")
ara("a birthday cake with candles")

Kodun mantığı CLIP'in eğitimiyle birebir aynı:

  • Fotoğraflar bir kez vektöre çevrilir. Bu, işin pahalı kısmıdır ve arşiv büyükse bir kere yapılıp saklanır.
  • Her aramada yalnızca sorgu cümlesi vektöre çevrilir. Bu çok hızlıdır.
  • Vektörler normalize edildiği için iki vektörün çarpımı doğrudan kosinüs benzerliği verir. En yüksek skorlu fotoğraflar sonuçtur.

Binlerce fotoğrafınız varsa, görselleri tek seferde değil, 32'şer 64'er gruplar hâlinde işleyin ve vektörleri bir dosyaya ya da bir vektör veritabanına kaydedin. Milyonlarca kayıtta arama yapmak için ise vektör indeksleri (ör. PostgreSQL'in pgvector eklentisi ya da FAISS) kullanılır.

Sıfır atış sınıflandırma örneği

Aynı model, etiketsiz bir ürün fotoğrafını kategorilere ayırmak için de kullanılabilir:

labels = ["a photo of a sneaker", "a photo of a handbag", "a photo of a wristwatch"]
image = Image.open("urun.jpg").convert("RGB")
inputs = processor(text=labels, images=image, return_tensors="pt", padding=True)
with torch.no_grad():
    probs = model(**inputs).logits_per_image.softmax(dim=1)[0]
for label, p in zip(labels, probs):
    print(f"{p:.1%}  {label}")

Kategori listesini değiştirmek için modeli yeniden eğitmeniz gerekmez; listeye yeni bir cümle eklemeniz yeterli.

Elma neden iPod oldu? Tipografik saldırılar

Yazının başındaki deneye dönelim. OpenAI araştırmacıları 2021'de CLIP'in içini incelediklerinde, aynı kavrama hem fotoğrafta hem de yazıda tepki veren "çok kipli nöronlar" buldu. Örneğin bir nöron hem örümcek fotoğrafına, hem "spider" yazısına, hem de Örümcek Adam çizimine tepki veriyordu.

Bu soyutlama gücü bir saldırı yüzeyi de yarattı. Araştırmacılar, "finans" kavramına tepki veren bir nöronun hem kumbara görsellerine hem de "$$$" yazısına tepki verdiğini gösterdi. Bir köpek fotoğrafına "$$$" eklendiğinde model köpeği kumbara olarak sınıflandırabiliyordu. OpenAI'ın ifadesiyle bu saldırı, kalem ve kâğıttan fazlasını gerektirmiyor. Bu tür saldırılara tipografik saldırı adı verildi.

Bu bulgu, gerçek ürünlerde önemli bir uyarı içeriyor: CLIP tabanlı bir sistem, fotoğraftaki yazıya görsel içerikten daha fazla güvenebilir. Bir ürün fotoğrafının üstüne yazılmış bir marka adı ya da bir içerik moderasyon sistemini kandırmak için eklenen bir kelime, sonucu değiştirebilir.

CLIP'in sınırları

  • Önyargılar: Model, internet verisinin önyargılarını taşıyor. OpenAI'ın kendi analizinde, bazı nöronların belirli bölgeleri ya da grupları olumsuz kavramlarla ilişkilendirdiği görüldü. İnsanları sınıflandıran uygulamalarda dikkatli olunmalı.
  • Sayma ve ince ayrımlar: "Üç elma" ile "dört elma"yı ayırmak, araba modellerini tek tek tanımak ya da uzaklık tahmin etmek gibi görevlerde zayıf.
  • Dil: Orijinal CLIP büyük ölçüde İngilizce metinlerle eğitildi. Türkçe sorgularda sonuçlar zayıflar. Çözüm olarak, CLIP'in görsel kodlayıcısıyla uyumlu çok dilli metin kodlayıcıları (ör. sentence-transformers'ın clip-ViT-B-32-multilingual-v1 modeli) kullanılabilir; böylece "sahilde koşan köpek" diye Türkçe arama yapılabilir.
  • Lisans ve kullanım amacı: OpenAI'ın model kartı, yayınlanan CLIP modellerinin araştırma amaçlı olduğunu belirtiyor. Ticari bir üründe kullanmadan önce modelin lisansını ve kullanım koşullarını kontrol edin; LAION verisiyle eğitilmiş açık kaynak OpenCLIP modelleri de bir alternatif.

İşletmeler CLIP'i nerede kullanabilir?

  • E-ticarette görsel arama: Müşteri "kırmızı topuklu ayakkabı" yazdığında, ürün açıklamalarında bu kelimeler geçmese bile görsele göre doğru ürünler bulunur.
  • Fotoğraf ve medya arşivleri: Ajanslar, haber kuruluşları ve emlak şirketleri binlerce fotoğrafı elle etiketlemeden aranabilir hâle getirebilir.
  • Kopya ve benzer içerik tespiti: Birbirine çok benzeyen ilan fotoğraflarını ya da kopyalanmış ürün görsellerini bulmak.
  • Otomatik etiketleme: Yeni gelen içerikleri önceden belirlenmiş kategorilere sıfır atışla ayırmak, ardından insan kontrolüne sunmak.

Sıkça sorulan sorular

CLIP görsel üretebiliyor mu?

Hayır. CLIP bir görsel ile metnin ne kadar uyumlu olduğunu ölçer, görsel üretmez. Ancak bu ölçme yeteneği, birçok görsel üretim sisteminin geliştirilmesinde önemli bir rol oynadı.

Kendi verimle CLIP'i eğitmem gerekir mi?

Çoğu zaman hayır. Hazır modelle sıfır atış arama ve sınıflandırma birçok iş için yeterli. Çok özel bir alanda (ör. tıbbi görüntüler ya da belirli bir ürün kataloğu) daha iyi sonuç gerekiyorsa, kendi görsel-metin çiftlerinizle ince ayar yapılabilir.

CLIP'i çalıştırmak için ekran kartı gerekir mi?

Küçük arşivler için hayır; clip-vit-base-patch32 gibi küçük modeller sıradan bir bilgisayarın işlemcisinde de çalışır. Yüz binlerce fotoğrafı vektöre çevirirken ekran kartı süreyi ciddi biçimde kısaltır; ama bu işlem bir kez yapılır, aramalar her durumda hızlıdır.

Tipografik saldırılara karşı nasıl korunurum?

Kritik kararları yalnızca CLIP skoruna bırakmayın. Fotoğraftaki yazıları ayrıca okuyup (OCR) değerlendirmek, birden fazla modelin sonucunu birleştirmek ve şüpheli durumlarda insan kontrolü eklemek riski azaltır.

CLIP, contrastive öğrenmenin ne kadar güçlü olabileceğinin en somut örneklerinden biri: yalnızca "hangi yazı hangi görsele ait?" sorusunu milyonlarca kez sorarak, görmeyi ve okumayı aynı uzayda birleştiren bir model ortaya çıktı. Ürünleriniz ya da arşiviniz için görsel arama ve yapay zekâ çözümleri geliştirmek isterseniz web uygulama geliştirme sayfamızdan bize ulaşabilirsiniz.

Kaynaklar

PaylaşLinkedInXWhatsApp
Bu konuda yardıma mı ihtiyacınız var?

Yazıda anlattıklarımızı kendi projenize uygulamak isterseniz birlikte bakalım.

Bize yazın
YE

EngerekTech’in kurucusu. İşletmeler için web, mobil ve kurumsal yazılım geliştiriyor; Angular, Spring Boot ve Flutter ile çalışıyor, KPSS Düello ve Kelime Kavanozu uygulamalarını geliştirdi. Blogda yapay zekâ araçlarını ve yazılım geliştirmeyi kendi projelerinde kullandığı haliyle anlatıyor.