Görüntü verisi büyütme, veri kümesinde görüntülerin değiştirilmiş versiyonlarını oluşturarak eğitim veri kümesinin boyutunu yapay olarak genişletmek için kullanılan bir tekniktir.
Derin öğrenme sinir ağı modellerini daha fazla veri üzerinde eğitmek, daha yetenekli modellerle sonuçlanabilir ve büyütme teknikleri, uygun modellerin öğrendiklerini yeni görüntülere genelleştirme yeteneğini geliştirebilen görüntülerin varyasyonlarını oluşturabilir.
Keras derin öğrenme sinir ağı kitaplığı, “ImageDataGenerator” sınıfı aracılığıyla görüntü verisi büyütmeyi kullanarak modelleri uydurma yeteneği sağlar.
Bu yazımda, sizlerle derin öğrenme sinir ağlarını eğitirken görüntü verisi büyütme tekniklerinin nasıl kullanılacağını keşfedeceğiz. Günün sonunda ise şunları bileceksiniz.
- Modelin performansını ve genelleştirme yeteneğini geliştirmek ve eğitim veri setini büyütmek için görüntü verisi büyütme kullanılır.
- Görüntü verisi büyütme, ImageDataGenerator sınıfı aracılığı ile Keras derin öğrenme kitaplığında desteklenir.
- Kaydırma, çevirme, parlaklık ayarları ve yakınlaştırma gibi teknikler nasıl kullanılır.
Derin öğrenme sinir ağlarının performansı, genellikle mevcut veri miktarı arttıkça daha fazla iyileşir.
Veri büyütme, mevcut eğitim verilerinden yapay olarak yeni eğitim verileri oluşturmaya yönelik bir tekniktir. Bu, yeni ve farklı eğitim örnekleri oluşturan eğitim verilerinden örneklere alana özgü teknikler uygulanarak yapılır.
Görüntü verisi büyütme belki de en iyi bilinen veri büyütme türüdür ve eğitim veri setinde orijinal görüntü ile aynı sınıfa ait görüntülerin dönüştürülmüş versiyonlarının oluşturulmasını içerir.
Dönüşümler, kaydırmalar, çevirmeler, yakınlaştırmalar ve çok daha fazlası gibi görüntü işleme alanından bir dizi işlemi içerir.
Amaç, eğitim veri setini yeni, makul örneklerle genişletmektir. Bu, model tarafından görülmesi muhtemel eğitim seti görüntülerinin varyasyonları anlamına gelir. Örneğin, bir kedi resminin yatay olarak çevrilmesi anlamlı olabilir, çünkü fotoğraf soldan veya sağdan çekilmiş olabilir. Bir kedinin fotoğrafının dikey olarak çevrilmesi mantıklı değildir ve modelin baş aşağı bir kedinin fotoğrafını görme olasılığının çok düşük olması nedeniyle muhtemelen uygun olmayacaktır. Bu nedenle, bir eğitim veri seti için kullanılan spesifik veri büyütme tekniklerinin seçiminin dikkatli bir şekilde, eğitim veri seti ve problem alanı bilgisi bağlamında seçilmesi gerektiği açıktır. Buna ek olarak, belki de küçük bir prototip veri kümesi, model ve eğitim çalıştırması ile model performansında ölçülebilir bir iyileştirmeyle sonuçlanıp sonuçlanmadıklarını görmek için veri artırma yöntemlerini ayrı ayrı ve uyum içinde denemek yararlı olabilir.
Evrişimli sinir ağı (CNN – Convolutional Neural Network) gibi modern derin öğrenme algoritmaları, görüntüdeki konumlarına göre değişmeyen özellikleri öğrenebilir. Bununla birlikte, büyütme, öğrenmeye bu dönüşüm değişmez yaklaşımına daha fazla yardımcı olabilir ve modele, soldan sağa, yukarıdan aşağıya sıralama, fotoğraflardaki ışık seviyeleri ve daha fazlası gibi dönüşümlerde de değişmez olan öğrenme özelliklerinde yardımcı olabilir.
Görüntü verisi büyütme tipik olarak yalnızca eğitim veri kümesine uygulanır, doğrulama veya test veri kümesine uygulanmaz. Bu, görüntü yeniden boyutlandırma ve piksel ölçekleme gibi veri hazırlamadan farklıdır; modelle etkileşime giren tüm veri kümelerinde tutarlı bir şekilde gerçekleştirilmelidirler.
ImageDataGenerator ile Veri Büyütme
Keras derin öğrenme kitaplığı, bir modeli eğitirken veri büyütmeyi otomatik olarak kullanma yeteneği sağlar.Bu, ImageDataGenerator sınıfı kullanılarak elde edilir.
İlk olarak, sınıf somutlaştırılabilir ve veri büyütme türlerinin konfigürasyonu, sınıf kurucusunun argümanları ile belirtilir.
Piksel ölçekleme yöntemlerinin yanı sıra bir dizi teknik desteklenir. Görüntü verileri için beş ana tip veri büyütme tekniğine odaklanacağız; özellikle:
- width_shift_range ve height_shift_range argümanları ile görüntü kaydırma,
- horizontal_flip ve vertical_flip argümanları ile görüntü çevirme,
- rotation_range argümanı ile görüntü döndürme,
- brightness_range argümanı ile parlaklık ayarı,
- zoom_range argümanı ile görüntü yakınlaştırma
tekniklerini kullanacağız.
Şimdi hep birlikte yukarıda saydığımız teknikleri örnek bir görüntü verisi üzerinde deneyelim. Ben kodumu yazmak için Pycharm Professional IDE’sini kullanacağım, siz ne şekilde rahat kod yazabiliyorsanız o şekilde devam edebilirsiniz veya benim gibi Pycharm da kullanabilirsiniz.
İlk olarak sıfırdan bir DataAugmentationTutorial adında Python uygulaması oluşturalım ve IDE’nin gerekli ortamı hazırlaması için bekliyelim. IDE gerekli oluşturma işlemlerini bitirdikten sonra terminali açıp “pip install tensorflow-gpu” komutu ile ImageDataGenerator için gerekli olan Keras kitaplığını da barındıran Tensorflow kitaplığının kurulumunu yapalım.
Evet şimdi daha önceden uygulama kök dizininde oluşturduğum “images” dizinine attığım “dog.jpeg” görüntü verisini yükleyelim ve veri büyütme tekniklerini uygulamaya başlayalım.
from keras.preprocessing.image import load_img, ImageDataGenerator img = load_img("./images/dog.jpeg") print(type(img)) print(img.format) print(img.mode) print(img.size)
Yukarıdaki kod bloğundaki gibi verimizi yükleyip, verimizin özelliklerini öğrenebiliriz. Bu kod bloğunun çıktısı şu şekilde olacaktır.
<class ‘PIL.JpegImagePlugin.JpegImageFile’>
JPEG
RGB
(1819, 1300)
Çıktıdan da görüldüğü üzere JPEG formatında RGB modunda ve 1819×1300 boyutlarında bir görüntü verimiz mevcut. Görüntü verileri bilindiği üzere piksellerden oluşur bu sebeple verimizi piksel dizisine çevirip, boyutunu veri büyütücünün istediği formata dönüştürmemiz ve o şekilde kullanmamız gerekiyor. Bu işlem için de şu metodu kullanıyoruz.
data = img_to_array(img) samples = np.expand_dims(data, 0)
Artık ImageDataGenerator sınıfından bir nesne oluşturup veri büyütme tekniklerini uygulayabiliriz.
ImageDataGenerator sınıfından oluşturacağımız datagen nesnemizi kullanarak görüntü verimiz üzerinde daha önce bahsettiğimiz 5 farklı tekniğe ait argümanlar ile bu teknikleri gerçekleyelim.
1- Görüntü Kaydırma Tekniği
Bir görüntüyü kaydırma, görüntü boyutlarını aynı tutarken görüntünün tüm piksellerini yatay veya dikey gibi tek bir yönde hareket ettirmek anlamına gelir.
Bu, bazı piksellerin görüntüden kırpılacağı ve görüntüde yeni piksel değerlerinin belirtilmesi gereken bir bölge olacağı anlamına gelir.
ImageDataGenerator yapıcısının width_shift_range ve height_shift_range argümanları, sırasıyla yatay ve dikey kaydırma miktarını kontrol eder.
Bu bağımsız değişkenler, kaydırılacak görüntünün genişliğinin veya yüksekliğinin yüzdesini (0 ile 1 arasında) gösteren bir kayan nokta değeri belirtebilir. Alternatif olarak, görüntüyü kaydırmak için bir dizi piksel belirtilebilir.
datagen = ImageDataGenerator(width_shift_range=[-200, 200], height_shift_range=[-200, 200]) it = datagen.flow(samples, batch_size=1) for i in range(9): plt.subplot(330 + 1 + i) batch = it.next() image = batch[0].astype('uint8') plt.imshow(image) plt.show()
Bu kod bloğunu çalıştırdığımızda bize genişlik ve yükseklik kaydırma tekniklerinin uygulandığı 9 farklı veri üretecektir. Çıktı şu şekilde olacaktır:
2 – Görüntü Çevirme Tekniği
Bir görüntü çevirme, sırasıyla dikey veya yatay çevirme durumunda piksel satırlarını veya sütunlarını tersine çevirmek anlamına gelir.
Çevirme büyütmesi, ImageDataGenerator sınıf oluşturucusuna yönelik bir boolean horizontal_flip veya vertical_flip argümanları tarafından belirtilir. Bu eğitimde kullanılan köpek fotoğrafı gibi fotoğraflar için yatay çevirmeler mantıklı olabilir, ancak dikey çevirmeler mantıklı olmaz.
Hava fotoğrafları, kozmoloji fotoğrafları ve mikroskobik fotoğraflar gibi diğer görüntü türleri için, belki dikey çevirmeler anlamlıdır.
datagen = ImageDataGenerator(horizontal_flip=True) it = datagen.flow(samples, batch_size=1) for i in range(9): plt.subplot(330 + 1 + i) batch = it.next() image = batch[0].astype('uint8') plt.imshow(image) plt.show()
Yatay çevirme tekniğinin uygulandığı kod bloğunun çıktısı şu şekilde olacaktır.
3- Rastgele Çevirme Tekniği
Döndürme büyütmesi, görüntüyü 0’dan 360’a kadar belirli bir derece sayısı kadar saat yönünde rasgele döndürür.
Döndürme muhtemelen pikselleri görüntü çerçevesinin dışına döndürecek ve çerçevenin alanlarını doldurulması gereken piksel verisi olmadan bırakacaktır.
Aşağıdaki örnek, 0 ile 90 derece arasında görüntüye yapılan döndürmelerle, rotation_range bağımsız değişkeni aracılığıyla rastgele döndürmeleri gösterir.
datagen = ImageDataGenerator(rotation_range=90) it = datagen.flow(samples, batch_size=1) for i in range(9): plt.subplot(330 + 1 + i) batch = it.next() image = batch[0].astype('uint8') plt.imshow(image) plt.show()
4- Rastgele Parlaklık Tekniği
Görüntünün parlaklığı, görüntülerin rasgele karartılması, görüntülerin aydınlatılması veya her ikisi ile artırılabilir.
Amaç, bir modelin farklı aydınlatma seviyelerinde eğitilmiş görüntüler arasında genelleme yapmasına izin vermektir.
Bu, bir parlaklık miktarı seçmek için bir yüzdeyi temsil eden bir kayan nokta olarak minimum ve maksimum aralığı belirten ImageDataGenerator() yapıcısına brightnes_range argümanı belirtilerek başarılabilir.
1.0’dan küçük değerler görüntüyü koyulaştırır, örn. [0.5, 1.0], 1.0’dan büyük değerler ise görüntüyü aydınlatır, örn. [1.0, 1.5], burada 1.0’ın parlaklık üzerinde hiçbir etkisi yoktur.
Aşağıdaki örnek, üreticinin görüntüyü 1,0 (değişiklik yok) ile 0,2 veya %20 arasında rastgele karartmasına olanak tanıyan bir parlaklık görüntü büyütmesini göstermektedir.
datagen = ImageDataGenerator(brightness_range=[0.2, 1.0]) it = datagen.flow(samples, batch_size=1) for i in range(9): plt.subplot(330 + 1 + i) batch = it.next() image = batch[0].astype('uint8') plt.imshow(image) plt.show()
Tekniğimizin çıktısı da şu şekilde olacaktır:
5- Rastgele Yakınlaştırma Tekniği
Yakınlaştırma büyütme, görüntüyü rastgele yakınlaştırır veya görüntünün etrafına yeni piksel değerleri ekler yada sırasıyla piksel değerlerini enterpolasyon yapar.
Görüntü yakınlaştırma, ImageDataGenerator yapıcısının zoom_range argümanı ile yapılandırılabilir. Yakınlaştırmanın yüzdesini tek bir kayan nokta veya bir dizi veya demet olarak bir aralık olarak belirtebilirsiniz.
Bir kayan nokta belirtilirse, yakınlaştırma aralığı [1-değer, 1+değer] olacaktır. Örneğin, 0,3 belirtirseniz, aralık [0,7, 1,3] veya %70 (yakınlaştırma) ile %130 (uzaklaştırma) arasında olacaktır.
Yakınlaştırma miktarı, her bir boyut (genişlik, yükseklik) için ayrı ayrı yakınlaştırma bölgesinden rastgele rastgele örneklenir.
Yakınlaştırma sezgisel gelmeyebilir. 1.0’dan küçük yakınlaştırma değerlerinin görüntüyü yakınlaştıracağını unutmayın, ör. [0.5,0.5] görüntüdeki nesneyi %50 daha büyük veya daha yakın yapar ve 1.0’dan büyük değerler görüntüyü uzaklaştırır, ör. [1.5, 1.5] görüntüdeki nesneyi %50 küçültür ve uzaklaştırır. [1.0,1.0] yakınlaştırmanın bir etkisi yoktur.
datagen = ImageDataGenerator(zoom_range=[0.5, 1.0]) it = datagen.flow(samples, batch_size=1) for i in range(9): plt.subplot(330 + 1 + i) batch = it.next() image = batch[0].astype('uint8') plt.imshow(image) plt.show()
Yukarıdaki kod bloğunda uygulanan yakınlaştırma tekniğinin çıktısı şu şekilde olacaktır:
Özetlersek, bu yazımızda, derin öğrenme sinir ağlarını eğitirken görüntü verisi büyütmenin nasıl kullanılacağını keşfettiniz.
Özellikle şunları öğrendiniz:
- Modelin performansını ve genelleştirme yeteneğini geliştirmek için eğitim veri setini genişletmek için görüntü verisi büyütme kullanılır.
- Görüntü verisi büyütme, ImageDataGenerator sınıfı aracılığıyla Keras derin öğrenme kitaplığında desteklenir.
- Kaydırma, çevirme, parlaklık ve yakınlaştırma görüntü verisi büyütme nasıl kullanılır.