Spaces:
Running
on
Zero
Running
on
Zero
Update app.py
Browse files
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.
|
| 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
|
| 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
|
| 266 |
]
|
|
|
|
| 267 |
|
| 268 |
-
|
| 269 |
-
|
| 270 |
-
|
|
|
|
| 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 |
|