Keras ile Otoenkoder Kullanarak Görüntü Sıkıştırma
Görüntü verileri, modern dijital çağın en yaygın ve hacimli içerik türlerinden biridir. Akıllı telefonlarımızdan profesyonel kameralara, tıbbi görüntüleme cihazlarından uydu sensörlerine kadar her alanda devasa miktarda görsel bilgi üretilmektedir. Bu verinin depolanması, iletilmesi ve işlenmesi, önemli bant genişliği, depolama alanı ve işlem gücü gereksinimleri doğurmaktadır. İşte tam da bu noktada görüntü sıkıştırma teknolojileri devreye girer. Görüntü sıkıştırma, görsel bilginin gereksiz fazlalıklarını ortadan kaldırarak veya azaltarak, aynı bilginin daha az veri ile temsil edilmesini sağlar. Bu sayede depolama maliyetleri düşer, iletim hızları artar ve genel sistem performansı iyileşir.
Geleneksel görüntü sıkıştırma yöntemleri, JPEG, PNG, GIF gibi standartlarla uzun yıllardır kullanılmaktadır. JPEG (Joint Photographic Experts Group), özellikle fotoğrafik görüntüler için tasarlanmış kayıplı bir sıkıştırma formatıdır ve insan gözünün algılama eşiğini kullanarak yüksek sıkıştırma oranları sunar. PNG (Portable Network Graphics) ise kayıpsız sıkıştırma için tercih edilir ve özellikle grafikler, logolar gibi keskin hatlı görüntülerde kalite kaybını önler. Bu yöntemler oldukça başarılı olsa da, sabit algoritmalar kullanmaları nedeniyle her zaman optimum sıkıştırma oranını ve kaliteyi sağlamayabilirler. Özellikle karmaşık ve dinamik görüntü içeriklerinde veya belirli uygulama senaryolarında, daha esnek ve veriye özgü sıkıştırma yaklaşımlarına ihtiyaç duyulmaktadır.
Son yıllarda derin öğrenme alanındaki hızlı gelişmeler, görüntü sıkıştırma problemlerine yeni ve heyecan verici çözümler sunmuştur. Derin öğrenme modelleri, büyük veri kümelerinden öğrenme yetenekleri sayesinde, geleneksel yöntemlerin ötesine geçebilen, adaptif ve yüksek performanslı sıkıştırma algoritmaları geliştirmemizi sağlamıştır. Bu yaklaşımlardan biri de otoenkoderlerdir. Otoenkoderler, bir girdiyi sıkıştırılmış bir temsile (gizli uzay veya latent space) dönüştürmek ve ardından bu sıkıştırılmış temsilden orijinal girdiyi yeniden oluşturmak için tasarlanmış özel bir yapay sinir ağı türüdür. Görüntü sıkıştırma bağlamında, otoenkoderler, görüntülerin en temel ve anlamlı özelliklerini öğrenerek, bu özellikleri düşük boyutlu bir vektör olarak kodlar ve ardından bu vektörden orijinal görüntüyü mümkün olan en yüksek kalitede yeniden inşa etmeye çalışır.
Bu makalede, Keras derin öğrenme kütüphanesini kullanarak otoenkoderlerin görüntü sıkıştırma amacıyla nasıl kullanılabileceğini detaylı bir şekilde inceleyeceğiz. Otoenkoderlerin temel prensiplerinden başlayarak, farklı türlerini, evrişimsel otoenkoderlerin görüntü sıkıştırmadaki önemini, Keras ile bir otoenkoder modelinin nasıl oluşturulacağını, eğitileceğini ve değerlendirileceğini adım adım açıklayacağız. Ayrıca, bu yaklaşımın avantajlarını ve dezavantajlarını tartışarak, gelecekteki potansiyel gelişmelere de değineceğiz.
Görüntü Sıkıştırmanın Temelleri
Görüntü sıkıştırma, görüntü verisinin boyutunu küçültme işlemidir. Bu işlem, genellikle görüntünün içerdiği gereksiz veya tekrarlayan bilgileri ortadan kaldırarak gerçekleştirilir. Görüntü sıkıştırma algoritmaları iki ana kategoriye ayrılır:
Kayıpsız (Lossless) Sıkıştırma
Kayıpsız sıkıştırma yöntemleri, sıkıştırılmış görüntünün orijinal görüntü ile tamamen aynı olmasını sağlar. Yani, sıkıştırma ve ardından açma işlemi sonrasında hiçbir bilgi kaybı yaşanmaz. Bu tür sıkıştırma, tıbbi görüntüler, teknik çizimler veya metin içeren görüntüler gibi veri bütünlüğünün kritik olduğu alanlarda tercih edilir. PNG, GIF ve TIFF gibi formatlar kayıpsız sıkıştırma kullanır. Ancak, kayıpsız sıkıştırma oranları genellikle kayıplı sıkıştırmaya göre daha düşüktür.
Kayıplı (Lossy) Sıkıştırma
Kayıplı sıkıştırma yöntemleri, görüntüden insan gözünün algılamakta zorlandığı veya algılamadığı bazı bilgileri kalıcı olarak kaldırır. Bu sayede çok daha yüksek sıkıştırma oranları elde edilebilir. Ancak, sıkıştırma ve açma işlemi sonrasında orijinal görüntüden bir miktar sapma meydana gelir. JPEG, sıkıştırma oranını görüntü kalitesiyle dengeleyerek en yaygın kayıplı sıkıştırma formatıdır. Otoenkoderler genellikle kayıplı sıkıştırma prensibiyle çalışır, çünkü amaçları verinin en önemli özelliklerini koruyarak en düşük boyutlu temsili elde etmektir.
Sıkıştırma Oranı ve Görüntü Kalitesi Metrikleri
Sıkıştırma oranı, orijinal dosya boyutunun sıkıştırılmış dosya boyutuna bölünmesiyle elde edilir. Yüksek bir sıkıştırma oranı, daha az depolama alanı ve bant genişliği anlamına gelir. Ancak, kayıplı sıkıştırmada yüksek sıkıştırma oranı genellikle daha fazla kalite kaybına yol açar. Bu nedenle, sıkıştırma algoritmalarını değerlendirirken hem sıkıştırma oranını hem de görüntü kalitesini göz önünde bulundurmak önemlidir.
Görüntü kalitesini nicel olarak değerlendirmek için çeşitli metrikler kullanılır:
* Ortalama Kare Hata (Mean Squared Error – MSE): Orijinal görüntü ile yeniden oluşturulmuş görüntü arasındaki piksel değerlerinin kare farklarının ortalamasıdır. Düşük MSE, daha iyi kalite anlamına gelir.
* Tepe Sinyal Gürültü Oranı (Peak Signal-to-Noise Ratio – PSNR): MSE’den türetilen ve desibel (dB) cinsinden ifade edilen bir metriktir. Daha yüksek PSNR değerleri, daha iyi görüntü kalitesini gösterir. Genellikle 30 dB’nin üzerindeki değerler kabul edilebilir olarak kabul edilir.
* Yapısal Benzerlik İndeksi (Structural Similarity Index Measure – SSIM): İnsan görsel sisteminin algısal özelliklerini dikkate alarak görüntü kalitesini değerlendiren daha gelişmiş bir metriktir. Parlaklık, kontrast ve yapısal bilgideki değişiklikleri ölçer. 0 ile 1 arasında bir değer alır; 1’e yakın değerler daha yüksek benzerliği ve kaliteyi gösterir.
Otoenkoderlere Giriş
Otoenkoderler, girdilerini sıkıştırılmış bir temsile dönüştürmek ve bu temsilden girdilerini mümkün olduğunca aslına uygun bir şekilde yeniden yapılandırmak için eğitilmiş bir tür yapay sinir ağıdır. Denetimsiz öğrenme (unsupervised learning) paradigmaları altında sınıflandırılırlar, çünkü etiketli verilere ihtiyaç duymazlar; bunun yerine girdinin kendisi hem giriş hem de beklenen çıkış olarak kullanılır.
Temel Mimari: Kodlayıcı ve Kod Çözücü
Bir otoenkoderin temel mimarisi iki ana bölümden oluşur:
1. Kodlayıcı (Encoder): Giriş verisini alır ve onu daha düşük boyutlu, sıkıştırılmış bir temsile dönüştürür. Bu sıkıştırılmış temsile “gizli uzay” (latent space) veya “kod” (code) denir. Kodlayıcı, giriş verisindeki en önemli özellikleri ve desenleri öğrenerek bu temsili oluşturur. Genellikle, katman sayısı ve nöron sayısı azalan bir yapıya sahiptir.
2. Kod Çözücü (Decoder): Gizli uzaydaki sıkıştırılmış temsili alır ve orijinal giriş verisine benzer bir çıkış üretmeye çalışır. Kod çözücü, kodlayıcının tersi bir yapıya sahiptir; yani katman sayısı ve nöron sayısı artan bir yapıya sahiptir.
Otoenkoderin amacı, çıkışın girişle mümkün olduğunca benzer olmasını sağlamaktır. Bu “benzerlik” genellikle bir kayıp fonksiyonu (loss function) ile ölçülür. Görüntü sıkıştırma bağlamında, en yaygın kayıp fonksiyonu Ortalama Kare Hata (MSE) veya İkili Çapraz Entropi (Binary Cross-Entropy) gibi fonksiyonlardır. Model, bu kayıp fonksiyonunu minimize etmek için eğitilir.
Gizli Uzay (Latent Space) Kavramı
Gizli uzay, otoenkoderin en kritik bileşenidir. Giriş verisinin, yani görüntünün, düşük boyutlu ve yoğun bir temsilidir. Bu uzaydaki her bir nokta, potansiyel bir görüntü veya görüntünün bir özelliğini temsil eder. Otoenkoderin öğrenme süreci boyunca, ağ, gizli uzayın her bir boyutunun giriş verisindeki hangi varyasyonu temsil ettiğini öğrenir. Görüntü sıkıştırma için, bu gizli uzayın boyutu, sıkıştırılmış görüntünün boyutunu doğrudan belirler. Gizli uzayın boyutu ne kadar küçük olursa, sıkıştırma oranı o kadar yüksek olur; ancak bu, yeniden oluşturulan görüntünün kalitesinde potansiyel bir düşüşe de yol açabilir.
Otoenkoderler, veri sıkıştırmanın yanı sıra, gürültü giderme (denoising), anomali tespiti ve üretken modelleme gibi birçok farklı görevde de kullanılabilir. Temel fikir, verinin özünü yakalamak ve bu özü kullanarak hem orijinal veriyi yeniden oluşturmak hem de potansiyel olarak yeni veriler üretmektir.
Otoenkoder Çeşitleri ve Görüntü Sıkıştırmadaki Rolleri
Otoenkoderler, temel mimarinin ötesinde, belirli görevler veya veri türleri için optimize edilmiş birçok farklı varyasyona sahiptir. Görüntü sıkıştırma alanında, özellikle evrişimsel otoenkoderler büyük önem taşır.
Basit Otoenkoderler
En temel otoenkoderler, tamamen bağlı (fully connected) katmanlardan oluşur. Kodlayıcı, giriş görüntüsünü düzleştirilmiş bir vektör olarak alır ve bir dizi yoğun katman aracılığıyla gizli uzaya indirger. Kod çözücü ise gizli uzay vektörünü tekrar düzleştirilmiş bir görüntü vektörüne dönüştürür ve ardından bu vektör görüntü boyutlarına yeniden şekillendirilir. Bu tür otoenkoderler, MNIST gibi küçük, basit görüntüler için çalışabilirken, daha büyük ve karmaşık görüntülerde uzamsal bilgiyi korumakta yetersiz kalır ve çok sayıda parametreye ihtiyaç duyar. Bu nedenle, görüntü sıkıştırma için genellikle tercih edilmezler.
Evrişimsel Otoenkoderler (Convolutional Autoencoders – CAE)
Evrişimsel otoenkoderler, görüntü sıkıştırma için en uygun otoenkoder türüdür. Geleneksel evrişimli sinir ağlarının (CNN) özelliklerini kullanarak, görüntülerin uzamsal hiyerarşisini ve yerel özelliklerini daha etkili bir şekilde öğrenirler.
* Kodlayıcı: Evrişimsel kodlayıcı, bir dizi Conv2D katmanı, MaxPooling2D katmanı ve aktivasyon fonksiyonlarından oluşur. Conv2D katmanları, görüntüdeki yerel desenleri (kenarlar, köşeler, dokular) öğrenir. MaxPooling2D katmanları ise uzamsal boyutları küçülterek ve en önemli özellikleri koruyarak verinin boyutunu azaltır. Bu katmanlar, görüntüyü giderek daha düşük boyutlu ve daha soyut bir temsile dönüştürür.
* Gizli Uzay: Kodlayıcının çıkışı, genellikle son MaxPooling2D katmanının veya bir Dense katmanının çıktısı olan, sıkıştırılmış gizli uzayı oluşturur. Bu, orijinal görüntünün düşük boyutlu, anlamlı bir temsilidir.
* Kod Çözücü: Evrişimsel kod çözücü, gizli uzaydaki temsili orijinal görüntü boyutlarına geri döndürmek için bir dizi Conv2DTranspose (deconvolution veya kesirli adımlı evrişim) veya UpSampling2D katmanları ile Conv2D katmanlarını kullanır. Conv2DTranspose katmanları, Conv2D katmanlarının tersi işlevi görerek uzamsal boyutları artırır ve özellik haritalarını yeniden birleştirir. Son katman genellikle sigmoid aktivasyon fonksiyonu ile 0-1 aralığında piksel değerleri üreten bir Conv2D katmanıdır.
CAE’ler, görüntü verileriyle çalışırken basit otoenkoderlere göre çok daha başarılıdır çünkü evrişim katmanları, görüntülerin yerel yapılarını ve uzamsal ilişkilerini koruyarak daha anlamlı ve verimli özellikler öğrenir. Bu, daha yüksek sıkıştırma oranları ve daha iyi yeniden oluşturma kalitesi anlamına gelir.
Seyrek Otoenkoderler (Sparse Autoencoders)
Seyrek otoenkoderler, gizli katmandaki nöronların küçük bir kısmının aynı anda aktif olmasını zorlayarak çalışır. Bu seyreklik kısıtlaması, modelin daha kompakt ve verimli temsiller öğrenmesini sağlar. Seyrek otoenkoderler, giriş verisindeki temel özelliklerin daha iyi yakalanmasına yardımcı olabilir ve aşırı uydurmayı (overfitting) azaltabilir. Görüntü sıkıştırma bağlamında, bu, daha az bilgiyle daha zengin bir temsil elde edilmesine olanak tanıyabilir.
Gürültü Giderici Otoenkoderler (Denoising Autoencoders)
Gürültü giderici otoenkoderler, giriş görüntüsüne kasıtlı olarak gürültü eklenerek eğitilir ve bu gürültülü girişten temiz, orijinal görüntüyü yeniden oluşturmaya çalışır. Bu eğitim stratejisi, modelin giriş verisindeki temel özellikleri gürültüden ayırmayı öğrenmesini sağlar. Görüntü sıkıştırmada, bu tür otoenkoderler, daha sağlam (robust) ve gürültüye daha az duyarlı özellik temsilleri öğrenerek dolaylı yoldan fayda sağlayabilir.
Varyasyonel Otoenkoderler (Variational Autoencoders – VAE)
VAE’ler, otoenkoder mimarisinin üretken bir uzantısıdır. Geleneksel otoenkoderlerin aksine, VAE’ler gizli uzayı belirli bir olasılıksal dağılım (genellikle Gauss dağılımı) olarak temsil eder. Kodlayıcı, giriş verisi için bu dağılımın ortalama ve varyans parametrelerini öğrenir. Kod çözücü ise bu dağılımdan örneklenen bir noktayı kullanarak görüntüyü yeniden oluşturur. VAE’ler, gizli uzayın daha pürüzsüz ve anlamlı olmasını sağlar, bu da yeni ve gerçekçi görüntüler üretme yeteneği kazandırır. Görüntü sıkıştırma için, VAE’ler, gizli uzayda daha anlamlı ve yapısal olarak zengin temsiller öğrenerek potansiyel olarak daha iyi sıkıştırma performansı sunabilirler, ancak genellikle daha karmaşık bir eğitim süreci gerektirirler.
Keras ile Otoenkoder Görüntü Sıkıştırma Uygulaması
Şimdi, Keras kullanarak evrişimsel bir otoenkoderin görüntü sıkıştırma amacıyla nasıl inşa edileceğini, eğitileceğini ve değerlendirileceğini adım adım açıklayalım.
Veri Kümesi Seçimi
Görüntü sıkıştırma uygulamaları için genellikle büyük ve çeşitli görüntü veri kümeleri tercih edilir. Ancak, bir başlangıç ve kavramsal ispat için MNIST (el yazısı rakamlar) veya CIFAR-10 (küçük renkli görüntüler) gibi daha küçük veri kümeleri de kullanılabilir. Bu örnekte, basitliği nedeniyle MNIST veri kümesini kullanacağız. MNIST, 28×28 piksel boyutunda gri tonlamalı el yazısı rakam görüntülerinden oluşur.
Veri Ön İşleme
Veri ön işleme, derin öğrenme modellerinin eğitimi için kritik bir adımdır.
1. Görüntülerin Yüklenmesi: Keras, mnist.load_data() fonksiyonu ile veri kümesini kolayca yüklememizi sağlar.
2. Normalizasyon: Piksel değerleri genellikle 0-255 aralığındadır. Bu değerleri 0-1 aralığına normalize etmek, modelin daha istikrarlı ve hızlı öğrenmesine yardımcı olur. Bu, her piksel değerini 255.0’e bölerek yapılır.
3. Boyutlandırma (Reshape): Evrişimli katmanlar, giriş olarak (yükseklik, genişlik, kanal) formatında görüntüler bekler. MNIST görüntüleri gri tonlamalı olduğu için tek bir kanala sahiptir. Bu nedenle, 28×28 boyutundaki görüntüleri (28, 28, 1) şekline getirmemiz gerekir.
import numpy as np
from tensorflow import keras
from tensorflow.keras import layers
Veri kümesini yükle
(x_train, _), (x_test, _) = keras.datasets.mnist.load_data()
Piksel değerlerini 0-1 aralığına normalize et
x_train = x_train.astype('float32') / 255.
x_test = x_test.astype('float32') / 255.
Görüntüleri (28, 28, 1) şekline getir (gri tonlamalı, 1 kanal)
x_train = np.reshape(x_train, (len(x_train), 28, 28, 1))
x_test = np.reshape(x_test, (len(x_test), 28, 28, 1))
Model Mimarisi Oluşturma
Evrişimsel otoenkoder modelini Keras’ın Functional API’sini kullanarak oluşturacağız. Bu API, daha esnek ve karmaşık model mimarileri tanımlamamıza olanak tanır.
# Giriş görüntüsü boyutu
input_img = keras.Input(shape=(28, 28, 1))
--- Kodlayıcı (Encoder) ---
1. Evrişim katmanı: 32 filtre, 3x3 kernel, relu aktivasyon, padding='same' ile boyut korunur
x = layers.Conv2D(32, (3, 3), activation='relu', padding='same')(input_img)
MaxPooling: Uzamsal boyutları yarıya indirir (28x28 -> 14x14)
x = layers.MaxPooling2D((2, 2), padding='same')(x)
2. Evrişim katmanı: 32 filtre, 3x3 kernel, relu aktivasyon
x = layers.Conv2D(32, (3, 3), activation='relu', padding='same')(x)
MaxPooling: Uzamsal boyutları yarıya indirir (14x14 -> 7x7)
encoded = layers.MaxPooling2D((2, 2), padding='same')(x)
encoded (gizli uzay) şimdi (7, 7, 32) boyutunda bir tensördür.
Bu, orijinal 28x28x1 görüntünün sıkıştırılmış temsilidir.
Sıkıştırma oranı: (28281) / (7732) = 784 / 1568 = 0.5 (Bu tam olarak sıkıştırma oranı değil,
ancak boyut küçülmesini gösterir. Bit bazında sıkıştırma için daha derin analiz gerekir.)
--- Kod Çözücü (Decoder) ---
Upsampling: Uzamsal boyutları iki katına çıkarır (7x7 -> 14x14)
x = layers.Conv2D(32, (3, 3), activation='relu', padding='same')(encoded)
x = layers.UpSampling2D((2, 2))(x)
1. Evrişim katmanı: 32 filtre, 3x3 kernel, relu aktivasyon
x = layers.Conv2D(32, (3, 3), activation='relu', padding='same')(x)
Upsampling: Uzamsal boyutları iki katına çıkarır (14x14 -> 28x28)
x = layers.UpSampling2D((2, 2))(x)
Çıkış katmanı: 1 filtre (gri tonlamalı görüntü için), 3x3 kernel, sigmoid aktivasyon
Sigmoid, piksel değerlerini 0-1 aralığına sıkıştırır.
decoded = layers.Conv2D(1, (3, 3), activation='sigmoid', padding='same')(x)
Otoenkoder modelini oluştur
autoencoder = keras.Model(input_img, decoded)
Sadece kodlayıcı kısmını içeren modeli oluştur (sıkıştırma için)
encoder = keras.Model(input_img, encoded)
Sadece kod çözücü kısmını içeren modeli oluştur (yeniden oluşturma için)
Kod çözücü girdisi, kodlayıcının çıktısının şekli olmalıdır: (7, 7, 32)
encoded_input = keras.Input(shape=(7, 7, 32))
decoder_layer = autoencoder.layers[-7](encoded_input) # İlk UpSampling katmanı
decoder_layer = autoencoder.layers[-6](decoder_layer) # İlk Conv2D katmanı
decoder_layer = autoencoder.layers[-5](decoder_layer) # İkinci UpSampling katmanı
decoder_layer = autoencoder.layers[-4](decoder_layer) # İkinci Conv2D katmanı
decoder_layer = autoencoder.layers[-3](decoder_layer) # Son Conv2D katmanı (output)
decoder = keras.Model(encoded_input, decoder_layer)
Yukarıdaki kodda, autoencoder.layers[-X] kullanarak kod çözücüyü oluşturmak biraz karmaşık olabilir. Daha temiz bir yol, kod çözücü katmanlarını ayrı ayrı tanımlayıp sonra birleştirmektir, ancak bu örnekte mevcut modelin katmanlarını yeniden kullanma mantığı gösterilmiştir.
Modelin Derlenmesi
Modeli eğitmeden önce, bir optimize edici (optimizer) ve bir kayıp fonksiyonu (loss function) belirtmemiz gerekir.
* Optimize Edici: Adam optimize edici, çoğu derin öğrenme görevi için iyi bir başlangıç noktasıdır.
* Kayıp Fonksiyonu: Görüntü pikselleri 0-1 aralığına normalize edildiği ve çıkış katmanı sigmoid aktivasyonu kullandığı için mean_squared_error (MSE) veya binary_crossentropy uygundur. MSE, piksel değerleri arasındaki farkları kareleyerek hata ölçer.
autoencoder.compile(optimizer='adam', loss='mean_squared_error')
Modelin Eğitimi
Modeli, eğitim verileri üzerinde belirli bir sayıda epok (epoch) ve yığın boyutu (batch size) kullanarak eğitebiliriz.
autoencoder.fit(x_train, x_train,
epochs=50,
batch_size=256,
shuffle=True,
validation_data=(x_test, x_test))
Burada x_train hem giriş hem de beklenen çıkış olarak kullanılır, çünkü otoenkoderler denetimsiz öğrenme paradigmasında çalışır ve kendi girdilerini yeniden oluşturmayı öğrenir. validation_data ile modelin eğitim sırasında test verisi üzerindeki performansını izleyebiliriz.
Sıkıştırma ve Yeniden Oluşturma
Eğitim tamamlandıktan sonra, otoenkoder modelini kullanarak görüntüleri sıkıştırabilir ve yeniden oluşturabiliriz.
# Test görüntülerinden bazılarını sıkıştır
encoded_imgs = encoder.predict(x_test)
Sıkıştırılmış temsillerden görüntüleri yeniden oluştur
decoded_imgs = autoencoder.predict(x_test) # veya decoder.predict(encoded_imgs)
Değerlendirme
Modelin performansını değerlendirmek için orijinal ve yeniden oluşturulmuş görüntüler arasında görsel karşılaştırmalar yapabiliriz. Ayrıca, PSNR ve SSIM gibi nicel metrikleri de hesaplayabiliriz.
import matplotlib.pyplot as plt
n = 10 # Gösterilecek görüntü sayısı
plt.figure(figsize=(20, 4))
for i in range(n):
# Orijinal görüntüler
ax = plt.subplot(2, n, i + 1)
plt.imshow(x_test[i].reshape(28, 28))
plt.gray()
ax.get_xaxis().set_visible(False)
ax.get_yaxis().set_visible(False)
# Yeniden oluşturulmuş görüntüler
ax = plt.subplot(2, n, i + 1 + n)
plt.imshow(decoded_imgs[i].reshape(28, 28))
plt.gray()
ax.get_xaxis().set_visible(False)
ax.get_yaxis().set_visible(False)
plt.show()
PSNR ve SSIM hesaplaması için scikit-image kütüphanesi kullanılabilir
from skimage.metrics import peak_signal_noise_ratio, structural_similarity
psnr_values = []
ssim_values = []
for i in range(len(x_test)):
original = x_test[i].reshape(28, 28)
reconstructed = decoded_imgs[i].reshape(28, 28)
psnr_values.append(peak_signal_noise_ratio(original, reconstructed, data_range=1.0))
ssim_values.append(structural_similarity(original, reconstructed, data_range=1.0))
print(f"Ortalama PSNR: {np.mean(psnr_values):.2f} dB")
print(f"Ortalama SSIM: {np.mean(ssim_values):.2f}")
Bu çıktılar, otoenkoderin sıkıştırma sonrası görüntüyü ne kadar iyi yeniden oluşturabildiğini gösterir. Sıkıştırma oranı ise gizli uzayın boyutuna ve bu uzayın temsil ettiği bilgi miktarına bağlıdır. Örneğin, (7, 7, 32) boyutundaki bir gizli uzay, orijinal (28, 28, 1) görüntüsüne kıyasla önemli ölçüde daha az veri noktası içerir.
Otoenkoder Tabanlı Sıkıştırmanın Avantajları ve Dezavantajları
Otoenkoderlerin görüntü sıkıştırma alanına getirdiği yenilikler ve potansiyeller, geleneksel yöntemlere kıyasla bazı belirgin avantajlar sunarken, beraberinde bazı zorlukları da getirir.
Avantajlar
* Veriye Özgü Sıkıştırma: Otoenkoderler, eğitildikleri veri kümesindeki görüntülerin özelliklerini öğrenir. Bu, belirli bir tür görüntü (örneğin, tıbbi görüntüler, uydu görüntüleri) için geleneksel yöntemlerden daha optimize ve verimli sıkıştırma algoritmaları oluşturma potansiyeli sunar. Geleneksel algoritmalar genellikle genel amaçlıdır.
* Daha İyi Sıkıştırma Oranları Potansiyeli: Derin öğrenme modelleri, görüntüdeki anlamsal bilgiyi daha iyi anlayarak ve gereksiz fazlalıkları daha etkili bir şekilde ortadan kaldırarak, geleneksel yöntemlere göre daha yüksek sıkıştırma oranları elde etme potansiyeline sahiptir.
* Gürültü Azaltma ve Özellik Öğrenimi: Otoenkoderler, sıkıştırma görevinin yanı sıra, gürültü azaltma ve görüntülerden yüksek seviyeli özellikler öğrenme gibi ek faydalar da sağlayabilir. Özellikle gürültü giderici otoenkoderler, sıkıştırma sırasında gürültüyü filtreleyerek daha temiz yeniden oluşturulmuş görüntüler üretebilir.
* Esneklik: Keras gibi kütüphanelerle farklı otoenkoder mimarileri, kayıp fonksiyonları ve optimize ediciler denemek kolaydır. Bu esneklik, belirli uygulama gereksinimlerine göre özel sıkıştırma çözümleri geliştirmeye olanak tanır.
* Anlamsal Sıkıştırma: Otoenkoderler, piksel düzeyindeki benzerlikten ziyade görüntünün anlamsal içeriğini korumaya odaklanabilir. Bu, çok yüksek sıkıştırma oranlarında bile görsel olarak kabul edilebilir sonuçlar elde edilmesini sağlayabilir.
Dezavantajlar
* Eğitim Süresi ve Hesaplama Maliyeti: Derin öğrenme modellerinin eğitimi, özellikle büyük veri kümeleri ve karmaşık mimariler için önemli miktarda işlem gücü (GPU/TPU) ve zaman gerektirir. Bu, modelin geliştirme ve dağıtım maliyetlerini artırabilir.
* Model Boyutu: Eğitilmiş otoenkoder modelleri, özellikle çok sayıda katman ve nöron içeriyorsa, kendileri de önemli depolama alanı kaplayabilir. Bu, sıkıştırma modelinin kendisinin depolanması ve dağıtılması gerektiğinde bir sorun teşkil edebilir.
* Genelleme Yeteneği: Otoenkoderler, eğitildikleri veri setine özgüdür. Eğitilmedikleri veya çok farklı özelliklere sahip görüntüler üzerinde kötü performans gösterebilirler. Bu, geniş bir görüntü yelpazesini sıkıştırmak için genel amaçlı bir otoenkoder oluşturmayı zorlaştırır.
* Kayıplı Sıkıştırma Doğası: Çoğu otoenkoder tabanlı sıkıştırma, kayıplı bir süreçtir. Yani, yeniden oluşturulan görüntü orijinal görüntüden bir miktar farklı olacaktır. Kritik uygulamalarda (tıbbi görüntüleme gibi) bu bilgi kaybı kabul edilemez olabilir.
* Standardizasyon Eksikliği: Geleneksel sıkıştırma formatları (JPEG, PNG) standartlaştırılmış ve geniş çapta desteklenirken, otoenkoder tabanlı sıkıştırma için henüz evrensel bir standart bulunmamaktadır. Bu, farklı modeller arasında uyumluluk sorunlarına yol açabilir.
* Sıkıştırma Oranının Belirlenmesi: Geleneksel sıkıştırmada sıkıştırma oranı doğrudan kontrol edilebilirken, otoenkoderlerde bu, gizli uzayın boyutu, mimari ve eğitim süreci gibi birçok faktöre bağlıdır. Optimum sıkıştırma oranı ve kalite dengesini bulmak deneysel bir süreçtir.
Gelecek Perspektifleri ve Gelişmeler
Otoenkoder tabanlı görüntü sıkıştırma alanı, derin öğrenmenin sürekli gelişimiyle birlikte hızla ilerlemektedir. Gelecekte bu alanda beklenen bazı gelişmeler ve araştırma yönleri şunlardır:
* Üretken Çekişmeli Ağlar (GANs) ile Sıkıştırma: GAN’lar, gerçekçi görüntüler üretme yetenekleriyle bilinir. Sıkıştırma bağlamında, bir üretici ağı sıkıştırılmış temsilden görüntüler oluştururken, bir ayırt edici ağ bu görüntüleri gerçek görüntülerden ayırmaya çalışabilir. Bu, daha yüksek görsel kaliteye sahip yeniden oluşturulmuş görüntüler elde etme potansiyeli sunar.
* Algısal Kayıp Fonksiyonları (Perceptual Loss): Geleneksel MSE gibi kayıp fonksiyonları piksel düzeyindeki farklılıklara odaklanırken, algısal kayıp fonksiyonları insan görsel sisteminin algısal özelliklerini daha iyi taklit eder. Bu, daha yüksek sıkıştırma oranlarında bile insan gözü için daha hoş ve gerçekçi görünen görüntüler üretilmesini sağlayabilir.
* Video Sıkıştırmaya Uygulanması: Görüntü sıkıştırma teknikleri, video sıkıştırma için de temel oluşturur. Otoenkoderlerin zamansal bağımlılıkları öğrenen varyasyonları (örneğin, 3D evrişimli otoenkoderler veya Recurrent Neural Network (RNN) tabanlı yapılar), video sıkıştırma performansını önemli ölçüde artırabilir.
* Daha Verimli Mimariler: Transformer tabanlı mimariler veya daha hafif evrişimli ağlar gibi yeni sinir ağı mimarileri, otoenkoderlerin hesaplama verimliliğini ve sıkıştırma performansını artırabilir. Özellikle mobil cihazlar ve gömülü sistemler için düşük kaynak tüketimli sıkıştırma çözümleri geliştirmek önemlidir.
* Uyarlanabilir Sıkıştırma: Görüntünün içeriğine ve karmaşıklığına göre sıkıştırma parametrelerini dinamik olarak ayarlayabilen otoenkoderler, farklı bölgelerde farklı sıkıştırma oranları uygulayarak genel kaliteyi optimize edebilir.
* Kuantize Edilmiş Gizli Uzaylar: Gizli uzayın kuantize edilmesi (yani, sürekli değerlerin ayrık değerlere dönüştürülmesi), sıkıştırılmış verinin daha da küçük boyutlarda depolanmasına olanak tanır ve standart sıkıştırma algoritmalarıyla daha kolay entegrasyon sağlayabilir.
Sonuç
Otoenkoderler, derin öğrenmenin görüntü sıkıştırma alanına getirdiği en umut verici yaklaşımlardan biridir. Kendi kendine öğrenen bu sinir ağları, görüntülerin temel özelliklerini ve desenlerini keşfederek, onları düşük boyutlu ve verimli bir gizli uzayda temsil etme yeteneğine sahiptir. Özellikle evrişimsel otoenkoderler, görüntülerin uzamsal yapısını koruyarak ve hiyerarşik özellikleri öğrenerek, geleneksel sıkıştırma yöntemlerinin ötesinde performans sergileyebilirler.
Keras gibi kullanıcı dostu kütüphaneler sayesinde, otoenkoder tabanlı görüntü sıkıştırma modellerini oluşturmak, eğitmek ve değerlendirmek giderek daha erişilebilir hale gelmiştir. Bu makalede ele aldığımız adımlar, basit bir evrişimsel otoenkoderin MNIST veri kümesi üzerinde nasıl çalıştığını göstermiştir. Elde edilen sonuçlar, otoenkoderlerin orijinal görüntüyü önemli ölçüde sıkıştırarak kabul edilebilir bir kalitede yeniden oluşturabildiğini ortaya koymaktadır.
Elbette, otoenkoder tabanlı sıkıştırmanın henüz geleneksel standartlar kadar yaygın veya optimize olmadığı bazı zorlukları bulunmaktadır. Yüksek hesaplama maliyetleri, genelleme sorunları ve standartlaşma eksikliği gibi konular, bu teknolojinin daha geniş çapta benimsenmesi için aşılması gereken engellerdir. Ancak, devam eden araştırmalar ve derin öğrenme alanındaki hızlı ilerlemeler, bu zorlukların üstesinden gelmek ve otoenkoderleri geleceğin görüntü ve video sıkıştırma standartlarının ayrılmaz bir parçası haline getirmek için büyük bir potansiyel sunmaktadır.
Özetle, otoenkoderler, görüntü sıkıştırmanın geleceğinde önemli bir rol oynayacak ve daha verimli, adaptif ve yüksek kaliteli sıkıştırma çözümlerinin geliştirilmesine katkıda bulunacaktır. Derin öğrenmenin bu alandaki etkisi, dijital çağın artan veri hacmiyle başa çıkmak için kritik öneme sahiptir.
