""" 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)