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]'Different jobs
| Side | Pixeltable | Label Studio |
|---|---|---|
| At a glance |
|
|
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.
| Feature | Pixeltable | Label 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 pxtfrom pixeltable.functions.video import frame_iteratorfrom pixeltable.functions.huggingface import detr_for_object_detectionTableModel = pxt.model_base()class Videos(TableModel, name='videos'):video: pxt.Videoclass 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.Stringframe_url: pxt.Stringannotation: pxt.Jsonreviewed: 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 Clientls = 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.