Reference architecture
Robotics episode curation reference architecture
Episode curation keeps robot teleop or autonomy runs as rows: a clip, JSON telemetry, a success flag, sampled stills, detections, and an index so a new run retrieves similar successes and failures. FiftyOne and Rerun are the visualizers. Pixeltable is the production table those exports come from.
Updated · Matching docs cookbook
A robotics dataset is multimodal whether or not the training code says so: video, joint trajectories, gripper states, language instructions, and a success label. Curation is finding the runs you will keep, the stills that show a failure, and the nearest successful episode to a new attempt.
This page is the production table. FiftyOne is the dataset App for visual review (Pixeltable vs Voxel51). Rerun and Foxglove are streaming visualizers. LeRobot is a dataset layout for policy training. Keep those tools; export into them. Do not pretend Pixeltable is a robot runtime.
Episode curation: a run becomes stills, detections, and similar episodes
Role of each component
- Episode row
- robot_id, task, success, a Video column, and Json telemetry. The clip and the log stay on one row so a still can join back to joints.
- Frame view
- frame_iterator at a rate you can afford. fps=1 is a starting point for long teleop. Each still keeps frame_attrs.
- Detector
- yolox on the still. COCO ids (person=0, car=2) are a starting point. A task-specific detector is a UDF you own; Pixeltable does not ship a robot-part model.
- Similarity index
- CLIP on the frame so a language instruction or a still retrieves episodes. Optional text index on the task string.
- Curation queries
- Success versus failure, frames whose labels contain a class, nearest neighbors to a new attempt.
- Export
- Optional. FiftyOne for visual QA, LeRobot or Parquet for training. The table remains the source of truth.
Honest alternatives per slot
Keep the named engine when it is already the contract. Pixeltable fills the slot when you want that job on the same table as the files.
| Slot | Role | Pixeltable | Named alternatives |
|---|---|---|---|
| Visualizer | Watch a live or recorded episode | Not a streaming visualizer. Store the clip; open it in a tool built for that |
|
| Dataset format | What training code reads | The episode table; export when a trainer needs a layout |
|
| Object store | Bytes for long videos | A Video column, or insert S3 URLs |
|
| Detector / embedder | Boxes and similar stills | yolox on frames; CLIP EmbeddingIndex on the frame column |
|
Where Pixeltable fits
Pixeltable is the episode table in this architecture: Video plus Json telemetry, frame_iterator, yolox, CLIP, and queries for success and similarity. Keep Rerun or Foxglove for the live timeline. Keep FiftyOne for interactive visual QA (pxt.io.export_images_as_fo_dataset is the documented export). Keep LeRobot as the training layout. Pixeltable vs Voxel51 is the App versus the production table. Pixeltable Cloud hosts the same app file. The industry page /industries/robotics is a worked warehouse-pick example on this shape.
import pixeltable as pxtfrom pixeltable.functions.huggingface import clipfrom pixeltable.functions.video import frame_iteratorfrom pixeltable.functions.yolox import yoloxTableModel = pxt.model_base()clip_embed = clip.using(model_id='openai/clip-vit-base-patch32')class Episodes(TableModel, name='episodes'):robot_id: pxt.Stringtask: pxt.Stringsuccess: pxt.Boolvideo: pxt.Videotelemetry: pxt.Jsonclass Frames(TableModel,name='frames',base=Episodes,iterator=frame_iterator(video=Episodes.video, fps=1),):detections = yolox(frame, model_id='yolox_s', threshold=0.5)__indexes__ = [pxt.EmbeddingIndex(frame, embedding=clip_embed),]@pxt.querydef similar_successes(question: str, limit: int = 5):sim = Frames.frame.similarity(string=question)return (Frames.where(Episodes.success == True).order_by(sim, asc=False).limit(limit).select(robot_id=Episodes.robot_id,task=Episodes.task,frame_attrs=Frames.frame_attrs,score=sim,))# detections["labels"] is COCO class ids. 0 is person.# frame_attrs["time"] is the presentation timestamp in seconds.# pxt init# pxt schema update app.py episodes -f
To run a sketch, install pixeltable[serve] and the packages its model functions import (such as sentence-transformers, openai, or openai-whisper), export the provider key a model call reads (such as OPENAI_API_KEY), save the file as app.py, and run the commands in its last lines. The tables start empty: insert a row, or POST to an insert route, then select the computed columns. Get started covers the CLI.