Spaces:
Build error
Build error
File size: 5,287 Bytes
aff9132 3dacec1 e4fb230 3dacec1 d1be09c 3dacec1 a37eb28 e4fb230 5000f96 e4fb230 5000f96 e4fb230 3dacec1 d1be09c 3dacec1 e4fb230 2578b1e 3dacec1 f6357b6 3dacec1 f2e8e46 f6357b6 baaaa83 56f61e4 d1be09c f2e8e46 3dacec1 f496440 5e8f5b8 f496440 79c6687 a402a5e 79c6687 a402a5e c63f571 5e8f5b8 3dacec1 8d43198 3dacec1 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 |
from cv2 import transpose
import numpy as np
import gradio as gr
from segmentation import get_mask,replace_sofa
from styleTransfer import create_styledSofa
from PIL import Image
from random import randint
#https://colab.research.google.com/drive/11CtQpSeRBGAuw4TtE_rL470tRo-1X-p2#scrollTo=edGukUHXyymr
#https://colab.research.google.com/drive/1xq33YKf0LVKCkbbUZIoNPzgpR_4Kd0qL#scrollTo=sPuM8Xypjs-c
#https://github.com/dhawan98/Post-Processing-of-Image-Segmentation-using-CRF
def resize_sofa(img):
"""
This function adds padding to make the orignal image square and 640by640.
It also returns the orignal ratio of the image, such that it can be reverted later.
Parameters:
img = original image
Return:
im1 = squared image
box = parameters to later crop the image to it original ratio
"""
width, height = img.size
idx = np.argmin([width,height])
newsize = (640, 640) # parameters from test script
if idx==0:
img1 = Image.new(img.mode, (height, height), (255, 255, 255))
img1.paste(img, ((height-width)//2, 0))
box = ( newsize[0]*(1-width/height)//2,
0,
newsize[0]-newsize[0]*(1-width/height)//2,
newsize[1])
else:
img1 = Image.new(img.mode, (width, width), (255, 255, 255))
img1.paste(img, (0, (width-height)//2))
box = (0,
newsize[1]*(1-height/width)//2,
newsize[0],
newsize[1]-newsize[1]*(1-height/width)//2)
im1 = img1.resize(newsize)
return im1,box
def resize_style(img):
"""
This function generates a zoomed out version of the style image and resizes it to a 640by640 square.
Parameters:
img = image containing the style/pattern
Return:
dst = a zoomed-out and resized version of the pattern
"""
width, height = img.size
idx = np.argmin([width,height])
# Makes the image square by cropping
if idx==0:
top= (height-width)//2
bottom= height-(height-width)//2
left = 0
right= width
else:
left = (width-height)//2
right = width - (width-height)//2
top = 0
bottom = height
newsize = (640, 640) # parameters from test script
im1 = img.crop((left, top, right, bottom))
# Constructs a zoomed-out version
copies = 8
resize = (newsize[0]//copies,newsize[1]//copies)
dst = Image.new('RGB', (resize[0]*copies,resize[1]*copies))
im2 = im1.resize((resize))
for row in range(copies):
im2 = im2.transpose(Image.FLIP_LEFT_RIGHT)
for column in range(copies):
im2 = im2.transpose(Image.FLIP_TOP_BOTTOM)
dst.paste(im2, (resize[0]*row, resize[1]*column))
dst = dst.resize((newsize))
return dst
def style_sofa(input_img: np.ndarray, style_img: np.ndarray):
"""
Styles (all) the sofas in the image to the given style.
This function uses a transformer to combine the image with the desired style according
to a generated mask of the sofas in the image.
Input:
input_img = image containing a sofa
style_img = image containing a style
Return:
new_sofa = image containing the styled sofa
"""
id = randint(0, 10)
print('Starting job ', id)
# preprocess input images to be (640,640) squares to fit requirements of the segmentation model
input_img,style_img = Image.fromarray(input_img),Image.fromarray(style_img)
resized_img,box = resize_sofa(input_img)
resized_style = resize_style(style_img)
#resized_style.save('resized_style.jpg')
# generate mask for image
print('generating mask...')
mask = get_mask(resized_img)
#mask.save('mask.jpg')
# Created a styled sofa
# print('Styling sofa...')
# styled_sofa = create_styledSofa(resized_img,resized_style)
# #styled_sofa.save('styled_sofa.jpg')
# # postprocess the final image
# print('Replacing sofa...')
# new_sofa = replace_sofa(resized_img,mask,styled_sofa)
# new_sofa = new_sofa.crop(box)
print('Finishing job', id)
return mask
demo = gr.Interface(
style_sofa,
inputs = [gr.inputs.Image(),gr.inputs.Image()],
outputs = 'image',
examples= [['sofa_example1.jpg','style_example1.jpg'],
['sofa_example1.jpg','style_example2.jpg'],
['sofa_example1.jpg','style_example3.jpg'],
['sofa_example1.jpg','style_example4.jpg'],
['sofa_example1.jpg','style_example5.jpg']],
title="π Style your sofa π ",
description="Customize your sofa to your wildest dreams π!\
\nProvide a picture of your sofa and a desired pattern\
or choose one of the examples below. β¬",
theme="huggingface",
# article="**References**\n\n"
# "<a href='https://www.tensorflow.org/hub/tutorials/tf2_arbitrary_image_stylization' target='_blank'>1. Tutorial to implement Fast Neural Style Transfer using the pretrained model from TensorFlow Hub</a> \n"
# "<a href='https://huggingface.co/spaces/luca-martial/neural-style-transfer' target='_blank'>2. The idea to build a neural style transfer application was inspired from this Hugging Face Space </a>"
)
if __name__ == "__main__":
demo.launch()
|