Spaces:
Running
Running
""" | |
Demonstrates integrating Rerun visualization with Gradio. | |
Provides example implementations of data streaming, keypoint annotation, and dynamic | |
visualization across multiple Gradio tabs using Rerun's recording and visualization capabilities. | |
""" | |
import math | |
import os | |
import tempfile | |
import time | |
import uuid | |
import cv2 | |
import gradio as gr | |
import rerun as rr | |
import rerun.blueprint as rrb | |
from gradio_rerun import Rerun | |
from gradio_rerun.events import ( | |
SelectionChange, | |
TimelineChange, | |
TimeUpdate, | |
) | |
from gradio_huggingfacehub_search import HuggingfaceHubSearch | |
from huggingface_hub import HfApi, HfFileSystem | |
from pathlib import Path | |
API = HfApi() # thin REST wrapper | |
FS = HfFileSystem() # fsspec-style filesystem :contentReference[oaicite:0]{index=0} | |
REPO = "pablovela5620/ego-dex-rrd" | |
SEQUENCE_NAMES = [ | |
"add_remove_lid", | |
"arrange_topple_dominoes", | |
"assemble_disassemble_furniture_bench_chair", | |
"assemble_disassemble_furniture_bench_desk", | |
"assemble_disassemble_furniture_bench_drawer", | |
"assemble_disassemble_furniture_bench_lamp", | |
"assemble_disassemble_furniture_bench_square_table", | |
"assemble_disassemble_furniture_bench_stool", | |
"assemble_disassemble_legos", | |
"assemble_disassemble_soft_legos", | |
"assemble_disassemble_structures", | |
"assemble_disassemble_tiles", | |
"assemble_jenga", | |
"basic_fold", | |
"basic_pick_place", | |
"boil_serve_egg", | |
"braid_unbraid", | |
"build_unstack_lego", | |
"charge_uncharge_airpods", | |
"charge_uncharge_device", | |
"clean_cups", | |
"clean_surface", | |
"clean_tableware", | |
"clip_unclip_papers", | |
"color", | |
"crumple_flatten_paper", | |
"deal_gather_cards", | |
"declutter_desk", | |
"dry_hands", | |
"fidget_magnetic_spinner_rings", | |
"flip_coin", | |
"flip_pages", | |
"fold_stack_unstack_unfold_cloths", | |
"fold_unfold_paper_basic", | |
"fold_unfold_paper_origami", | |
"fry_bread", | |
"fry_egg", | |
"gather_roll_dice", | |
"insert_dump_blocks", | |
"insert_remove_airpods", | |
"insert_remove_bagging", | |
"insert_remove_bookshelf", | |
"insert_remove_cups_from_rack", | |
"insert_remove_drawer", | |
"insert_remove_furniture_bench_cabinet", | |
"insert_remove_furniture_bench_round_table", | |
"insert_remove_plug_socket", | |
"insert_remove_shirt_in_tube", | |
"insert_remove_tennis_ball", | |
"insert_remove_usb", | |
"insert_remove_utensils", | |
"knead_slime", | |
"load_dispense_ice", | |
"lock_unlock_key", | |
"make_sandwich", | |
"measure_objects", | |
"open_close_insert_remove_box", | |
"open_close_insert_remove_case", | |
"open_close_insert_remove_tupperware", | |
"paint_clean_brush", | |
"peel_place_sticker", | |
"pick_place_food", | |
"pick_up_and_put_down_case_or_bag", | |
"play_mancala", | |
"play_piano", | |
"play_reset_connect_four", | |
"point_and_click_remote", | |
"pour", | |
"push_pop_toy", | |
"put_away_set_up_board_game", | |
"put_in_take_out_glasses", | |
"put_toothpaste_on_toothbrush", | |
"rake_smooth_zen_garden", | |
"roll_ball", | |
"scoop_dump_ice", | |
"screw_unscrew_allen_fixture", | |
"screw_unscrew_bottle_cap", | |
"screw_unscrew_fingers_fixture", | |
"set_up_clean_up_chessboard", | |
"setup_cleanup_table", | |
"sleeve_unsleeve_cards", | |
"slot_batteries", | |
"sort_beads", | |
"stack", | |
"stack_remove_jenga", | |
"stack_unstack_bowls", | |
"stack_unstack_cups", | |
"stack_unstack_plates", | |
"stack_unstack_tupperware", | |
"staple_paper", | |
"stock_unstock_fridge", | |
"sweep_dustpan", | |
"thread_unthread_bead_necklace", | |
"throw_and_catch_ball", | |
"throw_collect_objects", | |
"tie_and_untie_shoelace", | |
"tie_untie_rubberband", | |
"type_keyboard", | |
"use_chopsticks", | |
"use_rubiks_cube", | |
"vertical_pick_place", | |
"wash_fruit", | |
"wash_kitchen_dishes", | |
"wash_put_away_dishes", | |
"wipe_kitchen_surfaces", | |
"wipe_screen", | |
"wrap", | |
"wrap_unwrap_food", | |
"write", | |
"zip_unzip_bag", | |
"zip_unzip_case", | |
] | |
def show_dataset(task_name: str, episode_index: str): | |
episode_index = f"{int(episode_index):05d}" | |
url_str = f"https://huggingface.co/datasets/pablovela5620/ego-dex-rrd/resolve/main/{task_name}/{episode_index}.rrd" | |
return url_str | |
def list_episodes(task:str) -> list[str]: | |
""" | |
Return ["00000", "00001", ...] for the chosen task folder. | |
""" | |
# fastest: one HTTP hit that returns the whole tree once | |
files = API.list_repo_files(REPO, repo_type="dataset") | |
return sorted( | |
{Path(f).stem for f in files | |
if f.startswith(f"{task}/") and f.endswith(".rrd")} | |
) | |
default_task = SEQUENCE_NAMES[0] # "add_remove_lid" | |
initial_eps = list_episodes(default_task) # ["00000", "00001", …] | |
with gr.Blocks() as demo: | |
with gr.Tab("Hosted RRD"): | |
with gr.Row(): | |
with gr.Column(scale=1): | |
task_name = gr.Dropdown( | |
label="Task Name", | |
choices=SEQUENCE_NAMES, | |
value=default_task, | |
) | |
episode_index = gr.Dropdown( | |
label="Episode Index", | |
choices=initial_eps, | |
value=initial_eps[0] if initial_eps else None, | |
) | |
def _update_eps(t): # Gradio wants a fn | |
eps = list_episodes(t) | |
return gr.update(choices=eps, value=eps[0] if eps else None) | |
task_name.change(_update_eps, inputs=task_name, outputs=episode_index) | |
button = gr.Button("Show Dataset") | |
with gr.Column(scale=4): | |
viewer = Rerun( | |
streaming=True, | |
panel_states={ | |
"time": "collapsed", | |
"blueprint": "hidden", | |
"selection": "hidden", | |
}, | |
) | |
# choose_rrd.change(lambda x: x, inputs=[choose_rrd], outputs=[viewer]) | |
button.click( | |
fn=show_dataset, | |
inputs=[task_name, episode_index], | |
outputs=[viewer] | |
) | |
if __name__ == "__main__": | |
demo.launch(ssr_mode=False) |