Deploy Space app files
Browse files
app.py
CHANGED
|
@@ -169,25 +169,26 @@ def load_instance_frames(
|
|
| 169 |
return frames
|
| 170 |
|
| 171 |
|
| 172 |
-
def
|
| 173 |
-
"""Render RGB/Mask/Depth/Normal
|
| 174 |
if not frame_items:
|
| 175 |
-
return [
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 176 |
|
| 177 |
idx = int(round(frame_index)) - 1
|
| 178 |
idx = max(0, min(idx, len(frame_items) - 1))
|
| 179 |
selected = frame_items[idx]
|
| 180 |
frame_id = int(selected["frame_id"])
|
| 181 |
-
|
| 182 |
-
|
| 183 |
-
|
| 184 |
-
("
|
| 185 |
-
("
|
| 186 |
-
|
| 187 |
-
("normal_preview", "Normal"),
|
| 188 |
-
]:
|
| 189 |
-
gallery.append((selected[key], f"{label} frame_{frame_id:05d}"))
|
| 190 |
-
return gallery
|
| 191 |
|
| 192 |
|
| 193 |
# ---------------------------------------------------------------------------
|
|
@@ -265,11 +266,12 @@ def build_app(instance_df: pd.DataFrame, preview_df: pd.DataFrame) -> gr.Blocks:
|
|
| 265 |
summary = f"Matched **{len(filtered)}** preview instances, showing **{len(rows)}**."
|
| 266 |
gallery_items = build_instance_gallery_items(rows, preview_df)
|
| 267 |
slider_empty = gr.update(minimum=1, maximum=1, step=1, value=1, interactive=False)
|
| 268 |
-
return summary, gallery_items, rows, {}, None,
|
| 269 |
|
| 270 |
def on_instance_select(rows: list[dict[str, Any]], evt: gr.SelectData):
|
| 271 |
if not rows:
|
| 272 |
-
|
|
|
|
| 273 |
idx = evt.index[0] if isinstance(evt.index, tuple) else evt.index
|
| 274 |
if not isinstance(idx, int) or idx < 0 or idx >= len(rows):
|
| 275 |
raise IndexError(f"Selected gallery index is out of range: {evt.index!r}")
|
|
@@ -287,10 +289,10 @@ def build_app(instance_df: pd.DataFrame, preview_df: pd.DataFrame) -> gr.Blocks:
|
|
| 287 |
value=1,
|
| 288 |
interactive=True,
|
| 289 |
)
|
| 290 |
-
return row, download_glb(row["glb_path"]),
|
| 291 |
|
| 292 |
def on_frame_change(frame_idx: float, frame_items: list[dict[str, Any]]):
|
| 293 |
-
return
|
| 294 |
|
| 295 |
initial_rows = instance_df.head(MAX_RESULTS).to_dict(orient="records")
|
| 296 |
initial_gallery = build_instance_gallery_items(initial_rows, preview_df)
|
|
@@ -311,7 +313,6 @@ def build_app(instance_df: pd.DataFrame, preview_df: pd.DataFrame) -> gr.Blocks:
|
|
| 311 |
is_generated = gr.Dropdown(label="isGenerated", choices=BOOL_FILTER_CHOICES, value=FILTER_ALL)
|
| 312 |
transparent = gr.Dropdown(label="transparent", choices=BOOL_FILTER_CHOICES, value=FILTER_ALL)
|
| 313 |
near_light = gr.Dropdown(label="near_light", choices=BOOL_FILTER_CHOICES, value=FILTER_ALL)
|
| 314 |
-
filter_btn = gr.Button("Apply Filters", variant="primary")
|
| 315 |
|
| 316 |
summary = gr.Markdown(initial_summary)
|
| 317 |
instance_gallery = gr.Gallery(
|
|
@@ -330,7 +331,11 @@ def build_app(instance_df: pd.DataFrame, preview_df: pd.DataFrame) -> gr.Blocks:
|
|
| 330 |
camera_position=(35, 70, 3.5),
|
| 331 |
)
|
| 332 |
|
| 333 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 334 |
frame_slider = gr.Slider(
|
| 335 |
label="Frame",
|
| 336 |
minimum=1,
|
|
@@ -343,37 +348,52 @@ def build_app(instance_df: pd.DataFrame, preview_df: pd.DataFrame) -> gr.Blocks:
|
|
| 343 |
instance_state = gr.State(initial_rows)
|
| 344 |
frame_state = gr.State([])
|
| 345 |
|
| 346 |
-
|
| 347 |
-
|
| 348 |
-
|
| 349 |
-
|
| 350 |
-
|
| 351 |
-
|
| 352 |
-
|
| 353 |
-
|
| 354 |
-
|
| 355 |
-
|
| 356 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 357 |
outputs=[
|
| 358 |
-
summary,
|
| 359 |
-
instance_gallery,
|
| 360 |
-
instance_state,
|
| 361 |
instance_meta,
|
| 362 |
model_viewer,
|
| 363 |
-
|
|
|
|
|
|
|
|
|
|
| 364 |
frame_slider,
|
| 365 |
frame_state,
|
| 366 |
],
|
| 367 |
)
|
| 368 |
-
instance_gallery.select(
|
| 369 |
-
fn=on_instance_select,
|
| 370 |
-
inputs=[instance_state],
|
| 371 |
-
outputs=[instance_meta, model_viewer, frame_gallery, frame_slider, frame_state],
|
| 372 |
-
)
|
| 373 |
frame_slider.change(
|
| 374 |
fn=on_frame_change,
|
| 375 |
inputs=[frame_slider, frame_state],
|
| 376 |
-
outputs=[
|
| 377 |
)
|
| 378 |
|
| 379 |
return demo
|
|
|
|
| 169 |
return frames
|
| 170 |
|
| 171 |
|
| 172 |
+
def render_frame_images(frame_items: list[dict[str, Any]], frame_index: float) -> list[Any | None]:
|
| 173 |
+
"""Render RGB/Mask/Depth/Normal images for one selected frame index (1-based)."""
|
| 174 |
if not frame_items:
|
| 175 |
+
return [
|
| 176 |
+
gr.update(value=None, label="RGB"),
|
| 177 |
+
gr.update(value=None, label="Mask"),
|
| 178 |
+
gr.update(value=None, label="Depth"),
|
| 179 |
+
gr.update(value=None, label="Normal"),
|
| 180 |
+
]
|
| 181 |
|
| 182 |
idx = int(round(frame_index)) - 1
|
| 183 |
idx = max(0, min(idx, len(frame_items) - 1))
|
| 184 |
selected = frame_items[idx]
|
| 185 |
frame_id = int(selected["frame_id"])
|
| 186 |
+
return [
|
| 187 |
+
gr.update(value=selected["rgb"], label=f"RGB frame_{frame_id:05d}"),
|
| 188 |
+
gr.update(value=selected["mask"], label=f"Mask frame_{frame_id:05d}"),
|
| 189 |
+
gr.update(value=selected["depth_preview"], label=f"Depth frame_{frame_id:05d}"),
|
| 190 |
+
gr.update(value=selected["normal_preview"], label=f"Normal frame_{frame_id:05d}"),
|
| 191 |
+
]
|
|
|
|
|
|
|
|
|
|
|
|
|
| 192 |
|
| 193 |
|
| 194 |
# ---------------------------------------------------------------------------
|
|
|
|
| 266 |
summary = f"Matched **{len(filtered)}** preview instances, showing **{len(rows)}**."
|
| 267 |
gallery_items = build_instance_gallery_items(rows, preview_df)
|
| 268 |
slider_empty = gr.update(minimum=1, maximum=1, step=1, value=1, interactive=False)
|
| 269 |
+
return summary, gallery_items, rows, {}, None, None, None, None, None, slider_empty, []
|
| 270 |
|
| 271 |
def on_instance_select(rows: list[dict[str, Any]], evt: gr.SelectData):
|
| 272 |
if not rows:
|
| 273 |
+
slider_empty = gr.update(minimum=1, maximum=1, step=1, value=1, interactive=False)
|
| 274 |
+
return {}, None, None, None, None, None, slider_empty, []
|
| 275 |
idx = evt.index[0] if isinstance(evt.index, tuple) else evt.index
|
| 276 |
if not isinstance(idx, int) or idx < 0 or idx >= len(rows):
|
| 277 |
raise IndexError(f"Selected gallery index is out of range: {evt.index!r}")
|
|
|
|
| 289 |
value=1,
|
| 290 |
interactive=True,
|
| 291 |
)
|
| 292 |
+
return row, download_glb(row["glb_path"]), *render_frame_images(frame_items, 1), slider_ready, frame_items
|
| 293 |
|
| 294 |
def on_frame_change(frame_idx: float, frame_items: list[dict[str, Any]]):
|
| 295 |
+
return render_frame_images(frame_items, frame_idx)
|
| 296 |
|
| 297 |
initial_rows = instance_df.head(MAX_RESULTS).to_dict(orient="records")
|
| 298 |
initial_gallery = build_instance_gallery_items(initial_rows, preview_df)
|
|
|
|
| 313 |
is_generated = gr.Dropdown(label="isGenerated", choices=BOOL_FILTER_CHOICES, value=FILTER_ALL)
|
| 314 |
transparent = gr.Dropdown(label="transparent", choices=BOOL_FILTER_CHOICES, value=FILTER_ALL)
|
| 315 |
near_light = gr.Dropdown(label="near_light", choices=BOOL_FILTER_CHOICES, value=FILTER_ALL)
|
|
|
|
| 316 |
|
| 317 |
summary = gr.Markdown(initial_summary)
|
| 318 |
instance_gallery = gr.Gallery(
|
|
|
|
| 331 |
camera_position=(35, 70, 3.5),
|
| 332 |
)
|
| 333 |
|
| 334 |
+
with gr.Row():
|
| 335 |
+
rgb_image = gr.Image(label="RGB", height=360, interactive=False, scale=1, min_width=160)
|
| 336 |
+
mask_image = gr.Image(label="Mask", height=360, interactive=False, scale=1, min_width=160)
|
| 337 |
+
depth_image = gr.Image(label="Depth", height=360, interactive=False, scale=1, min_width=160)
|
| 338 |
+
normal_image = gr.Image(label="Normal", height=360, interactive=False, scale=1, min_width=160)
|
| 339 |
frame_slider = gr.Slider(
|
| 340 |
label="Frame",
|
| 341 |
minimum=1,
|
|
|
|
| 348 |
instance_state = gr.State(initial_rows)
|
| 349 |
frame_state = gr.State([])
|
| 350 |
|
| 351 |
+
filter_inputs = [
|
| 352 |
+
model_name,
|
| 353 |
+
material_name,
|
| 354 |
+
env_name,
|
| 355 |
+
has_glass,
|
| 356 |
+
is_generated,
|
| 357 |
+
transparent,
|
| 358 |
+
near_light,
|
| 359 |
+
]
|
| 360 |
+
filter_outputs = [
|
| 361 |
+
summary,
|
| 362 |
+
instance_gallery,
|
| 363 |
+
instance_state,
|
| 364 |
+
instance_meta,
|
| 365 |
+
model_viewer,
|
| 366 |
+
rgb_image,
|
| 367 |
+
mask_image,
|
| 368 |
+
depth_image,
|
| 369 |
+
normal_image,
|
| 370 |
+
frame_slider,
|
| 371 |
+
frame_state,
|
| 372 |
+
]
|
| 373 |
+
for filter_component in filter_inputs:
|
| 374 |
+
filter_component.change(
|
| 375 |
+
fn=filter_gallery,
|
| 376 |
+
inputs=filter_inputs,
|
| 377 |
+
outputs=filter_outputs,
|
| 378 |
+
)
|
| 379 |
+
instance_gallery.select(
|
| 380 |
+
fn=on_instance_select,
|
| 381 |
+
inputs=[instance_state],
|
| 382 |
outputs=[
|
|
|
|
|
|
|
|
|
|
| 383 |
instance_meta,
|
| 384 |
model_viewer,
|
| 385 |
+
rgb_image,
|
| 386 |
+
mask_image,
|
| 387 |
+
depth_image,
|
| 388 |
+
normal_image,
|
| 389 |
frame_slider,
|
| 390 |
frame_state,
|
| 391 |
],
|
| 392 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 393 |
frame_slider.change(
|
| 394 |
fn=on_frame_change,
|
| 395 |
inputs=[frame_slider, frame_state],
|
| 396 |
+
outputs=[rgb_image, mask_image, depth_image, normal_image],
|
| 397 |
)
|
| 398 |
|
| 399 |
return demo
|