Keras ile Nesne Tanıma Uygulamaları

Source: Deep Learning on Medium


Elinizdeki görsellerden nesne tanıma yapmak istiyorsunuz fakat görüntü işleme tekniklerine aşina değil misiniz? Gelin şimdi mükemmel derecede basit ve bir o kadar da pratik şekilde görsellerimizdeki nesneleri tanımlamayı görelim.

ImageNet

Yapacağımız çalışma giriş düzeyi nesne tanıma için süreci o kadar kolaylaştıracak ki, proje aşamasına geçmeden vereceğim bilgilere dahi göz atmadan uygulamayı kullanabileceksiniz, fakat ne yaptığımızı veya nasıl yaptığımızı görmek adına gerekli tüm bilgileri aktaracağım.

Projenin tamamlanmasından sonra diğer ağ yapılarını da nasıl sadece birkaç ufak değişiklikle çalıştırabileceğinizi de anlatacağım.

Keras

Keras’ın uzun zamandır “Derin Öğrenme” uygulamalarında hem modellerimizin prototiplerini gerçekleştirirken, hem de öğrenme aşamasında bize ne kadar yardımcı olduğunu göz ardı etmek imkansız bir hale geldi. Katmanların ince ayarlarını, hiper-parametrelerini, modelin oluşturulması ve veri setlerinin indirilmesinden tutun girdileri sinir ağına uygulayacağımız hale getirilmesine dek her an yanımızda. Bugün sizlere dünya çapında ve akademik alanda büyük başarılar sağlamış yapıları nasıl basitçe kullanabileceğinizi anlatacağım.

Çalışmaya geçmeden önce bildirmek isterim ki -siz de bunu rahatlıkla göreceksiniz- python bilginizin temel düzeyde olmasına bile gerek duymayacaksınız.

Görüntü İşleme Teknikleri

Deep Learning Türkiye takipçilerinin bildiği gibi “Görüntü İşleme” ve “Bilgisayarlı Görü” sistemleri, her geçen gün popülaritesi katlanarak artan alanlardan biri. Kamera sistemlerimizin, depolama alanlarımızın ve donanımlarımızın teknolojisi arttıkça, dijital gözlerimizin yeteneklerini optimize etmek gerçekten harika işlere imza atmamızı sağlıyor.

Projemize geçmeden önce bu alandaki bilgi birikimimizi artırmak adına, hem de okurlarımızı hazır yakalamışken onlara bu alandan daha detaylı bahsetmek istiyorum fakat hemen projeye geçmek istiyorum diyorsan bu bölümü hızlıca geçebilirsin.

Kim Bu Adam?

Alfred Haar

Alfred Haar, görüntü işleme tekniklerinin önünün açılması konusunda belki de en büyük matematikçilerden biri.

OpenCV’ye aşinaysanız Haar-Cascade veya diğer algoritmalarda “Haar-like Features” olarak duyduğunuz Haar aslında Alfred Haar.

Mükemmel, şimdi biraz daha derine inerek anlaşılır bir bağlantı kuralım.

Derin öğrenme algoritmalarını görüntü işleme tekniklerinde kullanmadan önce, bu problemi çözmek adına uğraşan birçok bilim adamı vardı. Belki de Alfred bu bulduğu tekniğin ne kadar büyük çalışmalara yahut bugün geldiğimiz düzeye erişebileceğini hayal dahi etmemişti fakat bildiğimiz bir şey var ki o da, teknik bir kez ortaya atıldığında “Homo-Sapiens” bilineni korumayı ve bunu ilerletmeyi çok iyi beceriyor.

Haar Hocamızın, Haar Dalgacık Dönüşümü (Haar Wavelets) yöntemini, kısacık 48 yıllık hayatında bize bahşettikten sonra 2001 yılında bu özellikleri kullanarak iki büyük bilim adamı Paul Viola ve Michael Jones ilk yüz tanıma algoritmasını geliştirdiler.

Haar Benzeri Özellikler (Haar-like Features)

Haar benzeri özellikleri kabaca 3 ana bölgeye ayırabiliriz.

  • Kenar Özellikleri
  • Çizgi Özellikleri
  • Dört Kare Özellikleri
OpenCV Documentation — Face Detection

Evet şimdi kurmak istediğim bağlantıya geri dönelim. Burada bağlantı kurmanız açısından insan yüzü tanımlamak istediğimizi düşünelim, haar benzeri özellikler gördüğünüz gibi bir insan yüzü tanımlamak istediğimizde bize bu özelliklerin olduğu bölgelerin tespitini yapmamızı kolaylaştırıyor. Bu sayede aradığımız görselde bir insan yüzü olup olmadığını anlayabiliyoruz.

OpenCV Documentation — Face Detection

Belki dikkatinizi çekmiştir, bu teknikler bazı dezavantajlara sebep olabiliyor, her ne kadar halen güçlü ve kullanılabilir bir algoritma olsa da, insan yüzünün bulunduğu görsel üzerinde gölge oluşması, yüzün ilgili görselde farklı açılarda olması gibi durumlarda algoritmamız pek de iyi sonuç vermeyebilir. Şimdi birlikte bu sorunu nasıl çözdüğümüze bakalım. Artık işin eğlenceli kısmına yavaş yavaş yaklaşmaya başladık. Daha da derine inip “Derin Ağları” göreve çağırıyoruz.

Evrişimsel Sinir Ağları (Convolutional Neural Networks)

Bu bölümde projemizde kullanacağımız ağın yapısından bahsedeceğim, bunun dışında kullanılan birçok farklı yöntem var, aynı zamanda çalışmada Keras içerisinde bulunan diğer yöntemleri nasıl kolayca çağırabileceğinizi ve kullanabileceğinizi de anlatacağım. Evrişimsel Sinir Ağlarında daha da fazla bilgi almak istiyorsanız Deep Learning Türkiye Medium sayfamızda Ayyüce Kızrak’ın mükemmel bir yazısı var.

Tarihi 1998 Yılına Alalım

Yann LeCun ve ekibi 1998 yılında yayınladığı makale, görüntü işleme yöntemlerinin nasıl Derin Ağlar üzerinde kullanabileceğini anlattı. LeNet-5 olarak adlandırılan bu yapı ilk başarılı sonucu veren evrişimli sinir ağı olmuştur.

Sonrasında durmayıp tekniklerimizi geliştirmeye devam ettik ve bugün size projemizde kullanacağımız yapıya ve gayet iyi sonuçlar veren modele nihayet geldik.

VGG-16

Burada anlatmak üzere olduğumuz model anlaşılması diğer modellere nazaran daha basit bir yapı, görselin uzun olması umarım sizi korkutmamıştır. Dikkat ederseniz bloklar kendilerini birkaç kez tekrar ediyor. Bunu yapmamızdaki en büyük amaç girişimizdeki görselimizi daha küçük boyutlu matrislere küçültmek.

Giriş katmanımızda görselimizi aldıktan sonra, bol bol evrişimsel (Convolutional) katmandan geçiriyoruz.

Sonrasında maksimum ortaklama (Max-Pooling) yapıyoruz ve bu döngüyü tekrar ediyoruz.

Elde ettiğimiz daha küçük matrisimizi düzleştirdikten sonra, iki kez tam bağlantı katmanından (Fully-Connected Layer) geçirip, çıkış katmanımıza bağlıyoruz.

Fakat yapacağımız çalışmada bunlara hiç ihtiyacımız olmayacağından emin olabilirsiniz.

Başlayalım!

O halde başlayalım, önceden bahsettiğim gibi hemen hemen hiçbir şeye ihtiyacınız yok, bilgisayarınızda python ve keras kurulu olduğunu kabul ederek devam edelim.

Tüm yapacağımız işlem bu kod bloğunu çalıştırmak olacak. Gelin şimdi burada ne yapıyoruz inceleyelim.

Kütüphanelerin Eklenmesi

Her zaman olduğu gibi ilk önce kullanacağımız kütüphaneler ile başlıyoruz.

Öncelikle Keras’a VGG16 modülünü ekleyeceğimizi söyleyelim. Sonrasında görüntümüz üzerinde ön işlem yapacağımızı ve tahminlerini basitçe yazdırmamız için gerekli fonksiyonları da ekliyoruz. Giriş verimiz üzerine modele uygulamak adına basit matris işlemleri yapmak için numpy modülünü de çağırıyoruz.

Modeli yeniden eğiterek vakit kaybetmemek adına, daha öncesinde eğitilmiş modelin ağırlıklarını alıyoruz. Görselimizin adresini img_path adlı değişkene aktardıktan sonra, boyutlarını VGG16 modeline uygun hale getiriyoruz. Eksenlerimizi ayarladıktan sonra süreç tamamlanmış oluyor. Artık tahmin aşamasına geçebiliriz.

Tahmin (Prediction)

Bu zamana kadar kodumuzu bilgisayarımıza kopyalayıp, bulunduğu dizine tahmin yapmak istediğimiz görselleri eklemek dışında hiçbir şey yapmadık. Keras’ın sürecimizi ne kadar kolaylaştırdığını ve ne kadar hız kazandırdığını gördük, pekala şimdi kodumuzu çalıştıralım ve sonuçlarına bir göz atalım.

Son satırda en iyi 3 tahmini yazdırmasını istedik. İlk testi internet üzerinden bulduğum bir kuş fotoğrafıyla yapıyorum.

Farklı Bir Görsel Üzerine Deneyelim

Burada tek yapmamız gereken modele göndereceğimiz görseli değiştirmek olacak.

img_path = ‘images/bird.jpg’

olarak yazdığım satırı,

img_path = ‘images/cup.jpg’

şeklinde değiştiriyorum ve kodumu tekrar çalıştırıyorum.

Öncesinde eğitilmiş modelleri Keras ile nasıl kolayca kullanabileceğimizi gördük. Fakat başka bir model kullanmak istiyorsak ne yapacağız hiç vakit kaybetmeden devam edelim.

Farklı Modeller ile Çalışmak

Keras’ın yetenekleri burada bitmiyor, içerisinde farklı modelleri kullanabileceğimiz fonksiyonları var. Keras’ın dokümantasyonuna giderek neler varmış bakalım.

Keras/Applications bölümüne gidelim. Buradan hızlıca ilgili bölüme gidebilirsiniz.

Gördüğünüz gibi farklı modellere sahibiz, dokümantasyona giderek daha ayrıntılı şekilde bakabilirsiniz. Her model için boyut, doğruluk ve parametre sayısı gibi bilgiler verilmiş.

Çalışmamızı VGG16 üzerinde yapmıştık, şimdi bir de hızlıca ResNet üzerinden nasıl yapacağımıza bakalım.

ResNet ile Çalışmak

Süreç çok basit kodumuzda birkaç ufak değişiklik yapalım ve yeniden çalıştıralım.

Neleri değiştirdiğimize hızlıca bakalım, endişe etmeye gerek yok sadece üç satır üzerinde VGG16 yazdığımız yerlere ResNet yazacağız.

from keras.applications.vgg16 import VGG16            #VGG16
from keras.applications.resnet50 import ResNet50 #ResNet50

#VGG16
from keras.applications.resnet50 import preprocess_input, decode_predictions
#ResNet50
from keras.applications.vgg16 import preprocess_input, decode_predictions

model = VGG16(weights='imagenet')        #VGG16
model = ResNet50(weights='imagenet') #ResNet50

Sonuç

Bu kadar basit ve hızlı bir çalışmayı bu kadar uzun bir yazıda anlatacağımı hiç düşünmezdim fakat programları çalıştırmaktan ziyade içeride neler döndüğünü ve bu teknolojiyi geliştirirken geçilen yolları öğrenmeyi seviyorum, umarım siz de keyif almışsınızdır.

Daha önce eğitilen ve güzel sonuçlar veren yöntemleri kullanmayı öneriyorum. Modelinizi sıfırdan eğitmek yerine büyük veri setlerinde ve güçlü donanımlar ile uzun sürelerde eğitilmiş modellerin ağırlıklarını alarak, çalışmanız dahilinde kendi veri setiniz ile yeniden eğitebilirsiniz.

Çalışmanın tam halini github üzerinden indirip kullanmanız için repoya ekledim. Kaynaklar bölümünden ulaşabilirsiniz.

Kaynaklar ve Detaylar

Görüntü İşleme

Derin Öğrenme

Github