Spaces:
Runtime error
Runtime error
Upload luciddreamer.py with huggingface_hub
Browse files- luciddreamer.py +23 -12
luciddreamer.py
CHANGED
|
@@ -75,7 +75,7 @@ class LucidDreamer:
|
|
| 75 |
self.lama = None
|
| 76 |
self.current_model = self.default_model
|
| 77 |
|
| 78 |
-
def load_model(self, model_name, use_lama=
|
| 79 |
if model_name is None:
|
| 80 |
model_name = self.default_model
|
| 81 |
if self.current_model == model_name:
|
|
@@ -108,33 +108,36 @@ class LucidDreamer:
|
|
| 108 |
self.current_model = model_name
|
| 109 |
|
| 110 |
def rgb(self, prompt, image, negative_prompt='', generator=None, num_inference_steps=50, mask_image=None):
|
|
|
|
|
|
|
| 111 |
if self.current_model == self.default_model:
|
| 112 |
return self.rgb_model(
|
| 113 |
prompt=prompt,
|
| 114 |
negative_prompt=negative_prompt,
|
| 115 |
generator=generator,
|
| 116 |
num_inference_steps=num_inference_steps,
|
| 117 |
-
image=
|
| 118 |
-
mask_image=
|
| 119 |
).images[0]
|
| 120 |
|
| 121 |
kwargs = {
|
| 122 |
'negative_prompt': negative_prompt,
|
| 123 |
'generator': generator,
|
| 124 |
-
'strength': 0.
|
| 125 |
'num_inference_steps': num_inference_steps,
|
| 126 |
'height': self.cam.H,
|
| 127 |
'width': self.cam.W,
|
| 128 |
}
|
| 129 |
|
| 130 |
-
image_np = np.array(image).astype(float) / 255.0
|
| 131 |
-
mask_np = np.array(mask_image) / 255.0
|
| 132 |
-
|
|
|
|
| 133 |
mask_padded = pad_mask(mask_sum, 3)
|
| 134 |
masked = image_np * np.logical_not(mask_padded[..., None])
|
| 135 |
|
| 136 |
if self.lama is not None:
|
| 137 |
-
lama_image = Image.fromarray(lama(masked, mask_padded).astype(np.uint8))
|
| 138 |
else:
|
| 139 |
lama_image = image
|
| 140 |
|
|
@@ -309,10 +312,15 @@ class LucidDreamer:
|
|
| 309 |
image_in, mask_in = np.zeros((in_res, in_res, 3), dtype=np.uint8), 255*np.ones((in_res, in_res, 3), dtype=np.uint8)
|
| 310 |
image_in[int(in_res/2-h_in/2):int(in_res/2+h_in/2), int(in_res/2-w_in/2):int(in_res/2+w_in/2)] = np.array(rgb_cond)
|
| 311 |
mask_in[int(in_res/2-h_in/2):int(in_res/2+h_in/2), int(in_res/2-w_in/2):int(in_res/2+w_in/2)] = 0
|
|
|
|
|
|
|
|
|
|
| 312 |
image_curr = self.rgb(
|
| 313 |
-
prompt=prompt,
|
|
|
|
| 314 |
negative_prompt=negative_prompt, generator=generator,
|
| 315 |
-
mask_image=
|
|
|
|
| 316 |
|
| 317 |
else: # if there is a large gap between height and width, do inpainting
|
| 318 |
if w_in > h_in:
|
|
@@ -379,9 +387,10 @@ class LucidDreamer:
|
|
| 379 |
border_valid_idx = np.where(mask_hf[round_coord_cam2[1], round_coord_cam2[0]] == 1)[0] # use valid_idx[border_valid_idx] for world1
|
| 380 |
|
| 381 |
image_curr = self.rgb(
|
| 382 |
-
prompt=prompt, image=Image.fromarray(np.round(image2*255.).astype(np.uint8)),
|
| 383 |
negative_prompt=negative_prompt, generator=generator, num_inference_steps=diff_steps,
|
| 384 |
-
mask_image=Image.fromarray(np.round((1-mask2[:,:])*255.).astype(np.uint8))
|
|
|
|
| 385 |
depth_curr = self.d(image_curr)
|
| 386 |
|
| 387 |
|
|
@@ -502,6 +511,8 @@ class LucidDreamer:
|
|
| 502 |
pixel_coord_camj[0]/pixel_coord_camj[2]<=W-1,
|
| 503 |
pixel_coord_camj[1]/pixel_coord_camj[2]>=0,
|
| 504 |
pixel_coord_camj[1]/pixel_coord_camj[2]<=H-1)))[0]
|
|
|
|
|
|
|
| 505 |
pts_depthsj = pixel_coord_camj[-1:, valid_idxj]
|
| 506 |
pixel_coord_camj = pixel_coord_camj[:2, valid_idxj]/pixel_coord_camj[-1:, valid_idxj]
|
| 507 |
round_coord_camj = np.round(pixel_coord_camj).astype(np.int32)
|
|
|
|
| 75 |
self.lama = None
|
| 76 |
self.current_model = self.default_model
|
| 77 |
|
| 78 |
+
def load_model(self, model_name, use_lama=True):
|
| 79 |
if model_name is None:
|
| 80 |
model_name = self.default_model
|
| 81 |
if self.current_model == model_name:
|
|
|
|
| 108 |
self.current_model = model_name
|
| 109 |
|
| 110 |
def rgb(self, prompt, image, negative_prompt='', generator=None, num_inference_steps=50, mask_image=None):
|
| 111 |
+
image_pil = Image.fromarray(np.round(image * 255.).astype(np.uint8))
|
| 112 |
+
mask_pil = Image.fromarray(np.round((1 - mask_image) * 255.).astype(np.uint8))
|
| 113 |
if self.current_model == self.default_model:
|
| 114 |
return self.rgb_model(
|
| 115 |
prompt=prompt,
|
| 116 |
negative_prompt=negative_prompt,
|
| 117 |
generator=generator,
|
| 118 |
num_inference_steps=num_inference_steps,
|
| 119 |
+
image=image_pil,
|
| 120 |
+
mask_image=mask_pil,
|
| 121 |
).images[0]
|
| 122 |
|
| 123 |
kwargs = {
|
| 124 |
'negative_prompt': negative_prompt,
|
| 125 |
'generator': generator,
|
| 126 |
+
'strength': 0.9,
|
| 127 |
'num_inference_steps': num_inference_steps,
|
| 128 |
'height': self.cam.H,
|
| 129 |
'width': self.cam.W,
|
| 130 |
}
|
| 131 |
|
| 132 |
+
# image_np = np.array(image).astype(float) / 255.0
|
| 133 |
+
# mask_np = 1.0 - np.array(mask_image) / 255.0
|
| 134 |
+
image_np = np.round(np.clip(image, 0, 1) * 255.).astype(np.uint8)
|
| 135 |
+
mask_sum = np.clip((image.prod(axis=-1) == 0) + (1 - mask_image), 0, 1)
|
| 136 |
mask_padded = pad_mask(mask_sum, 3)
|
| 137 |
masked = image_np * np.logical_not(mask_padded[..., None])
|
| 138 |
|
| 139 |
if self.lama is not None:
|
| 140 |
+
lama_image = Image.fromarray(self.lama(masked, mask_padded).astype(np.uint8))
|
| 141 |
else:
|
| 142 |
lama_image = image
|
| 143 |
|
|
|
|
| 312 |
image_in, mask_in = np.zeros((in_res, in_res, 3), dtype=np.uint8), 255*np.ones((in_res, in_res, 3), dtype=np.uint8)
|
| 313 |
image_in[int(in_res/2-h_in/2):int(in_res/2+h_in/2), int(in_res/2-w_in/2):int(in_res/2+w_in/2)] = np.array(rgb_cond)
|
| 314 |
mask_in[int(in_res/2-h_in/2):int(in_res/2+h_in/2), int(in_res/2-w_in/2):int(in_res/2+w_in/2)] = 0
|
| 315 |
+
|
| 316 |
+
image2 = np.array(Image.fromarray(image_in).resize((self.cam.W, self.cam.H))).astype(float) / 255.0
|
| 317 |
+
mask2 = np.array(Image.fromarray(mask_in).resize((self.cam.W, self.cam.H))).astype(float) / 255.0
|
| 318 |
image_curr = self.rgb(
|
| 319 |
+
prompt=prompt,
|
| 320 |
+
image=image2,
|
| 321 |
negative_prompt=negative_prompt, generator=generator,
|
| 322 |
+
mask_image=mask2,
|
| 323 |
+
)
|
| 324 |
|
| 325 |
else: # if there is a large gap between height and width, do inpainting
|
| 326 |
if w_in > h_in:
|
|
|
|
| 387 |
border_valid_idx = np.where(mask_hf[round_coord_cam2[1], round_coord_cam2[0]] == 1)[0] # use valid_idx[border_valid_idx] for world1
|
| 388 |
|
| 389 |
image_curr = self.rgb(
|
| 390 |
+
prompt=prompt, image=image2, #Image.fromarray(np.round(image2*255.).astype(np.uint8)),
|
| 391 |
negative_prompt=negative_prompt, generator=generator, num_inference_steps=diff_steps,
|
| 392 |
+
mask_image=mask2, #Image.fromarray(np.round((1-mask2[:,:])*255.).astype(np.uint8))
|
| 393 |
+
)
|
| 394 |
depth_curr = self.d(image_curr)
|
| 395 |
|
| 396 |
|
|
|
|
| 511 |
pixel_coord_camj[0]/pixel_coord_camj[2]<=W-1,
|
| 512 |
pixel_coord_camj[1]/pixel_coord_camj[2]>=0,
|
| 513 |
pixel_coord_camj[1]/pixel_coord_camj[2]<=H-1)))[0]
|
| 514 |
+
if len(valid_idxj) == 0:
|
| 515 |
+
continue
|
| 516 |
pts_depthsj = pixel_coord_camj[-1:, valid_idxj]
|
| 517 |
pixel_coord_camj = pixel_coord_camj[:2, valid_idxj]/pixel_coord_camj[-1:, valid_idxj]
|
| 518 |
round_coord_camj = np.round(pixel_coord_camj).astype(np.int32)
|