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]'
See how it works

Eyes vs the production table

SidePixeltableVoxel51 (FiftyOne)
At a glance
  • Image and video tables with computed model columns
  • Insert runs inference; only new rows recompute
  • HTTP from the same file if you declare it
  • No FiftyOne App, no zoo, no evaluate_detections
  • Interactive App for embeddings, mistakes, and slices
  • Model zoo, plugins, 3D / video / audio samples
  • evaluate_detections and dataset curation workflows
  • Not an application backend or embedding-index-as-schema

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.

FeaturePixeltableVoxel51 (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 fo
import pixeltable as pxt
from pixeltable.functions.huggingface import detr_for_object_detection
TableModel = pxt.model_base()
class Images(TableModel, name='images'):
image: pxt.Image
detections = detr_for_object_detection(
image, model_id='facebook/detr-resnet-50'
)
# pxt schema update app.py cv
images = pxt.get_table('cv.images')
images.insert([{'image': 'frame.jpg'}])
@pxt.udf
def 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 = box
boxes.append({
'label': label,
'confidence': score,
'bounding_box': [
x1 / img.width,
y1 / img.height,
(x2 - x1) / img.width,
(y2 - y1) / img.height,
],
})
return boxes
fo_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 fo
import fiftyone.zoo as foz
from fiftyone import ViewField as F
dataset = 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.

pip install 'pixeltable[serve]'
See how it worksGet expert guidance