CNN'de Görüntü Sınıflandırma: Bilmeniz Gereken Her Şey

Yayınlanan: 2021-02-25

İçindekiler

Tanıtım

Facebook beslemesini incelerken, bir grup fotoğrafındaki kişilerin Facebook yazılımı tarafından otomatik olarak nasıl etiketlendiğini hiç merak ettiniz mi? Facebook'un gördüğünüz her interaktif kullanıcı arayüzünün arkasında, sosyal medya platformuna tarafımızca yüklenen her resmi tanımak ve etiketlemek için kullanılan karmaşık ve güçlü bir algoritma vardır. Her resmimizle, yalnızca algoritmanın verimliliğini artırmaya yardımcı oluyoruz. Evet, Görüntü Sınıflandırma, Yapay Zeka uygulamasını gördüğümüz en yaygın kullanılan algoritmalardan biridir.

Son zamanlarda, Evrişimli Sinir Ağları (CNN), Derin Öğrenmenin en güçlü savunucularından biri haline geldi. Bu Evrişimsel Ağların popüler bir uygulaması Görüntü Sınıflandırmadır. Bu derste, Evrişimli Sinir Ağlarının temellerini inceleyeceğiz, bir CNN modeli oluşturmaya dahil olan çeşitli katmanları göreceğiz ve son olarak Görüntü Sınıflandırma görevinin bir örneğini görselleştireceğiz.

Görüntü Sınıflandırma

Derin Öğrenme ve Evrişimli Sinir Ağlarının ayrıntılarına girmeden önce, Görüntü Sınıflandırmanın temellerini anlayalım. Genel olarak, Görüntü Sınıflandırma, görüntünün ait olduğu sınıfı veya sınıfın olasılığını çıkaran belirli bir algoritma kullanılarak oluşturulmuş bir modele girdi olarak bir görüntü verdiğimiz görev olarak tanımlanır. Bir görüntüyü belirli bir sınıfa etiketlediğimiz bu işleme Denetimli Öğrenme denir.

Bir görüntüyü nasıl gördüğümüz ile makinenin (bilgisayarın) aynı görüntüyü nasıl gördüğü arasında büyük bir fark vardır. Bize göre, görüntüyü görselleştirebilir ve onu renk ve boyuta göre karakterize edebiliriz. Öte yandan, makinenin gördüğü tek şey sayılardır. Görülen sayılara piksel denir.

Her pikselin 0 ile 255 arasında bir değeri vardır. Bu nedenle, bu sayısal verilerle makine, bir görüntüyü diğerinden ayıran bazı özel desenler veya özellikler türetmek için bazı ön işleme adımları gerektirir. Evrişimli Sinir Ağları, görüntülerden belirli bir desen türetebilen algoritmalar oluşturmamıza yardımcı olur.

Bilgisayarın Gördüğüne Karşı Biz Gördüklerimiz

Kaynak - Bilgisayar ve İnsan Gözü Arasındaki Fark

Görüntü Sınıflandırma için Derin Öğrenme

Artık Görüntü Sınıflandırmanın ne olduğunu anladığımıza göre, şimdi bunu Yapay Zeka kullanarak nasıl uygulayabileceğimizi görelim. Bunun için popüler Derin Öğrenme yöntemlerini kullanıyoruz. Derin Öğrenme, görüntü veri kümesinde bulunan çeşitli sınıfları ayırt etmek için çeşitli görüntülerden kalıpları tanımak ve türetmek için büyük görüntü veri kümelerini kullanan bir Yapay Zeka alt kümesidir.

Derin Öğrenmenin karşılaştığı en büyük zorluk, büyük bir veritabanı için çok uzun zaman alması ve yüksek bir hesaplama maliyetine sahip olmasıdır. Ancak, bir Derin Öğrenme algoritması türü olan Evrişimli Sinir Ağları bu sorunu iyi bir şekilde ele almaktadır.

Evrişimli Sinir Ağları

Derin Öğrenmede, Evrişimli Sinir Ağları, çoğunlukla görsel görüntülerde kullanılan bir Derin Sinir Ağları sınıfıdır. Yann LeCunn tarafından 1998 yılında önerilen Yapay Sinir Ağlarının (YSA) özel bir mimarisidir. Evrişimsel Sinir Ağları iki bölümden oluşur.

İlk kısım, ana özellik çıkarma işleminin gerçekleştiği Evrişimsel katmanlardan ve Havuzlama katmanlarından oluşur. İkinci bölümde, Tam Bağlantılı ve Yoğun katmanlar, çıkarılan öznitelikler üzerinde birkaç doğrusal olmayan dönüşüm gerçekleştirir ve sınıflandırıcı bölüm olarak işlev görür. Görüntü sınıflandırması için CNN öğrenin.

İnsan ve makinenin ne gördüğüne dair yukarıda gösterilen resim örneğini düşünün. Gördüğümüz gibi, bilgisayar bir dizi piksel görür. Örneğin, görüntü boyutu 500×500 ise, dizinin boyutu 500x500x3 olacaktır. Burada, her yükseklik ve genişlik için 500, her bir renk kanalının ayrı bir diziyle temsil edildiği RGB kanalı için 3 vardır. Piksel yoğunluğu 0 ile 255 arasında değişir.

Şimdi Görüntü Sınıflandırması için bilgisayar, temel düzeydeki özellikleri arayacaktır. Biz insanlara göre, kedinin bu temel düzeydeki özellikleri kulakları, burnu ve bıyıklarıdır. Bilgisayar için ise, bu temel düzey özellikler eğrilikler ve sınırlardır. Bu şekilde, Konvolüsyon katmanları ve Havuzlama katmanları gibi birkaç farklı katman kullanarak bilgisayar, görüntülerden temel düzey özellikleri çıkarır.

Evrişimli Sinir Ağı modelinde, aşağıdakiler gibi birkaç katman türü vardır:

  • Giriş Katmanı
  • Evrişimsel Katman
  • Havuzlama Katmanı
  • Tam Bağlantılı Katman
  • Çıktı Katmanı
  • Aktivasyon Fonksiyonları

Görüntü Sınıflandırmadaki uygulamasına geçmeden önce her bir katmanı kısaca gözden geçirelim.

Giriş Katmanı

Adından, bunun girdi görüntüsünün CNN modeline besleneceği katman olduğunu anlıyoruz. İhtiyacımıza bağlı olarak, görüntüyü (28,28,3) gibi farklı boyutlara yeniden şekillendirebiliriz.

Evrişimsel Katman

Ardından, sabit boyutta bir filtreden (çekirdek olarak da bilinir) oluşan en önemli katman gelir. Convolution'ın matematiksel işlemi, giriş görüntüsü ile filtre arasında gerçekleştirilir. Bu, keskin kenarlar ve eğriler gibi temel özelliklerin çoğunun görüntüden çıkarıldığı aşamadır ve bu nedenle bu katman, özellik çıkarıcı katman olarak da bilinir.

Havuzlama Katmanı

Konvolüsyon işlemini gerçekleştirdikten sonra Pooling işlemini gerçekleştiriyoruz. Bu aynı zamanda görüntünün uzamsal hacminin azaltıldığı altörnekleme olarak da bilinir. Örneğin 28×28 boyutundaki bir görüntü üzerinde 2 adımlı Pooling işlemi yaparsak görüntü boyutu 14×14'e düşürülür, orijinal boyutunun yarısına küçülür.

Tam Bağlantılı Katman

Tam Bağlantılı Katman (FC), CNN modelinin nihai sınıflandırma çıktısının hemen önüne yerleştirilir. Bu katmanlar, sınıflandırmadan önce sonuçları düzleştirmek için kullanılır. Birkaç önyargı, ağırlık ve nöron içerir. Sınıflandırmadan önce bir FC katmanı eklemek, N-boyutlu bir vektörle sonuçlanır; burada N, modelin bir sınıf seçmesi gereken bir dizi sınıftır.

Çıktı Katmanı

Son olarak, Çıktı Katmanı, çoğunlukla tek sıcak kodlama yöntemi kullanılarak kodlanan etiketten oluşur.

Aktivasyon Fonksiyonu

Bu Aktivasyon İşlevleri, herhangi bir Evrişimli Sinir Ağı modelinin özüdür. Bu işlevler, bir sinir ağının çıktısını belirlemek için kullanılır. Kısacası, belirli bir nöronun etkinleştirilip etkinleştirilmeyeceğini (“ateşlenmesi”) belirler. Bunlar genellikle giriş sinyallerinde gerçekleştirilen doğrusal olmayan işlevlerdir. Bu dönüştürülmüş çıktı daha sonra bir sonraki nöron katmanına girdi olarak gönderilir. Sigmoid, ReLU, Leaky ReLU, TanH ve Softmax gibi çeşitli aktivasyon fonksiyonları vardır.

Temel CNN Mimarisi

Kaynak : Temel CNN Mimarisi

Daha önce tanımlandığı gibi, yukarıda gösterilen diyagram, bir Evrişimli Sinir Ağı modelinin temel mimarisidir. Artık Görüntü Sınıflandırma ve CNN'nin temelleri ile hazır olduğumuza göre, şimdi gerçek zamanlı bir problemle uygulamasına geçelim. Temel CNN mimarisi hakkında daha fazla bilgi edinin.

Evrişimli Sinir Ağları Uygulaması

Artık Görüntü Sınıflandırma ve Evrişimli Sinir Ağlarının temellerini anladığımıza göre, Python kodlaması ile TensorFlow/Keras'taki uygulamasını görselleştirelim. Burada, Temel LeNet Mimarisi ile basit bir Evrişimsel Sinir Ağı Modeli oluşturacağız, modeli bir eğitim seti ve test seti üzerinde eğiteceğiz ve son olarak test seti verisi üzerinde modelin doğruluğunu elde edeceğiz.

Problem Seti

Bu makalede, Evrişimli Sinir Ağı Modelini oluşturmak ve eğitmek için ünlü Fashion MNIST veri setini kullanacağız. MNIST, Modifiye Ulusal Standartlar ve Teknoloji Enstitüsü'nün kısaltmasıdır. Fashion-MNIST, 60.000 örneklik bir eğitim seti ve 10.000 örneklik bir test setinden oluşan, Zalando'nun makale görüntülerinin bir veri setidir. Her örnek, 10 sınıftan bir etiketle ilişkilendirilmiş 28×28 gri tonlamalı bir görüntüdür.

Her eğitim ve test örneği, aşağıdaki etiketlerden birine atanır:

0 – Tişört/üst

1 – Pantolon

2 – Kazak

3 – Elbise

4 – Ceket

5 – Sandalet

6 – Gömlek

7 – Spor Ayakkabı

8 – Çanta

9 – Bilek Çizme

Kaynak : Fashion MNIST Veri Kümesi Görselleri

Program kodu

Adım 1 – Kitaplıkları İçe Aktarma

Herhangi bir Derin Öğrenme modeli oluşturmanın ilk adımı, program için gerekli olan kitaplıkları içe aktarmaktır. Örneğimizde, TensorFlow çerçevesini kullandığımız için, Keras kütüphanesini ve ayrıca hesaplama sayısı ve grafikleri çizmek için matplotlib gibi diğer önemli kütüphaneleri içe aktaracağız.

#TensorFlow – Kitaplıkları İçe Aktarma

numpy'yi np olarak içe aktar

matplotlib.pyplot'u plt olarak içe aktar

%matplotlib satır içi

tensorflow'u tf olarak içe aktar

tensorflow ithalat Keras'tan

Adım 2 – Veri Kümesini Alma ve Bölme

Kütüphaneleri içe aktardıktan sonraki adım, veri setini indirmek ve Fashion MNIST veri setini ilgili 60.000 eğitim ve 10.000 test verisine bölmektir. Neyse ki, keras bize Fashion MNIST veri setini içe aktarmak için önceden tanımlanmış bir fonksiyon sağlıyor ve biz de kendi kendini anlayan basit bir kod satırı kullanarak bunları bir sonraki satıra bölebiliriz.

#TensorFlow – Veri Kümesini Alma ve Bölme

fashion_mnist = keras.datasets.fashion_mnist

(train_images_tf, train_labels_tf), (test_images_tf, test_labels_tf) = fashion_mnist.load_data()

Adım 3 – Verileri Görselleştirme

Veri kümesi, görüntüler ve bunlara karşılık gelen etiketlerle birlikte indirildiğinden, kullanıcı için daha açık hale getirmek için, Evrişimsel Sinirsel yapı ile uğraştığımız veri türünü anlayabilmemiz için her zaman verileri görüntülememiz önerilir. Ağ Modeli buna göre. Burada, aşağıda verilen bu basit kod bloğu ile rastgele karıştırılan eğitim veri setinin ilk 3 görüntüsünü görselleştireceğiz.

#TensorFlow – Verileri Görselleştirme

def imshowTensorFlow(img):

plt.imshow(img, cmap='gri')

print(“Etiket:”, img[0])

imshowTensorFlow(train_images_tf[0])

Etiket: 9 Etiket: 0 Etiket: 3

Yukarıda verilen görüntü ve etiketleri, yukarıdaki Fashion MNIST veri seti detaylarında verilen etiketlerle doğrulanabilir. Bundan, veri görüntümüzün 28 piksel yüksekliğinde ve 28 piksel genişliğinde gri tonlamalı bir görüntü olduğu sonucunu çıkarıyoruz.

Bu nedenle, model (28,28,1) giriş boyutuyla oluşturulabilir, burada 1 gri tonlamalı görüntüyü temsil eder.

Adım 4 – Modeli Oluşturma

Yukarıda bahsedildiği gibi, bu yazıda LeNet mimarisi ile basit bir Evrişimsel Sinir Ağı inşa edeceğiz. LeNet, Yann LeCun ve diğerleri tarafından önerilen bir evrişimsel sinir ağı yapısıdır. Genel olarak, LeNet, LeNet-5'e atıfta bulunur ve basit bir Evrişimli Sinir Ağıdır.

Kaynak : LeNet Mimarisi

LeNet CNN Modelinin yukarıda verilen Mimari diyagramından 5+2 katman olduğunu görüyoruz. Birinci ve ikinci katmanlar, bir Evrişim katmanı ve ardından bir Havuzlama katmanıdır. Yine, üçüncü ve dördüncü katmanlar, bir Evrişim katmanı ve bir Havuzlama katmanından oluşur. Bu işlemler sonucunda 28×28 olan giriş görüntüsünün boyutu 7×7'ye düşmektedir.

LeNet Modelinin beşinci katmanı, önceki katmanın çıktısını düzleştiren Tam Bağlantılı Katmandır. İki Yoğun katman tarafından takip edilen CNN modelinin son çıktı katmanı, 10 birimli bir Softmax aktivasyon fonksiyonundan oluşur. Softmax işlevi, Fashion MNIST veri kümesinin 10 sınıfının her biri için bir sınıf olasılığını tahmin eder.

#TensorFlow – Modeli Oluşturma

model = keras.Sequential([

keras.layers.Conv2D(input_shape=(28,28,1), filtreler=6, kernel_size=5, adımlar=1, padding=”aynı”, activation=tf.nn.relu),

keras.layers.AveragePooling2D(havuz_boyutu=2, adım sayısı=2),

keras.layers.Conv2D(16, kernel_size=5, adımlar=1, padding=”aynı”, activation=tf.nn.relu),

keras.layers.AveragePooling2D(havuz_boyutu=2, adım sayısı=2),

keras.layers.Flatten(),

keras.layers.Dense(120, aktivasyon=tf.nn.relu),

keras.layers.Dense(84, aktivasyon=tf.nn.relu),

keras.layers.Dense(10, aktivasyon=tf.nn.softmax)

])

Adım 5 – Model Özeti

LeNet modelinin katmanları sonlandırıldığında, modeli derlemeye devam edebilir ve tasarlanan CNN modelinin özet bir versiyonunu görebiliriz.

#TensorFlow – Model Özeti

model.compile(loss=keras.losses.categorical_crossentropy,

optimizer='adam',

metrikler=['acc'])

model.özet()

Bunda, nihai çıktı 2'den fazla sınıfa (10 sınıf) sahip olduğundan, kayıp fonksiyonu olarak kategorik çapraz entropiyi ve oluşturulan modelimiz için Adam Optimizer'ı kullanırız. Model özeti aşağıda verilmiştir.

Adım 6 – Modelin Eğitimi

Son olarak LeNet CNN modelinin eğitim sürecine başladığımız kısma geliyoruz. İlk olarak, eğitim veri setini yeniden şekillendiriyoruz ve hesaplama maliyetini azaltmak için 255,0'a bölerek daha küçük değerlere normalleştiriyoruz. Daha sonra eğitim etiketleri tamsayı sınıf vektöründen ikili sınıf matrisine dönüştürülür. Örneğin, etiket 3 [0, 0, 0, 1, 0, 0, 0, 0, 0] biçimine dönüştürülür.

#TensorFlow – Modelin Eğitimi

train_images_tensorflow = (train_images_tf / 255.0).reshape(train_images_tf.shape[0], 28, 28, 1)

test_images_tensorflow = (test_images_tf / 255.0).reshape(test_images_tf.shape[0], 28, 28 ,1)

train_labels_tensorflow=keras.utils.to_categorical(train_labels_tf)

test_labels_tensorflow=keras.utils.to_categorical(test_labels_tf)

H = model.fit(train_images_tensorflow, train_labels_tensorflow, epochs=30, batch_size=32)

30 epoch sonra eğitim sonunda, son eğitim doğruluğunu ve kaybını şu şekilde elde ederiz:

Dönem 30/30

1875/1875 [=============================] – 4s 2ms/adım – kayıp: 0.0421 – acc: 0.9850

Eğitim Doğruluğu: 98.294997215271 %

Antrenman Kaybı: 0.04584110900759697

Adım 7 – Sonuçları Tahmin Etme

Son olarak, CNN modelinin eğitim sürecimiz bittiğinde, aynı modeli test veri setine sığdıracağız ve 10.000 test görüntüsünün doğruluğunu tahmin edeceğiz.

#TensorFlow – Sonuçları Karşılaştırma

tahminler = model.predict(test_images_tensorflow)

doğru = 0

i için, numaralandırmada (tahminler) tahmin edilir:

if np.argmax(pred) == test_labels_tf[i]:

doğru += 1

print('Modelin {} test görüntüsünde Test Doğruluğu: TensorFlow ile % {}'.format(test_images_tf.shape[0],100 * right/test_images_tf.shape[0]))

Aldığımız çıktı,

10000 test görüntüsünde modelin Test Doğruluğu: TensorFlow ile %90,67

Bununla, Evrişimli Sinir Ağları ile Görüntü Sınıflandırma Modeli oluşturma programının sonuna geldik.

Ayrıca Okuyun: Makine Öğrenimi Proje Fikirleri

Çözüm

Bu nedenle, CNN'de Görüntü Sınıflandırmanın uygulanmasına ilişkin bu eğitimde, Görüntü Sınıflandırmasının, Evrişimli Sinir Ağlarının arkasındaki temel kavramları ve bunun Python programlama dilinde TensorFlow çerçevesiyle uygulanmasını anladık.

Makine öğrenimi hakkında daha fazla bilgi edinmek istiyorsanız, çalışan profesyoneller için tasarlanmış ve 450+ saat zorlu eğitim, 30'dan fazla vaka çalışması ve ödev, IIIT- sunan IIIT-B & upGrad'ın Makine Öğrenimi ve Yapay Zeka alanında PG Diplomasına göz atın. B Mezun statüsü, 5'ten fazla pratik uygulamalı bitirme projesi ve en iyi firmalarla iş yardımı.

Görüntü sınıflandırması için en uygun CNN modeli hangisidir?

Görüntü sınıflandırması için en iyi CNN modeli, Büyük Ölçekli Görüntü Tanıma için Çok Derin Evrişimli Ağlar anlamına gelen VGG-16'dır. Derin bir CNN olarak tasarlanan VGG, ImageNet dışındaki çok çeşitli görev ve veri kümelerinde taban çizgilerinden daha iyi performans gösterir. Modelin ayırt edici özelliği, oluşturulduğunda, çok sayıda hiper parametre eklemeye odaklanmak yerine mükemmel evrişim katmanlarını birleştirmeye daha fazla dikkat gösterilmesidir. Toplam 16 katmana, 5 bloğa sahiptir ve her bloğun bir maksimum havuzlama katmanı vardır, bu da onu oldukça büyük bir ağ yapar.

Görüntü sınıflandırması için CNN modellerini kullanmanın dezavantajları nelerdir?

Görüntü sınıflandırması söz konusu olduğunda CNN modelleri oldukça başarılıdır. Bununla birlikte, CNN'leri kullanmanın birkaç dezavantajı vardır. Tanımlanacak resim eğik veya döndürülmüşse, CNN modeli görüntüyü doğru bir şekilde tanımlamada sorun yaşar. CNN görüntüleri görselleştirdiğinde, bileşenlerin ve bunların parça-bütün bağlantılarının dahili temsilleri yoktur. Ayrıca kullanılacak CNN modeli çok sayıda evrişimsel katman içeriyorsa, sınıflandırma işlemi uzun zaman alacaktır.

Girdi olarak görüntü verileri için ANN yerine CNN modelinin kullanılması neden tercih edilir?

CNN, filtreleri veya dönüşümleri birleştirerek, girdi olarak sağlanan her görüntü için birçok özellik temsili katmanını öğrenebilir. CNN'de ağın öğreneceği parametre sayısı çok katmanlı sinir ağlarından önemli ölçüde daha küçük olduğu için fazla uyum azaltılır. YSA kullanırken, sinir ağları görüntünün tek bir öznitelik gösterimini öğrenebilir, ancak karmaşık görüntüler söz konusu olduğunda, ANN giriş görüntülerinde bulunan piksel bağımlılıklarını öğrenemediğinden gelişmiş görselleştirmeler veya sınıflandırmalar sağlayamaz.