Spaces:
Running
on
Zero
Running
on
Zero
Update app.py
Browse files
app.py
CHANGED
@@ -102,15 +102,13 @@ def preprocess_image(image_array, state):
|
|
102 |
if image_array is None:
|
103 |
return "❌ Please upload an image first.", None, state, gr.update(interactive=True), gr.update(interactive=True)
|
104 |
|
105 |
-
session_id = request.session_hash
|
106 |
base_dir = os.path.join(os.environ["PIXEL3DMM_PREPROCESSED_DATA"], session_id)
|
107 |
os.makedirs(base_dir, exist_ok=True)
|
108 |
-
state.update({"
|
109 |
|
110 |
img = Image.fromarray(image_array)
|
111 |
saved_image_path = os.path.join(base_dir, f"{session_id}.png")
|
112 |
img.save(saved_image_path)
|
113 |
-
state["image_path"] = saved_image_path
|
114 |
|
115 |
try:
|
116 |
p = subprocess.run([
|
@@ -218,7 +216,11 @@ def step4_track(state):
|
|
218 |
|
219 |
# New: run all steps sequentially
|
220 |
@spaces.GPU()
|
221 |
-
def run_pipeline(image_array, state):
|
|
|
|
|
|
|
|
|
222 |
# Step 1
|
223 |
status1, crop_img, state, _, _ = preprocess_image(image_array, state)
|
224 |
if "❌" in status1:
|
@@ -245,9 +247,15 @@ def cleanup(request: gr.Request):
|
|
245 |
shutil.rmtree(d1, ignore_errors=True)
|
246 |
shutil.rmtree(d2, ignore_errors=True)
|
247 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
248 |
# Build Gradio UI
|
249 |
-
|
250 |
-
with demo:
|
251 |
gr.Markdown("## Pixel3dmm [Image Mode]")
|
252 |
gr.Markdown("Versatile Screen-Space Priors for Single-Image 3D Face Reconstruction.")
|
253 |
gr.HTML(
|
@@ -260,38 +268,40 @@ with demo:
|
|
260 |
</div>
|
261 |
"""
|
262 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
263 |
|
264 |
-
|
265 |
-
|
266 |
-
|
267 |
-
|
268 |
-
|
269 |
-
|
270 |
-
|
271 |
-
|
272 |
-
|
273 |
-
|
274 |
-
|
275 |
-
|
276 |
-
|
277 |
-
|
278 |
-
|
279 |
-
|
280 |
-
|
281 |
-
outputs=[], # outputs are specified via the callback
|
282 |
-
fn=run_pipeline,
|
283 |
-
cache_examples=True # cache results of examples for faster loading
|
284 |
-
)
|
285 |
-
|
286 |
-
run_btn = gr.Button("Run Pipeline")
|
287 |
-
|
288 |
-
run_btn.click(
|
289 |
-
fn=run_pipeline,
|
290 |
-
inputs=[image_in, state],
|
291 |
-
outputs=[status, crop_img, normals_img, uv_img, track_img, mesh_file, state]
|
292 |
-
)
|
293 |
-
examples.outputs = [status, crop_img, normals_img, uv_img, track_img, mesh_file, state]
|
294 |
-
image_in.upload(fn=reset_all, inputs=None, outputs=[crop_img, normals_img, uv_img, track_img, mesh_file, status, state, run_btn])
|
295 |
|
296 |
demo.unload(cleanup)
|
297 |
|
|
|
102 |
if image_array is None:
|
103 |
return "❌ Please upload an image first.", None, state, gr.update(interactive=True), gr.update(interactive=True)
|
104 |
|
|
|
105 |
base_dir = os.path.join(os.environ["PIXEL3DMM_PREPROCESSED_DATA"], session_id)
|
106 |
os.makedirs(base_dir, exist_ok=True)
|
107 |
+
state.update({"base_dir": base_dir})
|
108 |
|
109 |
img = Image.fromarray(image_array)
|
110 |
saved_image_path = os.path.join(base_dir, f"{session_id}.png")
|
111 |
img.save(saved_image_path)
|
|
|
112 |
|
113 |
try:
|
114 |
p = subprocess.run([
|
|
|
216 |
|
217 |
# New: run all steps sequentially
|
218 |
@spaces.GPU()
|
219 |
+
def run_pipeline(image_array, state, request: gr.Request):
|
220 |
+
|
221 |
+
session_id = request.session_hash
|
222 |
+
state.update({"session_id": session_id, "base_dir": base_dir})
|
223 |
+
|
224 |
# Step 1
|
225 |
status1, crop_img, state, _, _ = preprocess_image(image_array, state)
|
226 |
if "❌" in status1:
|
|
|
247 |
shutil.rmtree(d1, ignore_errors=True)
|
248 |
shutil.rmtree(d2, ignore_errors=True)
|
249 |
|
250 |
+
css = """
|
251 |
+
#col-container {
|
252 |
+
margin: 0 auto;
|
253 |
+
max-width: 1024px;
|
254 |
+
}
|
255 |
+
"""
|
256 |
+
|
257 |
# Build Gradio UI
|
258 |
+
with gr.Blocks(css=css) as demo:
|
|
|
259 |
gr.Markdown("## Pixel3dmm [Image Mode]")
|
260 |
gr.Markdown("Versatile Screen-Space Priors for Single-Image 3D Face Reconstruction.")
|
261 |
gr.HTML(
|
|
|
268 |
</div>
|
269 |
"""
|
270 |
)
|
271 |
+
|
272 |
+
with gr.Column(elem_id="col-container"):
|
273 |
+
|
274 |
+
with gr.Row():
|
275 |
+
with gr.Column():
|
276 |
+
image_in = gr.Image(label="Upload Image", type="numpy", height=512)
|
277 |
+
status = gr.Textbox(label="Status", lines=6, interactive=True, value="Upload an image to start.")
|
278 |
+
state = gr.State({})
|
279 |
+
with gr.Column():
|
280 |
+
with gr.Row():
|
281 |
+
crop_img = gr.Image(label="Preprocessed", height=256)
|
282 |
+
normals_img = gr.Image(label="Normals", height=256)
|
283 |
+
with gr.Row():
|
284 |
+
uv_img = gr.Image(label="UV Map", height=256)
|
285 |
+
track_img = gr.Image(label="Tracking", height=256)
|
286 |
+
mesh_file = gr.Model3D(label="3D Model Preview")
|
287 |
|
288 |
+
examples = gr.Examples(
|
289 |
+
examples=["example_images/jim_carrey.png", "example_images/margaret_qualley.png"],
|
290 |
+
inputs=image_in,
|
291 |
+
outputs=[], # outputs are specified via the callback
|
292 |
+
fn=run_pipeline,
|
293 |
+
cache_examples=True # cache results of examples for faster loading
|
294 |
+
)
|
295 |
+
|
296 |
+
run_btn = gr.Button("Run Pipeline")
|
297 |
+
|
298 |
+
run_btn.click(
|
299 |
+
fn=run_pipeline,
|
300 |
+
inputs=[image_in, state, Request],
|
301 |
+
outputs=[status, crop_img, normals_img, uv_img, track_img, mesh_file, state]
|
302 |
+
)
|
303 |
+
examples.outputs = [status, crop_img, normals_img, uv_img, track_img, mesh_file, state]
|
304 |
+
image_in.upload(fn=reset_all, inputs=None, outputs=[crop_img, normals_img, uv_img, track_img, mesh_file, status, state, run_btn])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
305 |
|
306 |
demo.unload(cleanup)
|
307 |
|