Table of Contents
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)