Derin Öğrenme (Deep Learning) - Önemli Keras Ön İşlemeleri (Preprocessing)

I - flow Yöntemi

Yayın tarihi :12-Mar-22
Bölüm kodlarını ve/veya veri setlerini indir.

flow Yöntemi, görüntü veri kümesini belleğe yüklemek ve artırılmış görüntü yığınları oluşturmak için kullanılmaktadır. Kullanımını örnekler üzerinden incelerken aynı zamanda da "ImageDataGenrator" fonksiyonunun nasıl kullanıldığını da öğrenmiş olunacaktır.

Söz dizimi: flow(x, y=None, batch_size=32, shuffle=True, sample_weight=None, seed=None, save_to_dir=None, save_prefix=''", save_format='png', subset=None)

  • x, görüntüler listesini temsil etmektedir.
  • y, görüntülerin değerşerini (labels) temsil etmektedir.
  • batch_size, parti boyutunu temsil etmektedir.
  • shuffle, verileri rasgele şekilde karıştırmayı temsil etmektedir.
  • sample_weight, örnek ağırlıkları temsil eder.
  • seed, rasgele karıştırma işleminde başlangıç noktasını temsil etmektedir.
  • save_to_dir, flow işlemi sonrasında oluşacak resimlerin kayıt edileceği adresi temsil etmektedir. None bırakıldığında bilgisayara kayıt işlemi yapmayacaktır.
  • save_prefix, save_to_dir tanımlanmışsa eğer, kaydedilen resimlerin dosya adlarını temsil eder.
  • save_format, kaydedilecek görüntünün uzantısını temsil etmektedir.
  • subset, veri setinin train veya test olduğunu belirtmek için kullanılmaktadır. "training" ve "validation" değerlerini alabilir.
#Aşağıdaki örneklerde kullanılacak kütüphaneler içe aktarılır.
from tensorflow.keras.preprocessing import image
import matplotlib.pyplot as plt

Örnek-1: Görüntüyü 30 derecelik açılarda döndürerek yeni resimler üretelim.

#Resim yüklenir
img=image.load_img("test_image.png",target_size=(224,224))

#Resim array hale getirilir ve boyutları ayarlanır
img_array=image.img_to_array(img).reshape(1,224,224,3)

#ImageDataGenerator ataması yapılır.
idg=image.ImageDataGenerator(
    rotation_range=30,
    fill_mode="nearest"
)

img_flow=idg.flow(img_array,batch_size=1)

#Görselleştirme işlemleri
plt.figure(figsize=(15,8))

ax=plt.subplot(2,4,1)
plt.imshow(img)
plt.title("Orijinal Fotoğraf",color="red")
plt.xticks([])
plt.yticks([])

for i in range(1,8):
    plt.subplot(2,4,i+1)
    plt.imshow(next(img_flow)[0].astype("uint8"))
    plt.title(f"{i}. Genişletilmiş Fotoğraf",color="blue")
    plt.xticks([])
    plt.yticks([])

Çıktı:

Örnek-2: Görüntüye yatayda ve dikeyde kaydırma işlemi uygulayalım.

#Resim yüklenir
img=image.load_img("test_image.png",target_size=(224,224))

#Resim array hale getirilir ve boyutları ayarlanır
img_array=image.img_to_array(img).reshape(1,224,224,3)

#ImageDataGenerator ataması yapılır.
idg=image.ImageDataGenerator(
    width_shift_range=0.4,
    height_shift_range=0.4,
    fill_mode="nearest"
)

img_flow=idg.flow(img_array,batch_size=1)

#Görselleştirme işlemleri
plt.figure(figsize=(15,8))

ax=plt.subplot(2,4,1)
plt.imshow(img)
plt.title("Orijinal Fotoğraf",color="red")
plt.xticks([])
plt.yticks([])

for i in range(1,8):
    plt.subplot(2,4,i+1)
    plt.imshow(next(img_flow)[0].astype("uint8"))
    plt.title(f"{i}. Genişletilmiş Fotoğraf",color="blue")
    plt.xticks([])
    plt.yticks([])

Çıktı:

Örnek-3: Görüntüye yatayda ve dikeyde döndürme işlemi uygulayalım.

#Resim yüklenir
img=image.load_img("test_image.png",target_size=(224,224))

#Resim array hale getirilir ve boyutları ayarlanır
img_array=image.img_to_array(img).reshape(1,224,224,3)

#ImageDataGenerator ataması yapılır.
idg=image.ImageDataGenerator(
    horizontal_flip=True,
    vertical_flip=True,
    fill_mode="nearest"
)

img_flow=idg.flow(img_array,batch_size=1)

#Görselleştirme işlemleri
plt.figure(figsize=(15,8))

ax=plt.subplot(2,4,1)
plt.imshow(img)
plt.title("Orijinal Fotoğraf",color="red")
plt.xticks([])
plt.yticks([])

for i in range(1,8):
    plt.subplot(2,4,i+1)
    plt.imshow(next(img_flow)[0].astype("uint8"))
    plt.title(f"{i}. Genişletilmiş Fotoğraf",color="blue")
    plt.xticks([])
    plt.yticks([])

Çıktı:

Örnek-4: Görüntüye parlaklık işlemi uygulayalım.

#Resim yüklenir
img=image.load_img("test_image.png",target_size=(224,224))

#Resim array hale getirilir ve boyutları ayarlanır
img_array=image.img_to_array(img).reshape(1,224,224,3)

#ImageDataGenerator ataması yapılır.
idg=image.ImageDataGenerator(
    brightness_range=[0.3,2],
    fill_mode="nearest"
)

img_flow=idg.flow(img_array,batch_size=1)

#Görselleştirme işlemleri
plt.figure(figsize=(15,8))

ax=plt.subplot(2,4,1)
plt.imshow(img)
plt.title("Orijinal Fotoğraf",color="red")
plt.xticks([])
plt.yticks([])

for i in range(1,8):
    plt.subplot(2,4,i+1)
    plt.imshow(next(img_flow)[0].astype("uint8"))
    plt.title(f"{i}. Genişletilmiş Fotoğraf",color="blue")
    plt.xticks([])
    plt.yticks([])

Çıktı:

Örnek-5: Görüntüyü rastgele yakınlaştıralım.

#Resim yüklenir
img=image.load_img("test_image.png",target_size=(224,224))

#Resim array hale getirilir ve boyutları ayarlanır
img_array=image.img_to_array(img).reshape(1,224,224,3)

#ImageDataGenerator ataması yapılır.
idg=image.ImageDataGenerator(
    zoom_range=0.5,
    fill_mode="nearest"
)

img_flow=idg.flow(img_array,batch_size=1)

#Görselleştirme işlemleri
plt.figure(figsize=(15,8))

ax=plt.subplot(2,4,1)
plt.imshow(img)
plt.title("Orijinal Fotoğraf",color="red")
plt.xticks([])
plt.yticks([])

for i in range(1,8):
    plt.subplot(2,4,i+1)
    plt.imshow(next(img_flow)[0].astype("uint8"))
    plt.title(f"{i}. Genişletilmiş Fotoğraf",color="blue")
    plt.xticks([])
    plt.yticks([])

Çıktı:

Örnek-6: Birkaç görüntü büyütme işlemlerini tek bir çatı altında toplayalım. 

#Resim yüklenir
img=image.load_img("test_image.png",target_size=(224,224))

#Resim array hale getirilir ve boyutları ayarlanır
img_array=image.img_to_array(img).reshape(1,224,224,3)

#ImageDataGenerator ataması yapılır.
idg=image.ImageDataGenerator(
    rotation_range=15,
    width_shift_range=0.2,
    height_shift_range=0.2,
    horizontal_flip=True,
    vertical_flip=True,
    brightness_range=[0.4,1.8],
    zoom_range=0.2,
    fill_mode="wrap"
)

img_flow=idg.flow(img_array,batch_size=1)

#Görselleştirme işlemleri
plt.figure(figsize=(15,8))

ax=plt.subplot(2,4,1)
plt.imshow(img)
plt.title("Orijinal Fotoğraf",color="red")
plt.xticks([])
plt.yticks([])

for i in range(1,8):
    plt.subplot(2,4,i+1)
    plt.imshow(next(img_flow)[0].astype("uint8"))
    plt.title(f"{i}. Genişletilmiş Fotoğraf",color="blue")
    plt.xticks([])
    plt.yticks([])

Çıktı:

Yukarıda yapılan örneklerde, bir tane fotoğraf flow() yöntemi ile birden çok hale getirilmiş olundu. .flow Yöntemi ile veri setindeki tüm görüntülere resim büyütme işlemi de uygulanabilir. Bunun için yeni bir örnek üzerinden devam edelim;

Örnek-7: Keras altında bulunan veri setlerinden "cifar10" veri setine flow yöntemi uygulayarak veri setine büyütme işlemi uygulayalım. Veri seti; "airplane","automobile","bird","cat","deer","dog","frog","horse","ship","truck" olmak üzere 10 adet gruba ait 32x32 boylarında her gruba ait 6000 adet fotoğraf bulunan toplamda 60000 adet fotoğraftan oluşan bir veri setidir. 

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

from tensorflow.keras.utils import to_categorical
from tensorflow.keras.preprocessing import image,image_dataset_from_directory
from tensorflow.keras.datasets import cifar10
(train_images,train_labels),(test_images,test_labels)=cifar10.load_data()

train_images=train_images/255.0
test_images=test_images/255.0

Çıktı:

Downloading data from https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz
170500096/170498071 [==============================] - 2s 0us/step
170508288/170498071 [==============================] - 2s 0us/step
class_names=["airplane","automobile","bird","cat","deer","dog","frog","horse","ship","truck"]

#Train ve test verileri "categorical" şekline dönüştürülür.
train_labels=to_categorical(train_labels,num_classes=len(class_names))
test_labels=to_categorical(test_labels,num_classes=len(class_names))

print("Train resim boyutları:",train_images.shape)
print("Train label boyutları:",train_labels.shape)
print("Test resim boyutları:",test_images.shape)
print("Test label boyutları:",test_labels.shape)
#Train resimleri rasgele görünümü
plt.figure(figsize=(15,6))
for i in range(10):
    ax=plt.subplot(2,5,i+1)
    plt.imshow(train_images[i])
    plt.title(f"{class_names[np.argmax(train_labels[i])]} ({np.argmax(train_labels[i])})")
    plt.xticks([])
    plt.yticks([])

Çıktı:


#Test resimleri rasgele görünümü
plt.figure(figsize=(15,6))
for i in range(10):
    ax=plt.subplot(2,5,i+1)
    plt.imshow(test_images[i])
    plt.title(f"{class_names[np.argmax(test_labels[i])]} ({np.argmax(train_labels[i])})")
    plt.xticks([])
    plt.yticks([])

Çıktı:


Fotoğraflar için kullanılacak büyütme özelliklerini tanımlayarak train_images ve test_images olarak ayrılan veri setindeki fotoğraflara uygulayalım.

#ImageDataGenerator tanımlaması
datagen=image.ImageDataGenerator(
    rotation_range=20,
    width_shift_range=0.1,
    height_shift_range=0.1,
    vertical_flip=True,
    zoom_range=0.2,
    fill_mode="nearest"
)

#train_images fotoğraflarına ImageDataGenerator uygulanması işlemi
train_images_datagen=datagen.flow(
                                x=train_images,
                                y=train_labels,
                                batch_size=64)

#test_images fotoğraflarına ImageDataGenerator uygulanması işlemi
test_images_datagen=datagen.flow(
                                x=test_images,
                                y=test_labels,
                                batch_size=64)

Son durumda train_images_datagen ve test_images_datagen olarak atanan değişkenler fotoğraflara ImageDataGenerator uygulanmış veri setlerinin çıktılarıdır. Oluşturulacak modelin fit işlemi sırasında "batch_size" ve "epochs" miktarıyla bağlantılı olarak yeni fotoğraflar oluşacaktır. Oluşan fotoğraflardan bazılarını gözlemleyelim.

#Train resimlerine büyütme işlemi yapılması sonrasındaki rasgele görünümü
plt.figure(figsize=(15,6))
for i in range(10):
    ax=plt.subplot(2,5,i+1)
    imgs,labels=train_images_datagen.next()
    plt.imshow(imgs[i])
    plt.title(f"{class_names[np.argmax(labels[i])]} ({np.argmax(labels[i])})")
    plt.xticks([])
    plt.yticks([])

Çıktı:

#Test resimlerine büyütme işlemi yapılması sonrasındaki rasgele görünümü
plt.figure(figsize=(15,6))
for i in range(10):
    ax=plt.subplot(2,5,i+1)
    imgs,labels=test_images_datagen.next()
    plt.imshow(imgs[i])
    plt.title(f"{class_names[np.argmax(labels[i])]} ({np.argmax(labels[i])})")
    plt.xticks([])
    plt.yticks([])

Çıktı:

Sonuç olarak; bir görüntünün içeriğinin nasıl değiştirileceği(büyütme, kaydırma, ters çevirme vb.) gibi konulara değinerek bu içeriklerin flow yöntemi ile bir fotoğrafa veya veri setine nasıl uygulandığını gözlemlenmiş olundu. Artık mevcut veri setini eğitmek için model oluşturma aşamasına geçilebilir.

Paylaş:

Yorum Yap (*Yorumunuza kod eklemek isterseniz Kod Parçacığı Ekle butonuna tıklayarak ekleyebilirsiniz.)

Yorumlar

Henüz hiç yorum yapılmamış, ilk yorum yapan sen ol.