Asnly commited on
Commit
0d2ccd6
·
verified ·
1 Parent(s): 8e67690

Deploy Space app files

Browse files
Files changed (1) hide show
  1. app.py +60 -40
app.py CHANGED
@@ -169,25 +169,26 @@ def load_instance_frames(
169
  return frames
170
 
171
 
172
- def render_frame_gallery(frame_items: list[dict[str, Any]], frame_index: float) -> list[tuple[Any, str]]:
173
- """Render RGB/Mask/Depth/Normal gallery for one selected frame index (1-based)."""
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
- gallery: list[tuple[Any, str]] = []
183
- for key, label in [
184
- ("rgb", "RGB"),
185
- ("mask", "Mask"),
186
- ("depth_preview", "Depth"),
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, [], slider_empty, []
269
 
270
  def on_instance_select(rows: list[dict[str, Any]], evt: gr.SelectData):
271
  if not rows:
272
- return {}, None, [], gr.update(minimum=1, maximum=1, step=1, value=1, interactive=False), []
 
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"]), render_frame_gallery(frame_items, 1), slider_ready, frame_items
291
 
292
  def on_frame_change(frame_idx: float, frame_items: list[dict[str, Any]]):
293
- return render_frame_gallery(frame_items, frame_idx)
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
- frame_gallery = gr.Gallery(label="RGB / Mask / Depth / Normal", columns=4, rows=1, object_fit="contain", height="auto")
 
 
 
 
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
- filter_btn.click(
347
- fn=filter_gallery,
348
- inputs=[
349
- model_name,
350
- material_name,
351
- env_name,
352
- has_glass,
353
- is_generated,
354
- transparent,
355
- near_light,
356
- ],
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
357
  outputs=[
358
- summary,
359
- instance_gallery,
360
- instance_state,
361
  instance_meta,
362
  model_viewer,
363
- frame_gallery,
 
 
 
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=[frame_gallery],
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