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()