aidevices's picture
Sync third-solution for HF Jobs Docker image
fba52a7 verified
Raw
History Blame Contribute Delete
6.05 kB
import numpy as np
from src.preprocessing import get_color_scheme, get_dict_hash
def filter_list_of_dicts(list1, list2):
"""Returns the intersection of two lists of dicts"""
set_of_hashes = {get_dict_hash(item1) for item1 in list1}
final_list = []
for item2 in list2:
if get_dict_hash(item2) in set_of_hashes:
final_list.append(item2)
return final_list
def swap_two_colors(image):
"""sawaps two colors"""
unique = np.unique(image)
if len(unique) != 2:
return 1, None
result = image.copy()
result[image == unique[0]] = unique[1]
result[image == unique[1]] = unique[0]
return 0, result
def combine_two_lists(list1, list2):
result = list1.copy()
for item2 in list2:
exist = False
for item1 in list1:
if (item2 == item1).all():
exist = True
break
if not exist:
result.append(item2)
return result
def intersect_two_lists(list1, list2):
""" intersects two lists of np.arrays"""
result = []
for item2 in list2:
for item1 in list1:
if (item2.shape == item1.shape) and (item2 == item1).all():
result.append(item2)
break
return result
def check_surface_block(image, i, j, block):
color = 11
b = (image.shape[0] - i) // block.shape[0] + int(((image.shape[0] - i) % block.shape[0]) > 0)
r = (image.shape[1] - j) // block.shape[1] + int(((image.shape[1] - j) % block.shape[1]) > 0)
t = (i) // block.shape[0] + int((i) % block.shape[0] > 0)
l = (j) // block.shape[1] + int((j) % block.shape[1] > 0)
full_image = np.ones(((b + t) * block.shape[0], (r + l) * block.shape[1])) * color
start_i = (block.shape[0] - i) % block.shape[0]
start_j = (block.shape[1] - j) % block.shape[1]
full_image[start_i : start_i + image.shape[0], start_j : start_j + image.shape[1]] = image
blocks = []
for k in range(b + t):
for n in range(r + l):
new_block = full_image[
k * block.shape[0] : (k + 1) * block.shape[0], n * block.shape[1] : (n + 1) * block.shape[1]
]
mask = np.logical_and(new_block != color, block != color)
if (new_block == block)[mask].all():
blocks.append(new_block)
else:
return 1, None
new_block = block.copy()
for curr_block in blocks:
mask = np.logical_and(new_block != color, curr_block != color)
if (new_block == curr_block)[mask].all():
new_block[new_block == color] = curr_block[new_block == color]
else:
return 2, None
if (new_block == color).any():
return 3, None
return 0, new_block
def find_mosaic_block(image, params):
""" predicts 1 output image given input image and prediction params"""
itteration_list1 = list(range(2, sum(image.shape) - 3))
if params["big_first"]:
itteration_list1 = itteration_list1[::-1]
for size in itteration_list1:
if params["direction"] == "all":
itteration_list = list(range(1, size))
elif params["direction"] == "vert":
itteration_list = [image.shape[0]]
else:
itteration_list = [size - image.shape[1]]
for i_size in itteration_list:
j_size = size - i_size
if j_size < 1 or i_size < 1:
continue
block = image[0 : 0 + i_size, 0 : 0 + j_size]
status, predict = check_surface_block(image, 0, 0, block)
if status != 0:
continue
return 0, predict
return 1, None
def reconstruct_mosaic_from_block(block, params, original_image=None):
if params["mosaic_size_type"] == "fixed":
temp_shape = [0, 0]
temp_shape[0] = params["mosaic_shape"][0] + params["mosaic_shape"][0] % block.shape[0]
temp_shape[1] = params["mosaic_shape"][1] + params["mosaic_shape"][1] % block.shape[1]
result = np.zeros(temp_shape)
for i in range(temp_shape[0] // block.shape[0]):
for j in range(temp_shape[1] // block.shape[1]):
result[
i * block.shape[0] : (i + 1) * block.shape[0], j * block.shape[1] : (j + 1) * block.shape[1]
] = block
result = result[: params["mosaic_shape"][0], : params["mosaic_shape"][1]]
elif params["mosaic_size_type"] == "size":
result = np.zeros((params["mosaic_size"][0] * block.shape[0], params["mosaic_size"][1] * block.shape[1]))
for i in range(params["mosaic_size"][0]):
for j in range(params["mosaic_size"][1]):
result[
i * block.shape[0] : (i + 1) * block.shape[0], j * block.shape[1] : (j + 1) * block.shape[1]
] = block
elif params["mosaic_size_type"] == "same":
params = params.copy()
params["mosaic_shape"] = original_image.shape
params["mosaic_size_type"] = "fixed"
result = reconstruct_mosaic_from_block(block, params, original_image=None)
elif params["mosaic_size_type"] == "same_rotated":
params = params.copy()
params["mosaic_shape"] = original_image.T.shape
params["mosaic_size_type"] = "fixed"
result = reconstruct_mosaic_from_block(block, params, original_image=None)
elif params["mosaic_size_type"] == "color_num":
params = params.copy()
color_num = len(np.unique(original_image))
params["mosaic_size"] = [color_num, color_num]
params["mosaic_size_type"] = "size"
result = reconstruct_mosaic_from_block(block, params, original_image=None)
elif params["mosaic_size_type"] == "block_shape_size":
params = params.copy()
color_num = len(np.unique(original_image))
params["mosaic_size"] = block.shape
params["mosaic_size_type"] = "size"
result = reconstruct_mosaic_from_block(block, params, original_image=None)
else:
return None
return result