Derin Öğrenme (Deep Learning) - Önemli Keras Ön İşlemeleri (Preprocessing)
III - flow_from_dataframe Yöntemi
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ı: