Querying Physical AI Data with Daft Apple's EgoDex hand-manipulation dataset can now be queried using natural language and geometric features via Daft, an open-source data framework. The approach combines SigLIP semantic embeddings with hand-pose geometry to enable search across unlabeled video clips, addressing the data understanding problem in robotics and autonomous vehicle training. Daft's new Hdf5File type allows ingestion of HDF5-formatted robotics datasets for multimodal retrieval. Back to Blog /blog Finding a Needle in the Haystack: Querying Physical AI Data with Daft Pose + semantic search over Apple's EgoDex hand-manipulation dataset with Daft: SigLIP embeddings meet hand-pose geometry. Ctrl+F for physical AI data. by Shreyas Garimella TL;DR We ran Daft on Apple's EgoDex and showed what Daft makes possible: searching on video using natural language queries combining frame-level semantic embeddings and geometric features, i.e., “find every clip in my dataset where a writing-gripped hand lifts chopsticks.” Using Daft, you can now CTRL+F over your robotics dataset. All the code in this post is open source in daft-examples : the library and a runnable notebook, datasets/egodex . egodex demo.ipynb The Menu Problem Historically, robots have performed tasks listed on a pre-defined menu. An Amazon Kiva used to only need to know how to move shelving pods from storage to picker stations. Your Roomba only needs to know how to clean your floor. This made dataset curation somewhat hand-curatable. Using carefully set up experiments, a researcher or engineer could easily generate data for a specific task. Contents of the dataset were easily known by construction. | Amazon Kiva | Roomba | |---|---| In uncontrolled environments, that assumption falls apart. When training a clothes-folding robot, you can’t enumerate every garment configuration in advance. So instead of designing experiments, you outfit humans with head-mounted cameras and let them fold, reach, and grasp, hoping that the world provides the variation needed to capture the full distribution of data. That data doesn’t come labeled. When you need to later audit your training mix or retrain on failure cases like a tangled sleeve, silk blouse, inside-out sock , you have no idea where those moments are. Scale that up even further: A fleet of 500 autonomous vehicles uploads petabytes of video and sensor data to the cloud every day. How do you, as a researcher, identify your near crashes and traffic violations amongst hundreds of 100k+ hours of video for re-training? Your data is no longer served off a menu. The data just arrives, continuously growing faster than anyone could understand it, and what’s in it isn’t well-known: it needs to be discovered. How do you retrieve a specific subset of data based on unlabeled multimodal features for downstream task fine-tuning? How can you find difficult edge cases and failures within your data? This is the data understanding problem most frontier robotics labs are facing. Finding a Needle in the Haystack: EgoDex EgoDex https://github.com/apple/ml-egodex is Apple’s egocentric dataset consisting of paired hand pose annotations and head-view video across varying tabletop tasks. It’s full of unique scenarios and rich sensor and video data, making it a perfect candidate for multimodal understanding. But it runs into the menu problem. For example, the task description “fold a small t-shirt on a wooden table while sitting” obscures some important geometric and visual primitives. How can I tell if my training mix is short on twisting actions? How can I select a subset of episodes where the person holds something with a tight hammer grip? Let's see how Daft can provide the solution. Ingesting the EgoDex Dataset In the HDF5 file format, a single file holds many named n-dimensional arrays plus metadata, like a tiny filesystem per file. Since EgoDex as well as many other robotics datasets come packaged in the HDF5 format, we decided to write a new Hdf5File type with native support in Daft, alongside existing types like VideoFile, AudioFile, etc. Download the raw EgoDex dataset from Apple here: Every EgoDex episode is one {i}.hdf5 the hand-pose transforms sitting next to a corresponding {i}.mp4 the head-cam video . EgoDexPipeline turns that directory into a per-frame DataFrame in three lazy steps — file discovery, pose-tensor reads, and a per-frame explode: HDF5 to Daft Implementation Details raw discovers episodes with daft.from glob path , derives task and episode id from each path, and attaches the files as native Hdf5File and VideoFile columns — no bytes read yet. A small @daft.func UDF pulls the task metadata from the HDF5 attributes, and file exists guards episodes whose sibling video is missing: trajectory reads only the transform datasets the pose features need, as whole-episode tensors, through one struct-returning UDF unnest=True fans the struct out into columns : frame features then runs the spatial hand geometry per episode inside one UDF and explodes the result into one row per frame keyed by task, episode id, frame index — the math behind those columns is below. Here's what your dataframe output should look like after reading the first 3 rows: Here are some example videos abridged schemas : | episode id | frame index | task | observation.state | observation.skeleton | |---|---|---|---|---|