Spaces:
Runtime error
Runtime error
Commit
·
7b92dd6
1
Parent(s):
b03210b
update layout
Browse files
app.py
CHANGED
@@ -23,15 +23,17 @@ _DESCRIPTION = '''
|
|
23 |
Given a single-view image, SyncDreamer is able to generate multiview-consistent images, which enables direct 3D reconstruction with NeuS or NeRF without SDS loss </br>
|
24 |
|
25 |
Procedure: </br>
|
26 |
-
**Step
|
27 |
-
**Step 1**. Select "Crop size" and click "Crop it". ==> The foreground object is centered and resized. </br>
|
28 |
**Step 2**. Select "Elevation angle "and click "Run generation". ==> Generate multiview images. (This costs about 30s.) </br>
|
|
|
29 |
To reconstruct a NeRF or a 3D mesh from the generated images, please refer to our [github repository](https://github.com/liuyuan-pal/SyncDreamer).
|
30 |
'''
|
31 |
-
_USER_GUIDE0 = "
|
32 |
-
_USER_GUIDE1 = "Step1: Please select a **Crop size** and click **Crop it**."
|
33 |
_USER_GUIDE2 = "Step2: Please choose a **Elevation angle** and click **Run Generate**. This costs about 30s."
|
34 |
-
_USER_GUIDE3 = "Generated multiview images are shown below!"
|
|
|
|
|
35 |
|
36 |
deployed = True
|
37 |
|
@@ -63,6 +65,7 @@ class BackgroundRemoval:
|
|
63 |
return image
|
64 |
|
65 |
def resize_inputs(image_input, crop_size):
|
|
|
66 |
alpha_np = np.asarray(image_input)[:, :, 3]
|
67 |
coords = np.stack(np.nonzero(alpha_np), 1)[:, (1, 0)]
|
68 |
min_x, min_y = np.min(coords, 0)
|
@@ -119,6 +122,7 @@ def generate(model, sample_steps, batch_view_num, sample_num, cfg_scale, seed, i
|
|
119 |
|
120 |
|
121 |
def sam_predict(predictor, removal, raw_im):
|
|
|
122 |
if deployed:
|
123 |
raw_im.thumbnail([512, 512], Image.Resampling.LANCZOS)
|
124 |
image_nobg = removal(raw_im.convert('RGB'))
|
@@ -213,7 +217,7 @@ def run_demo():
|
|
213 |
with gr.Column(scale=0.8):
|
214 |
sam_block = gr.Image(type='pil', image_mode='RGBA', label="SAM output", height=256, interactive=False)
|
215 |
crop_size.render()
|
216 |
-
crop_btn = gr.Button('Crop it', variant='primary', interactive=True)
|
217 |
fig1 = gr.Image(value=Image.open('assets/elevation.jpg'), type='pil', image_mode='RGB', height=256, show_label=False, tool=None, interactive=False)
|
218 |
|
219 |
with gr.Column(scale=0.8):
|
@@ -230,14 +234,22 @@ def run_demo():
|
|
230 |
|
231 |
output_block = gr.Image(type='pil', image_mode='RGB', label="Outputs of SyncDreamer", height=256, interactive=False)
|
232 |
|
|
|
|
|
|
|
|
|
|
|
233 |
update_guide = lambda GUIDE_TEXT: gr.update(value=GUIDE_TEXT)
|
234 |
-
|
235 |
-
|
|
|
|
|
|
|
236 |
|
237 |
crop_size.change(fn=resize_inputs, inputs=[sam_block, crop_size], outputs=[input_block], queue=False)\
|
238 |
-
|
239 |
-
crop_btn.click(fn=resize_inputs, inputs=[sam_block, crop_size], outputs=[input_block], queue=False)\
|
240 |
-
|
241 |
|
242 |
run_btn.click(partial(generate, model), inputs=[sample_steps, batch_view_num, sample_num, cfg_scale, seed, input_block, elevation], outputs=[output_block], queue=False)\
|
243 |
.success(fn=partial(update_guide, _USER_GUIDE3), outputs=[guide_text], queue=False)
|
|
|
23 |
Given a single-view image, SyncDreamer is able to generate multiview-consistent images, which enables direct 3D reconstruction with NeuS or NeRF without SDS loss </br>
|
24 |
|
25 |
Procedure: </br>
|
26 |
+
**Step 1**. Upload an image or select an example. ==> The foreground is masked out by SAM and we crop it as inputs. </br>
|
|
|
27 |
**Step 2**. Select "Elevation angle "and click "Run generation". ==> Generate multiview images. (This costs about 30s.) </br>
|
28 |
+
You may adjust the **Crop size** and **Elevation angle** to get a better result! <br>
|
29 |
To reconstruct a NeRF or a 3D mesh from the generated images, please refer to our [github repository](https://github.com/liuyuan-pal/SyncDreamer).
|
30 |
'''
|
31 |
+
_USER_GUIDE0 = "Step1: Please upload an image in the block above (or choose an example shown in the left)."
|
32 |
+
# _USER_GUIDE1 = "Step1: Please select a **Crop size** and click **Crop it**."
|
33 |
_USER_GUIDE2 = "Step2: Please choose a **Elevation angle** and click **Run Generate**. This costs about 30s."
|
34 |
+
_USER_GUIDE3 = "Generated multiview images are shown below! (You may adjust the **Crop size** and **Elevation angle** to get a better result!)"
|
35 |
+
|
36 |
+
others = '''**Step 1**. Select "Crop size" and click "Crop it". ==> The foreground object is centered and resized. </br>'''
|
37 |
|
38 |
deployed = True
|
39 |
|
|
|
65 |
return image
|
66 |
|
67 |
def resize_inputs(image_input, crop_size):
|
68 |
+
if image_input is None: return None
|
69 |
alpha_np = np.asarray(image_input)[:, :, 3]
|
70 |
coords = np.stack(np.nonzero(alpha_np), 1)[:, (1, 0)]
|
71 |
min_x, min_y = np.min(coords, 0)
|
|
|
122 |
|
123 |
|
124 |
def sam_predict(predictor, removal, raw_im):
|
125 |
+
if raw_im is None: return None
|
126 |
if deployed:
|
127 |
raw_im.thumbnail([512, 512], Image.Resampling.LANCZOS)
|
128 |
image_nobg = removal(raw_im.convert('RGB'))
|
|
|
217 |
with gr.Column(scale=0.8):
|
218 |
sam_block = gr.Image(type='pil', image_mode='RGBA', label="SAM output", height=256, interactive=False)
|
219 |
crop_size.render()
|
220 |
+
# crop_btn = gr.Button('Crop it', variant='primary', interactive=True)
|
221 |
fig1 = gr.Image(value=Image.open('assets/elevation.jpg'), type='pil', image_mode='RGB', height=256, show_label=False, tool=None, interactive=False)
|
222 |
|
223 |
with gr.Column(scale=0.8):
|
|
|
234 |
|
235 |
output_block = gr.Image(type='pil', image_mode='RGB', label="Outputs of SyncDreamer", height=256, interactive=False)
|
236 |
|
237 |
+
def update_guide2(text, im):
|
238 |
+
if im is None:
|
239 |
+
return _USER_GUIDE0
|
240 |
+
else:
|
241 |
+
return text
|
242 |
update_guide = lambda GUIDE_TEXT: gr.update(value=GUIDE_TEXT)
|
243 |
+
|
244 |
+
image_block.clear(fn=partial(update_guide, _USER_GUIDE0), outputs=[guide_text], queue=False)
|
245 |
+
image_block.change(fn=partial(sam_predict, mask_predictor, removal), inputs=[image_block], outputs=[sam_block], queue=False) \
|
246 |
+
.success(fn=resize_inputs, inputs=[sam_block, crop_size], outputs=[input_block], queue=False)\
|
247 |
+
.success(fn=partial(update_guide2, _USER_GUIDE2), inputs=[image_block], outputs=[guide_text], queue=False)\
|
248 |
|
249 |
crop_size.change(fn=resize_inputs, inputs=[sam_block, crop_size], outputs=[input_block], queue=False)\
|
250 |
+
.success(fn=partial(update_guide, _USER_GUIDE2), outputs=[guide_text], queue=False)
|
251 |
+
# crop_btn.click(fn=resize_inputs, inputs=[sam_block, crop_size], outputs=[input_block], queue=False)\
|
252 |
+
# .success(fn=partial(update_guide, _USER_GUIDE2), outputs=[guide_text], queue=False)
|
253 |
|
254 |
run_btn.click(partial(generate, model), inputs=[sample_steps, batch_view_num, sample_num, cfg_scale, seed, input_block, elevation], outputs=[output_block], queue=False)\
|
255 |
.success(fn=partial(update_guide, _USER_GUIDE3), outputs=[guide_text], queue=False)
|