multimodalart HF Staff commited on
Commit
26b519f
·
verified ·
1 Parent(s): 23de8c0

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +32 -18
app.py CHANGED
@@ -90,6 +90,7 @@ def build_camera_prompt(rotate_deg, move_forward, vertical_tilt, wideangle):
90
  @spaces.GPU
91
  def infer_camera_edit(
92
  image,
 
93
  rotate_deg,
94
  move_forward,
95
  vertical_tilt,
@@ -100,7 +101,6 @@ def infer_camera_edit(
100
  num_inference_steps,
101
  height,
102
  width,
103
- prev_output=None,
104
  progress=gr.Progress(track_tqdm=True)
105
  ):
106
  prompt = build_camera_prompt(rotate_deg, move_forward, vertical_tilt, wideangle)
@@ -144,8 +144,13 @@ css = '''#col-container { max-width: 800px; margin: 0 auto; }
144
  .dark .progress-text{color: white !important}
145
  #examples{max-width: 800px; margin: 0 auto; }'''
146
 
 
 
147
  def reset_all():
148
- return [0, 0, 0, 0]
 
 
 
149
 
150
  def update_dimensions_on_upload(image):
151
  if image is None:
@@ -188,7 +193,7 @@ with gr.Blocks(theme=gr.themes.Citrus(), css=css) as demo:
188
  rotate_deg = gr.Slider(label="Rotate Left–Right (degrees °)", minimum=-90, maximum=90, step=45, value=0)
189
  move_forward = gr.Slider(label="Move Forward → Close-Up", minimum=0, maximum=10, step=5, value=0)
190
  vertical_tilt = gr.Slider(label="Vertical Angle (Bird ↔ Worm)", minimum=-1, maximum=1, step=1, value=0)
191
- wideangle = gr.Slider(label="Wide-Angle Lens", minimum=0, maximum=1, step=1, value=0)
192
  with gr.Row():
193
  reset_btn = gr.Button("Reset")
194
  run_btn = gr.Button("Generate", variant="primary")
@@ -210,9 +215,9 @@ with gr.Blocks(theme=gr.themes.Citrus(), css=css) as demo:
210
  #gr.Markdown("_Each change applies a fresh camera instruction to the last output image._")
211
 
212
  inputs = [
213
- image, rotate_deg, move_forward,
214
  vertical_tilt, wideangle,
215
- seed, randomize_seed, true_guidance_scale, num_inference_steps, height, width, prev_output
216
  ]
217
  outputs = [result, seed, prompt_preview]
218
 
@@ -220,9 +225,9 @@ with gr.Blocks(theme=gr.themes.Citrus(), css=css) as demo:
220
  reset_btn.click(
221
  fn=reset_all,
222
  inputs=None,
223
- outputs=[rotate_deg, move_forward, vertical_tilt, wideangle],
224
  queue=False
225
- )
226
 
227
  # Manual generation
228
  run_event = run_btn.click(fn=infer_camera_edit, inputs=inputs, outputs=outputs)
@@ -234,11 +239,7 @@ with gr.Blocks(theme=gr.themes.Citrus(), css=css) as demo:
234
  ["monkey.jpg", None, -45, 5, 0, False, 0, True, 1.0, 4, 704, 1024],
235
  ["metropolis.jpg", None, 0, 0, -1, True, 0, True, 1.0, 4, 816, 1024],
236
  ],
237
- inputs=[
238
- image, rotate_deg, move_forward,
239
- vertical_tilt, wideangle,
240
- seed, randomize_seed, true_guidance_scale, num_inference_steps, height, width
241
- ],
242
  outputs=outputs,
243
  fn=infer_camera_edit,
244
  cache_examples="lazy",
@@ -253,21 +254,34 @@ with gr.Blocks(theme=gr.themes.Citrus(), css=css) as demo:
253
  ).then(
254
  fn=reset_all,
255
  inputs=None,
256
- outputs=[rotate_deg, move_forward, vertical_tilt, wideangle],
 
 
 
 
 
257
  queue=False
258
  )
259
 
260
 
261
  # Live updates
 
 
 
 
 
 
262
  control_inputs = [
263
- image, rotate_deg, move_forward,
264
  vertical_tilt, wideangle,
265
- seed, randomize_seed, true_guidance_scale, num_inference_steps, height, width, prev_output
266
  ]
 
267
 
268
- # All sliders use .release() to avoid triggering during reset
269
- for control in [rotate_deg, move_forward, vertical_tilt, wideangle]:
270
- control.release(fn=infer_camera_edit, inputs=control_inputs, outputs=outputs)
 
271
 
272
  run_event.then(lambda img, *_: img, inputs=[result], outputs=[prev_output])
273
 
 
90
  @spaces.GPU
91
  def infer_camera_edit(
92
  image,
93
+ prev_output,
94
  rotate_deg,
95
  move_forward,
96
  vertical_tilt,
 
101
  num_inference_steps,
102
  height,
103
  width,
 
104
  progress=gr.Progress(track_tqdm=True)
105
  ):
106
  prompt = build_camera_prompt(rotate_deg, move_forward, vertical_tilt, wideangle)
 
144
  .dark .progress-text{color: white !important}
145
  #examples{max-width: 800px; margin: 0 auto; }'''
146
 
147
+ is_reset = gr.State(value=False)
148
+
149
  def reset_all():
150
+ return [0, 0, 0, 0, False, True]
151
+
152
+ def end_reset():
153
+ return False
154
 
155
  def update_dimensions_on_upload(image):
156
  if image is None:
 
193
  rotate_deg = gr.Slider(label="Rotate Left–Right (degrees °)", minimum=-90, maximum=90, step=45, value=0)
194
  move_forward = gr.Slider(label="Move Forward → Close-Up", minimum=0, maximum=10, step=5, value=0)
195
  vertical_tilt = gr.Slider(label="Vertical Angle (Bird ↔ Worm)", minimum=-1, maximum=1, step=1, value=0)
196
+ wideangle = gr.Checkbox(label="Wide-Angle Lens", value=False)
197
  with gr.Row():
198
  reset_btn = gr.Button("Reset")
199
  run_btn = gr.Button("Generate", variant="primary")
 
215
  #gr.Markdown("_Each change applies a fresh camera instruction to the last output image._")
216
 
217
  inputs = [
218
+ image, prev_output, rotate_deg, move_forward,
219
  vertical_tilt, wideangle,
220
+ seed, randomize_seed, true_guidance_scale, num_inference_steps, height, width
221
  ]
222
  outputs = [result, seed, prompt_preview]
223
 
 
225
  reset_btn.click(
226
  fn=reset_all,
227
  inputs=None,
228
+ outputs=[rotate_deg, move_forward, vertical_tilt, wideangle, is_reset],
229
  queue=False
230
+ ).then(fn=end_reset, inputs=None, outputs=[is_reset], queue=False)
231
 
232
  # Manual generation
233
  run_event = run_btn.click(fn=infer_camera_edit, inputs=inputs, outputs=outputs)
 
239
  ["monkey.jpg", None, -45, 5, 0, False, 0, True, 1.0, 4, 704, 1024],
240
  ["metropolis.jpg", None, 0, 0, -1, True, 0, True, 1.0, 4, 816, 1024],
241
  ],
242
+ inputs=inputs,
 
 
 
 
243
  outputs=outputs,
244
  fn=infer_camera_edit,
245
  cache_examples="lazy",
 
254
  ).then(
255
  fn=reset_all,
256
  inputs=None,
257
+ outputs=[rotate_deg, move_forward, vertical_tilt, wideangle, is_reset],
258
+ queue=False
259
+ ).then(
260
+ fn=end_reset,
261
+ inputs=None,
262
+ outputs=[is_reset],
263
  queue=False
264
  )
265
 
266
 
267
  # Live updates
268
+ def maybe_infer(is_reset, progress=gr.Progress(track_tqdm=True), *args):
269
+ if is_reset:
270
+ return gr.update(), gr.update(), gr.update()
271
+ else:
272
+ return infer_camera_edit(*args)
273
+
274
  control_inputs = [
275
+ image, prev_output, rotate_deg, move_forward,
276
  vertical_tilt, wideangle,
277
+ seed, randomize_seed, true_guidance_scale, num_inference_steps, height, width
278
  ]
279
+ control_inputs_with_flag = [is_reset] + control_inputs
280
 
281
+ for control in [rotate_deg, move_forward, vertical_tilt]:
282
+ control.release(fn=maybe_infer, inputs=control_inputs_with_flag, outputs=outputs)
283
+
284
+ wideangle.change(fn=maybe_infer, inputs=control_inputs_with_flag, outputs=outputs)
285
 
286
  run_event.then(lambda img, *_: img, inputs=[result], outputs=[prev_output])
287