Üretken Çekişmeli Ağları Kullanan DLSS
Bu makale size Keras kitaplığı kullanılarak yazılan bir DLSS Üretken Çekişmeli Ağı’nın genel çerçevesini sağlayacaktır. Kendi görüntü veri kümelerinizi kullanarak süper çözünürlüklü modelleri eğitmek için bu genel DLSS GAN şablonunu kullanabileceksiniz.
Kodun tam sürümü bu GitHub deposunda mevcuttur.
Veri kümesi
Bu şablon, herhangi bir RGB görüntüsünü veri kümeniz olarak kullanabileceğiniz şekilde yazılmıştır. Kullanılabilecek iyi bir veri kümesi örneğini Kagge’den indirebilirsiniz . Bu veri seti iki görüntü seti sağlar: 96 × 96 pikselli bir düşük çözünürlüklü görüntü seti ve 384 × 384 pikselli bir yüksek çözünürlüklü görüntü seti.
Bu veri kümesini kullanmak için, ayarlarınızı yalnızca kullanıcı tarafından belirlenen parametreler dahilinde tanımlamanız gerekir. input_path indirilen veri kümesindeki LR klasörüne ayarlayın ve output_path’i HR klasörüne ayarlayın. Ayrıca görüntülerinizin boyutlarını da belirtmeniz gerekir, bu nedenle input_dimensions’ı (96,96,3) ve output_dimensions’ı (384,384,3) olarak ayarlayın. Bu durumda giriş ve çıkış boyutlarının uyumlu olduğuna dikkat edin. İki görüntü boyutu, yüksek çözünürlük ile düşük çözünürlük arasındaki oran 2’nin katı olduğunda uyumludur. Bu durumda 384 × 384 görüntüler, 96 × 96 görüntülerden 4 kat daha büyüktür. Bu uyumluluk, Upsampling2D’nin katmanları Keras’ta çalışır. Katman girdinin çözünürlüğünü iki katına çıkarır ve super_sampling_ratio parametresi, girdi boyutlarımızdan çıktı boyutlarımıza ulaşmak için modelimizdeki katmanı kaç kez uyguladığımızı belirler.
İki görüntü setiyle birlikte gelen veri kümelerini kullanmanıza gerek olmadığını da unutmamak önemlidir. Örneğin, yalnızca bir 256 × 256 görüntü kümesiyle gelen bu veri kümesini kullanabilirsiniz. Sadece ayarlama yoluyla, input_path ve output_path aynı klasöre parametrelerini ve görüntüleri doğru işlenecektir. Bu örnekte, output_dimension (256,256,3) olarak ayarlayın ve input_dimension’ları (64,64,3) veya (128,128,3) olarak ayarlayın ve görüntüler buna göre yeniden boyutlandırılacaktır.
Girdiler
from keras.layers import Input, Dense, Reshape, Flatten
from keras.layers.advanced_activations import LeakyReLU
from keras.layers.convolutional import UpSampling2D, Conv2D, MaxPooling2D
from keras.models import Sequential, Model
from keras.optimizers import Adam
from sklearn.utils import shuffle
import matplotlib.pyplot as plt
import numpy as np
import os
from PIL import Image
import skimage.transform as s
Bu proje aşağıdaki kitaplıkları gerektirmektedir:
- Keras (I use 2.3.1)
- Tensorflow (I use 1.14.0)
- Sklearn
- Skimage
- Numpy
- Matplotlib
- PIL
Parametreleri Ayarla
Bu şablonu özel ihtiyaçlarınıza göre değiştirebilmeniz için şablonun parametrelerini tanımlamanız gerekir. Mevcut parametreler, 8 GB VRAM’li bir GPU’da kullanılmak üzere tasarlanmıştır. Daha az güce sahip bir GPU ile çalışıyorsanız, evrişimli filtrelerin sayısını ve çekirdek boyutunu buna göre azaltın. Bellek kısıtlamaları nedeniyle toplu iş boyutu da azaltılabilir. Geri kalan parametreler aşağıda açıklanmıştır:
Kullanıcı Tarafından Belirlenen Parametreler:
- input_path: Düşük çözünürlüklü veri kümesini içeren klasöre işaret eden dosya yolu.
- output_path: Yüksek çözünürlüklü veri kümesini içeren klasöre işaret eden dosya yolu.
- input_dimensions: Düşük çözünürlüklü veri kümesindeki görüntülerin boyutları. Görüntü boyutları uyumlu olmalıdır, yani output_dimensions / input_dimensions 2’nin katıdır.
- output_dimensions: Yüksek çözünürlüklü veri kümesindeki görüntülerin boyutları. Görüntü boyutları uyumlu olmalıdır, yani output_dimensions / input_dimensions 2’nin katıdır.
- super_sampling_ratio: İki görüntü çözünürlüğü arasındaki boyut farkının oranını temsil eden tamsayı. Bu tam sayı, modellerde Upsampling2D ve MaxPooling2D katmanlarının kaç kez kullanıldığını belirtir.
- model_path: Modele kaydetmek istediğiniz klasöre ve oluşturulan örneklere işaret eden dosya yolu.
- interval: Modelinizi kaydetme arasında kaç dönemin olduğunu gösteren tamsayı.
- epochs: Modelin kaç dönemin eğitileceğini temsil eden tam sayı.
- batch: Bir seferde kaç görüntünün eğitileceğini temsil eden tam sayı.
- conv_filters: Generator ve Discriminator’ın her bir evrişimli katmanında kaç tane evrişimli filtre kullanıldığını temsil eden tamsayı.
- kernel: Evrişimli katmanlarda kullanılan çekirdeklerin boyutunu temsil eden grup.
- png: Boolean flag, verilerde resimlerden alfa katmanını kaldırmak için PNG’ler varsa True olarak ayarlayın.
# Folder containing input (low resolution) dataset
input_path = r'D:\Downloads\selfie2anime\trainB'
# Folder containing output (high resolution) dataset
output_path = r'D:\Downloads\selfie2anime\trainB'
# Dimensions of the images inside the dataset.
# NOTE: The image sizes must be compatible meaning output_dimensions / input_dimensions is a multiple of 2
input_dimensions = (128,128,3)
# Dimensions of the images inside the dataset.
# NOTE: The image sizes must be compatible meaning output_dimensions / input_dimensions is a multiple of 2
output_dimensions = (256,256,3)
# How many times to increase the resolution by 2 (by appling the UpSampling2D layer)
super_sampling_ratio = int(output_dimensions[0] / input_dimensions[0] / 2)
# Folder where you want to save to model as well as generated samples
model_path = r"C:\Users\Vee\Desktop\python\GAN\DLSS\results"
# How many epochs between saving your model
interval = 5
# How many epochs to run the model
epoch = 100
# How many images to train at one time.
# Ideally this number would be a factor of the size of your dataset
batch = 25
# How many convolutional filters for each convolutional layer of the generator and the discrminator
conv_filters = 64
# Size of kernel used in the convolutional layers
kernel = (5,5)
# Boolean flag, set to True if the data has pngs to remove alpha layer from images
png = True
Derin Evrişimli GAN Sınıfı Oluşturun
Bu sınıf 6 yöntem içerir.
__init __ (self) : Sınıf, girdi görüntüsünün yanı sıra çıktı görüntüsünün boyutları tanımlanarak başlatılır. Generator ve Discriminator modelleri build_generator () ve build_discriminator () kullanılarak başlatılır .
build_generator (self) : Generator modelini tanımlar. Evrişimsel ve UpSampling2D tabakaları kat görüntünün çözünürlüğünü artırmak super_sampling_ratio * 2 . DCGAN sınıfı başlatıldığında çağrılır.
build_discriminator (self) : Discriminator modelini tanımlar. Konvolüsyonel ve MaxPooling2D tabakalar output_dimensions ila altörnekleyebilirsiniz 1 skaler tahmini. DCGAN sınıfı başlatıldığında çağrılır.
load_data (self) : Kullanıcı tarafından belirtilen dosya yolundan veri_yolu verileri yükler . Dan yeniden şekillendiren görüntüleri input_path olması input_dimensions . Output_path dosyasındaki görüntüleri output_dimensions için yeniden şekillendirir . Train () yönteminde çağrılır .
train (self, epochs, batch_size, save_interval) : Generative Adversarial Network’ü eğitir . Her dönem modeli, batch_size ile tanımlanan parçalara ayrılmış tüm veri kümesini kullanarak eğitir . Epoch, save_interval’deyse , yöntem örnekleri oluşturmak için save_imgs () öğesini çağırır ve modeli geçerli dönemde kaydeder.
save_imgs (self, epoch, gen_imgs, interpolated) : Modeli kaydeder ve kullanıcının belirlediği yol olan model_path’ta belirli bir dönem için tahmin örnekleri oluşturur . Her örnek, karşılaştırma için 8 enterpolasyonlu görüntü ve Derin Öğrenilmiş Süper Örneklenmiş görüntüler içerir.
Başlatma
class DCGAN():
# Initialize parameters, generator, and discriminator models
def __init__(self):
# Set dimensions of the output image
self.img_rows = output_dimensions[0]
self.img_cols = output_dimensions[1]
self.channels = output_dimensions[2]
self.img_shape = (self.img_rows, self.img_cols, self.channels)
# Shape of low resolution input image
self.latent_dim = input_dimensions
# Chose optimizer for the models
optimizer = Adam(0.0002, 0.5)
# Build and compile the discriminator
self.discriminator = self.build_discriminator()
self.discriminator.compile(loss='binary_crossentropy',
optimizer=optimizer,
metrics=['accuracy'])
# Build the generator
self.generator = self.build_generator()
generator = self.generator
# The generator takes low resolution images as input and generates high resolution images
z = Input(shape = self.latent_dim)
img = self.generator(z)
# For the combined model we will only train the generator
self.discriminator.trainable = False
# The discriminator takes generated images as input and determines validity
valid = self.discriminator(img)
# The combined model (stacked generator and discriminator)
# Trains the generator to fool the discriminator
self.combined = Model(z, valid)
self.combined.compile(loss='binary_crossentropy', optimizer=optimizer)
DCGAN sınıfı başlatıldığında, Sinir Ağının veri setinden beklemesi gereken görüntülerin boyutunu tanımlarız. Çıktı boyutları Tuple img_shape tarafından belirtilir. Girdi boyutları ayrıca Tuple latent_dim tarafından da belirtilir.
Her iki model için de kullandığımız optimize edici, Adam optimize edicidir. Optimize edicinin öğrenme oranı ve beta değerleri ile denemekten çekinmeyin ve ne tür sonuçlar aldığınızı görün.
Generative Adversarial Network’ün mimarisi, her iki modelde İkili Çapraz Entropi kaybını kullanarak burada tanımlanmıştır. Kayıp fonksiyonu olarak İkili Çapraz Entropi seçimi burada açıklanmıştır. Diğer kayıp fonksiyonlarını denemekten çekinmeyin, ancak her iki modelin de aynı kayıp fonksiyonunu kullanması gerektiğini unutmayın.
Veri yükle
# load data from specified file path def load_data(self): # Initializing arrays for data and image file paths data = [] small = [] paths = [] # Get the file paths of all image files in this folder for r, d, f in os.walk(output_path): for file in f: if '.jpg' in file or 'png' in file: paths.append(os.path.join(r, file)) # For each file add high resolution image to array for path in paths: img = Image.open(path) # Resize Image y = np.array(img.resize((self.img_rows,self.img_cols))) # Remove alpha layer if imgaes are PNG if(png): y = y[...,:3] data.append(y) paths = [] # Get the file paths of all image files in this folder for r, d, f in os.walk(input_path): for file in f: if '.jpg' in file or 'png' in file: paths.append(os.path.join(r, file)) # For each file add low resolution image to array for path in paths: img = Image.open(path) # Resize Image x = np.array(img.resize((self.latent_dim[0],self.latent_dim[1]))) # Remove alpha layer if imgaes are PNG if(png): x = x[...,:3] small.append(x) # Return x_train and y_train reshaped to 4 dimensions y_train = np.array(data) y_train = y_train.reshape(len(data),self.img_rows,self.img_cols,self.channels) x_train = np.array(small) x_train = x_train.reshape(len(small),self.latent_dim[0],self.latent_dim[0],self.latent_dim[2]) del data del small del paths # Shuffle indexes of data X_shuffle, Y_shuffle = shuffle(x_train, y_train) return X_shuffle, Y_shuffle
DCGAN sınıfına eklediğimiz ilk yöntem load_data () ‘dır . Bu kullanıcı belirtilen yolları, içinde tüm görüntüleri için ön işlemeden input_path ve output_paths olacaktır. Her klasördeki görüntüler, buna göre input_dimensions ve output_dimensions olarak yeniden boyutlandırılacaktır. Bu yöntem, eğitimden önce verileri yüklemek için train () yönteminin içinde çağrılır.
Veri kümelerini döndürmeden, iki diziyi döndürmeden önce x_train ve y_train veri kümelerini karıştırıyoruz. Veri kümesindeki modelleri sıralı olarak eğitmek için train () yöntemini yazdık, her yinelemede toplu iş boyutunu artırdık. Bu nedenle, veri kümesinin sıralı olarak sıralanma biçimiyle ilgili oluşacak önyargıları getirmemek için veri kümesini karıştırmak önemlidir.
Generator Oluşturun
# Define Generator model def build_generator(self): model = Sequential() # 1st Convolutional Layer / Input Layer model.add(Conv2D(conv_filters, kernel_size=kernel, padding="same", input_shape=self.latent_dim)) model.add(LeakyReLU(alpha=0.2)) # Upsample the data as many times as needed to reach output resolution for i in range(super_sampling_ratio): # Super Sampling Convolutional Layer model.add(Conv2D(conv_filters, kernel_size=kernel, padding="same")) model.add(LeakyReLU(alpha=0.2)) # Upsample the data (Double the resolution) model.add(UpSampling2D()) # Convolutional Layer model.add(Conv2D(conv_filters, kernel_size=kernel, padding="same")) model.add(LeakyReLU(alpha=0.2)) # Convolutional Layer model.add(Conv2D(conv_filters, kernel_size=kernel, padding="same")) model.add(LeakyReLU(alpha=0.2)) # Final Convolutional Layer (Output Layer) model.add(Conv2D(3, kernel_size=kernel, padding="same")) model.add(LeakyReLU(alpha=0.2)) model.summary() noise = Input(shape=self.latent_dim) img = model(noise) return Model(noise, img)
DCGAN sınıfına eklediğimiz ikinci yöntem build_generator () ‘dır . Bu yöntem, sınıf ilk kez başlatıldığında çağrılır. Generator modelinin mimarisi burada tasarlanmıştır. Model özeti, bu modelde gerçekte neler olduğu konusunda size daha net bir fikir verecektir.
Generator modelinin girdisi, bir RGB görüntüsünü temsil eden bir tensördür. Bu durumda, bir (128,128,3) resim. Bu tensör daha sonra çıktı olarak (256,256,3) değerine yükseltilir.
Çıktı Evrişimli katmanı, RGB görüntüsünün sırasıyla Kırmızı, Yeşil ve Mavi kanallarını temsil eden 3 filtre içerir.
Ayrımcı (Discriminator) Oluşturun
# Define Discriminator model def build_discriminator(self): model = Sequential() # Input Layer model.add(Conv2D(conv_filters, kernel_size=kernel, input_shape=self.img_shape,activation = "relu", padding="same")) # Downsample the image as many times as needed for i in range(super_sampling_ratio): # Convolutional Layer model.add(Conv2D(conv_filters, kernel_size=kernel)) model.add(LeakyReLU(alpha=0.2)) # Downsample the data (Half the resolution) model.add(MaxPooling2D(pool_size=(2, 2))) # Convolutional Layer model.add(Conv2D(conv_filters, kernel_size=kernel, strides = 2)) model.add(LeakyReLU(alpha=0.2)) # Convolutional Layer model.add(Conv2D(conv_filters, kernel_size=kernel, strides = 2)) model.add(LeakyReLU(alpha=0.2)) model.add(Flatten()) # Output Layer model.add(Dense(1, activation='sigmoid')) model.summary() img = Input(shape=self.img_shape) validity = model(img) return Model(img, validity)
DCGAN sınıfına eklediğimiz üçüncü yöntem build_discriminator () ‘dür. Bu yöntem, sınıf ilk kez başlatıldığında çağrılır. Discriminator modelinin mimarisi burada tasarlanmıştır. Model özeti, bu modelde gerçekte neler olduğu konusunda size daha net bir fikir verecektir.
Discriminator modelinin girişi, bir RGB görüntüsünü temsil eden bir tensördür. Bu durumda, bir (256,256,3) resim. Tensör daha sonra 252 × 252, 126 × 126, 61 × 61 ve 29 × 29’a alt örneklenir. Bu 29 × 29 tensör daha sonra düzleştirilir ve çıktı katmanına aktarılır.
Son yoğun katman, ayırıcı modelin tahminini temsil eden tek bir skaler sayı verir. Bu tahmin, giriş görüntüsünün “gerçek” olup olmadığını belirlemede modelin güvenini temsil eder. 1 tahmini, modelin görüntünün orijinal veri kümesinden geldiğini düşündüğü anlamına gelir. O tahmini, modelin görüntünün Generator modeli tarafından oluşturulduğunu düşündüğü anlamına gelir.
Eğitmek
# Train the Generative Adversarial Network def train(self, epochs, batch_size, save_interval): # Prevent script from crashing from bad user input if(epochs <= 0): epochs = 1 if(batch_size <= 0): batch_size = 1 # Load the dataset X_train, Y_train = self.load_data() # Normalizing data to be between 0 and 1 X_train = X_train / 255 Y_train = Y_train / 255 # Adversarial ground truths valid = np.ones((batch_size, 1)) fake = np.zeros((batch_size, 1)) # Placeholder arrays for Loss function values g_loss_epochs = np.zeros((epochs, 1)) d_loss_epochs = np.zeros((epochs, 1)) # Training the GAN for epoch in range(1, epochs + 1): # Initialize indexes for training data start = 0 end = start + batch_size # Array to sum up all loss function values discriminator_loss_real = [] discriminator_loss_fake = [] generator_loss = [] # Iterate through dataset training one batch at a time for i in range(int(len(X_train)/batch_size)): # Get batch of images imgs_output = Y_train[start:end] imgs_input = X_train[start:end] # Train Discriminator # Make predictions on current batch using generator gen_imgs = self.generator.predict(imgs_input) # Train the discriminator (real classified as ones and generated as zero) d_loss_real = self.discriminator.train_on_batch(imgs_output, valid) d_loss_fake = self.discriminator.train_on_batch(gen_imgs, fake) d_loss = 0.5 * np.add(d_loss_real, d_loss_fake) # Train Generator # Train the generator (wants discriminator to mistake images as real) g_loss = self.combined.train_on_batch(imgs_input, valid) # Add loss for current batch to sum over entire epoch discriminator_loss_real.append(d_loss[0]) discriminator_loss_fake.append(d_loss[1]) generator_loss.append(g_loss) # Increment image indexes start = start + batch_size end = end + batch_size
DCGAN sınıfına eklediğimiz dördüncü yöntem train (). Bu yöntem, ağı toplu iş boyutu tarafından belirtilen artışlarla belirtilen sayıda dönem için eğitecektir. Eğitim tamamlandığında, yöntem her dönem boyunca her iki modelin kayıp değerlerini temsil eden iki dizi döndürecektir. Kayıp değerleri Matplotlib kullanılarak çizilebilir.
Kayıp değerlerini takip etmeli ve çökmeye başlarsa ağı eğitmeyi bırakmalısınız. Modellerden biri 0 kaybına yaklaşırsa ağ çöker.
Generator 0 kaybına yaklaşırsa, bu, Generator’ün her seferinde ayırıcıyı kandıracak bir görüntüyü nasıl oluşturacağını bulduğu anlamına gelir. Bu genellikle Generator’ün mod çökmesi olarak da bilinen tek bir görüntü türü üretebilmesine neden olur.
Discriminator, 0 kaybına yaklaşırsa, bu, Discriminator’ın eğitim verileri ile oluşturulan görüntüleri çok doğru bir şekilde nasıl ayırt edeceğini bulduğu anlamına gelir. Bu, Generator’ün; kaybolan gradyan problemi olarak da bilinen, ayırıcıdan öğrenmeye devam edememesine neden olacaktır.
Ağımız çöktüğünde ilerlememizi kaybetmemek için, modeli her birkaç dönemde bir kaydedeceğiz. Kullanıcı tanımlı parametre olan interval, modelin ne sıklıkla kaydedileceğini belirleyecektir. Geçerli dönem tanımlanan aralığa her geldiğinde, save_imgs () çağrılır. Yöntem, modelin o dönemde ne kadar iyi olduğuna dair bir anlık görüntü elde etmek için tahmin edilen bazı örneklerin bir görüntüsünü kaydedecektir.
Görüntüleri Kaydet
# Save the model and generate prediction samples for a given epoch def save_imgs(self, epoch, gen_imgs, interpolated): # Define number of columns and rows r, c = 4, 4 # Placeholder array for MatPlotLib Figure Subplots subplots = [] # Create figure with title fig = plt.figure(figsize= (40, 40)) fig.suptitle("Epoch: " + str(epoch), fontsize=65) # Initialize counters needed to track indexes across multiple arrays img_count = 0; index_count = 0; x_count = 0; # Loop through columns and rows of the figure for i in range(1, c+1): for j in range(1, r+1): # If row is even, plot the predictions if(j % 2 == 0): img = gen_imgs[index_count] index_count = index_count + 1 # If row is odd, plot the interpolated images else: img = interpolated[x_count] x_count = x_count + 1 # Add image to figure, add subplot to array subplots.append(fig.add_subplot(r, c, img_count + 1)) plt.imshow(img) img_count = img_count + 1 # Add title to columns of figure subplots[0].set_title("Interpolated", fontsize=45) subplots[1].set_title("Predicted", fontsize=45) subplots[2].set_title("Interpolated", fontsize=45) subplots[3].set_title("Predicted", fontsize=45) # Save figure to .png image in specified folder fig.savefig(model_path + "\\epoch_%d.png" % epoch) plt.close() # save model to .h5 file in specified folder self.generator.save(model_path + "\\generator" + str(epoch) + ".h5")
DCGAN sınıfına eklediğimiz beşinci ve son yöntem, save_imgs () yöntemidir. Bu yöntem, modeli mevcut dönemde kaydedecek ve enterpolasyonlu emsallerine kıyasla 8 süper örneklenmiş görüntüyü çizecektir. Oluşturulan örnek, DLSS modelinin kalitesini En Yakın Komşu Enterpolasyonu ile karşılaştırmanıza olanak tanır.
Bu yöntem şu anda her 5 çağda bir kaydedecek şekilde yapılandırılmıştır. Bu, aralık parametresi ile ayarlanabilir . Modelinizi sık sık kaydetmek, eğitim sürecinde ağınızın kaydettiği ilerlemeyi izlemenin iyi bir yoludur.
DCGAN Sınıfını Başlatma
Artık DCGAN sınıfını oluşturmayı bitirdik ve Generative Adversarial Network’ümüzü eğitmeye hazırız. Öncelikle, sınıfın bir örneğini oluşturmalı ve onu bir değişkene atamalıyız.
Girdi[4]
dcgan = DCGAN()
Bu, Generator ve Discriminator modellerini başlatacak ve bunların özetlerini yazdıracaktır.
GAN Eğitimi
Artık DCGAN sınıf nesnemize sahip olduğumuza göre, eğitime başlamak için train () yöntemini çağırmamız gerekiyor. Bu komut dosyasıyla, genellikle eğitim için çok sayıda dönem seçmeli ve süreç boyunca kayıp değerlerini izlemelisiniz. Ağ çökmeye başlarsa eğitimi erken durdurun ve hangi modelin en iyi performans gösteren model olduğunu bulmak için oluşturulan örnekleri kontrol edin.
Train () yöntemi, eğitim boyunca iki modelin kayıp değerlerini içeren iki dizi döndürür. Bu değerleri g_loss ve d_loss’a atayacağız ve grafiğini çizeceğiz.
Girdi [5]
g_loss, d_loss = dcgan.train(epochs=epoch, batch_size=batch, save_interval=interval)
1 [D loss: 0.640689, acc.: 59.37%] [G loss: 0.967596] 2 [D loss: 0.575859, acc.: 73.34%] [G loss: 1.787223] 3 [D loss: 0.656025, acc.: 61.31%] [G loss: 1.042790] 4 [D loss: 0.656616, acc.: 60.19%] [G loss: 0.998186] 5 [D loss: 0.674997, acc.: 56.04%] [G loss: 0.893507]
Plot Kaybı
Girdi [6]
plt.plot(g_loss)
plt.plot(d_loss)
plt.title('GAN Loss')
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend(['Generator', 'Discriminator'], loc='upper left')
plt.show()
Sonuçları Analiz Et
Memnun olduğunuz bir modeli eğittikten sonra, modelinizi çeşitli görüntüler üzerinde test etme zamanı gelmiştir. Bunu sağlanan bu komut dosyasını kullanarak yapabilirsiniz. Bunu kullanmak için önce birkaç parametre tanımlamalısınız. Input_dimensions ve ouput_dimesions’ı eğitim komut dosyasında yaptığınız aynı değerlere ayarlayın. Model_path , kullanmak istediğiniz H5 modelinin yoluna ayarlayın . H5 modelleri , save_imgs () yöntemi sırasında eğitim komut dosyasında model_path ile belirtilen klasöre kaydedilir . Dataset_path parametresini, modelinizi test etmek istediğiniz görüntüleri içeren klasöre ayarlayın. Görüntüler herhangi bir PNG içeriyorsa, pngalfa katmanlarını görüntülerden kaldırmak için boole işaretini true olarak ayarlayın. Sonuçlarınızdan animasyonlu GIF’ler oluşturmak için videonun karelerini dataset_path klasörüne yerleştirin. Son olarak, save_path parametresini model çıkarımının sonuçlarının kaydedilmesini istediğiniz klasöre ayarlayın.
Girdi [19]
model = load_model(model_path)
Görüntüleri ve Süper Örnekleri Yükleyin
Girdi [29]
paths = []
count = 0
for r, d, f in os.walk(dataset_path):
for file in f:
if '.png' in file or 'jpg' in file:
paths.append(os.path.join(r, file))
for path in paths:
# Select image
img = Image.open(path)
#create plot
f, axarr = plt.subplots(1,3,figsize=(15,15),gridspec_kw={'width_ratios': [1,super_sampling_ratio,super_sampling_ratio]})
axarr[0].set_xlabel('Original Image (' + str(input_dimensions[0]) + 'x' + str(input_dimensions[1]) + ')', fontsize=10)
axarr[1].set_xlabel('Interpolated Image (' + str(output_dimensions[0]) + 'x' + str(output_dimensions[1]) + ')', fontsize=10)
axarr[2].set_xlabel('Super Sampled Image (' + str(output_dimensions[0]) + 'x' + str(output_dimensions[1]) + ')', fontsize=10)
#original image
x = img.resize((input_dimensions[0],input_dimensions[1]))
#interpolated (resized) image
y = x.resize((output_dimensions[0],output_dimensions[1]))
x = np.array(x)
y = np.array(y)
# Remove alpha layer if imgaes are PNG
if(png):
x = x[...,:3]
y = y[...,:3]
#plotting first two images
axarr[0].imshow(x)
axarr[1].imshow(y)
#plotting super sampled image
x = x.reshape(1,input_dimensions[0],input_dimensions[1],input_dimensions[2])/255
result = np.array(model.predict_on_batch(x))*255
result = result.reshape(output_dimensions[0],output_dimensions[1],output_dimensions[2])
np.clip(result, 0, 255, out=result)
result = result.astype('uint8')
axarr[2].imshow(result)
# Save image
f.savefig(save_path + '\\frame_%d.png' % count)
# Increment file name counter
count = count + 1
Bu parametreleri ayarladıktan sonra, komut dosyası her görüntüyü input_dimesions ile belirtilen boyuta yeniden şekillendirecek ve modelinize girdi olarak besleyecektir. Ardından komut dosyası, modeliniz tarafından çıkarılan görüntüyü, En Yakın Komşu Enterpolasyonu kullanılarak giriş görüntüsünün enterpolasyonlu gibi görüneceği ile karşılaştırarak çizecektir. Modelinizden oluşturulan bu örnekler, save_path parametresi ile belirtilen klasöre kaydedilecektir. Bu örnekler, modelinizin kalitesini analiz etmenin iyi bir yoludur. Bir görüntünün modelinize girilmeden önceki görünümünü, modelinizden geçtikten sonra nasıl göründüğünü ve başka bir teknik kullanılarak süper örneklenmiş görünme biçimini karşılaştırabilirsiniz. Modellerimden bazılarının sonuçları aşağıda gösterilmektedir.
Sonuçlar
Sonuç
Bu makale, Keras kullanarak bir DLSS Üretken Çekişmeli Ağı eğitmek için genel bir çerçeve sağlar. Bu komut dosyasını kullanarak kendi veri kümelerinizle çeşitli çözünürlükler için kendi DLSS modellerinizi oluşturabileceksiniz. Bu kodun tam sürümü burada bulunabilir.
Memnun olduğunuz bir modeli eğittikten sonra, bu komut dosyasını çıktılar oluşturmak ve sonuçlarınızı analiz etmek için kullanabilirsiniz. Komut dosyası ayrıca size süper örneklenmiş video karelerinden GIF’ler oluşturmak için kod sağlayacaktır.