ccm's picture
This one is much better
a99a8d0
raw
history blame
14.2 kB
import random
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.offsetbox import OffsetImage, AnnotationBbox
import tensorflow
import warnings
from tensorflow.python.framework.ops import disable_eager_execution
import pandas as pd
warnings.filterwarnings('ignore')
disable_eager_execution()
load_data = np.load('data/train_test_split_data.npz') # Data saved by the VAE
# Convert Data to Tuples and Assign to respective variables
box_matrix_train, box_density_train, additional_pixels_train, box_shape_train = tuple(load_data['box_matrix_train']), tuple(load_data['box_density_train']), tuple(load_data['additional_pixels_train']), tuple(load_data['box_shape_train'])
box_matrix_test, box_density_test, additional_pixels_test, box_shape_test = tuple(load_data['box_matrix_test']), tuple(load_data['box_density_test']), tuple(load_data['additional_pixels_test']), tuple(load_data['box_shape_test'])
testX = box_matrix_test # Shows the relationship to the MNIST Dataset vs the Shape Dataset
image_size = np.shape(testX)[-1] # Determines the size of the images
test_data = np.reshape(testX, (len(testX), image_size, image_size, 1))
# Creates tuples that contain all of the data generated
allX = np.append(box_matrix_train,box_matrix_test, axis=0)
all_box_density = np.append(box_density_train, box_density_test, axis=0)
all_additional_pixels = np.append(additional_pixels_train, additional_pixels_test,axis=0)
all_box_shape = np.append(box_shape_train, box_shape_test,axis=0)
all_data = np.reshape(allX, (len(allX), image_size, image_size, 1))
# train_latent_points = []
# train_data = np.reshape(box_matrix_train, (len(box_matrix_train), image_size, image_size, 1))
# for i in range(len(box_shape_train)):
# predicted_train = encoder_model_boxes.predict(np.array([train_data[i]]))
# train_latent_points.append(predicted_train[0])
# train_latent_points = np.array(train_latent_points)
shapes = ("basic_box", "diagonal_box_split", "horizontal_vertical_box_split", "back_slash_box", "forward_slash_box",
"back_slash_plus_box", "forward_slash_plus_box", "hot_dog_box", "hamburger_box", "x_hamburger_box",
"x_hot_dog_box", "x_plus_box")
import numpy as np
import matplotlib.pyplot as plt
import math
def basic_box_array(image_size):
A = np.zeros((int(image_size), int(image_size))) # Initializes A matrix with 0 values
# Creates the outside edges of the box
for i in range(image_size):
for j in range(image_size):
if i == 0 or j == 0 or i == image_size - 1 or j == image_size - 1:
A[i][j] = 1
return A
def back_slash_array(image_size):
A = np.zeros((int(image_size), int(image_size))) # Initializes A matrix with 0 values
for i in range(image_size):
for j in range(image_size):
if i == j:
A[i][j] = 1
return A
def forward_slash_array(image_size):
A = np.zeros((int(image_size), int(image_size))) # Initializes A matrix with 0 values
for i in range(image_size):
for j in range(image_size):
if i == (image_size-1)-j:
A[i][j] = 1
return A
def hot_dog_array(image_size):
# Places pixels down the vertical axis to split the box
A = np.zeros((int(image_size), int(image_size))) # Initializes A matrix with 0 values
for i in range(image_size):
for j in range(image_size):
if j == math.floor((image_size - 1) / 2) or j == math.ceil((image_size - 1) / 2):
A[i][j] = 1
return A
def hamburger_array(image_size):
# Places pixels across the horizontal axis to split the box
A = np.zeros((int(image_size), int(image_size))) # Initializes A matrix with 0 values
for i in range(image_size):
for j in range(image_size):
if i == math.floor((image_size - 1) / 2) or i == math.ceil((image_size - 1) / 2):
A[i][j] = 1
return A
def center_array(image_size):
A = np.zeros((int(image_size), int(image_size))) # Initializes A matrix with 0 values
for i in range(image_size):
for j in range(image_size):
if i == math.floor((image_size-1)/2) and j == math.ceil((image_size-1)/2):
A[i][j] = 1
if i == math.floor((image_size-1)/2) and j == math.floor((image_size-1)/2):
A[i][j] = 1
if j == math.ceil((image_size-1)/2) and i == math.ceil((image_size-1)/2):
A[i][j] = 1
if j == math.floor((image_size-1)/2) and i == math.ceil((image_size-1)/2):
A[i][j] = 1
return A
def update_array(array_original, array_new, image_size):
A = array_original
for i in range(image_size):
for j in range(image_size):
if array_new[i][j] == 1:
A[i][j] = 1
return A
def add_pixels(array_original, additional_pixels, image_size):
# Adds pixels to the thickness of each component of the box
A = array_original
A_updated = np.zeros((int(image_size), int(image_size))) # Initializes A matrix with 0 values
for dens in range(additional_pixels):
for i in range(1, image_size - 1):
for j in range(1, image_size - 1):
if A[i - 1][j] + A[i + 1][j] + A[i][j - 1] + A[i][j + 1] > 0:
A_updated[i][j] = 1
A = update_array(A, A_updated,image_size)
return A
import numpy as np
import matplotlib.pyplot as plt
import math
def basic_box(additional_pixels, density, image_size):
A = basic_box_array(image_size) # Creates the outside edges of the box
# Increase the thickness of each part of the box
A = add_pixels(A, additional_pixels, image_size)
return A*density
def horizontal_vertical_box_split(additional_pixels, density, image_size):
A = basic_box_array(image_size) # Creates the outside edges of the box
# Place pixels across the horizontal and vertical axes to split the box
A = update_array(A, hot_dog_array(image_size), image_size)
A = update_array(A, hamburger_array(image_size), image_size)
# Increase the thickness of each part of the box
A = add_pixels(A, additional_pixels, image_size)
return A*density
def diagonal_box_split(additional_pixels, density, image_size):
A = basic_box_array(image_size) # Creates the outside edges of the box
# Add pixels along the diagonals of the box
A = update_array(A, back_slash_array(image_size), image_size)
A = update_array(A, forward_slash_array(image_size), image_size)
# Adds pixels to the thickness of each component of the box
# Increase the thickness of each part of the box
A = add_pixels(A, additional_pixels, image_size)
return A*density
def back_slash_box(additional_pixels, density, image_size):
A = basic_box_array(image_size) # Initializes A matrix with 0 values
A = update_array(A, back_slash_array(image_size), image_size)
A = add_pixels(A, additional_pixels, image_size)
return A * density
def forward_slash_box(additional_pixels, density, image_size):
A = basic_box_array(image_size) # Initializes A matrix with 0 values
A = update_array(A, forward_slash_array(image_size), image_size)
A = add_pixels(A, additional_pixels, image_size)
return A * density
def hot_dog_box(additional_pixels, density, image_size):
A = basic_box_array(image_size) # Initializes A matrix with 0 values
A = update_array(A, hot_dog_array(image_size), image_size)
A = add_pixels(A, additional_pixels, image_size)
return A * density
def hamburger_box(additional_pixels, density, image_size):
A = basic_box_array(image_size) # Initializes A matrix with 0 values
A = update_array(A, hamburger_array(image_size), image_size)
A = add_pixels(A, additional_pixels, image_size)
return A * density
def x_plus_box(additional_pixels, density, image_size):
A = basic_box_array(image_size) # Initializes A matrix with 0 values
A = update_array(A, hot_dog_array(image_size), image_size)
A = update_array(A, hamburger_array(image_size), image_size)
A = update_array(A, forward_slash_array(image_size), image_size)
A = update_array(A, back_slash_array(image_size), image_size)
A = add_pixels(A, additional_pixels, image_size)
return A * density
def forward_slash_plus_box(additional_pixels, density, image_size):
A = basic_box_array(image_size) # Initializes A matrix with 0 values
A = update_array(A, hot_dog_array(image_size), image_size)
A = update_array(A, hamburger_array(image_size), image_size)
A = update_array(A, forward_slash_array(image_size), image_size)
# A = update_array(A, back_slash_array(image_size), image_size)
A = add_pixels(A, additional_pixels, image_size)
return A * density
def back_slash_plus_box(additional_pixels, density, image_size):
A = basic_box_array(image_size) # Initializes A matrix with 0 values
A = update_array(A, hot_dog_array(image_size), image_size)
A = update_array(A, hamburger_array(image_size), image_size)
# A = update_array(A, forward_slash_array(image_size), image_size)
A = update_array(A, back_slash_array(image_size), image_size)
A = add_pixels(A, additional_pixels, image_size)
return A * density
def x_hot_dog_box(additional_pixels, density, image_size):
A = basic_box_array(image_size) # Initializes A matrix with 0 values
A = update_array(A, hot_dog_array(image_size), image_size)
# A = update_array(A, hamburger_array(image_size), image_size)
A = update_array(A, forward_slash_array(image_size), image_size)
A = update_array(A, back_slash_array(image_size), image_size)
A = add_pixels(A, additional_pixels, image_size)
return A * density
def x_hamburger_box(additional_pixels, density, image_size):
A = basic_box_array(image_size) # Initializes A matrix with 0 values
# A = update_array(A, hot_dog_array(image_size), image_size)
A = update_array(A, hamburger_array(image_size), image_size)
A = update_array(A, forward_slash_array(image_size), image_size)
A = update_array(A, back_slash_array(image_size), image_size)
A = add_pixels(A, additional_pixels, image_size)
return A * density
def center_box(additional_pixels, density, image_size):
A = basic_box_array(image_size) # Initializes A matrix with 0 values
A = update_array(A, center_array(image_size), image_size)
A = add_pixels(A, additional_pixels, image_size)
return A * density
import tensorflow as tf
sess = tf.compat.v1.Session()
from keras import backend as K
K.set_session(sess)
# Gradio Interface
import gradio
import numpy
endpoint_types = shapes
density_options = ["{:.2f}".format(x) for x in numpy.linspace(0, 1, 11)]
thickness_options = [str(int(x)) for x in numpy.linspace(0, 10, 11)]
interpolation_options = [str(int(x)) for x in [3, 5, 10]]
def interpolate(t1, t2, d1, d2, th1, th2, steps):
decoder_model_boxes = tensorflow.keras.models.load_model('data/decoder_model_boxes', compile=False)
# # compile=False ignores a warning from tensorflow, can be removed to see warning
# # import the encoder model architecture
json_file_loaded = open('data/model.json', 'r')
loaded_model_json = json_file_loaded.read()
# load model using the saved json file
encoder_model_boxes = tensorflow.keras.models.model_from_json(loaded_model_json)
# load weights into newly loaded_model
encoder_model_boxes.load_weights('data/model_tf')
num_internal = int(steps)
number_1 = globals()[t1](int(th1), float(d1), 28)
number_2 = globals()[t2](int(th2), float(d2), 28)
# resize the array to match the prediction size requirement
number_1_expand = np.expand_dims(np.expand_dims(number_1, axis=2), axis=0)
number_2_expand = np.expand_dims(np.expand_dims(number_2, axis=2), axis=0)
# Determine the latent point that will represent our desired number
latent_point_1 = encoder_model_boxes.predict(number_1_expand)[0]
latent_point_2 = encoder_model_boxes.predict(number_2_expand)[0]
latent_dimensionality = len(latent_point_1) # define the dimensionality of the latent space
num_interp = num_internal + 2 # the number of images to be pictured
latent_matrix = [] # This will contain the latent points of the interpolation
for column in range(latent_dimensionality):
new_column = np.linspace(latent_point_1[column], latent_point_2[column], num_interp)
latent_matrix.append(new_column)
latent_matrix = np.array(latent_matrix).T # Transposes the matrix so that each row can be easily indexed
plot_rows = 2
plot_columns = num_interp + 2
predicted_interps = [number_1_expand[0, :, :, 0]]
for latent_point in range(2, num_interp + 2): # cycles the latent points through the decoder model to create images
generated_image = decoder_model_boxes.predict(np.array([latent_matrix[latent_point - 2]]))[0] # generates an interpolated image based on the latent point
predicted_interps.append(generated_image[:, :, -1])
predicted_interps.append(number_2_expand[0, :, :, 0])
transition_region = predicted_interps[0]
for i in range(len(predicted_interps)-1):
transition_region = numpy.hstack((transition_region, predicted_interps[i+1]))
return transition_region
with gradio.Blocks() as demo:
with gradio.Row():
with gradio.Column():
t1 = gradio.Dropdown(endpoint_types, label="Type 1", value="basic_box")
d1 = gradio.Dropdown(density_options, label="Density 1", value="0.10")
th1 = gradio.Dropdown(thickness_options, label="Thickness 1", value="5")
with gradio.Column():
t2 = gradio.Dropdown(endpoint_types, label="Type 2", value="basic_box")
d2 = gradio.Dropdown(density_options, label="Density 2", value="0.10")
th2 = gradio.Dropdown(thickness_options, label="Thickness 2", value="5")
steps = gradio.Dropdown(interpolation_options, label="Interpolation Length", value="5")
btn = gradio.Button("Run")
img = gradio.Image(label="Transition")
btn.click(fn=interpolate, inputs=[t1, t2, d1, d2, th1, th2, steps], outputs=[img])
demo.launch(debug=True)