byeongjun-park commited on
Commit
5c2046f
·
1 Parent(s): 1155ae6

HarmonyView update

Browse files
Files changed (2) hide show
  1. .idea/workspace.xml +30 -2
  2. app.py +21 -32
.idea/workspace.xml CHANGED
@@ -6,6 +6,7 @@
6
  <component name="ChangeListManager">
7
  <list default="true" id="a993d736-6297-4164-9c29-6b2ab1055a96" name="변경" comment="HarmonyView update">
8
  <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
 
9
  </list>
10
  <option name="SHOW_DIALOG" value="false" />
11
  <option name="HIGHLIGHT_CONFLICTS" value="true" />
@@ -32,7 +33,7 @@
32
  "RunOnceActivity.OpenProjectViewOnStart": "true",
33
  "RunOnceActivity.ShowReadmeOnStart": "true",
34
  "git-widget-placeholder": "main",
35
- "last_opened_file_path": "/home/byeongjun/PycharmProjects/HarmonyView"
36
  }
37
  }]]></component>
38
  <component name="RecentsManager">
@@ -57,6 +58,9 @@
57
  <updated>1703058146297</updated>
58
  <workItem from="1703058147338" duration="769000" />
59
  <workItem from="1703224127800" duration="3023000" />
 
 
 
60
  </task>
61
  <task id="LOCAL-00001" summary="error resolve">
62
  <option name="closed" value="true" />
@@ -138,7 +142,31 @@
138
  <option name="project" value="LOCAL" />
139
  <updated>1703132120481</updated>
140
  </task>
141
- <option name="localTasksCounter" value="11" />
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
142
  <servers />
143
  </component>
144
  <component name="Vcs.Log.Tabs.Properties">
 
6
  <component name="ChangeListManager">
7
  <list default="true" id="a993d736-6297-4164-9c29-6b2ab1055a96" name="변경" comment="HarmonyView update">
8
  <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
9
+ <change beforePath="$PROJECT_DIR$/app.py" beforeDir="false" afterPath="$PROJECT_DIR$/app.py" afterDir="false" />
10
  </list>
11
  <option name="SHOW_DIALOG" value="false" />
12
  <option name="HIGHLIGHT_CONFLICTS" value="true" />
 
33
  "RunOnceActivity.OpenProjectViewOnStart": "true",
34
  "RunOnceActivity.ShowReadmeOnStart": "true",
35
  "git-widget-placeholder": "main",
36
+ "last_opened_file_path": "/home/byeongjun/HarmonyView"
37
  }
38
  }]]></component>
39
  <component name="RecentsManager">
 
58
  <updated>1703058146297</updated>
59
  <workItem from="1703058147338" duration="769000" />
60
  <workItem from="1703224127800" duration="3023000" />
61
+ <workItem from="1703644898438" duration="448000" />
62
+ <workItem from="1703677779702" duration="730000" />
63
+ <workItem from="1703731914758" duration="8515000" />
64
  </task>
65
  <task id="LOCAL-00001" summary="error resolve">
66
  <option name="closed" value="true" />
 
142
  <option name="project" value="LOCAL" />
143
  <updated>1703132120481</updated>
144
  </task>
145
+ <task id="LOCAL-00011" summary="HarmonyView update">
146
+ <option name="closed" value="true" />
147
+ <created>1703645193143</created>
148
+ <option name="number" value="00011" />
149
+ <option name="presentableId" value="LOCAL-00011" />
150
+ <option name="project" value="LOCAL" />
151
+ <updated>1703645193143</updated>
152
+ </task>
153
+ <task id="LOCAL-00012" summary="HarmonyView update">
154
+ <option name="closed" value="true" />
155
+ <created>1703645337792</created>
156
+ <option name="number" value="00012" />
157
+ <option name="presentableId" value="LOCAL-00012" />
158
+ <option name="project" value="LOCAL" />
159
+ <updated>1703645337792</updated>
160
+ </task>
161
+ <task id="LOCAL-00013" summary="HarmonyView update">
162
+ <option name="closed" value="true" />
163
+ <created>1703677831151</created>
164
+ <option name="number" value="00013" />
165
+ <option name="presentableId" value="LOCAL-00013" />
166
+ <option name="project" value="LOCAL" />
167
+ <updated>1703677831151</updated>
168
+ </task>
169
+ <option name="localTasksCounter" value="14" />
170
  <servers />
171
  </component>
172
  <component name="Vcs.Log.Tabs.Properties">
app.py CHANGED
@@ -24,14 +24,14 @@ Given a single-view image, HarmonyView is able to generate multiview-consistent
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. The **Elevation angle** is the elevation of the input image. (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/byeongjun-park/HarmonyView). <br>
30
  We have heavily borrowed codes from [Syncdreamer](https://huggingface.co/spaces/liuyuan-pal/SyncDreamer), which is an our strong baseline.
31
  '''
32
  _USER_GUIDE0 = "Step1: Please upload an image in the block above (or choose an example shown in the left)."
33
  # _USER_GUIDE1 = "Step1: Please select a **Crop size** and click **Crop it**."
34
- _USER_GUIDE2 = "Step2: Please choose a **Elevation angle** and click **Run Generate**. The **Elevation angle** is the elevation of the input image. This costs about 30s."
35
  _USER_GUIDE3 = "Generated multiview images are shown below! (You may adjust the **Crop size** and **Elevation angle** to get a better result!)"
36
 
37
  others = '''**Step 1**. Select "Crop size" and click "Crop it". ==> The foreground object is centered and resized. </br>'''
@@ -65,7 +65,8 @@ class BackgroundRemoval:
65
  image = self.interface([image])[0]
66
  return image
67
 
68
- def resize_inputs(image_input, crop_size):
 
69
  if image_input is None: return None
70
  alpha_np = np.asarray(image_input)[:, :, 3]
71
  coords = np.stack(np.nonzero(alpha_np), 1)[:, (1, 0)]
@@ -194,8 +195,7 @@ def run_demo():
194
  with gr.Row():
195
  with gr.Column(scale=1):
196
  gr.Markdown('# ' + _TITLE)
197
- # with gr.Column(scale=0):
198
- # gr.DuplicateButton(value='Duplicate Space for private use', elem_id='duplicate-button')
199
  gr.Markdown(_DESCRIPTION)
200
 
201
  with gr.Row(variant='panel'):
@@ -211,50 +211,39 @@ def run_demo():
211
 
212
  with gr.Column(scale=0.8):
213
  image_block.render()
214
- guide_text = gr.Markdown(_USER_GUIDE0, visible=True)
 
215
  fig0 = gr.Image(value=Image.open('assets/crop_size.jpg'), type='pil', image_mode='RGB', height=256, show_label=False, tool=None, interactive=False)
216
 
217
 
218
  with gr.Column(scale=0.8):
219
  sam_block = gr.Image(type='pil', image_mode='RGBA', label="SAM output", height=256, interactive=False)
220
- crop_size.render()
221
  # crop_btn = gr.Button('Crop it', variant='primary', interactive=True)
 
222
  fig1 = gr.Image(value=Image.open('assets/elevation.jpg'), type='pil', image_mode='RGB', height=256, show_label=False, tool=None, interactive=False)
223
 
224
  with gr.Column(scale=0.8):
225
- input_block = gr.Image(type='pil', image_mode='RGBA', label="Input to SyncDreamer", height=256, interactive=False)
226
- elevation.render()
227
- with gr.Accordion('Advanced options', open=False):
228
- cfg_scale_1 = gr.Slider(1.0, 5.0, 2.0, step=0.1, label='Classifier free guidance 1', interactive=True)
229
- cfg_scale_2 = gr.Slider(0.5, 1.5, 1.0, step=0.1, label='Classifier free guidance 2', interactive=True)
230
- sample_num = gr.Slider(1, 2, 1, step=1, label='Sample num', interactive=False, info='How many instance (16 images per instance)')
231
- sample_steps = gr.Slider(10, 300, 50, step=10, label='Sample steps', interactive=False)
232
- batch_view_num = gr.Slider(1, 16, 16, step=1, label='Batch num', interactive=True)
233
  seed = gr.Number(6033, label='Random seed', interactive=True)
234
  run_btn = gr.Button('Run generation', variant='primary', interactive=True)
235
 
 
236
 
237
- output_block = gr.Image(type='pil', image_mode='RGB', label="Outputs of SyncDreamer", height=256, interactive=False)
238
-
239
- def update_guide2(text, im):
240
- if im is None:
241
- return _USER_GUIDE0
242
- else:
243
- return text
244
- update_guide = lambda GUIDE_TEXT: gr.update(value=GUIDE_TEXT)
245
 
246
- image_block.clear(fn=partial(update_guide, _USER_GUIDE0), outputs=[guide_text], queue=False)
247
  image_block.change(fn=partial(sam_predict, mask_predictor, removal), inputs=[image_block], outputs=[sam_block], queue=True) \
248
- .success(fn=resize_inputs, inputs=[sam_block, crop_size], outputs=[input_block], queue=True)\
249
- .success(fn=partial(update_guide2, _USER_GUIDE2), inputs=[image_block], outputs=[guide_text], queue=False)\
250
 
251
- crop_size.change(fn=resize_inputs, inputs=[sam_block, crop_size], outputs=[input_block], queue=True)\
252
- .success(fn=partial(update_guide, _USER_GUIDE2), outputs=[guide_text], queue=False)
253
- # crop_btn.click(fn=resize_inputs, inputs=[sam_block, crop_size], outputs=[input_block], queue=False)\
254
- # .success(fn=partial(update_guide, _USER_GUIDE2), outputs=[guide_text], queue=False)
255
 
256
- run_btn.click(partial(generate, model), inputs=[sample_steps, batch_view_num, sample_num, cfg_scale_1, cfg_scale_2, seed, input_block, elevation], outputs=[output_block], queue=True)\
257
- .success(fn=partial(update_guide, _USER_GUIDE3), outputs=[guide_text], queue=False)
 
 
258
 
259
  demo.queue().launch(share=False, max_threads=80) # auth=("admin", os.environ['PASSWD'])
260
 
 
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. The **Elevation angle** is the elevation of the input image. (This costs about 45s.) </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/byeongjun-park/HarmonyView). <br>
30
  We have heavily borrowed codes from [Syncdreamer](https://huggingface.co/spaces/liuyuan-pal/SyncDreamer), which is an our strong baseline.
31
  '''
32
  _USER_GUIDE0 = "Step1: Please upload an image in the block above (or choose an example shown in the left)."
33
  # _USER_GUIDE1 = "Step1: Please select a **Crop size** and click **Crop it**."
34
+ _USER_GUIDE2 = "Step2: Please choose a **Elevation angle** and click **Run Generate**. The **Elevation angle** is the elevation of the input image. This costs about 45s."
35
  _USER_GUIDE3 = "Generated multiview images are shown below! (You may adjust the **Crop size** and **Elevation angle** to get a better result!)"
36
 
37
  others = '''**Step 1**. Select "Crop size" and click "Crop it". ==> The foreground object is centered and resized. </br>'''
 
65
  image = self.interface([image])[0]
66
  return image
67
 
68
+ def resize_inputs(original_image, sam_image, crop_size, background_removal):
69
+ image_input = original_image if background_removal == "Original Image" else sam_image
70
  if image_input is None: return None
71
  alpha_np = np.asarray(image_input)[:, :, 3]
72
  coords = np.stack(np.nonzero(alpha_np), 1)[:, (1, 0)]
 
195
  with gr.Row():
196
  with gr.Column(scale=1):
197
  gr.Markdown('# ' + _TITLE)
198
+
 
199
  gr.Markdown(_DESCRIPTION)
200
 
201
  with gr.Row(variant='panel'):
 
211
 
212
  with gr.Column(scale=0.8):
213
  image_block.render()
214
+ # guide_text = gr.Markdown(_USER_GUIDE0, visible=True)
215
+ crop_size.render()
216
  fig0 = gr.Image(value=Image.open('assets/crop_size.jpg'), type='pil', image_mode='RGB', height=256, show_label=False, tool=None, interactive=False)
217
 
218
 
219
  with gr.Column(scale=0.8):
220
  sam_block = gr.Image(type='pil', image_mode='RGBA', label="SAM output", height=256, interactive=False)
 
221
  # crop_btn = gr.Button('Crop it', variant='primary', interactive=True)
222
+ elevation.render()
223
  fig1 = gr.Image(value=Image.open('assets/elevation.jpg'), type='pil', image_mode='RGB', height=256, show_label=False, tool=None, interactive=False)
224
 
225
  with gr.Column(scale=0.8):
226
+ input_block = gr.Image(type='pil', image_mode='RGBA', label="Input to HarmonyView", height=256, interactive=False)
227
+ with gr.Accordion('Advanced options', open=True):
228
+ background_removal = gr.CheckboxGroup(["Original Image", "SAM Output"], label="Input to HarmonyView", info="Which image do you want for the input?")
229
+ cfg_scale_1 = gr.Slider(1.0, 5.0, 2.0, step=0.1, label='Classifier free guidance 1', info='How consistent to be with the input image', interactive=True)
230
+ cfg_scale_2 = gr.Slider(0.5, 1.5, 1.0, step=0.1, label='Classifier free guidance 2', info='How diverse a novel view to create', interactive=True)
 
 
 
231
  seed = gr.Number(6033, label='Random seed', interactive=True)
232
  run_btn = gr.Button('Run generation', variant='primary', interactive=True)
233
 
234
+ output_block = gr.Image(type='pil', image_mode='RGB', label="Outputs of HarmonyView", height=256, interactive=False)
235
 
 
 
 
 
 
 
 
 
236
 
 
237
  image_block.change(fn=partial(sam_predict, mask_predictor, removal), inputs=[image_block], outputs=[sam_block], queue=True) \
238
+ .success(fn=resize_inputs, inputs=[image_block, sam_block, crop_size, background_removal], outputs=[input_block], queue=True)
 
239
 
240
+ background_removal.change(fn=resize_inputs, inputs=[image_block, sam_block, crop_size, background_removal], outputs=[input_block], queue=True)
241
+ crop_size.change(fn=resize_inputs, inputs=[image_block, sam_block, crop_size, background_removal], outputs=[input_block], queue=True)
 
 
242
 
243
+ sample_num = 1
244
+ sample_steps = 50
245
+ batch_view_num = 16
246
+ run_btn.click(partial(generate, model), inputs=[sample_steps, batch_view_num, sample_num, cfg_scale_1, cfg_scale_2, seed, input_block, elevation], outputs=[output_block], queue=True)
247
 
248
  demo.queue().launch(share=False, max_threads=80) # auth=("admin", os.environ['PASSWD'])
249