Pixeltable + FiftyOne
FiftyOne is eyes on the dataset: the App, zoo models, COCO-style evaluation, plugins. Pixeltable is the production table: incremental inference, versioning, serving. Explore in FiftyOne. Produce in Pixeltable. Export with pxt.io.export_images_as_fo_dataset.
pip install 'pixeltable[serve]'Eyes vs the production table
| Side | Pixeltable | Voxel51 (FiftyOne) |
|---|---|---|
| At a glance |
|
|
Curation and eval vs incremental pipelines
Pixeltable loses the visual debugger. FiftyOne is not “limited multimodal” in 2026. Do not mark Pixeltable the winner on data types.
| Feature | Pixeltable | Voxel51 (FiftyOne) |
|---|---|---|
| Job | Production tables, incremental compute, serving | Dataset visualization, curation, and CV eval |
| Looking at the data | pxt dashboard and queries; not a CV visualizer | FiftyOne App — this is why people open it |
| Model eval | Computed columns and aggregates you write | evaluate_detections, zoo models, mistake views |
| Incremental production | Computed columns on insert; lineage in the catalog | Apply a model to a dataset; you re-run when the set changes |
| Modalities | Image, Video, Audio, Document, Json in one schema | Images, video, 3D, audio, and plugins — not a “CV-only leftover” |
| Join | pxt.io.export_images_as_fo_dataset | Load the exported Dataset and launch_app |
Produce, then look
Pixeltable runs DETR on insert and exports a FiftyOne dataset. FiftyOne loads a zoo set, applies a model, and opens the App. Apply Pixeltable with pxt schema update app.py cv.
Pixeltable
import fiftyone as foimport pixeltable as pxtfrom pixeltable.functions.huggingface import detr_for_object_detectionTableModel = pxt.model_base()class Images(TableModel, name='images'):image: pxt.Imagedetections = detr_for_object_detection(image, model_id='facebook/detr-resnet-50')# pxt schema update app.py cvimages = pxt.get_table('cv.images')images.insert([{'image': 'frame.jpg'}])@pxt.udfdef detr_to_fo(img: pxt.Image, detr_labels: dict) -> list:boxes = []for label, box, score in zip(detr_labels['label_text'],detr_labels['boxes'],detr_labels['scores'],):x1, y1, x2, y2 = boxboxes.append({'label': label,'confidence': score,'bounding_box': [x1 / img.width,y1 / img.height,(x2 - x1) / img.width,(y2 - y1) / img.height,],})return boxesfo_dataset = pxt.io.export_images_as_fo_dataset(images,images.image,detections=detr_to_fo(images.image, images.detections),)session = fo.launch_app(fo_dataset)
Voxel51 (FiftyOne)
import fiftyone as foimport fiftyone.zoo as fozfrom fiftyone import ViewField as Fdataset = foz.load_zoo_dataset('quickstart')model = foz.load_zoo_model('yolov5s-coco-torch')dataset.apply_model(model, label_field='predictions')session = fo.launch_app(dataset)results = dataset.evaluate_detections('predictions',gt_field='ground_truth',eval_key='eval',)high_precision = dataset.match(F('eval.precision') > 0.8)high_precision.export(export_dir='./curated')# Pixeltable does not ship this App or evaluate_detections.
When each belongs
Use Pixeltable when
- The table is the product
New images should run the model without a notebook re-apply. You need versioning, HTTP, or an embedding index on production rows.
- You already curate in FiftyOne
Keep the App. Export from Pixeltable when you want eyes on model output. Howto: docs.pixeltable.com/howto/working-with-fiftyone
Use Voxel51 (FiftyOne) when
- You need to see the dataset
Embeddings projector, mistake slices, plugins. Pixeltable dashboard is not a substitute.
- CV eval is the job this week
Zoo models, evaluate_detections, COCO-style metrics. Do not migrate off FiftyOne for that.
Making the right choice
Do not “switch from FiftyOne”
- Explore and eval in FiftyOne. Produce in Pixeltable.
- Pixeltable is not a 3D/time-series visualizer. FiftyOne is stronger there.
- The join is export_images_as_fo_dataset, not a hidden rewrite of the App.
Frequently asked questions
Produce in the schema. Look at it in FiftyOne.
Declare tables in app.py. Apply with pxt schema update. Export images into the FiftyOne App when you need eyes on the set.