MuhammadALELIWI's picture
modify app
c29c0e1
import tensorflow as tf
import keras
from keras.models import Model
import keras.losses
from keras.layers import Dense, Dropout, Conv2D, MaxPooling2D, Conv2DTranspose, \
Input, concatenate, BatchNormalization, LeakyReLU, AveragePooling2D, Activation, Add
from tensorflow.keras.activations import tanh, softplus#softplus=log(exp(x) + 1)
import numpy as np
import cv2
import gradio as gr
def normalize(arr):#[0,255]to [-1,1]
return 2 * (arr / 255) - 1
def denormalize(arr):
return ((arr + 1) / 2) * 255
mish = lambda x: x * tanh(softplus(x))
def get_model(input_shape, is_bn):
def get_block_left(nfilters, conv_input, pool=True):
res_i = Conv2D(filters=nfilters, kernel_size=1, use_bias=False, strides=1, padding='same')(conv_input)
conv_i = Conv2D(filters=nfilters, kernel_size=3, strides=1, padding='same')(conv_input)
if is_bn:
conv_i = BatchNormalization()(conv_i)
conv_i = Activation(mish)(conv_i)
conv_i = Conv2D(filters=nfilters, kernel_size=3, strides=1, padding='same')(conv_i)
res_conv_i = Add()([conv_i, res_i])
if is_bn:
res_conv_i = BatchNormalization()(res_conv_i)
res_conv_i = Activation(mish)(res_conv_i)
if not pool:
return res_conv_i
pool_i = MaxPooling2D(pool_size=(2, 2))(res_conv_i)
return [res_conv_i, pool_i]
def get_block_right(nfilters, conv_input, cross_conv):
inv_i = Conv2DTranspose(filters=nfilters, kernel_size=3, strides=2, padding='same') (conv_input)
cat_i = concatenate([inv_i, cross_conv])
res_i = Conv2D(filters=nfilters, kernel_size=1, use_bias=False, strides=1, padding='same')(cat_i)
conv_i = Conv2D(filters=nfilters, kernel_size=3, strides=1, padding='same')(cat_i)
if is_bn:
conv_i = BatchNormalization()(conv_i)
conv_i = Activation(mish)(conv_i)
conv_i = Conv2D(filters=nfilters, kernel_size=3, strides=1, padding='same')(conv_i)
res_conv_i = Add()([conv_i, res_i])
if is_bn:
res_conv_i = BatchNormalization()(res_conv_i)
res_conv_i = Activation(mish)(res_conv_i)
return res_conv_i
# input
inp_1 = Input(input_shape)#Number of Channels = 4 represent Alpha, Red, Green and Blue channels
# first part
conv1, pool1 = get_block_left(16, inp_1)
conv2, pool2 = get_block_left(32, pool1)
conv3, pool3 = get_block_left(64, pool2)
conv4, pool4 = get_block_left(128, pool3)
conv5, pool5 = get_block_left(256, pool4)
conv6 = get_block_left(512, pool5, False)
# second part
rconv1 = get_block_right(256, conv6, conv5)
rconv2 = get_block_right(128, rconv1, conv4)
rconv3 = get_block_right(64, rconv2, conv3)
rconv4 = get_block_right(32, rconv3, conv2)
rconv5 = get_block_right(16, rconv4, conv1)
# output
out_1 = Conv2D(filters=3, kernel_size=1, strides=1, padding='same')(rconv5)
out_1 = Activation('tanh')(out_1)
# create model
model = Model(inputs = inp_1, outputs = out_1)
# build
model.compile(loss=keras.losses.mse, optimizer='adam')
return model
def predict_one( x):
x = cv2.resize(x, (256, 256))
x = normalize(x)
h = model.predict(np.array([x]))[0]
h = denormalize(h)
return np.uint8(h)
model = get_model((256, 256, 3), True)
model.load_weights('./resweights.h5')
# Write 1 line of Python to create a simple GUI
gr.Interface(fn=predict_one, allow_flagging= "never", inputs="image", outputs="image", description="The project aims at developing a software program capable of manipulating digital images to adopt the appearance or visual style of another image. Our objective is to create an artificial artwork from photographs, for example by transferring the appearance of famous paintings such as Van Kof’s paintings to user-supplied photographs. This type of application is called style transfer. However, famous style-transfer algorithms need lots of time to produce one image, it maybe takes 30 minutes running on a normal PC. So my project focus on reproducing the image in seconds.").launch()