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

III - flow_from_dataframe Yöntemi

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

flow_from_dataframe 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. Bir önceki konu olan flow_from_directory yönteminden farklı olarak Pandas DataFrame üzerinden görüntüleri ve etiketleri alarak görüntüleri büyütme işlemi yapmaktadır. 

Söz dizimi: flow_from_dataframe(dataframe, directory=None, x_col='filename', y_col='class', weight_col=None, 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', subset=None, interpolation='nearest', validate_filenames=True, **kwargs)

  • dataframe, Pandas DataFrame adını temsil etmektedir. 
  • directory, görüntülerin bulunduğu yolu temsil etmektedir.
  • x_col, dataframe içersinde dosya adlarını içeren sütunu temsil etmektedir.
  • y_col, dataframe hedef değerleri(etiket değerleri) içeren sütunu temsil etmektedir. 
  • weight_col, dataframe içerisinde örnek ağırlıklarını içeren sütunu 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","multi_output","raw" 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.
    • multi_output, farklı sütunların değerlerini içerin listeyi temsil eder.
    • 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.

Not: **Burada en dikkat edilecek husus; Pandas DataFrame sadece resim adlarını içeriyorsa directory alanına resimlerin bulunduğu dosya konumu tanıtılmalıdır. Pandas DataFrame de resimlerin bulunduğu dosya yolu tanımlanmışsa da directory "None" olarak bırakılabilir.

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

Örnek-1: Bir klasör içerisinde çiçeklere ait resimler karışık halde bulunmaktadır. Çiçeklerin hangi türe ait olduklarını içeren bir de ".csv" dosyası bulunmaktadır. Bu çiçekleri eğitme ve değerlendirme olarak 2 gruba ayıralım ve "flow_from_directory" ile resim büyütme işlemi uygulayarak modele girdi olarak vermek için hazır hale getirelim.

Not:Orjinal veri setini aşağıdaki kod yardımı ile 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()}"
        )

(Çiçekler klasörü aşağıdaki gibi karışık türde 3670 adet resimlerden oluşmaktadır.)

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

from tensorflow.keras.preprocessing import image
import pathlib
df=pd.read_csv("Cicekler.csv",index_col=[0])
df.head()

Çıktı:

df.tail()

Çıktı:

df.shape

Çıktı:

(3670, 2)
#Resimlerin bulunduğu yol
data_dir=pathlib.Path("Cicekler/")
#Veri seti içerisinde bulunan fotoğrafların rasgele görünümü
plt.figure(figsize=(15,5))
for i in range(5):
    ax=plt.subplot(1,5,i+1)
    img_path=data_dir.joinpath(df["image"][np.random.randint(1,len(df))])
    img_array=plt.imread(img_path)
    plt.imshow(img_array)
    plt.xticks([])
    plt.yticks([])

Çıktı:

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

#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],
                                validation_split=0.2)

train_data_datagen=datagen.flow_from_dataframe(dataframe=df,
                                              directory=data_dir,
                                              x_col="image",
                                              y_col="label",
                                              target_size=img_size,
                                              batch_size=batch_size,
                                              subset="training",
                                              class_mode="categorical",
                                              seed=seed)

val_data_datagen=datagen.flow_from_dataframe(dataframe=df,
                                              directory=data_dir,
                                              x_col="image",
                                              y_col="label",
                                              target_size=img_size,
                                              batch_size=batch_size,
                                              subset="validation",
                                              class_mode="categorical",
                                              seed=seed)

Çıktı:

Found 2936 validated image filenames belonging to 5 classes.
Found 734 validated image filenames belonging to 5 classes.

Yukarıdaki çıktıda da görüldüğü gibi toplu halde bulunan resimler 2 farklı gruba (train ve val) 0.2 oranında ayrılmış oldu. 

#Çiçek türleri listesi
class_indices=train_data_datagen.class_indices
class_indices_items=list(class_indices.items())
class_indices_items

Çıktı:

[('daisy', 0),
 ('dandelion', 1),
 ('roses', 2),
 ('sunflowers', 3),
 ('tulips', 4)]
#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(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ı:

#Validation 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ı:

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.