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

II - flow_from_directory Yöntemi

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

flow_from_directory 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ı için veri setinin belirli bir formatta olması gerekmektedir. Bu format;

  • Tüm veriler (training, validation görüntüleri) tek bir klasör (Ana Klasör) altında olmalıdır.
  • Klasör içerisinde training ve validation olmak üzere 2 adet klasör bulunmalıdır.
  • Training ve validation klasörülerinin altında aynı isimde (aynı sınıflandırma türünde) klasörler ve bu klasörlere ait resimlerin bulunması gerekmektedir.  

Söz dizimi: flow_from_directory(directory, target_size=(256, 256), color_mode='rgb', classes=None, class_mode='categorical', batch_size=32, shuffle=True, seed=None, save_to_dir=None, save_prefix='', save_format='png', follow_links=False, subset=None, interpolation='nearest')

  • directory, veri setinin yolunu temsil etmektedir.
  • target_size, veri setindeki fotoğrafların yüklenirken alacağı boyutları temsil etemektedir. Varsayılan olarak (256,256)'dır.
  • color_mode, yüklenecek resimlerin renklerini temsil etmektedir. "grayscale","rgb","rgba" olmak üzere 3 farklı değer alabilir. Varsayılan olarak "rgb" dir.
  • classes, alt klasör isimlerini temsil etmektedir.
  • class_mode, sınıflandırma işlemlerinde etiketin(label) türünü belirler ve "categorical", "binary", "sparse", "input" veya "None" değerlerini alabilir. Varsayılan olarak "categorical" dir.
    • categorical, 2D etiket türlerini temsil eder.
    • binary, 1D etiket türlerini temsil eder.
    • sparse, tam sayı etiket türlerini temsil eder.
    • input, etiketin giriş resimleri ile aynı olmasıdır.
    • None, hiçbir etiket türü döndürmez. 
  • batch_size, parti boyutunu temsil etmektedir. Varsayılan olarak 32'dir.
  • shuffle, verileri rasgele şekilde karıştırmayı temsil etmektedir.
  • 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.
  • interpolation, görüntünün dışındaki noktalar verilen moda göre doldurulur."bilinear", "nearest", "bicubic" değerlerini alabilir, varsayılan olarak "nearest" dir.

Örnekler üzerinden flow_from_directory yöntemini gözlemleyelim.

Örnek-1: Train ve valid klasörleri içersinde 5 farklı çiçek türüne ait klasör ve bu klasörler içerisinde çiçeklerin fotoğrafları bulunmaktadır. Bu çiçek türlerine "flow_from_directory" ile resim büyütme işlemi uygulayarak model eğitme işlemi uygulayalım.

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

from tensorflow.keras.preprocessing import image
import pathlib 
from glob import glob

Not:Orjinal veri setini aşağıdaki kod yardımı ile bulunduğunuz konuma indirebilir ve formatı verilen şekilde dönüştürüp kullanabilirsiniz.

import os
from tensorflow.keras.utils import get_file
url="https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz"

get_file(fname="Cicekler",
         origin=url,
         untar=True,
         cache_subdir=f"{os.getcwd()}"
        )

 

train_data_dir=pathlib.Path("Cicekler/train/")
val_data_dir=pathlib.Path("Cicekler/val/")

train_data_image_list=list(train_data_dir.glob("*\*"))
val_data_image_list=list(val_data_dir.glob("*\*"))
#Train resimleri rasgele görünümü
random_list_train=np.random.randint(1,len(train_data_image_list),(5))
plt.figure(figsize=(15,6))

for i,img_row in enumerate(random_list_train):
    ax=plt.subplot(1,5,i+1)
    img_array=plt.imread(train_data_image_list[img_row])
    plt.imshow(img_array)
    plt.xticks([])
    plt.yticks([])

Çıktı:

#Validation resimleri rasgele görünümü
random_list_val=np.random.randint(1,len(val_data_image_list),(5))
plt.figure(figsize=(15,6))

for i,img_row in enumerate(random_list_val):
    ax=plt.subplot(1,5,i+1)
    img_array=plt.imread(train_data_image_list[img_row])
    plt.imshow(img_array)
    plt.xticks([])
    plt.yticks([])

Çıktı:

img_size=(256,256)
seed=13
batch_size=8

#ImageDataGenerator ataması yapılır.
datagen=image.ImageDataGenerator(rescale=1./255,
                                 rotation_range=20,
                                horizontal_flip=True,
                                vertical_flip=True,
                                zoom_range=0.1,
                                width_shift_range=0.1,
                                height_shift_range=0.1,
                                brightness_range=[0.3,1.2])

train_data_datagen=datagen.flow_from_directory(directory=train_data_dir,
                                              target_size=img_size,
                                              color_mode="rgb",
                                              batch_size=batch_size,
                                              seed=seed,
                                              class_mode="categorical")

val_data_datagen=datagen.flow_from_directory(directory=val_data_dir,
                                              target_size=img_size,
                                              color_mode="rgb",
                                              batch_size=batch_size,
                                              seed=seed,
                                              class_mode="categorical")
#Sınıflandırma türleri
class_indices=val_data_datagen.class_indices
class_indices

Çıktı:

{'Ayçiçeği': 0, 'Gül': 1, 'Karahindibağ': 2, 'Lale': 3, 'Papatya': 4}
#Train resimlerine büyütme işlemi yapılması sonrasındaki rasgele görünümü
class_indices_items=list(class_indices.items())
plt.figure(figsize=(15,6))

for i in range(5):
    ax=plt.subplot(1,5,i+1)
    imgs,labels=train_data_datagen.next()
    plt.imshow(imgs[i])
    plt.title(f"{class_indices_items[np.argmax(labels[i])]}")
    plt.xticks([])
    plt.yticks([])

Çıktı:

#Değerlendirme resimlerine büyütme işlemi yapılması sonrasındaki rasgele görünümü
plt.figure(figsize=(15,6))

for i in range(5):
    ax=plt.subplot(1,5,i+1)
    imgs,labels=val_data_datagen.next()
    plt.imshow(imgs[i])
    plt.title(f"{class_indices_items[np.argmax(labels[i])]}")
    plt.xticks([])
    plt.yticks([])

Çıktı:

Sonuç olarak; train ve validation verileri büyütülmüş oldu. 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.