BertChristiaens commited on
Commit
41e92f0
1 Parent(s): 3790166
Files changed (1) hide show
  1. models.py +69 -119
models.py CHANGED
@@ -29,7 +29,6 @@ def flush():
29
 
30
  class ControlNetPipeline:
31
  def __init__(self):
32
- print(torch.__version__)
33
  self.in_use = False
34
  self.controlnet = ControlNetModel.from_pretrained(
35
  "BertChristiaens/controlnet-seg-room", torch_dtype=torch.float16)
@@ -43,7 +42,6 @@ class ControlNetPipeline:
43
 
44
  self.pipe.scheduler = UniPCMultistepScheduler.from_config(self.pipe.scheduler.config)
45
  self.pipe.enable_xformers_memory_efficient_attention()
46
- # self.pipe.enable_attention_slicing("max")
47
  self.pipe = self.pipe.to("cuda")
48
 
49
  self.waiting_queue = []
@@ -72,21 +70,44 @@ class ControlNetPipeline:
72
  self.waiting_queue.pop(0)
73
  flush()
74
  return results
 
 
 
 
 
 
 
 
75
 
 
 
 
 
 
 
 
 
 
 
 
 
 
76
 
77
- @contextmanager
78
- def catchtime(message: str) -> float:
79
- """Context manager to measure time
80
- Args:
81
- message (str): message to log
82
- Returns:
83
- float: time in seconds
84
- Yields:
85
- Iterator[float]: time in seconds
86
- """
87
- start = perf_counter()
88
- yield lambda: perf_counter() - start
89
- LOGGING.info('%s: %.3f seconds', message, perf_counter() - start)
 
 
90
 
91
 
92
  def convolution(mask: Image.Image, size=9) -> Image:
@@ -154,53 +175,10 @@ def get_inpainting_pipeline() -> StableDiffusionInpaintPipeline:
154
  Returns:
155
  StableDiffusionInpaintPipeline: inpainting pipeline
156
  """
157
- pipe = StableDiffusionInpaintPipeline.from_pretrained(
158
- "stabilityai/stable-diffusion-2-inpainting",
159
- torch_dtype=torch.float16,
160
- safety_checker=None,
161
- )
162
-
163
- pipe.enable_xformers_memory_efficient_attention()
164
- pipe = pipe.to("cuda")
165
-
166
  return pipe
167
 
168
 
169
- def make_grid_parameters(grid_search: Dict, params: Dict) -> List[Dict]:
170
- """Method to make grid parameters
171
- Args:
172
- grid_search (Dict): grid search parameters
173
- params (Dict): fixed parameters
174
- Returns:
175
- List[Dict]: grid parameters
176
- """
177
- options = []
178
-
179
- for k in range(len(grid_search['generator'])):
180
- for i in range(len(grid_search['strength'])):
181
- for j in range(len(grid_search['guidance_scale'])):
182
- options.append({'strength': grid_search['strength'][i],
183
- 'guidance_scale': grid_search['guidance_scale'][j],
184
- 'generator': grid_search['generator'][k],
185
- **params
186
- })
187
- return options
188
-
189
-
190
- def make_captions(options: List[Dict]) -> List[str]:
191
- """Method to make captions
192
- Args:
193
- options (List[Dict]): grid parameters
194
- Returns:
195
- List[str]: captions
196
- """
197
- captions = []
198
- for option in options:
199
- captions.append(
200
- f"strength {option['strength']}, guidance {option['guidance_scale']}, steps {option['num_inference_steps']}")
201
- return captions
202
-
203
-
204
  @torch.inference_mode()
205
  def make_image_controlnet(image: np.ndarray,
206
  mask_image: np.ndarray,
@@ -219,49 +197,30 @@ def make_image_controlnet(image: np.ndarray,
219
  List[Image.Image]: list of generated images
220
  """
221
 
222
- with catchtime("get controlnet"):
223
- pipe = get_controlnet()
224
-
225
- torch.cuda.empty_cache()
226
- images = []
227
-
228
- common_parameters = {'prompt': positive_prompt,
229
- 'negative_prompt': negative_prompt,
230
- 'num_inference_steps': 30,
231
- 'controlnet_conditioning_scale': 1.1,
232
- 'controlnet_conditioning_scale_decay': 0.96,
233
- 'controlnet_steps': 28,
234
- }
235
-
236
- grid_search = {'strength': [1.00, ],
237
- 'guidance_scale': [7.0],
238
- 'generator': [[torch.Generator(device="cuda").manual_seed(seed+i)] for i in range(1)],
239
- }
240
-
241
- prompt_settings = make_grid_parameters(grid_search, common_parameters)
242
-
243
 
244
- mask_image = Image.fromarray((mask_image * 255).astype(np.uint8)).convert("RGB")
245
  image = Image.fromarray(image).convert("RGB")
246
  controlnet_conditioning_image = Image.fromarray(controlnet_conditioning_image).convert("RGB").filter(ImageFilter.GaussianBlur(radius = 9))
247
-
248
  mask_image_postproc = convolution(mask_image)
249
 
250
- with catchtime("Controlnet generation total"):
251
- for _, setting in enumerate(prompt_settings):
252
- st.success(f"{pipe.queue_size} images in the queue, can take up to {(pipe.queue_size)+1 * 20} seconds")
253
- with catchtime("Controlnet generation"):
254
- generated_image = pipe(
255
- **setting,
256
- image=image,
257
- mask_image=mask_image,
258
- controlnet_conditioning_image=controlnet_conditioning_image,
259
- ).images[0]
260
- generated_image = postprocess_image_masking(
261
- generated_image, image, mask_image_postproc)
262
- images.append(generated_image)
263
 
264
- return images
 
 
 
 
 
 
 
 
 
 
 
 
 
 
265
 
266
 
267
  @torch.inference_mode()
@@ -278,27 +237,19 @@ def make_inpainting(positive_prompt: str,
278
  Returns:
279
  List[Image.Image]: list of generated images
280
  """
 
281
 
282
- with catchtime("Get inpainting pipeline"):
283
- pipe = get_inpainting_pipeline()
284
-
285
- common_parameters = {'prompt': positive_prompt,
286
- 'negative_prompt': negative_prompt,
287
- 'num_inference_steps': 20,
288
- }
289
-
290
- torch.cuda.empty_cache()
291
- images = []
292
- for _ in range(1):
293
- with catchtime("Inpainting generation"):
294
- image_ = pipe(image=image,
295
- mask_image=Image.fromarray((mask_image * 255).astype(np.uint8)),
296
- height=HEIGHT,
297
- width=WIDTH,
298
- **common_parameters
299
- ).images[0]
300
- images.append(image_)
301
- return images
302
 
303
 
304
  @torch.inference_mode()
@@ -316,9 +267,8 @@ def segment_image(image: Image) -> Image:
316
  outputs = image_segmentor(pixel_values)
317
 
318
  seg = image_processor.post_process_semantic_segmentation(
319
- outputs, target_sizes=[image.size[::-1]])
320
- seg = seg[0]
321
- color_seg = np.zeros((seg.shape[0], seg.shape[1], 3), dtype=np.uint8) # height, width, 3
322
  palette = np.array(ade_palette())
323
  for label, color in enumerate(palette):
324
  color_seg[seg == label, :] = color
 
29
 
30
  class ControlNetPipeline:
31
  def __init__(self):
 
32
  self.in_use = False
33
  self.controlnet = ControlNetModel.from_pretrained(
34
  "BertChristiaens/controlnet-seg-room", torch_dtype=torch.float16)
 
42
 
43
  self.pipe.scheduler = UniPCMultistepScheduler.from_config(self.pipe.scheduler.config)
44
  self.pipe.enable_xformers_memory_efficient_attention()
 
45
  self.pipe = self.pipe.to("cuda")
46
 
47
  self.waiting_queue = []
 
70
  self.waiting_queue.pop(0)
71
  flush()
72
  return results
73
+
74
+ class SDPipeline:
75
+ def __init__(self):
76
+ self.pipe = StableDiffusionInpaintPipeline.from_pretrained(
77
+ "stabilityai/stable-diffusion-2-inpainting",
78
+ torch_dtype=torch.float16,
79
+ safety_checker=None,
80
+ )
81
 
82
+ self.pipe.enable_xformers_memory_efficient_attention()
83
+ self.pipe = self.pipe.to("cuda")
84
+
85
+ self.waiting_queue = []
86
+ self.count = 0
87
+
88
+ @property
89
+ def queue_size(self):
90
+ return len(self.waiting_queue)
91
+
92
+ def __call__(self, **kwargs):
93
+ self.count += 1
94
+ number = self.count
95
 
96
+ self.waiting_queue.append(number)
97
+
98
+ # wait until the next number in the queue is the current number
99
+ while self.waiting_queue[0] != number:
100
+ print(f"Wait for your turn {number} in queue {self.waiting_queue}")
101
+ time.sleep(0.5)
102
+ pass
103
+
104
+ # it's your turn, so remove the number from the queue
105
+ # and call the function
106
+ print("It's the turn of", self.count)
107
+ results = self.pipe(**kwargs)
108
+ self.waiting_queue.pop(0)
109
+ flush()
110
+ return results
111
 
112
 
113
  def convolution(mask: Image.Image, size=9) -> Image:
 
175
  Returns:
176
  StableDiffusionInpaintPipeline: inpainting pipeline
177
  """
178
+ pipe = SDPipeline()
 
 
 
 
 
 
 
 
179
  return pipe
180
 
181
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
182
  @torch.inference_mode()
183
  def make_image_controlnet(image: np.ndarray,
184
  mask_image: np.ndarray,
 
197
  List[Image.Image]: list of generated images
198
  """
199
 
200
+ pipe = get_controlnet()
201
+ flush()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
202
 
 
203
  image = Image.fromarray(image).convert("RGB")
204
  controlnet_conditioning_image = Image.fromarray(controlnet_conditioning_image).convert("RGB").filter(ImageFilter.GaussianBlur(radius = 9))
205
+ mask_image = Image.fromarray((mask_image * 255).astype(np.uint8)).convert("RGB")
206
  mask_image_postproc = convolution(mask_image)
207
 
 
 
 
 
 
 
 
 
 
 
 
 
 
208
 
209
+ st.success(f"{pipe.queue_size} images in the queue, can take up to {(pipe.queue_size)+1 * 10} seconds")
210
+ generated_image = pipe(
211
+ prompt=positive_prompt,
212
+ negative_prompt=negative_prompt,
213
+ num_inference_steps=20,
214
+ strength=[1.00, ],
215
+ guidance_scale=[7.0],
216
+ generator=[torch.Generator(device="cuda").manual_seed(seed)],
217
+ image=image,
218
+ mask_image=mask_image,
219
+ controlnet_conditioning_image=controlnet_conditioning_image,
220
+ ).images[0]
221
+ generated_image = postprocess_image_masking(generated_image, image, mask_image_postproc)
222
+
223
+ return generated_image
224
 
225
 
226
  @torch.inference_mode()
 
237
  Returns:
238
  List[Image.Image]: list of generated images
239
  """
240
+ pipe = get_inpainting_pipeline()
241
 
242
+ flush()
243
+ image_ = pipe(image=image,
244
+ mask_image=Image.fromarray((mask_image * 255).astype(np.uint8)),
245
+ prompt=positive_prompt,
246
+ negative_prompt=negative_prompt,
247
+ num_inference_steps=20,
248
+ height=HEIGHT,
249
+ width=WIDTH,
250
+ **common_parameters
251
+ ).images[0]
252
+ return image_
 
 
 
 
 
 
 
 
 
253
 
254
 
255
  @torch.inference_mode()
 
267
  outputs = image_segmentor(pixel_values)
268
 
269
  seg = image_processor.post_process_semantic_segmentation(
270
+ outputs, target_sizes=[image.size[::-1]])[0]
271
+ color_seg = np.zeros((seg.shape[0], seg.shape[1], 3), dtype=np.uint8)
 
272
  palette = np.array(ade_palette())
273
  for label, color in enumerate(palette):
274
  color_seg[seg == label, :] = color