CNN Kullanarak Görüntü Sınıflandırma
Merhabalar, ilk yazımda yüksek lisans sürecimde CNN kullanarak yaptığım görüntü sınıflandırma çalışmasından bahsedeceğim.
Konuya yabancı kişiler için öncelikle CNN nedir , kısaca bahsedeyim. CNN (Convolutional Neural Network) genellikle görüntüler üzerinde kullanılan ve görüntülerin özniteliklerini çıkartan ağlardır. Örnek bir CNN aşağıdaki katmanlardan oluşur :
Convolutional Layer : Görüntüye filtreler uygulayarak özelliklerini çıkarır. Bir CNN modelinde birden fazla convolutional layer bulunabilir.
Pooling Layer : Convolutional katmandan sonra ya da convolutional katmanlar arasına eklenen bir katmandır. Bu katmanın görevi hesaplama sayısını azaltmak ve işlem hızını arttırmak için bazı fonksiyonlar uygulamaktır. Bu fonksiyonlardan en yaygın olanı Max Pooling algoritmasıdır.
Flattenning Layer : Bu katmanda veri tek boyutlu bir dizi haline getirilerek bir sonraki katman için hazırlanır.
Fully-Connected Layer : CNN modelinin son katmanıdır. Verilerle öğrenmeyi gerçekleştirir.
CNN hakkında kısa bir bilgilendirme sonrası çalışmamıza geçebiliriz. Öncelikle bu çalışmada bir veri setine ihtiyacımız var. Görüntüler ile çalışacağımız için uygun bir veri seti bulmalıyız. Ben çalışmamda Weather Dataseti’ni kullandım. Siz de bağlantıdan inceleyebilir ve indirebilirsiniz. Bu veri seti ‘cloudy’, ‘foggy’, ‘rainy’, ‘shine’, ‘sunrise’ olmak üzere beş ayrı sınıftan oluşmaktadır. Dataset toplam 1500 görüntü içeriyor. Dataset içerisinde her sınıfa ait ortalama 250–300 örnek bulunuyor. Sınıfların benzer sayıda veri içermesi önemli aksi takdirde ağımız öğrenmeyecek ve verileri ezberleme dediğimiz durum oluşacaktır.
Veri setimizi hazırladıysak artık kodlamaya başlayabiliriz. Kodlama aşamasında Python kullanacağız. Önce veri setimizdeki görüntüleri ve class bilgilerini aşağıdaki gibi okuyarak dizilere aktaralım. Görüntüleri okurken boyutularını 256x256 olarak değiştiriyoruz. Boyut önemli çünkü modelin input shape’ini görüntünün boyutuna göre ayarlayacağız.
Veri setimizdeki sınıf ve veri dağılımını grafik üzerinde aşağıdaki kod bloğuyla gösterebiliriz.
Dizilerimizi numpy array’e dönüştürelim. Shape değerlerini aşağıdaki gibi yazdırdığımızda 1500 veri sayısını, 256x256 görüntü boyutunu, 3 ise görüntüdeki kanal sayısını ifade eder.
((1500, 256, 256, 3), (1500,))
Eğer classes dizisini yazdırırsak aşağıdaki gibi çıktı alırız.
['foggy' 'foggy' 'foggy' ... 'cloudy' 'cloudy' 'cloudy']
Şimdi classes dizimizi biraz değiştirelim ve binary hale getirelim.
(1500, 5)
Güncellenmiş classes dizisini yazdıralım.
[[0 1 0 0 0] [0 1 0 0 0] [0 1 0 0 0] … [1 0 0 0 0] [1 0 0 0 0] [1 0 0 0 0]]
Bu haliyle diziyi incelersek :
[1 0 0 0 0] : cloudy
[0 1 0 0 0] : foggy
[0 0 1 0 0] : rainy
[0 0 0 1 0] : shine
[0 0 0 0 1] : sunrise olarak ifade edebiliriz.
Verilerimizi artık modele hazır hale getirdik. Şimdi model ve eğitim için bazı parametreleri ayarlayalım. Öncelikle bir learning rate belirleyelim. Bu parametreyi çalışmamda 0.00001, 0.0001 ve 0.001 olarak üç farklı şekilde kullandım. Ağımı farklı learning rate değerleri ile eğiterek başarı oranlarını inceledim. Siz de bu şekilde denemelerle uygun bir learning rate belirleyebilirsiniz.
Çalışmada k-fold cross validation yöntemini kullanacağız. Bu yöntem belirlenen fold sayısına göre veri setini test ve train olarak parçalara böler. Fold değerini 5 olarak belirleyelim.
CNN modelimizi oluşturalım. Modelimizin son katmanındaki çıkış sayısının 5 olduğuna dikkat edelim. Son katmana, kaç tane sınıfımız var ise o kadar çıkış eklememiz gerekiyor.
Modelimizi oluşturduktan eğitim aşamasına geçebiliriz. Aşağıdaki gibi fit fonksiyonunu kullanıyoruz. Buradaki parametreler çalışmanıza göre farklılıklar gösterebilir. Epoch sayısı eğitim verisinin ağa kaç defa gösterileceğini ifade eder. Epoch sayısını 15 olarak belirleyelim.
Modeli eğittikten sonra test aşamasına geçiyoruz ve çalışmanın başarı durumunu anlamak için confusion matrisini oluşturuyoruz.
Confusion matrisimizi görselleştirelim.
Sonuçlara bakarsak ağımız en fazla doğru tahmini 4 nolu sınıfta yani “sunrise” sınıfında yapmış. En düşük tahmini ise 1 nolu sınıfta yani “cloudy” sınıfında yapmış.
Bu çalışmada data üzerinde çeşitli düzenlemeler yapılarak ve model üzerindeki geliştirmeler ile doğruluk oranları arttırılabilir. Kodların tamamına buradan ulaşabilirsiniz. Bir sonraki yazımda görüşmek üzere .☺