THEODOROS commited on
Commit
3a2a07e
·
1 Parent(s): 97bfe1e

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +9 -35
app.py CHANGED
@@ -4,11 +4,9 @@ import numpy as np
4
  import os
5
  import random
6
  import re
7
- import textwrap
8
  import torch
9
  from shapely.geometry.polygon import Polygon
10
  from shapely.affinity import scale
11
- import aggdraw
12
  from PIL import Image, ImageDraw, ImageOps, ImageFilter, ImageFont, ImageColor
13
 
14
  import gradio as gr
@@ -51,87 +49,62 @@ architext_colors = [[0, 0, 0], [249, 222, 182], [195, 209, 217], [250, 120, 128]
51
  regex = re.compile(".*?\((.*?)\)")
52
 
53
  def draw_polygons(polygons, colors, im_size=(512, 512), b_color="white", fpath=None):
54
-
55
  image = Image.new("RGBA", im_size, color="white")
56
- #draw = aggdraw.Draw(image)
57
  draw = ImageDraw.Draw(image)
58
-
59
  for poly, color, in zip(polygons, colors):
60
  #get initial polygon coordinates
61
  xy = poly.exterior.xy
62
  coords = np.dstack((xy[1], xy[0])).flatten()
63
  # draw it on canvas, with the appropriate colors
64
- #brush = aggdraw.Brush((0, 0, 0), opacity=255)
65
- #draw.polygon(coords, brush)
66
  draw.polygon(list(coords), fill=(0, 0, 0))
67
-
68
  #get inner polygon coordinates
69
  small_poly = poly.buffer(-1, resolution=32, cap_style=2, join_style=2, mitre_limit=5.0)
70
  if small_poly.geom_type == 'MultiPolygon':
71
  mycoordslist = [list(x.exterior.coords) for x in small_poly]
72
  for coord in mycoordslist:
73
  coords = np.dstack((np.array(coord)[:,1], np.array(coord)[:, 0])).flatten()
74
- #brush2 = aggdraw.Brush((0, 0, 0), opacity=255)
75
- #draw.polygon(coords, brush2)
76
  draw.polygon(list(coords), fill=tuple(color))
77
  elif poly.geom_type == 'Polygon':
78
  #get inner polygon coordinates
79
  xy2 = small_poly.exterior.xy
80
  coords2 = np.dstack((xy2[1], xy2[0])).flatten()
81
  # draw it on canvas, with the appropriate colors
82
- #brush2 = aggdraw.Brush((color[0], color[1], color[2]), opacity=255)
83
- #draw.polygon(coords2, brush2)
84
  draw.polygon(list(coords2), fill=tuple(color))
85
-
86
- #image = Image.frombytes("RGBA", im_size, draw.tobytes()).transpose(Image.FLIP_TOP_BOTTOM)
87
  image = image.transpose(Image.FLIP_TOP_BOTTOM)
88
-
89
  if(fpath):
90
  image.save(fpath, quality=100, subsampling=0)
91
-
92
  return draw, image
93
 
94
  def prompt_to_layout(user_prompt, intensity, fpath=None):
95
-
96
  if(containsNumber(user_prompt) == True):
97
  spaced_prompt = user_prompt.split(' ')
98
  new_prompt = ' '.join([word if word.isdigit() == False else num2words(int(word)).lower() for word in spaced_prompt])
99
  model_prompt = '[User prompt] {} [Layout]'.format(new_prompt)
100
-
101
  top_p, top_k = creativity(intensity)
102
  model_prompt = '[User prompt] {} [Layout]'.format(user_prompt)
103
  input_ids = tokenizer(model_prompt, return_tensors='pt').to(device)
104
  output = finetuned.generate(**input_ids, do_sample=True, top_p=top_p, top_k=top_k,
105
  eos_token_id=50256, max_length=400)
106
  output = tokenizer.batch_decode(output, skip_special_tokens=True)
107
-
108
  layout = output[0].split('[User prompt]')[1].split('[Layout] ')[1].split(', ')
109
  spaces = [txt.split(':')[0] for txt in layout]
110
-
111
- coordinates = [txt.split(':')[1] for txt in layout]
112
- coordinates = [re.findall(regex, coord) for coord in coordinates]
113
-
114
  polygons = []
115
  for coord in coordinates:
116
- polygons.append([point.split(',') for point in coord])
117
-
118
  geom = []
119
  for poly in polygons:
120
  scaled_poly = scale(Polygon(np.array(poly, dtype=int)), xfact=2, yfact=2, origin=(0,0))
121
- geom.append(scaled_poly)
122
- #geom.append(Polygon(np.array(poly, dtype=int)))
123
-
124
  colors = [architext_colors[housegan_labels[space]] for space in spaces]
125
-
126
  _, im = draw_polygons(geom, colors, fpath=fpath)
127
-
128
  html = '<img class="labels" src="images/labels.png" />'
129
-
130
  legend = Image.open("labels.png")
131
  imgs_comb = np.vstack([im, legend])
132
  imgs_comb = Image.fromarray(imgs_comb)
133
-
134
- return imgs_comb, layout
135
 
136
 
137
  # Gradio App
@@ -257,13 +230,14 @@ creative_slider = gr.inputs.Radio(["Low", "Medium", "High"], default="Low", labe
257
  textbox = gr.inputs.Textbox(placeholder='An apartment with two bedrooms and one bathroom', lines="3",
258
  label="DESCRIBE YOUR IDEAL APARTMENT")
259
  generated = gr.outputs.Image(label='Generated Layout')
 
260
 
261
  iface = gr.Interface(fn=prompt_to_layout, inputs=[textbox, creative_slider],
262
  outputs=[generated, layout],
263
- css=custom_css,
264
  theme="default",
265
  allow_flagging='never',
266
  allow_screenshot=False,
267
- thumbnail="thumbnail_gradio.PNG")
268
 
269
  iface.launch(enable_queue=True)
 
4
  import os
5
  import random
6
  import re
 
7
  import torch
8
  from shapely.geometry.polygon import Polygon
9
  from shapely.affinity import scale
 
10
  from PIL import Image, ImageDraw, ImageOps, ImageFilter, ImageFont, ImageColor
11
 
12
  import gradio as gr
 
49
  regex = re.compile(".*?\((.*?)\)")
50
 
51
  def draw_polygons(polygons, colors, im_size=(512, 512), b_color="white", fpath=None):
 
52
  image = Image.new("RGBA", im_size, color="white")
 
53
  draw = ImageDraw.Draw(image)
 
54
  for poly, color, in zip(polygons, colors):
55
  #get initial polygon coordinates
56
  xy = poly.exterior.xy
57
  coords = np.dstack((xy[1], xy[0])).flatten()
58
  # draw it on canvas, with the appropriate colors
 
 
59
  draw.polygon(list(coords), fill=(0, 0, 0))
 
60
  #get inner polygon coordinates
61
  small_poly = poly.buffer(-1, resolution=32, cap_style=2, join_style=2, mitre_limit=5.0)
62
  if small_poly.geom_type == 'MultiPolygon':
63
  mycoordslist = [list(x.exterior.coords) for x in small_poly]
64
  for coord in mycoordslist:
65
  coords = np.dstack((np.array(coord)[:,1], np.array(coord)[:, 0])).flatten()
 
 
66
  draw.polygon(list(coords), fill=tuple(color))
67
  elif poly.geom_type == 'Polygon':
68
  #get inner polygon coordinates
69
  xy2 = small_poly.exterior.xy
70
  coords2 = np.dstack((xy2[1], xy2[0])).flatten()
71
  # draw it on canvas, with the appropriate colors
 
 
72
  draw.polygon(list(coords2), fill=tuple(color))
 
 
73
  image = image.transpose(Image.FLIP_TOP_BOTTOM)
 
74
  if(fpath):
75
  image.save(fpath, quality=100, subsampling=0)
 
76
  return draw, image
77
 
78
  def prompt_to_layout(user_prompt, intensity, fpath=None):
 
79
  if(containsNumber(user_prompt) == True):
80
  spaced_prompt = user_prompt.split(' ')
81
  new_prompt = ' '.join([word if word.isdigit() == False else num2words(int(word)).lower() for word in spaced_prompt])
82
  model_prompt = '[User prompt] {} [Layout]'.format(new_prompt)
 
83
  top_p, top_k = creativity(intensity)
84
  model_prompt = '[User prompt] {} [Layout]'.format(user_prompt)
85
  input_ids = tokenizer(model_prompt, return_tensors='pt').to(device)
86
  output = finetuned.generate(**input_ids, do_sample=True, top_p=top_p, top_k=top_k,
87
  eos_token_id=50256, max_length=400)
88
  output = tokenizer.batch_decode(output, skip_special_tokens=True)
 
89
  layout = output[0].split('[User prompt]')[1].split('[Layout] ')[1].split(', ')
90
  spaces = [txt.split(':')[0] for txt in layout]
91
+ coords = [txt.split(':')[1] for txt in layout]
92
+ coordinates = [re.findall(regex, coord) for coord in coords]
93
+ layout_dict = dict(zip(spaces, coords))
 
94
  polygons = []
95
  for coord in coordinates:
96
+ polygons.append([point.split(',') for point in coord])
 
97
  geom = []
98
  for poly in polygons:
99
  scaled_poly = scale(Polygon(np.array(poly, dtype=int)), xfact=2, yfact=2, origin=(0,0))
100
+ geom.append(scaled_poly)
 
 
101
  colors = [architext_colors[housegan_labels[space]] for space in spaces]
 
102
  _, im = draw_polygons(geom, colors, fpath=fpath)
 
103
  html = '<img class="labels" src="images/labels.png" />'
 
104
  legend = Image.open("labels.png")
105
  imgs_comb = np.vstack([im, legend])
106
  imgs_comb = Image.fromarray(imgs_comb)
107
+ return imgs_comb, layout_dict
 
108
 
109
 
110
  # Gradio App
 
230
  textbox = gr.inputs.Textbox(placeholder='An apartment with two bedrooms and one bathroom', lines="3",
231
  label="DESCRIBE YOUR IDEAL APARTMENT")
232
  generated = gr.outputs.Image(label='Generated Layout')
233
+ layout = gr.outputs.Text(label='Layout Coordinates')
234
 
235
  iface = gr.Interface(fn=prompt_to_layout, inputs=[textbox, creative_slider],
236
  outputs=[generated, layout],
237
+ #css=custom_css,
238
  theme="default",
239
  allow_flagging='never',
240
  allow_screenshot=False,
241
+ #thumbnail="thumbnail_gradio.PNG")
242
 
243
  iface.launch(enable_queue=True)