插件兼容性建议用 Python 3.10,例如 SAM 自动标注插件;GUI 默认起在 localhost:8001,可用 host 和 port 参数改;quickstart 会先下载示例数据集,用自己的数据需先跑 Python 脚本索引再启动服务。

pip install lightly-studio
lightly-studio quickstartREADME 称在单台 M1、16GB 内存的 MacBook 上可流畅处理 200 万张以上图像(含嵌入);未说明 GPU 或显存要求。
本地跑的多模态数据平台,在浏览器里策展、标注和管理图像视频数据集
面向多模态机器学习的数据平台,支持图像标注、数据筛选与清洗,帮助团队管理训练数据并提升数据质量。
核心能力
- 用嵌入图与套索选择按簇过滤样本
- 支持 COCO、YOLO、文件夹与视频帧索引
- 用采样挑选典型且多样的样本降低标注成本
- 对比预测与真值做模型评估并导出问题样本
- 通过插件调用 SAM 等模型自动标注
容易踩的坑
- v1.2.1最新正式版2026-11-02 · 2026-11-02 15:25 UTC
Changelog
Added
-
Annotations
- Label with the "Smart select" and "Find all instances" assisted labeling tools in the sample details view, which save results as segmentation masks or bounding boxes. The tools use SAM 3 on fal.ai, need the
falextra (pip install "lightly-studio[fal]") and theFAL_KEYenvironment variable, and send images to fal.ai. - Delete selected annotations in bulk from the annotation grid.
- Set the opacity of segmentation masks with the "Mask opacity" slider in the sample details view.
- Reset brightness, contrast, and mask opacity to their defaults with one button in the sample details view.
- Label with the "Smart select" and "Find all instances" assisted labeling tools in the sample details view, which save results as segmentation masks or bounding boxes. The tools use SAM 3 on fal.ai, need the
-
Filtering
- See histograms of the image width and height in the distribution panel of image datasets, and compare them by tag. Select a range on a histogram to filter the images by width or height.
- Use metadata and boolean values in the query editor, with hover help and a metadata filter example.
-
Other
- Python SDK:
connect()trusts the custom CA certificates of an S3-compatible storage when the enterprise instance provides them.
- Python SDK:
Changed
-
Embedding plot
- Saved embedding plots now load in milliseconds instead of seconds on datasets with over 100k samples.
-
Settings
- The settings dialog is organized in tabs.
- "Save changes" in the settings dialog is enabled only when there are changes to save.
-
Other
- The sample details view keeps collapsed and hidden annotation sources when you go to another sample. A page reload restores the defaults.
- DuckDB database files retain a format readable by DuckDB 1.x when created or updated with DuckDB 2.x.
Removed
- BREAKING: Dropped Python 3.9 support. Upgrade to Python 3.10–3.14.
Fixed
-
Annotations
- Labeling with superpixels no longer skips cells or leaves pixels behind.
- Existing selections no longer disappear while you paint with superpixels, and selecting many cells is faster.
- Brush, eraser, and box drawing previews now use the custom color of the label.
- In the annotation grid, changing the class after "Select all" now changes every selected annotation, not only the first 100. The selected annotations count and undo also cover all of them.
- In Safari, the image in the details view has the correct size again, so annotations and labeling tools line up with it and show on top of it.
-
Filtering
- The header of the filters panel, with the button to hide the panel, stays visible when you scroll the filters. You no longer have to scroll back to the top to hide the panel.
- In the distribution panel, metadata bars now include images without annotations. Before, those images showed as filtered out even with no filters set.
- The distribution panel keeps the selected plot when you open a sample and go back to the grid.
-
Other
- In the settings dialog, pressing Escape while setting a shortcut now cancels the change instead of closing the dialog. The "Go back" shortcut is now always Escape and can no longer be changed.
- Exporting from the export dialog no longer fails on Windows.
- Python SDK:
add_samples_from_coconow shows the real cause when it cannot read the annotations file from cloud storage.
What's Changed
- Add: Smart select preview logic by @iunir in https://github.com/lightly-ai/lightly-studio/pull/2834
- feat: add the evaluation class metric table by @lorinczszabolcs in https://github.com/lightly-ai/lightly-studio/pull/2381
- Fix: Scale the sample image correctly in Safari by @iunir in https://github.com/lightly-ai/lightly-studio/pull/2915
- Add: Smart select overlay and pop-up by @iunir in https://github.com/lightly-ai/lightly-studio/pull/2835
- Add: Smart select tool by @iunir in https://github.com/lightly-ai/lightly-studio/pull/2836
- Add context-aware metadata query completions by @lukas-lightly in https://github.com/lightly-ai/lightly-studio/pull/2920
- Add
-
- v1.2.02026-10-23 · 2026-10-23 08:01 UTC
查看更新说明
Changelog
Added
-
Evaluation
- Edit the settings of an evaluation and rerun it, in the evaluation panel or the API.
- Delete an evaluation in the evaluation panel or the API. Annotations stay unchanged, and filters that use the evaluation are removed.
-
Filtering
- Filter by metadata in the query editor, e.g.
metadata["score"] >= 0.8. - Python SDK: Filter images and videos by metadata, including nested fields, e.g.
ImageSampleField.metadata["odometry.speed"] < 15. - Filter captions by tag and metadata in the captions tab.
- Reset all filters with one click with the new "Clear all filters" button.
- Filter by metadata in the query editor, e.g.
-
Annotations
- Copy an annotation to another annotation source in the details view, or create a new source while you copy.
- Set your own keyboard shortcut for AI-assisted labeling in the settings.
-
Other
- Get started quickly with a short onboarding tour on image datasets.
- See why a button is disabled in its tooltip.
- Show sharp pixel edges when you zoom into images with the new image interpolation setting.
- Python SDK: Embed video frames on a remote embedding server registered with
register_default_embedder. - Python SDK: Report anonymous usage data on how data is loaded (format and source). Set
LIGHTLY_STUDIO_ANALYTICS_ENABLED=falseto opt out.
Changed
-
Tags
- BREAKING: A tag now holds only samples of its own collection, and tags no longer have a
kindfield. PostgreSQL migrates automatically. DuckDB users must re-index their data before they create tags. - Adding many samples to a tag is faster.
- BREAKING: A tag now holds only samples of its own collection, and tags no longer have a
-
Embeddings
- BREAKING: Python SDK: Image search in the GUI now needs an embedder that implements
ImageBytesEmbedder. Implement it in your custom embedder to keep image search. - Python SDK: New video datasets embed frames with Perception Encoder (
PE-Core-T16-384) instead of MobileCLIP. Existing datasets are not changed. - Python SDK: Crops and frames are embedded automatically with a previously used compatible remote embedder.
- BREAKING: Python SDK: Image search in the GUI now needs an embedder that implements
-
Embedding plot
- Set the text axes with the new "Define axes" button. The applied texts show at the plot edges, and "Reset axes" returns to PaCMAP.
- Text axes are now balanced and comparable. Lines at x = 0 and y = 0 split the plot into four parts, and axes with weak text matches now look small.
- Points that are filtered out or have no category are easier to see on dark backgrounds.
-
Evaluation
- The evaluation panel has clearer settings and confusion matrix filters. Sorts are grouped by metric, show the highest counts first, and mark missing results.
- Python SDK:
dataset.evaluate()and evaluation recompute are faster on large datasets.
-
Other
- Python SDK:
start_gui()opens the browser. Passopen_browser=False, or uselightly-studio gui --no-browser, to turn this off.
- Python SDK:
Fixed
-
Annotations
- Annotation cards stay aligned, source colors stay stable, and confidence stays visible when you hide annotations or switch to editing.
- Deleting annotations now also deletes their captions.
-
Evaluation
- Evaluation results are kept when a recompute fails.
-
Other
- The grids return to the exact scroll position when you go back from the details view.
- Python SDK:
start_gui()stops cleanly on Ctrl+C, without a traceback. - The GUI footer no longer shows a dev commit hash for released versions.
What's Changed
- Bump lightly-studio-serve version to 0.1.2 by @github-actions[bot] in https://github.com/lightly-ai/lightly-studio/pull/2738
- Add: Configurable ai assisted labeling shortcut by @IgorSusmelj in https://github.com/lightly-ai/lightly-studio/pull/2730
- Do not skip frames without all components matched by @horatiualmasan in https://github.com/lightly-ai/lightly-studio/pull/2739
- fix(point clouds): select inner cuboids and fill on hover/select by @LeonardoRosaa in https://
-
- v1.1.32026-10-07 · 2026-10-07 21:54 UTC
查看更新说明
Changelog
Added
- Add
quickstart-enterpriseCLI command to seed a remote enterprise instance with a demo dataset. - Python SDK: Index
.mcaprecordings into a dataset withMcapDataset.load_or_create(...)anddataset.add_mcaps_from_path(...). - Python SDK: Attach 3D cuboids and frame tags from annotation MCAPs with
dataset.add_labels_from_folder(...). A later call skips sequences that already have that annotation source. - Python SDK: Embed search queries on a remote embedding server with
register_remote_embedder. - Add AI-Assisted labeling with adjustable superpixels for creating and editing instance segmentation masks in WASM-capable browsers.
- Python SDK: Enable metric recomputing for instance-segmentation.
- Show the distribution panel on the videos grid in the GUI, with annotation class and metadata distributions.
- Python SDK: Embed images that are added after
register_remote_embedderon the remote embedding server, if the server embeds image bytes. - Python SDK: Store the URL and API key of a remote embedder that
register_default_embedderregistered before an import, so that a later process, such aslightly-studio gui, searches on the server with no new registration. - Python SDK: Embed annotation crops on a remote embedding server that
register_default_embedderregistered, if the server embeds image bytes.
Changed
- Redesign the embedding plot selection tools as visible, sticky Pan, Rectangle, and Lasso buttons in the GUI.
- Show the Rectangle and Lasso drag shortcuts in the embedding plot tool tooltips.
- Show categorical metadata filters in the image sidebar with an optional field picker and expanded value lists.
- Keep the query editor button enabled in the GUI. Clicking "Re-apply" refreshes the results with the current data.
- Move the Tags, Metadata, and Embeddings docs pages under Workflows and add Enterprise sign-up and demo buttons to the docs landing page. The old URLs redirect.
Fixed
- Disable the subpart diversity sampling strategy when no object detection or segmentation annotation sources exist in the collection.
- Combine typicality and similarity computation and sampling into one backend request that continues if the frontend disconnects.
- Fix the
Valuesfield in the distribution panel using a larger font than the other fields. - Fix the focus outline of the bulk annotation panel controls missing its left and right edges.
- Fix instance segmentation masks that cannot be selected with a click when their bounding boxes are hidden in the GUI.
- Fix undoing an annotation deletion restoring it to the default source instead of its original one.
- Return 409 instead of 500 for text and image search on a collection whose embedding space cannot embed the query, and 502 when its embedding server cannot be used.
- Python SDK: Keep the image embeddings stored before an embedder failure, and embed only the images without an embedding when the images are added again with
embed=True.
What's Changed
- Cover RemoteEmbedder protocol and routing edge cases by @iunir in https://github.com/lightly-ai/lightly-studio/pull/2388
- Increase Fast Track guardrail timeout by @lukas-lightly in https://github.com/lightly-ai/lightly-studio/pull/2436
- fix(gallery): prevent native image drag during selection by @breken-ai in https://github.com/lightly-ai/lightly-studio/pull/2310
- Give each remote capability its own timeout by @iunir in https://github.com/lightly-ai/lightly-studio/pull/2361
- Run the conformance kit from the command line (conformance kit 2/2) by @iunir in https://github.com/lightly-ai/lightly-studio/pull/2433
- Round-trip the remote embedder over a live socket by @iunir in https://github.com/lightly-ai/lightly-studio/pull/2362
- feat: introduce tick representation model by @ikondrat in https://github.com/lightly-ai/lightly-studio/pull/2440
- provide information about current ticks of mcap sequence.get tick channels by @ikondrat in https://github.com/lightly-ai/lightly-stu
- Add
- lightly-studio-serve/v0.1.22026-10-07 · 2026-10-07 21:54 UTC
查看更新说明
Changelog
Added
- Add the conformance kit,
lightly-studio-serve conformance <url>. It checks any server that claims to speak the protocol, reports one outcome per capability, and needs no dataset.
What's Changed
- Bump lightly-studio version to 1.1.2 by @github-actions[bot] in https://github.com/lightly-ai/lightly-studio/pull/2435
- Cover RemoteEmbedder protocol and routing edge cases by @iunir in https://github.com/lightly-ai/lightly-studio/pull/2388
- Increase Fast Track guardrail timeout by @lukas-lightly in https://github.com/lightly-ai/lightly-studio/pull/2436
- fix(gallery): prevent native image drag during selection by @breken-ai in https://github.com/lightly-ai/lightly-studio/pull/2310
- Give each remote capability its own timeout by @iunir in https://github.com/lightly-ai/lightly-studio/pull/2361
- Run the conformance kit from the command line (conformance kit 2/2) by @iunir in https://github.com/lightly-ai/lightly-studio/pull/2433
- Round-trip the remote embedder over a live socket by @iunir in https://github.com/lightly-ai/lightly-studio/pull/2362
- feat: introduce tick representation model by @ikondrat in https://github.com/lightly-ai/lightly-studio/pull/2440
- provide information about current ticks of mcap sequence.get tick channels by @ikondrat in https://github.com/lightly-ai/lightly-studio/pull/2444
- Add method in recording service to return all ticks by @ikondrat in https://github.com/lightly-ai/lightly-studio/pull/2449
- feat: introduce get_ticks route function by @ikondrat in https://github.com/lightly-ai/lightly-studio/pull/2450
- Replace the embedding plot's built-in tool strip with a sticky Pan/Rectangle/Lasso pill by @gabrielfruet in https://github.com/lightly-ai/lightly-studio/pull/2377
- Check remote embedder URLs before connecting by @iunir in https://github.com/lightly-ai/lightly-studio/pull/2359
- feat: add instance segmentation to dataset.evaluate() by @lorinczszabolcs in https://github.com/lightly-ai/lightly-studio/pull/2400
- add method to query one sample link by sequence id by @ikondrat in https://github.com/lightly-ai/lightly-studio/pull/2452
- feat: introduce method to get tick details by @ikondrat in https://github.com/lightly-ai/lightly-studio/pull/2453
- feat: introduce api endpoint to provide logs information for given sequence tick by @ikondrat in https://github.com/lightly-ai/lightly-studio/pull/2455
- feat: introduce runnable example of indexing mcap from s3 by @ikondrat in https://github.com/lightly-ai/lightly-studio/pull/2458
- feat: fix wrong dataset id by @ikondrat in https://github.com/lightly-ai/lightly-studio/pull/2459
- feat(point clouds): render camera previews in the MCAP sequence grid by @LeonardoRosaa in https://github.com/lightly-ai/lightly-studio/pull/2429
- Add CreateMcap.from_frame_locator by @horatiualmasan in https://github.com/lightly-ai/lightly-studio/pull/2464
- Add CreateSensorCalibration from camera intrinsics by @horatiualmasan in https://github.com/lightly-ai/lightly-studio/pull/2465
- feat: introduce channel selection component by @ikondrat in https://github.com/lightly-ai/lightly-studio/pull/2468
- feat: render timeline frame for channels by @ikondrat in https://github.com/lightly-ai/lightly-studio/pull/2461
- Add grid item size control to MCAP grid view by @LeonardoRosaa in https://github.com/lightly-ai/lightly-studio/pull/2445
- Build an embedder from the configuration stored on a model row by @iunir in https://github.com/lightly-ai/lightly-studio/pull/2446
- Add Annotation QA docs page by @JonasWurst in https://github.com/lightly-ai/lightly-studio/pull/2431
- Add McapComponent and look up group components by @horatiualmasan in https://github.com/lightly-ai/lightly-studio/pull/2466
- Add a Recording wrapper that stores camera calibrations by @horatiualmasan in https://github.com/lightly-ai/lightly-studio/pull/2469
- Fix Values input font size in the distribution panel (#2414) by @rishcx in https://github.com/lightly-ai/lightly-studio/pu
- Add the conformance kit,
- v1.1.22026-09-21 · 2026-09-21 11:06 UTC
查看更新说明
Changelog
Added
- Choose how many categorical metadata values to show in distribution plots.
- Python SDK: Read aggregate evaluation metrics (per-class and micro-averaged precision, recall, and F1, plus classification accuracy) with
dataset.evaluate().metrics(run_id). - Add an optional preselected tag selector to the sampling dialog.
Changed
- Speed up coloring the embedding plot by tags on large datasets by up to 2x.
- Show loading spinners in distribution plots in the GUI.
- Preselected samples are now part of the sampling result.
- Move each docs page into a folder named for its nav section. The old URLs redirect.
- Speed up video embedding by decoding videos in parallel, overlapping decoding with the model forward (up to about 2.4× faster when embedding many videos).
- Register a custom embedder with
register_default_embedderand the capability interfaces fromlightly_studio_serve.embedder, replacingset_default_embedding_modeland theEmbeddingGeneratorprotocols.
Fixed
- Categorical distribution requests are now up to 80% faster by fetching only the selected field.
- Fix
hf://directory ingest reporting every file as missing. - Fix the distribution panel and annotation class counts not updating when a filter changes.
- Speed up the initial page load in the GUI by up to ~3.5 seconds by no longer loading the query editor on every page.
What's Changed
- Add sensor_calibration table by @horatiualmasan in https://github.com/lightly-ai/lightly-studio/pull/2319
- Add sensor_calibration resolver by @horatiualmasan in https://github.com/lightly-ai/lightly-studio/pull/2322
- Extract embedding storage by @michal-lightly in https://github.com/lightly-ai/lightly-studio/pull/2275
- Add get_default_model_by_collection_id resolver by @michal-lightly in https://github.com/lightly-ai/lightly-studio/pull/2315
- Add default embedder resolver for embed functions by @michal-lightly in https://github.com/lightly-ai/lightly-studio/pull/2299
- Track enterprise connect events in PostHog by @LeonardoRosaa in https://github.com/lightly-ai/lightly-studio/pull/2169
- feat(point cloud): add 3D cuboid visualization by @LeonardoRosaa in https://github.com/lightly-ai/lightly-studio/pull/2301
- Keep the hf:// scheme on Hugging Face directory listings by @gabrielfruet in https://github.com/lightly-ai/lightly-studio/pull/2328
- Warn in the annotation grid when the sort order is stale by @JonasWurst in https://github.com/lightly-ai/lightly-studio/pull/2155
- Update mundig to 0.1.16b2 by @lukas-lightly in https://github.com/lightly-ai/lightly-studio/pull/2330
- Include preselected samples in sampling results by @lukas-lightly in https://github.com/lightly-ai/lightly-studio/pull/2331
- Mount the embed endpoints with create_app (embed stack 3/4) by @iunir in https://github.com/lightly-ai/lightly-studio/pull/2259
- Use default embedder resolver in embed_samples by @michal-lightly in https://github.com/lightly-ai/lightly-studio/pull/2298
- feat(point cloud): add cuboid selection, gizmo and tooltip by @LeonardoRosaa in https://github.com/lightly-ai/lightly-studio/pull/2302
- Use EmbedderRegistry in embed_video_samples by @michal-lightly in https://github.com/lightly-ai/lightly-studio/pull/2329
- feat: emulate s3 locally with localstack by @ikondrat in https://github.com/lightly-ai/lightly-studio/pull/2321
- Add static_transform table by @horatiualmasan in https://github.com/lightly-ai/lightly-studio/pull/2325
- Add static_transform resolver by @horatiualmasan in https://github.com/lightly-ai/lightly-studio/pull/2326
- Cover every Python workspace member in the backend guardrails by @iunir in https://github.com/lightly-ai/lightly-studio/pull/2314
- docs: name each folder for its nav section, and redirect the old URLs by @mrpositron in https://github.com/lightly-ai/lightly-studio/pull/2334
- Warn in the annotation detail view when the step order is stale by @JonasWurst in https://github.com/lightly-ai/lightly-studio/pull/2156
用户点评
登录用户的真实使用记录,可按版本和硬件筛选还没有人点评。第一个说出真实体验的人最有价值。
🚀 Try it in 60 seconds
LightlyStudio runs on your computer and opens in your browser. The following command downloads an example dataset with images, annotations, and evaluation results — no account needed.
pip install lightly-studio
lightly-studio quickstart
- Local only: your images and datasets never leave your machine.
- Your own images: one Python call indexes them, then start the server. See the Image Dataset guide.
- Your own videos: see the Video Dataset guide.
- No install: open the quickstart in Colab
- A guided walkthrough: read the Tutorials below. Curate a Traffic CCTV Dataset for YOLO Training goes from raw images to a trained model.
- Runs on Python 3.10 to 3.15 on Windows, Linux, and macOS. Use Python 3.10 for plugin compatibility, for example SAM autolabeling.
Workflows
Example workflows
LightlyStudio is a browser app that runs on your own computer. Load your data into the local database with a Python script, then start the server and explore it in your browser.
Create a file named example_coco.py:
import lightly_studio as ls
# Download the example dataset (will be skipped if it already exists)
dataset_path = ls.utils.download_example_dataset(download_dir="dataset_examples")
dataset = ls.ImageDataset.load_or_create()
dataset.add_samples_from_coco(
annotations_json=f"{dataset_path}/coco_subset_128_images/instances_train2017.json",
images_path=f"{dataset_path}/coco_subset_128_images/images",
)
# Start the UI server on localhost:8001.
# Pass `host` and `port` parameters to customize it.
# Reopen the app later with `lightly-studio gui` instead of re-running this script.
ls.start_gui()
Run python example_coco.py and open the printed URL to inspect images with their annotations.
To ingest COCO samples with segmentation masks instead of object detections, pass
annotation_type=ls.AnnotationType.SEGMENTATION_MASK to add_samples_from_coco().
Create a file named example_image.py:
import lightly_studio as ls
# Download the example dataset (will be skipped if it already exists)
dataset_path = ls.utils.download_example_dataset(download_dir="dataset_examples")
# Index the images, create embeddings, and store everything in the local database.
dataset = ls.ImageDataset.load_or_create()
dataset.add_images_from_path(
path=f"{dataset_path}/coco_subset_128_images/images",
)
# Start the UI server on localhost:8001.
# Pass `host` and `port` parameters to customize it.
ls.start_gui()
Run python example_image.py and open the printed URL in your browser.
Other starting points: YOLO datasets, video folders, custom annotations, model evaluation, notebooks, and more in the docs.
📚 Tutorials
Step-by-step guides covering complete workflows — from raw, unlabeled data to a trained and evaluated model:
- Curate a Traffic CCTV Dataset for YOLO Training: Explore embeddings, remove near-duplicates, auto-label with a detection plugin, and review annotations before training.
- Evaluate YOLO26 on Your Dataset with LightlyStudio: Compare predictions against ground truth, use the confusion matrix and embeddings to find failure patterns, and export issues for relabeling.
A selection of features
Set up a dataset
- Image datasets — index folders, COCO, and YOLO data
- Video datasets — index videos and work with frames
- Cloud storage — read from S3, GCS, or Azure
- Reuse datasets — append to an existing database, or point at a custom path
- Notebooks — run the GUI inside Jupyter or Colab
Work with your data
- Query, filter, and sort — build reusable subsets in Python
- Lightly Query Language — the query syntax for the GUI query editor
- Annotations, Tags, Metadata, Captions, Embeddings
- Sampling — pick the most typical and diverse samples to cut labeling cost
- Model evaluation — compare predictions against ground truth
- Plugins — auto-label with SAM and other models
- Export — write a query back out as COCO or YOLO
🐍 Python Interface
Everything in LightlyStudio is scriptable: index datasets, query and edit samples, sample subsets, and export the result. See the API reference.
🤝 Contribute
We welcome contributions! Please check our issues page for current tasks and improvements, or propose new issues yourself. See CONTRIBUTING.md for development setup and validation instructions.