Program
Bir Gen AI Mühendisi olarak, sürekli okuyup yeni gelişmeleri keşfederek en güncel araç ve teknolojilerden haberdar olmayı öncelik hâline getiriyorum. Yakın zamanda Microsoft araştırmacılarının tanıttığı, BridgeTower adlı bir modelin görme ve dil yeteneklerinin entegrasyonunu basitleştirerek multimodal görevlerin uygulanmasını çok daha kolay hâle getirdiğini anlatan bir araştırma makalesine rastladım.
Bu rehberde, Hugging Face Transformers kütüphanesindeki BridgeTower'ı kullanarak basit ama güçlü bir görsel-metin getirme sistemi nasıl kuracağınızı göstereceğim. Bu eğitim başlangıç seviyesine uygundur ve sizi şu adımlardan geçirecek:
- Gerekli kütüphanelerin kurulumu.
- BridgeTower ile görsellerin ve metinlerin işlenmesi.
- Hem görseller hem de metinler için gömme (embedding) oluşturma.
- Bu gömmelerin kosinüs benzerliği ile karşılaştırılması.
Eğitimin sonunda, görselleri metin sorgularıyla etkili bir şekilde eşleştirebilen, multimodal yapay zekânın gücünü ve sadeliğini gösteren, tamamen işlevsel bir sisteme sahip olacaksınız.
BridgeTower Nedir?
BridgeTower modeli, Xiao Xu ve diğerlerinin kaleme aldığı BridgeTower: Building Bridges Between Encoders in Vision-Language Representative Learning başlıklı makalede açıklandığı üzere, görme ve dil modellerinin birlikte nasıl çalıştığını iyileştirmeyi amaçlar.
Modelin hem bir görseli hem de bir metin açıklamasını, örneğin "parkta koşan bir köpek" ifadesini anlaması gereken bir görevi hayal edin.
Genellikle model, görseli ve metni sırasıyla görme ve dil kodlayıcılarıyla ayrı ayrı işler. BridgeTower modeli, bu kodlayıcılar ile çapraz-modal kodlayıcı (görme ve dili birleştiren) arasında bir "köprü" ekleyerek her adımda daha iyi etkileşim kurmalarını sağlar.
Örneğin, köpeğin görseli işlenirken görme kodlayıcı köpeğin şeklini ve hareketini algılayabilir. Bu sırada dil kodlayıcı "koşan" ve "köpek" kelimelerini anlar.
Köprü, bu iki bilgi parçasının ayrıntılı şekilde etkileşime girmesine olanak tanır ve modelin görsel ve metinsel ipuçlarını daha etkili biçimde ilişkilendirmesine yardımcı olur. Böylece model, fazladan hesaplama gerektirmeden veya yavaşlamadan görsel altyazılama ya da soru yanıtlama gibi görevlerde daha iyi performans gösterir.
Uygulama Klasör Yapısı
Her şeyi temiz ve düzenli tutacağız. Proje dizininiz şu şekilde görünmelidir:
/image-search-app/
│
├── app.py # Frontend (Streamlit UI)
├── search.py # Backend logic (embeddings & similarity search)
├── images/ # Directory for uploaded images
│ ├── image1.jpg
│ ├── image2.png
│ ├── image3.jpeg
│
└── requirements.txt # Python dependencies
- app.py: Ön yüz ve kullanıcı etkileşimlerini yönetir.
- search.py: Gömme oluşturma ve arama gerçekleştirme mantığını içerir.
- images/: Yüklenen görsel dosyalarını saklar.
- requirements.txt: Gerekli kütüphaneleri listeler.
Kurulum ve Yükleme
Koda dalmadan önce, sorunsuz bir geliştirme ve test süreci için ortamı hazırlayalım. Şu adımları izleyin:
1. Bağımlılıkları yükleyin
Öncelikle Python kurulu olduğundan emin olun (3.7 veya üzeri sürüm önerilir). Ardından, gerekli kütüphaneleri yüklemek için terminalinizde şu komutu çalıştırın:
pip install torch transformers streamlit Pillow
- torch: Bridgetower modelini oluşturmak ve çalıştırmak için kullanılan derin öğrenme çatısı.
- transformers: Bridgetower gibi önceden eğitilmiş modelleri sağlayarak verimli metin ve görsel işleme sunar.
- streamlit: Uygulama için etkileşimli bir kullanıcı arayüzü oluşturmak üzere hafif bir web çatısı.
- Pillow: Görsel yüklemeleri ve yeniden boyutlandırmayı yönetmek için kullanılan bir görsel işleme kütüphanesi.
2. Örnek görselleri hazırlayın
Uygulamayı test etmek için bazı örnek görselleri /images dizinine yerleştirin. Bu görsellerin JPG, PNG veya JPEG gibi desteklenen formatlarda olduğundan emin olun; bu formatlar yaygın olarak tanınır ve çoğu kütüphane ile uyumludur.
Modelin metin sorgusuna göre eşleşmeleri doğru şekilde getirebildiğinden emin olmak için çeşitli görseller kullanın.
BridgeTower Temel Mantığı Açıklaması
Uygulamanın temel işlevselliği iki ana bileşene ayrılır: Arka uç (search.py) ve Ön uç (app.py). Her bileşen, uygulamanın sorunsuz çalışmasını sağlamak için kritik bir rol oynar.
Arka uç mantığı (search.py)
Bu dosya, metin ve görsel gömmeleri ile arama mekanizmasının mantığını içerir.
1. Kütüphaneleri içe aktarın
from transformers import BridgeTowerProcessor, BridgeTowerForImageAndTextRetrieval
from PIL import Image
import torch.nn.functional as F
import os
- BridgeTowerProcessor: Verileri (görseller ve metin) BridgeTower modeli için doğru biçimde hazırlayan bir yardımcı sınıf. Metin için tokenleştirme ve görseller için ön işleme gibi görevleri yerine getirir.
- BridgeTowerForImageAndTextRetrieval: Özellikle görsel-metin getirme görevleri için tasarlanmış, önceden eğitilmiş bir BridgeTower model sınıfı; bir metin sorgusuna göre en ilgili görseli (veya tersini) aramak için kullanılır.
- PIL (Python Imaging Library) görsel işlemede kullanılır. Bu bağlamda, görselleri (ör. yeniden boyutlandırma, kırpma) modele vermeden önce açmak ve düzenlemek için kullanılır.
- torch.nn.functional, etkinleştirme (ReLU, softmax), kayıp (çapraz entropi vb.) ve tensörler üzerinde diğer işlemler gibi çeşitli işlevler sağlar. PyTorch ile sinir ağları üzerinde çalışırken sıklıkla kullanılır.
- os işletim sistemiyle etkileşim için kullanılır. Dosya okumak, dizinleri kontrol etmek ve yolları yönetmek (ör. görsellerin veya model ağırlıklarının konumunu bulmak) gibi işlemlerde yardımcı olur.
2. Modeli ve işlemciyi yükleyin
processor = BridgeTowerProcessor.from_pretrained("BridgeTower/bridgetower-base-itm-mlm")
model = BridgeTowerForImageAndTextRetrieval.from_pretrained("BridgeTower/bridgetower-base-itm-mlm")
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)
Bu, gömmeler için gerekli model ve işlemciyi başlatır.
3. En iyi eşleşmeyi bulun
def image_search(query, image_dir):
image_files = [os.path.join(image_dir, img) for img in os.listdir(image_dir) if img.lower().endswith(('jpg', 'jpeg', 'png'))]
scores = {}
for img_path in image_files:
image = Image.open(img_path).convert("RGB")
encoding = processor(text=query, images=image, return_tensors="pt").to(device)
outputs = model(**encoding)
scores[img_path] = outputs.logits[0, 1].item()
best_match = max(scores, key=scores.get)
return best_match
Nasıl çalışır:
- image_search işlevi, modeli kullanarak metin sorgusunun gömmesini oluşturur.
- Her görsel işlenerek kendi gömmeleri üretilir.
- Gömmeler, modelin çıktı logits'leri kullanılarak karşılaştırılır.
- Kosinüs benzerliği metin ve görsel gömmeleri arasında hesaplanır.
- En yüksek benzerlik skoruna sahip görsel en iyi eşleşme olarak belirlenir ve döndürülür.
Ön yüz arayüzü (app.py)
Bu dosya, kullanıcı dostu bir arayüz sağlamak için Streamlit kullanır.
1. Kütüphaneleri içe aktarın
import streamlit as st
from search import search_best_match
import os
2. Arayüzü oluşturun
st.title("🖼️ AI-Powered Image Search App")
uploaded_files = st.file_uploader("Upload images", accept_multiple_files=True, type=['jpg', 'jpeg', 'png'])
image_folder = 'images'
os.makedirs(image_folder, exist_ok=True)
if uploaded_files:
for uploaded_file in uploaded_files:
with open(os.path.join(image_folder, uploaded_file.name), 'wb') as f:
f.write(uploaded_file.getbuffer())
st.image(uploaded_file, caption="Uploaded Image", use_column_width=True)
Kullanıcılar birden fazla görsel yükleyebilir. Görseller images/ klasörüne kaydedilir ve görüntülenir.
3. Arama sorgusu ekleyin
query = st.text_input("Enter your search query:")
if query and uploaded_files:
best_match, score = search_best_match(image_folder, query)
st.write("### Most Relevant Image:")
st.image(best_match, caption=f"Score: {score:.4f}", use_column_width=True)
Kullanıcılar bir arama sorgusu girer. Uygulama en iyi eşleşen görseli arar ve gösterir.
Tam Uygulama: BridgeTower ve Streamlit ile Görsel Arama Uygulaması Oluşturma
1. search.py - Arka Uç Mantığı
from transformers import BridgeTowerProcessor, BridgeTowerForImageAndTextRetrieval
from PIL import Image
import torch
import torch.nn.functional as F
import os
# Load Bridgetower processor and model
processor = BridgeTowerProcessor.from_pretrained("BridgeTower/bridgetower-base-itm-mlm")
model = BridgeTowerForImageAndTextRetrieval.from_pretrained("BridgeTower/bridgetower-base-itm-mlm")
# Search for the best matching image
def image_search(query, image_dir):
image_files = [os.path.join(image_dir, img) for img in os.listdir(image_dir) if img.lower().endswith(('jpg', 'jpeg', 'png'))]
scores = {}
for img_path in image_files:
image = Image.open(img_path).convert("RGB")
encoding = processor(text=query, images=image, return_tensors="pt").to(device)
outputs = model(**encoding)
scores[img_path] = outputs.logits[0, 1].item()
best_match = max(scores, key=scores.get)
return best_match
2. app.py - Streamlit Arayüzü
import streamlit as st
from search import image_search
import os
# Title of the app
st.title("🖼️ Image Search Application with BridgeTower")
# Image upload section
uploaded_files = st.file_uploader("Upload your images", accept_multiple_files=True, type=['jpg', 'jpeg', 'png'])
# Create image folder if not exists
image_folder = 'images'
os.makedirs(image_folder, exist_ok=True)
if uploaded_files:
for uploaded_file in uploaded_files:
with open(os.path.join(image_folder, uploaded_file.name), 'wb') as f:
f.write(uploaded_file.getbuffer())
st.image(uploaded_file, caption="Uploaded Image", use_column_width=True)
# Text input for query
query = st.text_input("Enter your search query:")
# Display search results
if query and uploaded_files:
best_match, score = image_search(image_folder, query)
st.write("### Most Relevant Image:")
st.image(best_match, caption=f"Similarity Score: {score:.4f}", use_column_width=True)
3. Uygulamayı çalıştırın
streamlit run app.py
BridgeTower ve Streamlit Uygulama Örneği
İşte uygulamanın çalışırken bir örneği! Bir görsel yüklendi ve kullanıcı “cat” arama sorgusunu yazdı. Uygulama görseli ve metni hızla analiz edip BridgeTower modelini kullanarak eşleştirdi.
En iyi eşleşmeyi buldu ve doğru kedi görselini gösterdi. Bu, uygulamanın doğru sonuçlar vermek için görseller ve metin arasında nasıl iyi bir bağlantı kurduğunu ortaya koyuyor.
Merak burada bitmemeli. Bu tür uygulamaların potansiyeli, şu an uygulananın çok ötesine uzanarak büyüme ve yenilik için heyecan verici fırsatlar açıyor. Kullanıcı deneyimini, performansı ve işlevselliği geliştirmek için imkânlar geniş. Aşağıda, bu tür uygulamaları bir üst seviyeye taşıyabilecek bazı iyileştirmeler öneriyorum.
Gelecekteki BridgeTower İyileştirmeleri
Oluşturduğumuz uygulamayı çeşitli şekillerde geliştirebilirsiniz, örneğin:
Daha hızlı görsel aramaları için FAISS indekslemesi ekleyin
Büyük veri kümelerinde görsel aramaların hızını artırmak için FAISS indekslemeyi uygulayın. Bu sayede görselleri özellik vektörlerine dönüştürüp bir indeks oluşturabilir ve benzerlik aramalarını hızlıca gerçekleştirebilirsiniz; böylece veri kümesi büyüse bile getirme verimli kalır.
Uygulamayı Streamlit Cloud veya AWS üzerinde dağıtın
Özellikle Python ve Streamlit ile çalışıyorsanız hızlı ve kolay bir kurulum için uygulamayı Streamlit Cloud üzerinde dağıtın. Alternatif olarak, daha fazla kontrol, ölçeklenebilirlik ve daha yüksek trafiği karşılama olanağı için AWS üzerinde dağıtarak uygulama büyürken daha iyi performans sağlayın.
Görsel yüklemeleri için gerçek zamanlı güncellemeler uygulayın
Yeni görseller yüklendiğinde sayfayı yenilemeye gerek kalmadan tüm kullanıcılarda anında görünmeleri için gerçek zamanlı güncellemeler kurun. WebSockets veya Socket.IO gibi teknolojileri kullanarak bir görsel yüklenir yüklenmez bağlı tüm kullanıcılara güncellemeleri itebilir, böylece uygulamanın etkileşimini ve deneyimini iyileştirebilirsiniz.
Sonuç
BridgeTower, Streamlit ve PyTorch kullanarak yapay zekâ destekli bir görsel arama uygulamasını başarıyla oluşturduk; bu da yapay zekânın dijital içeriklerle etkileşimi nasıl basitleştirip geliştirebileceğini gösteriyor.
Tam işlevsel olmakla birlikte, FAISS indeksleme ile arama hızını optimize etmek, ölçeklenebilirlik için AWS gibi platformlarda dağıtım yapmak ve daha akıcı bir kullanıcı deneyimi için gerçek zamanlı güncellemeler eklemek gibi geliştirmelere açık. Bu proje, akıllı arama sistemlerinde daha fazla yenilik için sağlam bir temel sunuyor.
Daha fazlasını öğrenmek isterseniz şu kaynakları önerebilirim:
GenAI ve veri bilimi üzerine bilgi paylaşarak 20 milyon görüntüleme elde etmiş Kıdemli GenAI Mühendisi ve İçerik Üreticisi.

