Tensorflow ve Keras ile Data Augmentation

Onuryilmaz
Google Developer Student Clubs
4 min readNov 24, 2020

Data Augmentation, Veri setimizde bulunan verilerine kırpma, çevirme, zoom vb. işlemleri uygulayarak veri miktarımızı arttırmamızı sağlayan bir tekniktir. Veri kümemizi genişleterek modelin daha iyi eğitilmesine yardımcı olmuş oluyoruz. Böylelikle modelin daha iyi genellemesini sağlıyor ve overfitting (aşırı uyum) ihtimalinin önüne geçiyoruz.

Bu sebeplerden dolayı eğer elinizde nispeten küçük bir veri seti varsa ve daha iyi bir model oluşturmak istiyorsanız Data Augmentation gerçekleştirmeniz size çok yardımcı olacaktır.

Tensorflow’da Veri arttırma işlemini uygularken çok faydalı bir özellik daha mevcut. Yeni oluşturduğumuz verileri bellekte depolamamız hiç etkili bir yöntem değildir ve bize fazladan işlem yükü olarak geri dönecektir. İşte burada Tensorflow’un apisine dahil olan Keras sınıfından (tensorflow.keras) ImageDataGenerator devreye giriyor.Bu modülü kullanarak gerçek zamanlı veri arttırma yapabiliyor ve yeni görüntülerimizi bellekte depolamamıza gerek kalmıyor.

Şimdi bahsettiklerimizin hepsini uygulayarak görelim. İlk önce gerekli kütüphaneleri import edelim.

Elde edeceğimiz yeni verileri kolayca görselleştirmek için bir fonksiyon yazalım.

Şimdi bu fotoğrafı kullanarak yeni görseller oluşturmaya başlayabiliriz.

1–Width Shifting (Kaydırma)

Görüntümüzü x ekseninde kaydırmak için width_shift_range parametresinin değerini değiştirebiliriz. Bu parametre ile kayan nokta sayısını belirliyoruz ve 0–1 aralığında değerler verebiliyoruz.

2- Height Shifting ( Yükseklik Değiştirme )

Görüntümüzü y ekseni üzerinde kaydırmak istiyorsak height_shift_range parametresini kullanabiliriz. Width Shifting ile neredeyse aynı işlemi gerçekleştiriyoruz. Aralarındaki tek fark görselin farklı eksenlerde hareket ettirilmesi.

Farkettiyseniz görsellerimizi eksenlerde kaydırırken ters tarafta bir bulanık bölge oluşuyor. Bunun nedeni fotoğrafı kaydırdığımızda o kısımda boşluk oluşmaması için otomatik piksel doldurma işlemi yapılıyor. Peki bunu kendimiz yapabilir miyiz ? Evet. Bu bölgelerdeki doldurma işleminin nasıl olacağına kendimiz karar verebiliyoruz. Şimdi de onlar üzerinde oynama yapalım.

fill_mode parametresinin değerlerini değiştirerek bu işlemi yapacağız.

A) Reflect (Yansıtma)

Görselimiz ile doldurma kısmı arasında bir ayna olduğunu varsayalım. Resmimizin yansıması olucak şekilde oradaki kısım doldurulur.

B ) Nearest (En Yakın Değerler )

Bu değer fill_mode için default (varsayılan) değerdir. Yakınındaki piksel değerlerine göre doldurma işlemi yapılır.

C ) Wrap

Yansıtma modeline çok benzeyen bir tekniktir. Wrap ile doldurma yapılırken görselin bittiği noktadan itibaren görselin diğer tarafıyla tekrar doldurulur.

D ) Constant (Sabit Değer )

Oluşacak olan boş değerlerin tamamı sabit bir piksel değeri ile doldurulur. Bu değeride cval parametresi ile belirleyebiliyoruz.

Doldurma işleminde kullanılabilecek teknikleri de örnekleriyle görmüş olduk. Şimdi veri arttırırken yapılabileceklere devam edelim.

3-Rotation ( Döndürme )

Veri setimizde ki görselleri istediğimiz açı aralığında döndürebiliriz. Bunun için rotation_range parametresine açı cinsinden bir değer vermemiz gerekiyor. Verdiğimiz değere örneğin x diyelim. Görselimiz +x , -x aralığında rastgele değerler ile döndürülüyor.

4-Shear Intensity (Kayma / Eğimlendirme )

shear_range ile görüntümüzün şekline eğim verebiliyoruz. Burada değerimizi derece cinsinden belirtiyoruz. Yapıcağımız bu değişiklik ile görselimizde bir esneme oluşuyor.

NOT : Görselimiz de eğimden dolayı bulanık bölgeler oluşuyor. Yukarıda da bahsettiğimiz gibi fill_mode ile buraları farklı doldurma teknikleriyle düzeltebilirsiniz.

5- Brightness (Parlaklık)

İsminden de anlaşılacağı üzere görselimizdeki parlaklığı ayarlayabiliyoruz. Bunun için brightness_range parametresine 0-1 sınır olacak şekilde bir değer aralığı vermeliyiz. (0.0 değeri kullanılmaz, parlaklık karşılığı yoktur)

6- Zoom

Zoom değer aralığını belirtmek için zoom_range argümanını kullanırız. 1.0 ‘ den küçük değerler fotoğrafı daha yakından çekilmiş gibi gösterirken, 1.0’ den büyük değerler ise görselimizi küçültmüş oluyor.

7-Horizontal Flip

horizontal_flip argümanına True değeri vererek görsellerimizi yatay olarak çevirebiliriz.

Görselimiz çok simetrik olduğu için bu örnekte bunu anlamak çok zor. Başka görseller ile deneme yapabilirsiniz.

8-Vertical Flip

vertical_flip argümanına True değeri vererek görselimizi dikey eksende çevirebiliriz.

Tek bir görsel ile yaptığımız için hep aynı fotoğrafı görüyoruz. Ama çok çeşitli bir data ile çalıştığınızda rastgele seçilmiş görselleriniz dikey olarak çevrilecek ve yeni bir veriniz oluşacaktır.

9-Channel Shift

Görsellerin renk kanallarında, verilen değer aralığında rastgele kaydırma yapılır. Bunun için channel_shift_range argümanına bir değer verilir.

Veri arttırırken kullanabileceğimiz yöntemler bunlardı. Yazımızın sonuna gelmeden hepsinin birlikte kullanıldığı son bir örnek yapalım.

References

https://www.tensorflow.org/api_docs/python/tf/keras/preprocessing/image/ImageDataGenerator?version=stable

--

--

Onuryilmaz
Google Developer Student Clubs

Istanbul University- Industrial engineering / Computer Engineering / Junior Software Engineer @LcWaikiki