Veri Artırma (Augmentation) Teknikleri

Veri artırma, veri setini çeşitlendirmek ve modelin daha genel bir anlayış geliştirmesine yardımcı olmak için mevcut verilere çeşitli yöntemler uygulayarak yeni veriler elde etme işlemidir. Bu teknik, özellikle modelin aşırı uyum (overfitting) problemiyle karşı karşıya olduğu durumlarda etkili bir çözüm sağlar. Aşağıdaki kodlara bu linkten ulaşabilirsiniz.

Görüntü Verileri

  • Döndürme: Görüntüyü rastgele açılardan döndürmek.
  • Öteleme: Görüntüyü yatay veya dikey olarak kaydırmak.
  • Kırpma: Görüntünün rastgele parçalarını kırpmak.
  • Ölçeklendirme: Görüntüyü büyütmek veya küçültmek.
  • Aydınlatma: Görüntünün parlaklığını ve kontrastını değiştirmek.
  • Renk: Görüntü üzerindeki renkleri değiştirmek.

Ses Verileri

  • Gürültü ekleme: Rastgele gürültüler ekleyerek yeni ses örneği oluşturmak.
  • Zaman kaydırma: Sesi zaman ekseni boyunca kaydırmak.
  • Perde değiştirme: Sesin perdesini değiştirme.
  • Hız değiştirme: Sesin hızını arttırmak veya azaltmak.
  • Ses sıkıştırma: Sesi farklı sıkıştırma seviyeleriyle sıkıştırmak.

Metin Verileri

  • Eş anlamlılarla değiştirme: Bazı kelimeleri eş anlamlı sözcükler ile değiştirmek.
  • Sözcük ekleme: Metne yeni sözcükler eklemek.
  • Sözcük silme: Metinden bazı sözcükleri kaldırmak.

Python İle Veri Artırma

Gerekli kütüphaneleri yüklemekle başlayalım. Görüntü verileri için “tensorflow”, ses verileri için “librosa” ve metin verileri için “nltk” kütüphanesini kullanacağız.

import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
import librosa
import random
from nltk.corpus import wordnet
from nltk.tokenize import word_tokenize
from PIL import Image

Image Augmentation

Aşağıda kullandığım görüntüye bu linkten erişebilirsiniz.

# Fotoğraf Linki: https://unsplash.com/photos/parked-white-ford-explorer-suv-a4S6KUuLeoM 
image_path = "suv.jpg"
img = Image.open(image_path)
image = tf.io.read_file(image_path)

plt.imshow(img)

3 Kanallı RGB Resim Okuma

image_3 = tf.image.decode_jpeg(image, channels=3)

plt.imshow(image_3)

1 Kanallı Resim Okuma

image_1 = tf.image.decode_jpeg(image, channels=1)

plt.imshow(image_1)

Flip (Ters Çevirme)

# Resmi yatay olarak ters çevirme
flipped_image = tf.image.flip_left_right(image_3)

plt.imshow(flipped_image)
flipped_image = tf.image.flip_up_down(image_3)

plt.imshow(flipped_image)

Brightness (Parlaklık)

# Parlaklığı 0.2 birim artırma
brightness_image = tf.image.adjust_brightness(image_3, delta=0.2)

plt.imshow(brightness_image)

Contrast (Kontrast)

# Kontrastı 2 katına çıkarma
contrast_image = tf.image.adjust_contrast(image_3, contrast_factor=2)

plt.imshow(contrast_image)

Saturation (Dolgunluk)

#  Doygunluğu 3 katına çıkarma
saturation_image = tf.image.adjust_saturation(image_3, saturation_factor=3)

plt.imshow(saturation_image)

Hue (Ton)

# Tonu 0.1 birim değiştirme
hue_image = tf.image.adjust_hue(image_3, delta=0.1)

plt.imshow(hue_image)

Rotate (Döndürme)

# Resmi 90 derece saat yönünde döndürme.
rotated_image = tf.image.rot90(image_3)

plt.imshow(rotated_image)

Zoom (Yakınlaştırma)

# Resmi merkezi %50 oranında kırpma
zoomed_image = tf.image.central_crop(image_3, central_fraction=0.5)

plt.imshow(zoomed_image)

Shear (Eğme)

# Resmi 45 derece eğme
sheared_image = tf.keras.preprocessing.image.apply_affine_transform(image_3, shear=45)

plt.imshow(sheared_image)

Shift (Kaydırma)

# Resmi 150 birim yatay ve dikey olarak kaydırma.
shifted_image = tf.keras.preprocessing.image.apply_affine_transform(image_3, tx=150, ty=150)

plt.imshow(shifted_image)

Sound Augmentation

Her ses dosyasında kullanacağım için bir tane görselleştirme fonksiyonu tanımlıyorum. Librosa kütüphanesi ile örnek ses dosyasını okuyorum.

real_audio = "dog.wav"

def plot_ad(ad_path, title):
    plt.figure(figsize=(12, 4))
    plt.plot(ad_path)
    plt.title(title)
    plt.show()

real_ad, real_sr = librosa.load(real_audio)
plot_ad(real_ad, "Ham Ses Verisi")

Gürültü Ekleme

noise_factor = 0.05
noise = np.random.randn(len(real_ad))
noise_data = real_ad + noise_factor * noise

plot_ad(noise_data, "0.05 Gürültü Eklenmiş Ses Verisi")

Zaman Kaydırma

# 0.2 kaydıracağız.
time_shift_range = int(real_sr * 0.2)
start_ = int(np.random.uniform(-time_shift_range, time_shift_range))
if start_ >= 0:
    shift_data = np.r_[real_ad[start_:], np.random.uniform(-0.001, 0.001, start_)]
else:
    shift_data = np.r_[np.random.uniform(-0.001, 0.001, -start_), real_ad[:start_]]
shift_data =  shift_data[:len(real_ad)]

plot_ad(shift_data, "0.2 Saniye Kaydırılmış Ses Verisi")

Hız Değiştirme

speed_factor = 2
speed_data = librosa.effects.time_stretch(y=real_ad, rate=speed_factor)

plot_ad(speed_data, "2x Hızlandırılmış Ses Verisi")

Perde Değiştirme

pitch_shift_factor = 1.5
pitch_data = librosa.effects.pitch_shift(y=real_ad, sr=real_sr, n_steps=pitch_shift_factor)

plot_ad(pitch_data, "1.5 Perde Değiştirilmiş Ses Verisi")

Text Augmentation

Örnek bir metin tanımlayıp bunun üzerinden yeni metinler elde etmeye çalışacağız.

Eş Anlamlılarla Değiştirme

words = word_tokenize(text)
new_words = words.copy()
for i, word in enumerate(words):
    syns = wordnet.synsets(word)
    if syns:
        synonym = random.choice(syns).lemma_names()[0]
        new_words[i] = synonym

new_words = ' '.join(new_words)
print("Ham Metin:", text)
print("Eş Anlamlılarla Değiştirilmiş Metin:", new_words)

Kelime Ekleme

words = word_tokenize(text)
new_words = words.copy()
random_index = random.randint(0, len(words) - 1)
new_words.insert(random_index, 'word')
new_words = ' '.join(new_words)

print("Ham Metin:", text)
print("Kelime Eklenmiş Metin:", new_words)

Kelime Silme

words = word_tokenize(text)
random_index = random.randint(0, len(words) - 1)
new_words = words[:random_index] + words[random_index + 1:]
new_words = ' '.join(new_words)

print("Ham Metin:", text)
print("Kelime Silinmiş Metin:", new_words)

Kelime Sırası Değiştirme

words = word_tokenize(text)
random.shuffle(words)
new_words = ' '.join(words)

print("Ham Metin:", text)
print("Kelime Sırası Değiştirilmiş Metin:", new_words)