From 4afc1fa6eef1bef43761de7fb5125d9959c39fe4 Mon Sep 17 00:00:00 2001 From: joaobrasil65 Date: Tue, 21 Sep 2021 20:12:57 -0400 Subject: [PATCH 1/3] updated to TF2 --- src/custom_vgg19V2.py | 140 ++++++++++++++++++++++++++ src/report.txt | 26 +++++ src/style_transfer.py | 7 +- src/style_transferV2 | 223 ++++++++++++++++++++++++++++++++++++++++++ src/utils.py | 12 ++- src/utilsV2.py | 59 +++++++++++ 6 files changed, 462 insertions(+), 5 deletions(-) create mode 100644 src/custom_vgg19V2.py create mode 100644 src/report.txt create mode 100644 src/style_transferV2 create mode 100644 src/utilsV2.py diff --git a/src/custom_vgg19V2.py b/src/custom_vgg19V2.py new file mode 100644 index 0000000..b96c243 --- /dev/null +++ b/src/custom_vgg19V2.py @@ -0,0 +1,140 @@ +import os +import tensorflow as tf +import numpy as np +import inspect +import urllib.request + +VGG_MEAN = [103.939, 116.779, 123.68] +data = None +dir_path = os.path.dirname(os.path.realpath(__file__)) +weights_name = dir_path + "/../lib/weights/vgg19.npy" +weights_url = "https://www.dropbox.com/s/68opci8420g7bcl/vgg19.npy?dl=1" + + +class Vgg19: + def __init__(self, vgg19_npy_path=None): + global data + + if vgg19_npy_path is None: + path = inspect.getfile(Vgg19) + path = os.path.abspath(os.path.join(path, os.pardir)) + path = os.path.join(path, weights_name) + + if os.path.exists(path): + vgg19_npy_path = path + else: + print("VGG19 weights were not found in the project directory") + + answer = 0 + while answer is not 'y' and answer is not 'N': + answer = input("Would you like to download the 548 MB file? [y/N] ").replace(" ", "") + + # Download weights if yes, else exit the program + if answer == 'y': + print("Downloading. Please be patient...") + urllib.request.urlretrieve(weights_url, weights_name) + vgg19_npy_path = path + elif answer == 'N': + print("Exiting the program..") + exit(0) + + if data is None: + data = np.load(vgg19_npy_path, encoding='latin1') + self.data_dict = data.item() + print("VGG19 weights loaded") + + else: + self.data_dict = data.item() + + def build(self, rgb, shape): + rgb_scaled = rgb * 255.0 + num_channels = shape[2] + channel_shape = shape + channel_shape[2] = 1 + + # Convert RGB to BGR + red, green, blue = tf.split(axis=3, num_or_size_splits=3, value=rgb_scaled) + + assert red.get_shape().as_list()[1:] == channel_shape + assert green.get_shape().as_list()[1:] == channel_shape + assert blue.get_shape().as_list()[1:] == channel_shape + + bgr = tf.concat(axis=3, values=[ + blue - VGG_MEAN[0], + green - VGG_MEAN[1], + red - VGG_MEAN[2], + ]) + + shape[2] = num_channels + assert bgr.get_shape().as_list()[1:] == shape + + self.conv1_1 = self.conv_layer(bgr, "conv1_1") + self.conv1_2 = self.conv_layer(self.conv1_1, "conv1_2") + self.pool1 = self.avg_pool(self.conv1_2, 'pool1') + + self.conv2_1 = self.conv_layer(self.pool1, "conv2_1") + self.conv2_2 = self.conv_layer(self.conv2_1, "conv2_2") + self.pool2 = self.avg_pool(self.conv2_2, 'pool2') + + self.conv3_1 = self.conv_layer(self.pool2, "conv3_1") + self.conv3_2 = self.conv_layer(self.conv3_1, "conv3_2") + self.conv3_3 = self.conv_layer(self.conv3_2, "conv3_3") + self.conv3_4 = self.conv_layer(self.conv3_3, "conv3_4") + self.pool3 = self.avg_pool(self.conv3_4, 'pool3') + + self.conv4_1 = self.conv_layer(self.pool3, "conv4_1") + self.conv4_2 = self.conv_layer(self.conv4_1, "conv4_2") + self.conv4_3 = self.conv_layer(self.conv4_2, "conv4_3") + self.conv4_4 = self.conv_layer(self.conv4_3, "conv4_4") + self.pool4 = self.avg_pool(self.conv4_4, 'pool4') + + self.conv5_1 = self.conv_layer(self.pool4, "conv5_1") + self.conv5_2 = self.conv_layer(self.conv5_1, "conv5_2") + self.conv5_3 = self.conv_layer(self.conv5_2, "conv5_3") + self.conv5_4 = self.conv_layer(self.conv5_3, "conv5_4") + + self.data_dict = None + + def avg_pool(self, bottom, name): + return tf.nn.avg_pool2d(input=bottom, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME', name=name) + + def max_pool(self, bottom, name): + return tf.nn.max_pool2d(input=bottom, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME', name=name) + + def conv_layer(self, bottom, name): + with tf.compat.v1.variable_scope(name): + filt = self.get_conv_filter(name) + + conv = tf.nn.conv2d(input=bottom, filters=filt, strides=[1, 1, 1, 1], padding='SAME') + + conv_biases = self.get_bias(name) + bias = tf.nn.bias_add(conv, conv_biases) + + relu = tf.nn.relu(bias) + return relu + + def fc_layer(self, bottom, name): + with tf.compat.v1.variable_scope(name): + shape = bottom.get_shape().as_list() + dim = 1 + for d in shape[1:]: + dim *= d + x = tf.reshape(bottom, [-1, dim]) + + weights = self.get_fc_weight(name) + biases = self.get_bias(name) + + # Fully connected layer. Note that the '+' operation automatically + # broadcasts the biases. + fc = tf.nn.bias_add(tf.matmul(x, weights), biases) + + return fc + + def get_conv_filter(self, name): + return tf.constant(self.data_dict[name][0], name="filter") + + def get_bias(self, name): + return tf.constant(self.data_dict[name][1], name="biases") + + def get_fc_weight(self, name): + return tf.constant(self.data_dict[name][0], name="weights") diff --git a/src/report.txt b/src/report.txt new file mode 100644 index 0000000..4f071d5 --- /dev/null +++ b/src/report.txt @@ -0,0 +1,26 @@ +TensorFlow 2.0 Upgrade Script +----------------------------- +Converted 1 files +Detected 0 issues that require attention +-------------------------------------------------------------------------------- +================================================================================ +Detailed log follows: + +================================================================================ +-------------------------------------------------------------------------------- +Processing file 'custom_vgg19.py' + outputting to 'custom_vgg19V2.py' +-------------------------------------------------------------------------------- + +99:15: INFO: Added keywords to args of function 'tf.nn.avg_pool' +99:15: INFO: Renamed keyword argument for tf.nn.avg_pool from value to input +99:15: INFO: Renamed 'tf.nn.avg_pool' to 'tf.nn.avg_pool2d' +102:15: INFO: Added keywords to args of function 'tf.nn.max_pool' +102:15: INFO: Renamed keyword argument for tf.nn.max_pool from value to input +102:15: INFO: Renamed 'tf.nn.max_pool' to 'tf.nn.max_pool2d' +105:13: INFO: Renamed 'tf.variable_scope' to 'tf.compat.v1.variable_scope' +108:19: INFO: Added keywords to args of function 'tf.nn.conv2d' +108:19: INFO: Renamed keyword argument for tf.nn.conv2d from filter to filters +117:13: INFO: Renamed 'tf.variable_scope' to 'tf.compat.v1.variable_scope' +-------------------------------------------------------------------------------- + diff --git a/src/style_transfer.py b/src/style_transfer.py index b1c9067..b973628 100644 --- a/src/style_transfer.py +++ b/src/style_transfer.py @@ -8,6 +8,9 @@ import numpy as np import os import tensorflow as tf + +# import tensorflow.compat.v1 as tf + import time import utils from functools import reduce @@ -134,8 +137,8 @@ def parse_args(): STYLE_PATH = os.path.realpath(args.style) OUT_PATH = os.path.realpath(args.out) - -with tf.Session() as sess: +with tf.compat.v1.Session() as sess: +# with tf.Session() as sess: parse_args() # Initialize and process photo image to be used for our content diff --git a/src/style_transferV2 b/src/style_transferV2 new file mode 100644 index 0000000..9a212ac --- /dev/null +++ b/src/style_transferV2 @@ -0,0 +1,223 @@ +#!/usr/bin/python3 +# Mohamed K. Eid (mohamedkeid@gmail.com) +# Description: TensorFlow implementation of "A Neural Algorithm of Artistic Style" using TV denoising as a regularizer. + +import argparse +import custom_vgg19V2 as vgg19 +import logging +import numpy as np +import os +import tensorflow as tf + +# import tensorflow.compat.v1 as tf + +import time +import utilsV2 +from functools import reduce + +# Model hyperparams +CONTENT_LAYER = 'conv4_2' +STYLE_LAYERS = ['conv1_1', 'conv2_1', 'conv3_1', 'conv4_1', 'conv5_1'] +EPOCHS = 300 +LEARNING_RATE = .02 +TOTAL_VARIATION_SMOOTHING = 1.5 +NORM_TERM = 6. + +# Loss term weights +CONTENT_WEIGHT = 1. +STYLE_WEIGHT = 3. +NORM_WEIGHT = .1 +TV_WEIGHT = .1 + +# Default image paths +DIR_PATH = os.path.dirname(os.path.realpath(__file__)) +OUT_PATH = DIR_PATH + '/../output/out_%.0f.jpg' % time.time() +INPUT_PATH, STYLE_PATH = None, None + +# Logging params +PRINT_TRAINING_STATUS = True +PRINT_N = 100 + +# Logging config +log_dir = DIR_PATH + '/../log/' +if not os.path.isdir(log_dir): + os.makedirs(log_dir) + print('Directory "%s" was created for logging.' % log_dir) +log_path = ''.join([log_dir, str(time.time()), '.log']) +logging.basicConfig(filename=log_path, level=logging.INFO) +print("Printing log to %s" % log_path) + + +# Given an activated filter maps of any particular layer, return its respected gram matrix +def convert_to_gram(filter_maps): + # Get the dimensions of the filter maps to reshape them into two dimenions + dimension = filter_maps.get_shape().as_list() + reshaped_maps = tf.reshape(filter_maps, [dimension[1] * dimension[2], dimension[3]]) + + # Compute the inner product to get the gram matrix + if dimension[1] * dimension[2] > dimension[3]: + return tf.matmul(reshaped_maps, reshaped_maps, transpose_a=True) + else: + return tf.matmul(reshaped_maps, reshaped_maps, transpose_b=True) + + +# Compute the content loss given a variable image (x) and a content image (c) +def get_content_loss(x, c): + with tf.compat.v1.name_scope('get_content_loss'): + # Get the activated VGG feature maps and return the normalized euclidean distance + noise_representation = getattr(x, CONTENT_LAYER) + photo_representation = getattr(c, CONTENT_LAYER) + return get_l2_norm_loss(noise_representation - photo_representation) + + +# Compute the L2-norm divided by squared number of dimensions +def get_l2_norm_loss(diffs): + shape = diffs.get_shape().as_list() + size = reduce(lambda x, y: x * y, shape) ** 2 + sum_of_squared_diffs = tf.reduce_sum(input_tensor=tf.square(diffs)) + return sum_of_squared_diffs / size + + +# Compute style loss given a variable image (x) and a style image (s) +def get_style_loss(x, s): + with tf.compat.v1.name_scope('get_style_loss'): + style_layer_losses = [get_style_loss_for_layer(x, s, l) for l in STYLE_LAYERS] + style_weights = tf.constant([1. / len(style_layer_losses)] * len(style_layer_losses), tf.float32) + weighted_layer_losses = tf.multiply(style_weights, tf.convert_to_tensor(value=style_layer_losses)) + return tf.reduce_sum(input_tensor=weighted_layer_losses) + + +# Compute style loss for a layer (l) given the variable image (x) and the style image (s) +def get_style_loss_for_layer(x, s, l): + with tf.compat.v1.name_scope('get_style_loss_for_layer'): + # Compute gram matrices using the activated filter maps of the art and generated images + x_layer_maps = getattr(x, l) + s_layer_maps = getattr(s, l) + x_layer_gram = convert_to_gram(x_layer_maps) + s_layer_gram = convert_to_gram(s_layer_maps) + + # Make sure the feature map dimensions are the same + assert_equal_shapes = tf.compat.v1.assert_equal(x_layer_maps.get_shape(), s_layer_maps.get_shape()) + with tf.control_dependencies([assert_equal_shapes]): + # Compute and return the normalized gram loss using the gram matrices + shape = x_layer_maps.get_shape().as_list() + size = reduce(lambda a, b: a * b, shape) ** 2 + gram_loss = get_l2_norm_loss(x_layer_gram - s_layer_gram) + return gram_loss / size + + +# Compute total variation regularization loss term given a variable image (x) and its shape +def get_total_variation(x, shape): + with tf.compat.v1.name_scope('get_total_variation'): + # Get the dimensions of the variable image + height = shape[1] + width = shape[2] + size = reduce(lambda a, b: a * b, shape) ** 2 + + # Disjoin the variable image and evaluate the total variation + x_cropped = x[:, :height - 1, :width - 1, :] + left_term = tf.square(x[:, 1:, :width - 1, :] - x_cropped) + right_term = tf.square(x[:, :height - 1, 1:, :] - x_cropped) + smoothed_terms = tf.pow(left_term + right_term, TOTAL_VARIATION_SMOOTHING / 2.) + return tf.reduce_sum(input_tensor=smoothed_terms) / size + + +# Parse arguments and assign them to their respective global variables +def parse_args(): + global INPUT_PATH, STYLE_PATH, OUT_PATH + + parser = argparse.ArgumentParser() + parser.add_argument("input", help="path to the input image you'd like to apply the style to") + parser.add_argument("style", help="path to the image you'd like to reference the style from") + parser.add_argument("--out", default=OUT_PATH, help="path to where the styled image will be created") + args = parser.parse_args() + + # Assign image paths from the arg parsing + INPUT_PATH = os.path.realpath(args.input) + STYLE_PATH = os.path.realpath(args.style) + OUT_PATH = os.path.realpath(args.out) + +with tf.compat.v1.Session() as sess: +# with tf.Session() as sess: + parse_args() + + # Initialize and process photo image to be used for our content + photo, image_shape = utilsV2.load_image(INPUT_PATH) + image_shape = [1] + image_shape + photo = photo.reshape(image_shape).astype(np.float32) + + # Initialize and process art image to be used for our style + art = utilsV2.load_image2(STYLE_PATH, height=image_shape[1], width=image_shape[2]) + art = art.reshape(image_shape).astype(np.float32) + + # Initialize the variable image that will become our final output as random noise + noise = tf.Variable(tf.random.truncated_normal(image_shape, mean=.5, stddev=.1)) + + # VGG Networks Init + with tf.compat.v1.name_scope('vgg_content'): + content_model = vgg19.Vgg19() + content_model.build(photo, image_shape[1:]) + + with tf.compat.v1.name_scope('vgg_style'): + style_model = vgg19.Vgg19() + style_model.build(art, image_shape[1:]) + + with tf.compat.v1.name_scope('vgg_x'): + x_model = vgg19.Vgg19() + x_model.build(noise, image_shape[1:]) + + # Loss functions + with tf.compat.v1.name_scope('loss'): + # Content + if CONTENT_WEIGHT is 0: + content_loss = tf.constant(0.) + else: + content_loss = get_content_loss(x_model, content_model) * CONTENT_WEIGHT + + # Style + if STYLE_WEIGHT is 0: + style_loss = tf.constant(0.) + else: + style_loss = get_style_loss(x_model, style_model) * STYLE_WEIGHT + + # Norm regularization + if NORM_WEIGHT is 0: + norm_loss = tf.constant(0.) + else: + norm_loss = (get_l2_norm_loss(noise) ** NORM_TERM) * NORM_WEIGHT + + # Total variation denoising + if TV_WEIGHT is 0: + tv_loss = tf.constant(0.) + else: + tv_loss = get_total_variation(noise, image_shape) * TV_WEIGHT + + # Total loss + total_loss = content_loss + style_loss + norm_loss + tv_loss + + # Update image + with tf.compat.v1.name_scope('update_image'): + optimizer = tf.compat.v1.train.AdamOptimizer(LEARNING_RATE) + grads = optimizer.compute_gradients(total_loss, [noise]) + clipped_grads = [(tf.clip_by_value(grad, -1., 1.), var) for grad, var in grads] + update_image = optimizer.apply_gradients(clipped_grads) + + # Train + logging.info("Initializing variables and beginning training..") + sess.run(tf.compat.v1.global_variables_initializer()) + start_time = time.time() + for i in range(EPOCHS): + _, loss = sess.run([update_image, total_loss]) + if PRINT_TRAINING_STATUS and i % PRINT_N == 0: + logging.info("Epoch %04d | Loss %.03f" % (i, loss)) + + # FIN + elapsed = time.time() - start_time + logging.info("Training complete. The session took %.2f seconds to complete." % elapsed) + logging.info("Rendering final image and closing TensorFlow session..") + + # Render the image after making sure the repo's dedicated output dir exists + out_dir = os.path.dirname(os.path.realpath(__file__)) + '/../output/' + if not os.path.isdir(out_dir): + os.makedirs(out_dir) + utilsV2.render_img(sess, noise, save=True, out_path=OUT_PATH) diff --git a/src/utils.py b/src/utils.py index a14789b..ce23875 100644 --- a/src/utils.py +++ b/src/utils.py @@ -3,7 +3,11 @@ import skimage import skimage.io import skimage.transform -from scipy.misc import toimage +import PIL +import scipy +# from scipy.misc import toimage +from PIL import Image + # Return a numpy array of an image specified by its path @@ -48,6 +52,8 @@ def render_img(session, x, save=False, out_path=None): img = np.clip(session.run(x), 0, 1) if save: - toimage(np.reshape(img, shape[1:])).save(out_path) + Image.fromarray(np.reshape(img, shape[1:])).save(out_path) + # toimage(np.reshape(img, shape[1:])).save(out_path) else: - toimage(np.reshape(img, shape[1:])).show() \ No newline at end of file + Image.fromarray(np.reshape(img, shape[1:])).show() + diff --git a/src/utilsV2.py b/src/utilsV2.py new file mode 100644 index 0000000..ce23875 --- /dev/null +++ b/src/utilsV2.py @@ -0,0 +1,59 @@ +import numpy as np +import os +import skimage +import skimage.io +import skimage.transform +import PIL +import scipy +# from scipy.misc import toimage +from PIL import Image + + + +# Return a numpy array of an image specified by its path +def load_image(path): + # Load image [height, width, depth] + img = skimage.io.imread(path) / 255.0 + assert (0 <= img).all() and (img <= 1.0).all() + + # Crop image from center + short_edge = min(img.shape[:2]) + yy = int((img.shape[0] - short_edge) / 2) + xx = int((img.shape[1] - short_edge) / 2) + shape = list(img.shape) + + crop_img = img[yy: yy + short_edge, xx: xx + short_edge] + resized_img = skimage.transform.resize(crop_img, (shape[0], shape[1])) + return resized_img, shape + + +# Return a resized numpy array of an image specified by its path +def load_image2(path, height=None, width=None): + # Load image + img = skimage.io.imread(path) / 255.0 + if height is not None and width is not None: + ny = height + nx = width + elif height is not None: + ny = height + nx = img.shape[1] * ny / img.shape[0] + elif width is not None: + nx = width + ny = img.shape[0] * nx / img.shape[1] + else: + ny = img.shape[0] + nx = img.shape[1] + return skimage.transform.resize(img, (ny, nx)) + + +# Render the generated image given a tensorflow session and a variable image (x) +def render_img(session, x, save=False, out_path=None): + shape = x.get_shape().as_list() + img = np.clip(session.run(x), 0, 1) + + if save: + Image.fromarray(np.reshape(img, shape[1:])).save(out_path) + # toimage(np.reshape(img, shape[1:])).save(out_path) + else: + Image.fromarray(np.reshape(img, shape[1:])).show() + From 227ff746b8dd27dd892bf2c790145940f27751a4 Mon Sep 17 00:00:00 2001 From: joaobrasil65 Date: Wed, 22 Sep 2021 14:35:05 -0400 Subject: [PATCH 2/3] Added scikit --- src/{style_transferV2 => style_transferV2.py} | 0 src/utilsV2.py | 1 + 2 files changed, 1 insertion(+) rename src/{style_transferV2 => style_transferV2.py} (100%) diff --git a/src/style_transferV2 b/src/style_transferV2.py similarity index 100% rename from src/style_transferV2 rename to src/style_transferV2.py diff --git a/src/utilsV2.py b/src/utilsV2.py index ce23875..7ad8ddd 100644 --- a/src/utilsV2.py +++ b/src/utilsV2.py @@ -1,5 +1,6 @@ import numpy as np import os + import skimage import skimage.io import skimage.transform From 0ece2c61385a0df7cbc3912c1eedfb2fa6877f86 Mon Sep 17 00:00:00 2001 From: joaobrasil65 Date: Wed, 22 Sep 2021 18:58:35 -0400 Subject: [PATCH 3/3] working now - fixed issues and changed size of output in utilsV2 using PIL image --- lib/images/style/west-elm-brightcolors.jpg | Bin 0 -> 58961 bytes src/custom_vgg19V2.py | 2 +- src/utilsV2.py | 5 ++--- 3 files changed, 3 insertions(+), 4 deletions(-) create mode 100644 lib/images/style/west-elm-brightcolors.jpg diff --git a/lib/images/style/west-elm-brightcolors.jpg b/lib/images/style/west-elm-brightcolors.jpg new file mode 100644 index 0000000000000000000000000000000000000000..086f40c4a4e231c0725a8b1e4d7f40f22ad879d4 GIT binary patch literal 58961 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