## hf_space_mini_tug Requirements This directory contains the Streamlit application that runs on Hugging Face Spaces and visualizes each episode. ### Files - `app.py` – Streamlit entrypoint. Downloads the dataset via `snapshot_download`, exposes an episode selector, video player, and Plotly charts. - `requirements.txt` – Python dependencies (`streamlit`, `plotly`, `pandas`, `huggingface_hub`). - `README.md` – Hub metadata (SDK = Streamlit). ### Data Contract `app.py` expects the dataset `raffaelkultyshev/mini_tug_tape_to_bowl` to have: - `meta/info.json` describing `episodes`, `data_path`, and `video_path`. - Parquet files with either: 1. LeRobot-style `observation.state` columns (`list`) **or** 2. Long-form `frame_idx`, `joint_name`, `x_cm`, etc. produced by `hand_pose_pipeline.py`. - RGB MP4s encoded as H.264 / yuv420p / faststart (`videos/chunk-000/rgb/...`). ### Internal Logic 1. `get_dataset_revision()` uses `HfApi.repo_info` so Streamlit caches auto-invalidate when the dataset updates. 2. `load_episode()` reads the Parquet file and, via `build_state_dataframe`, pivots the long table back into the `[wrist_x_cm, ...]` format used by the charts. - This function enforces accuracy bounds by reindexing frames and rejecting missing joint rows. 3. Plots are generated with Plotly (`build_plot`) and share the same axis scaling as the offline PNGs. ### Accuracy Guarantees - Streamlit charts display the exact values computed by `hand_pose_pipeline.py`. No down-sampling is performed. - If gaps exist, the app surfaces `NaN` segments directly, ensuring transparency about measurement uncertainty (<3 mm XYZ, <5° angles as validated in `scripts/Requirements.md`). ### Deployment - Use `huggingface_hub.HfApi.upload_folder(folder_path='hf_space_mini_tug', repo_type='space')`. - Before deploying, regenerate the `dataset_cache/` by running the app locally or deleting the cache to avoid shipping stale data.***