Derin Öğrenme için Görüntü Verisi Geliştirme

Görüntü verisi büyütmenin ne olduğunu ve derin öğrenme projeleriniz için Keras kullanarak nasıl kullanılacağını anlayın

Fotoğraf Chris Lawton on Unsplash

Derin öğrenmeyi kullanarak görüntü tanıma yapmayı denediyseniz, eğitim için iyi bir veri kümesinin önemini bilirsiniz. Ancak eğitim için yeterli görüntü bulmak her zaman kolay değildir ve modelinizin doğruluğu doğrudan eğitim verilerinin kalitesine bağlıdır.

Neyse ki, eğitim için kullandıkları görüntü veri kümesini tamamlamak için kullanabileceğiniz teknikler var. tekniklerden biri denir. görüntü verisi büyütme. Bu yazıda, görüntü verisi artırmanın ne olduğunu, nasıl çalıştığını, derin öğrenmede neden yararlı olduğunu ve son olarak Keras kütüphanesini kullanarak görüntü verisi artırmanın nasıl gerçekleştirileceğini tartışacağım.

Görüntü verisi büyütme bir tekniktir ki mevcut olanlardan yeni görüntüler oluşturur. Bunu yapmak için, görüntünün parlaklığını ayarlamak veya görüntüyü döndürmek veya nesneyi görüntüde yatay veya dikey olarak kaydırmak gibi bazı küçük değişiklikler yaparsınız.

Görüntü büyütme teknikleri, eğitim setinizin boyutunu yapay olarak artırmanıza olanak tanır ve böylece eğitim için modelinize çok daha fazla veri sağlar. Bu, modelinizin eğitim verilerinizin yeni varyantlarını tanıma yeteneğini geliştirerek modelinizin doğruluğunu artırmanıza olanak tanır.

Görüntü Verisi Büyütme Türleri

Görüntü büyütme birçok biçimde gelir, işte yaygın olanlardan bazıları şunlardır: Dikey kaydırma, Yatay kaydırma, Dikey döndürme, Yatay döndürme, Döndürme, Parlaklık ayarı ve Yakınlaştır/Uzaklaştır.

İlk önce Python ve Keras kullanarak çeşitli görüntü büyütme tekniklerini göstereceğim. Birlikte denemek isterseniz, aşağıdaki yazılım ve paketlerin kurulu olduğundan emin olun:

Anaconda ve TensorFlow kurulduktan sonra yeni bir Jupyter Notebook oluşturun.

Dikey Kaydırma

Göstermek istediğim ilk görüntü büyütme tekniği, dikey kayma. dikey kayma görüntüyü dikey olarak yukarı veya aşağı rastgele kaydırır. Bu örnek için, adlı bir resim kullanacağım. 747.jpg, Jupyter Notebook'umla aynı klasörde bulunur.

Görüntü kaynağı: https://commons.wikimedia.org/wiki/File:Qantas_Boeing_747-438ER_VH-OEI_at_LAX.jpg. Bu dosya altında lisanslanmıştır Creative Commons Atıf-Benzer Paylaşım 2.0 Genel lisans.

Aşağıdaki kod parçacığı kullanır ImageDataGenerator görüntüyü dikey olarak kaydırmak için Keras'ta sınıf.

The ImageDataGenerator Keras'tan gelen class, gerçek zamanlı veri büyütme ile görüntü verisi yığınları oluşturur.

#---modülleri içe aktar---
numpy'yi np olarak içe aktar
matplotlib.pyplot dosyasını plt olarak içe aktar
tensorflow.keras.preprocessing.image'den load_img'i içe aktar
tensorflow.keras.preprocessing.image'den içe aktarma img_to_array
tensorflow.keras.preprocessing.image'den ImageDataGenerator'ı içe aktarın
#---resmi yükle---
image_filename = '747.jpg'
img = load_img(resim_dosyaadı)
#---görüntüyü 3B diziye dönüştür---
image_data = img_to_array(img)
#---temsil eden 4D dizinin 1 elemanından oluşan 3-D dizisine dönüştürme
# görüntü---
images_data = np.expand_dims(image_data, eksen=0)
#---görüntü verisi büyütme üreteci oluştur---
datagen = ImageDataGenerator(width_shift_range=0.2)
#---yineleyiciyi hazırla; flow() bir 4B diziyi alır ve döndürür
# toplu görüntü içeren bir yineleyici ---
train_generator = datagen.flow(images_data, Batch_size=1)
satırlar = 5
sütunlar = 4
#---5 satır ve 4 sütun çizin---
incir, eksenler = plt.subplots(satırlar,sütunlar)
aralıktaki r için(satırlar):
aralıktaki c için(sütunlar):
#--toplu işteki bir sonraki görüntüyü alın (toplu işlemden bu yana bir görüntü
# beden 1)---
image_batch = train_generator.next()

#---görüntülemek için işaretsiz tam sayılara dönüştür---
görüntü = image_batch[0].astype('uint8')

#---resmi göster---
eksenler[r,c].imshow(resim)
#---şeklin boyutunu ayarla---
şek.set_size_inches(15,10)

Yukarıdaki kod parçacığı aşağıdaki çıktıyı üretir:

Yukarıdaki çıktıdan da görebileceğiniz gibi, her aramanızda next() yöntemden train_generator nesne, biraz değiştirilmiş bir görüntü elde edersiniz. Yukarıdaki kod parçacığında, orijinal görüntü yüksekliğine göre %20 kaydırılan yeni bir görüntü, her çağrıldığında döndürülür. next() yöntem:

veri oluşturucu = ImageDataGenerator(genişlik_kaydırma_aralığı=0.2)

İlginç bir şekilde, bu sürüm için ImageDataGenerator (tensorflow.keras.preprocessing.image) sınıfı, width_shift_range parametresi görüntüyü yatay yerine dikey olarak kaydırır (bu, eskiImageDataGeneratoritibaren keras.preprocessing.image modül). Aynı şekilde, görüntünün yatay olarak kaydırılmasını istiyorsanız, height_shift_range parametre (sonraki bölüme bakın).

Unutmayın next() yöntemi, istediğiniz kadar artırılmış bir görüntü döndürür. Yukarıdaki kod parçacığında 20 kez (5 satır çarpı 4 sütun) çağırdık.

Yatay Kaydırma

Artık görüntüyü yatay olarak kaydırmayı deneyebilirsiniz. height_shift_range parametre:

veri oluşturucu = ImageDataGenerator(yükseklik_kaydırma_aralığı=0.2)
train_generator = datagen.flow(images_data, Batch_size=1)
satırlar = 5
sütunlar = 4
incir, eksenler = plt.subplots(satırlar,sütunlar)
aralıktaki r için(satırlar):
aralıktaki c için(sütunlar):
image_batch = train_generator.next()
görüntü = image_batch[0].astype('uint8')
eksenler[r,c].imshow(resim)
şek.set_size_inches(15,10)

Yukarıdaki kod parçacığı aşağıdaki çıktıyı üretir:

Yatay Çevirme

Bazen görüntüyü yatay olarak çevirmek mantıklıdır. Bir uçak söz konusu olduğunda, uçağın önü sola veya sağa bakıyor olabilir:

veri oluşturucu = ImageDataGenerator(yatay_flip=Doğru)
train_generator = datagen.flow(images_data, Batch_size=1)
satırlar = 2
sütunlar = 2
incir, eksenler = plt.subplots(satırlar,sütunlar)
aralıktaki r için(satırlar):
aralıktaki c için(sütunlar):
image_batch = train_generator.next()
görüntü = image_batch[0].astype('uint8')
eksenler[r,c].imshow(resim)
şek.set_size_inches(15,10)

Yukarıdaki kod parçacığı için, uçağın önü sola veya sağa dönük olabileceğinden, dört görüntü oluşturmak yeterince iyidir:

Döndürmenin rastgele olduğunu unutmayın (bazen dört orijinal görüntünün tümünü elde edersiniz ve bazen yatay olarak çevrilmiş görüntüler elde edersiniz). Yukarıdaki dört görüntünün hepsinin aynı olması muhtemeldir. Böyle bir durumda, o kod bloğunu tekrar çalıştırın.

Dikey Çevirme

Tıpkı yatay çevirme gibi, dikey çevirme de yapabilirsiniz:

veri oluşturucu = ImageDataGenerator(Vertical_flip=Doğru)
train_generator = datagen.flow(images_data, Batch_size=1)
satırlar = 2
sütunlar = 2
incir, eksenler = plt.subplots(satırlar,sütunlar)
aralıktaki r için(satırlar):
aralıktaki c için(sütunlar):
image_batch = train_generator.next()
görüntü = image_batch[0].astype('uint8')
eksenler[r,c].imshow(resim)
şek.set_size_inches(15,10)

Uçaklar söz konusu olduğunda, uçağımızı baş aşağı çevirmek pek mantıklı gelmeyebilir! Görüntü tanıma gerçekleştirmeye çalışıyorsanız, uçak görüntülerinizin dik olması muhtemeldir ve bu nedenle modelinizi ters düzlemleri tanıması için eğitmek çok yaygın olmayabilir. Diğer durumlarda, dikey çevirme çok anlamlıdır.

rotasyon

Döndürme, adından da anlaşılacağı gibi, görüntünüzü döndürür. Bu, uçak imajımız için çok faydalı olacaktır. Aşağıdaki kod parçacıkları, görüntüyü 50 dereceye kadar rastgele döndürür:

veri oluşturucu = ImageDataGenerator(döndürme_aralığı=50)
train_generator = datagen.flow(images_data)
satırlar = 5
sütunlar = 4
incir, eksenler = plt.subplots(satırlar,sütunlar)
aralıktaki r için(satırlar):
aralıktaki c için(sütunlar):
image_batch = train_generator.next()
görüntü = image_batch[0].astype('uint8')
eksenler[r,c].imshow(resim)
şek.set_size_inches(15,10)

Döndürme ile çıktı, uçakları çeşitli konumlarda gösterir — kalkış ve iniş konumlarını simüle eder:

Parlaklık

Diğer bir büyütme tekniği de görüntünün parlaklığını ayarlamaktır. Aşağıdaki kod parçacığı, bir dizi parlaklık kaydırma değeri ayarlar:

veri oluşturucu = ImageDataGenerator(parlaklık_aralığı=[0.15,2.0])
train_generator = datagen.flow(images_data, Batch_size=1)
satırlar = 5
sütunlar = 4
incir, eksenler = plt.subplots(satırlar,sütunlar)
aralıktaki r için(satırlar):
aralıktaki c için(sütunlar):
image_batch = train_generator.next()
görüntü = image_batch[0].astype('uint8')
eksenler[r,c].imshow(resim)
şek.set_size_inches(15,10)

Çıktı, değişen parlaklıkta bir dizi görüntü içerir:

Zoom yapma

Ayrıca görüntüleri yakınlaştırabilir veya uzaklaştırabilirsiniz:

veri oluşturucu = ImageDataGenerator(zoom_range=[5,0.5])
train_generator = datagen.flow(images_data, Batch_size=1)
satırlar = 5
sütunlar = 4
incir, eksenler = plt.subplots(satırlar,sütunlar)
aralıktaki r için(satırlar):
aralıktaki c için(sütunlar):
image_batch = train_generator.next()
görüntü = image_batch[0].astype('uint8')
eksenler[r,c].imshow(resim)
şek.set_size_inches(15,10)

Çıktı, görüntüyü çeşitli yakınlaştırma oranlarında gösterir:

Görüntüleri yakınlaştırmanın görüntülerin en boy oranlarını değiştireceğini unutmayın.

Tüm geliştirmeleri birleştirmek

Tabii ki, şimdiye kadar tartıştığım çeşitli büyütme teknikleri birleştirilebilir:

veri oluşturucu = ImageDataGenerator(genişlik_kaydırma_aralığı=0.2,
yükseklik_kaydırma_aralığı=0.2,
yatay_flip=Doğru,
döndürme_aralığı=50,
parlaklık_aralığı=[0.15,2.0],
zoom_range=[5,0.5]
)
train_generator = datagen.flow(images_data, Batch_size=1)satırlar = 8
sütunlar = 8
incir, eksenler = plt.subplots(satırlar,sütunlar)
aralıktaki r için(satırlar):
aralıktaki c için(sütunlar):
image_batch = train_generator.next()
görüntü = image_batch[0].astype('uint8')
eksenler[r,c].imshow(resim)
şek.set_size_inches(15,10)

Örneğimiz için bir anlam ifade etmediği için dikey çevirmeyi dışarıda bıraktığımı unutmayın.

Çıktı şimdi görüntüyü çeşitli geliştirmeler uygulanmış olarak gösterir:

Önceki bölümler, görüntü verisi artırmanın temellerini ve bunun tek bir görüntüye nasıl uygulanabileceğini gösterdi. Derin öğrenmede, genellikle bir dizi görüntüyle ilgileniriz. Şimdi görüntü büyütmenin bir dizi görüntüye nasıl uygulanabileceğini görelim. Çizimler için, Jupyter Notebook'unuzu içeren klasörde bir dosyanız olduğunu varsayacağım. Meyve klasör ve aşağıdaki alt klasörler:

Meyve
|__muz
|__muz1.jpg
|__muz2.jpg
|__muz3.jpg
|__ ...
|__durian
|__durian1.jpg
|__durian2.jpg
|__durian3.jpg
|__ ...
|__Portakal
|__turuncu1.jpg
|__turuncu2.jpg
|__turuncu3.jpg
|__ ...
|__çilek
|__çilek1.jpg
|__çilek2.jpg
|__çilek3.jpg
|__ ...

Her alt klasör bir dizi resim içerir. Örneğin, muz klasör, adlı bir dizi resim içerir. muz1.jpg, muz2.jpg, ve benzeri. Alt klasörlerin adı, çeşitli görüntüler için etiket görevi görecektir. Bu, altındaki tüm dosyaların muz klasör muz vb. görüntüleri içerir.

Diskten bir dizi görüntü yüklemek için şimdi flow_from_directory() yöntem ImageDataGenerator bunun yerine örnek flow() yöntem (bellekten görüntüleri yüklemek için):

tren_datagen = ImageDataGenerator(
yatay_flip=Doğru,
Vertical_flip=Doğru,
döndürme_aralığı=50,
)
parti_boyutu = 8tren_generator = train_datagen.flow_from_directory(
'./Meyveler',
hedef_size=(224,224),
color_mode='rgb',
toplu_boyutu=batch_size,
class_mode='kategorik',
karıştır=Doğru)

Şimdi ayarladığıma dikkat edin batch_size 8'e kadar. Parti boyutunun kullanımını kısa süre sonra göreceksiniz.

Döndürülen yineleyiciyi kullanarak çeşitli meyveler (muz, durian, portakal ve çilek) için etiketleri bulabilirim:

class_dictionary = train_generator.class_indices#---bir etiket sözlüğü oluşturun---
class_dictionary = { değer: anahtar için anahtar, içindeki değer
class_dictionary.items()}
#---sözlüğü bir listeye dönüştür---
class_list = [_ için değer, class_dictionary.items() içindeki değer]
yazdır(sınıf_listesi)

Aşağıdaki çıktıyı göreceksiniz:

54 sınıfa ait 4 görsel bulundu.
['muz', 'durian', 'portakal', 'çilek']

Toplamda 54 klasörde toplam 4 resim var. Ayrıca class_list değişken meyve listesini içerir.

Şimdi, tarafından oluşturulan artırılmış görüntüler kümesini yazdıracağım. ImageDataGenerator sınıf. Satırları keyfi olarak 10'a ayarlayacağım ve her satır için, döndürülen resim grubunu yazdırmak istiyorum (bu örnekte 8'dir):

satırlar = 10incir, eksenler = plt.subplots(satırlar,batch_size)aralıktaki r için(satırlar):    
#---artırılmış görsel grubunu alın---
image_batch = train_generator.next()
#---döndürülen resim sayısını al---
resim_sayısı = resim_batch[0].şekil[0]

aralıktaki c için(images_count):
#---görüntülemek için işaretsiz tam sayılara dönüştür---
görüntü = image_batch[0][c].astype('uint8')

#---resmi göster---
eksenler[r,c].imshow(resim)

#---resmin etiketini göster---
eksenler[r,c].title.set_text(
class_list[np.argmax(image_batch[1][c]))])
#---x ve y işaretlerini gizler---
eksenler[r,c].set_xticks([])
eksenler[r,c].set_yticks([])
şek.set_size_inches(15,18)

Yana batch_size şimdi 8'e ayarlanmıştır (artık 1 değildir), train_generator.next() yöntem size bir dönecektir yığın her aradığınızda sekiz artırılmış görüntü. Döndürülen görüntülerin sayısı şuna bağlıdır: batch_size daha önce ayarladığınız flow_from_directory() yöntem:

train_generator = train_datagen.flow_from_directory(
'./Meyveler',
hedef_size=(224,224),
color_mode='rgb',
toplu_boyutu=batch_size, # parti_boyutu = 8
class_mode='kategorik',
karıştır=Doğru)

Değeri image_batch değişken (tarafından döndürülen next() yöntem) iki öğeden oluşan bir demettir:

  • İlk eleman (image_batch[0]) bir dizidir Parti boyutu görüntüler (4B dizi)
  • İkinci eleman (image_batch[1]) resimler için etiketleri içerir

Yukarıdaki kod parçacığı aşağıdaki çıktıyı üretir:

Yedinci satırda, resim içermeyen iki boş tablo olduğuna dikkat edin. Görüntü setinde toplam 54 görüntü olduğunu ve her toplu işin (satır başına) 8 görüntü döndürdüğü için, ilk yedi satırın toplam 54 görüntü (8×6 + 6) göstereceğini hatırlayın. Aşağıdaki şekil bunu açıkça ortaya koymaktadır:

ayarlayabileceğinizi unutmayın. rows herhangi bir sayıya ve ImageDataGenerator sınıf sizin için yeni artırılmış görüntüler oluşturmaya devam edecek.

Transfer öğrenimini kullanarak bir model oluşturma

Artık nasıl kullanılacağını biliyorsunuz ImageDataGenerator büyütme için diskten görüntü kümeleri yüklemek için. Ama bunu eğitim için nasıl kullanıyorsunuz? Aşağıdaki kod parçacığı, kullanarak bir derin öğrenme modelinin nasıl oluşturulacağını gösterir. öğrenme aktarımı.

Transfer öğrenimi, bir görev için geliştirilen modelin ikinci bir görevdeki model için başlangıç ​​noktası olarak yeniden kullanıldığı bir makine öğrenimi yöntemidir. Transfer öğrenimi, eğitim için harcamanız gereken süreyi azaltır.

tensorflow.keras.models'ten içe aktarma Modeli
tensorflow.keras.applications'tan VGG16'yı içe aktarın
tensorflow.keras.layers'tan Yoğun, GlobalAveragePooling2D'yi içe aktarın
#---meyve sayısı---
NO_CLASSES = maksimum(train_generator.class_indices.values()) + 1
#---eğitim için temel model olarak VGG16 modelini yükleyin---
base_model = VGG16(include_top=Yanlış, input_shape=(224, 224, 3))
#---kendi katmanlarımızı ekleyin---
x = temel_model.çıktı
x = GlobalAveragePooling2D()(x)
x = Dense(1024,activation='relu')(x) # yoğun katmanlar ekleyin, böylece
# modelin yapabileceği
# daha karmaşık öğren
# fonksiyonlar ve
# daha iyisi için sınıflandır
# Sonuçlar.
x = Yoğun(1024,aktivasyon='relu')(x) # yoğun katman 2
x = Yoğun(512,aktivasyon='relu')(x) # yoğun katman 3
preds = Yoğun(NO_CLASSES,
aktivasyon='softmax')(x) # ile son katman
# softmax aktivasyonu
#---temel modelin orijinaliyle yeni bir model oluşturun
# girdi ve yeni modelin çıktısı ---
model = Model(girdiler = base_model.input, çıktılar = tahminler)
#---ilk 19 katmanı eğitme - 0..18---
model.layers[:19] içindeki katman için:
layer.trainable=Yanlış
#--katmanların geri kalanını eğitin - 19'dan itibaren---
model.layers[19:] içindeki katman için:
katman.eğitilebilir=Doğru

#---modeli derleyin---
model.compile(optimizer='Adam',
kayıp='categorical_crossentropy',
metrics = ['doğruluk'])

Transfer öğreniminin nasıl çalıştığını açıklamak bu makalenin kapsamı dışındadır. Onu başka bir yazıya bırakıyorum.

Oluşturulan görüntülerin eğitim için kullanılması

Arttırılmış görüntüleri eğitim amacıyla kullanmak için train_generator içine fit() modelin yöntemi:

#---modeli eğit---
step_size_train = train_generator.n //train_generator.batch_size
model.fit(tren_generator,
steps_per_epoch=step_size_train,
çağlar=15)

The steps_per_epoch parametre temel olarak bir çağda kaç adım olduğu anlamına gelir - sahip olduğunuz görüntü sayısına ve daha önce tanımlanan parti boyutuna bağlıdır. Bunu yüksek bir sayıya ayarlarsanız, tekrarlı egzersiz yapıyorsunuz demektir. Bu formüle göre ayarlamanız gerekir:

görüntü sayısı / parti boyutu

Örneğimizde toplamda 54 görselimiz var. Ve böylece her çağda, ImageDataGenerator class, eğitim için 54 görüntünün tamamını dönüştürecektir. Her çağda model, görüntülerin farklı varyasyonlarını alacaktır. 15 döneminiz varsa, görüntülerin toplam 15×54 varyasyonu oluşturulacak ve eğitim modeline beslenecektir.

The ImageDataGenerator class, modelinizin her çağda görüntülerin yeni varyasyonlarını almasına izin verir. Ancak, yalnızca dönüştürülmüş görüntüleri döndürdüğünü ve sahip olduğunuz görüntü grubuna eklemediğini unutmayın.

Umarım bu makale size görüntü verisi artırmanın neyle ilgili olduğu ve derin öğrenme modellerinizin eğitiminde bunlara neden ihtiyacınız olduğu konusunda iyi bir fikir vermiştir. Özellikle TensorFlow kitaplığındaki Keras modülünü kullanarak gösterdim.

Kaynaktan Yeniden Yayınlanan Derin Öğrenme için Görüntü Verisi Artırma

<!–

->

Zaman Damgası:

Den fazla Blockchain Danışmanları