Pixeltable + Label Studio

Label Studio is the annotator UI, QA, and reviewer workflow. Pixeltable is the versioned multimodal pipeline those labels feed. They do not replace each other. There is no Pixeltable Label Studio package anymore; export JSON and insert it.

pip install 'pixeltable[serve]'
See how it works

Different jobs

SidePixeltableLabel Studio
At a glance
  • Video, frames, detections, and labels as tables
  • Computed columns run models on insert
  • Versioned rows you can query after review
  • No annotator UI, consensus, or project roles
  • Custom labeling UI and taxonomies
  • Annotators, reviewers, and QA workflows
  • ML-assisted pre-labels you already use
  • Not a compute engine or embedding index

Human QA vs the production table

Pixeltable v0.6.7 removed pxt.io.create_label_studio_project and table.sync(). The join is Label Studio’s export and a Json column.

FeaturePixeltableLabel Studio
Job
Store media, run models, version the result
Collect and QA human labels
Annotator UI
None — dashboard is for tables, not labeling tasks
Configurable views, hotkeys, and project UX
QA and roles
Data versioning; not annotator consensus
Reviewers, agreement, and project permissions
Downstream compute
Iterators, UDFs, indexes on the labeled rows
Export; processing happens in something else
How they join now
Insert exported JSON into a Json column
Projects, tasks, and export APIs

Export, then insert

Label Studio owns the project and the XML config. Pixeltable owns frames and the Json those tasks become. Apply Pixeltable with pxt schema update app.py annotation.

Pixeltable

import pixeltable as pxt
from pixeltable.functions.video import frame_iterator
from pixeltable.functions.huggingface import detr_for_object_detection
TableModel = pxt.model_base()
class Videos(TableModel, name='videos'):
video: pxt.Video
class Frames(
TableModel,
name='frames',
base=Videos,
iterator=frame_iterator(Videos.video, fps=1),
):
detections = detr_for_object_detection(
frame, model_id='facebook/detr-resnet-50'
)
class Labels(TableModel, name='labels'):
task_id: pxt.String
frame_url: pxt.String
annotation: pxt.Json
reviewed: pxt.Bool
# pxt schema update app.py annotation
# After Label Studio export:
labels = pxt.get_table('annotation.labels')
labels.insert(exported_tasks)

Label Studio

from label_studio_sdk import Client
ls = Client(url='http://localhost:8080', api_key=API_KEY)
label_config = '''
<View>
<Image name="image" value="$image"/>
<RectangleLabels name="label" toName="image">
<Label value="Person"/>
</RectangleLabels>
</View>
'''
project = ls.start_project(title='Video frames', label_config=label_config)
project.import_tasks([{'image': url} for url in frame_urls])
# Annotators and reviewers work in the Label Studio UI.
exported_tasks = project.export_tasks()
# Pixeltable has no create_label_studio_project; insert this JSON.

When each belongs

Use Pixeltable when

  • After the labels exist

    Frames, pre-detections, embedding indexes, and training export. Incremental recompute when a new export lands.

  • You already have a labeling tool

    Keep it. Pixeltable is the system of record downstream, not a second labeling UI.

Use Label Studio when

  • Humans have to agree on boxes

    Taxonomies, reviewer workflows, custom interfaces. Pixeltable will not do this.

  • ML-assisted labeling in that UI

    Pre-annotation backends and active learning inside Label Studio. Send model output in; do not expect Pixeltable to host the annotators.

Making the right choice

  • The native integration is gone

    • Pixeltable v0.6.7 removed external stores and Label Studio (PR #1436). pxt.io.create_label_studio_project and table.sync() are not in current Pixeltable.
    • docs.pixeltable.com may still show the old howto; do not copy it.
    • There is no pixeltable[labelstudio] extra. Export JSON. Insert Json.

Frequently asked questions

Labels from the tool that does labeling.

Declare tables in app.py. Apply with pxt schema update. Insert exported annotations as Json. Do not look for a Pixeltable Label Studio extra.

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