Derin Öğrenme ile İçerik Tabanlı Görüntü Benzerliği (Content Based Image Retrieval)— Bölüm 1

Original article was published by Mehmet EFE on Deep Learning on Medium


Bu çalışmaların çoğu farklı uygulamalar ve veri setleri için yapılmakta ve github’da benzeri pek çok örnek bulunabilmektedir. Genellikle literatürde “image similarity”, “content based image retrieval (CBIR[1])”, “image search”, “image retrieval”, vb anahtar sözcüklerle benzer çalışmalara ve yayınlara erişmek mümkün. Benim yapacaklarım ve yapmayacaklarım özetle şu şekilde:

  • Önceleri öznitelik hesaplayıp (color histogram, auto-correlogram, HOG/SIFT kombinasyonu, wavelet, color moments vb.), bu öznitelikleri bir sınıflandırıcıya vererek yaptığımız çalışmaları (çok old school gelebiliyor kulağa), öznitelik çıkartmadan CNN tabanlı bir uygulamada test etmek.
  • Eski/yeni karşılaştırması yapmayacağım (aslında o da güzel iş ancak bu konuda yayın zaten çok fazla) ancak uyguladığım yöntemlerin sonuçlarını en son bölümde toparlamaya çalışacağım.
  • Bu konuda eğitilebilir (veya transfer-learning ile adapte edilebilir) bir kaç CNN modelini uygulayacağım.
  • Sadece görüntüde benzerlik ve arama kısmına odaklanarak bu çalışmaların diğer kombinasyonlarına girmeyeceğim. “Deep Visual-Semantic embedding (DeVise)” gibi görüntünün kelime vektörleriyle (word-vec) kombinlendiği şahane çalışmalar mevcut. Orjinal bir veri setinde belki ileride uygulanabilir. Hazırı img2vec linkinde yer almaktadır.
  • Üretilen özniteliklerin karşılaştırılmasında kullanılabilecek optimizasyon (hashing trick) işlemlerine göz atacağım.

Uygulama

Uygulama için NWPU RESISC45 ve UCMerced veri setlerine ihtiyacımız var. Bunları lokal bilgisayarımıza indirdikten sonra işe girişebiliriz. Uygulamada NWPU veri setinin özniteliklerini çıkartıp, UCMerced üzerinde test edeceğiz.

Önce gerekli kütüphaneleri import edip, klasörde görüntüleri gezen ve bize dosya/kategori dönen bir fonksiyona ihtiyacımız var. Bu fonksiyonu,yazacağımız custom torchvision.Dataset sınıfında kullanacağız. Bunun yerine doğrudan torchvision.datasets.ImageFolder kullanarak da yapılabilir.

NWPU için Dataset sınıfı, transform ve dataset nesnesi:

Model ön eğitilmiş (pretrained) Resnet50 ([2],[3]). ‘fc’ katmanını kaldırıp bir önceki katmandaki öznitelikleri kullanacağız. Bunun için ‘fc’ katmanını bir ‘Identity’ katmanı ile değiştirmemiz yeterli (model içerisindeki tüm katmanları başka bir modele bire bir kopyalayarak da yapılabilirdi, ancak henüz katman seçme kaygımızın olmadığını kabul ediyorum). Modeli eğitmeyeceğimiz için (yani backpropagation yok) katmanlardaki katsayıları donduracağız (freeze, no_grad) .

Veri yükleyicimiz (DataLoader) . batch_size şu aşamada çokta önemli değil, çalıştığınız ortama uyacak oranda bir değer vermeniz yeterlidir.

Artık bir döngü içerisinde veri setine ait tüm görüntülerin özniteliklerini hesaplayabiliriz. Veri seti küçük olduğu için döngü, batch’leri sırayla işleyecektir (bu döngü tqdm ile belki daha da hızlanabilir). Kodun bu işlemleri GPU üzerinde yaptığını düşünerek, öznitelikleri CPU üzerine np.array olarak alıp all_stack_matrix listesinde sırayla tutacağız.