pixera / src /GAN.py
Alican Akca
issues...
1e4d453
raw history blame
No virus
6.75 kB
import os
import cv2
import keras
import warnings
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.models import Sequential, Model
from tensorflow.keras.layers import Dense, LeakyReLU, Reshape, Flatten, Input
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Activation, Dropout, Conv2DTranspose
from tensorflow.compat.v1.keras.layers import BatchNormalization
images = []
def load_images(size=(64,64)):
pixed_faces = os.listdir("kaggle/working/results/pixed_faces")
images_Path = "kaggle/working/results/pixed_faces"
for i in pixed_faces:
try:
image = cv2.imread(f"{images_Path}/{i}")
image = cv2.resize(image,size)
images.append(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
except:
pass
load_images()
#--------vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
#Author: https://www.kaggle.com/nassimyagoub
#--------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
def __init__(self):
self.img_shape = (64, 64, 3)
self.noise_size = 100
optimizer = Adam(0.0002,0.5)
self.discriminator = self.build_discriminator()
self.discriminator.compile(loss='binary_crossentropy',
optimizer=optimizer,
metrics=['accuracy'])
self.generator = self.build_generator()
self.generator.compile(loss='binary_crossentropy', optimizer=optimizer)
self.combined = Sequential()
self.combined.add(self.generator)
self.combined.add(self.discriminator)
self.discriminator.trainable = False
self.combined.compile(loss='binary_crossentropy', optimizer=optimizer)
self.combined.summary()
def build_generator(self):
epsilon = 0.00001
noise_shape = (self.noise_size,)
model = Sequential()
model.add(Dense(4*4*512, activation='linear', input_shape=noise_shape))
model.add(LeakyReLU(alpha=0.2))
model.add(Reshape((4, 4, 512)))
model.add(Conv2DTranspose(512, kernel_size=[4,4], strides=[2,2], padding="same",
kernel_initializer= keras.initializers.TruncatedNormal(stddev=0.02)))
model.add(BatchNormalization(momentum=0.9, epsilon=epsilon))
model.add(LeakyReLU(alpha=0.2))
model.add(Conv2DTranspose(256, kernel_size=[4,4], strides=[2,2], padding="same",
kernel_initializer= keras.initializers.TruncatedNormal(stddev=0.02)))
model.add(BatchNormalization(momentum=0.9, epsilon=epsilon))
model.add(LeakyReLU(alpha=0.2))
model.add(Conv2DTranspose(128, kernel_size=[4,4], strides=[2,2], padding="same",
kernel_initializer= keras.initializers.TruncatedNormal(stddev=0.02)))
model.add(BatchNormalization(momentum=0.9, epsilon=epsilon))
model.add(LeakyReLU(alpha=0.2))
model.add(Conv2DTranspose(64, kernel_size=[4,4], strides=[2,2], padding="same",
kernel_initializer= keras.initializers.TruncatedNormal(stddev=0.02)))
model.add(BatchNormalization(momentum=0.9, epsilon=epsilon))
model.add(LeakyReLU(alpha=0.2))
model.add(Conv2DTranspose(3, kernel_size=[4,4], strides=[1,1], padding="same",
kernel_initializer= keras.initializers.TruncatedNormal(stddev=0.02)))
model.add(Activation("tanh"))
model.summary()
noise = Input(shape=noise_shape)
img = model(noise)
return Model(noise, img)
def build_discriminator(self):
model = Sequential()
model.add(Conv2D(128, (3,3), padding='same', input_shape=self.img_shape))
model.add(LeakyReLU(alpha=0.2))
model.add(BatchNormalization())
model.add(Conv2D(128, (3,3), padding='same'))
model.add(LeakyReLU(alpha=0.2))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(3,3)))
model.add(Dropout(0.2))
model.add(Conv2D(128, (3,3), padding='same'))
model.add(LeakyReLU(alpha=0.2))
model.add(BatchNormalization())
model.add(Conv2D(128, (3,3), padding='same'))
model.add(LeakyReLU(alpha=0.2))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(3,3)))
model.add(Dropout(0.3))
model.add(Flatten())
model.add(Dense(128))
model.add(LeakyReLU(alpha=0.2))
model.add(Dense(128))
model.add(LeakyReLU(alpha=0.2))
model.add(Dense(1, activation='sigmoid'))
model.summary()
img = Input(shape=self.img_shape)
validity = model(img)
return Model(img, validity)
def train(self, epochs, batch_size=128, metrics_update=50, save_images=100, save_model=2000):
X_train = np.array(images)
X_train = (X_train.astype(np.float32) - 127.5) / 127.5
half_batch = int(batch_size / 2)
mean_d_loss=[0,0]
mean_g_loss=0
for epoch in range(epochs):
idx = np.random.randint(0, X_train.shape[0], half_batch)
imgs = X_train[idx]
noise = np.random.normal(0, 1, (half_batch, self.noise_size))
gen_imgs = self.generator.predict(noise)
d_loss = 0.5 * np.add(self.discriminator.train_on_batch(imgs, np.ones((half_batch, 1))),
self.discriminator.train_on_batch(gen_imgs, np.zeros((half_batch, 1))))
noise = np.random.normal(0, 1, (batch_size, self.noise_size))
valid_y = np.array([1] * batch_size)
g_loss = self.combined.train_on_batch(noise, valid_y)
mean_d_loss[0] += d_loss[0]
mean_d_loss[1] += d_loss[1]
mean_g_loss += g_loss
if epoch % metrics_update == 0:
print ("%d [Discriminator loss: %f, acc.: %.2f%%] [Generator loss: %f]" % (epoch, mean_d_loss[0]/metrics_update, 100*mean_d_loss[1]/metrics_update, mean_g_loss/metrics_update))
mean_d_loss=[0,0]
mean_g_loss=0
if epoch % save_images == 0:
self.save_images(epoch)
if epoch % save_model == 0:
self.generator.save("kaggle/working/results/generators/generator_%d" % epoch)
self.discriminator.save("kaggle/working/results/discriminators/discriminator_%d" % epoch)
def save_images(self, epoch):
noise = np.random.normal(0, 1, (25, self.noise_size))
gen_imgs = self.generator.predict(noise)
gen_imgs = 0.5 * gen_imgs + 0.5
fig, axs = plt.subplots(5,5, figsize = (8,8))
for i in range(5):
for j in range(5):
axs[i,j].imshow(gen_imgs[5*i+j])
axs[i,j].axis('off')
plt.show()
fig.savefig("kaggle/working/results/pandaS_%d.png" % epoch)
plt.close()