Skip to content

Welcome to LightlyStudio!

LightlyStudio is an open-source tool designed to unify your data workflows from curation, annotation and management. Built with Rust for speed and efficiency, it lets you work seamlessly with datasets like COCO and ImageNet, even on a MacBook Pro with an M1 chip and 16 GB of memory.

Working in a team and looking for collaboration features, role-based access permissions, and centrally managed cloud credentials? Check out LightlyStudio Enterprise and start for free with your team.

The embedding plot shows how images relate to each other, with a preview on hover. A lasso selection filters the grid to one cluster. A search for "coffee" finds a match, and the annotation editor opens to label it.

⚡ Works smoothly with 2M+ images, embeddings included, on a single MacBook (M1, 16GB RAM).

Installation

LightlyStudio works on Windows, Linux, and macOS with Python 3.9 to 3.14. We recommend Python 3.10 for the best compatibility with plugins such as SAM autolabeling.

pip install lightly-studio
Recommended: install into a virtual environment

A virtual environment keeps LightlyStudio and its dependencies separate from other Python projects on your machine:

python3 -m venv venv
source venv/bin/activate
pip install lightly-studio
python -m venv venv
.\venv\Scripts\activate
pip install lightly-studio

Try it in 60 seconds

Want to try LightlyStudio instantly? Run:

lightly-studio quickstart

This downloads the COCO example dataset, loads it, and opens the GUI in your browser. Run lightly-studio quickstart --help for the available options.

Quickstart

The examples below use the same example dataset by default, downloaded on the first run. Point them at your own image, video, or YOLO/COCO dataset by changing the input path.

  1. Create a file named example_coco.py with the following contents:

    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",
    )
    # Optional: tag a subset of samples to filter them in the GUI. 
    dataset.query()[:10].add_tag("sample_subset")
    
    ls.start_gui()
    
  2. Run python example_coco.py in your terminal.

  3. Click on the printed URL to open the app in your browser.
  1. Create a file named example_yolo.py with the following contents:

    example_yolo.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_yolo(
        data_yaml=f"{dataset_path}/road_signs_yolo/data.yaml",
    )
    
    ls.start_gui()
    
  2. Run python example_yolo.py in your terminal.

  3. Click on the printed URL to open the app in your browser.
  1. Create a file named example_image.py with the following contents:

    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")
    
    # Indexes the dataset, creates embeddings and stores everything in the 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 port 8001.
    # Pass `host` and `port` parameters to customize.
    ls.start_gui()
    
  2. Run python example_image.py in your terminal.

  3. Click on the printed URL to open the app in your browser.
  1. Create a file named example_video.py with the following contents:

    example_video.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")
    
    # Create a dataset and populate it with videos.
    dataset = ls.VideoDataset.load_or_create()
    dataset.add_videos_from_path(path=f"{dataset_path}/youtube_vis_50_videos/train/videos")
    
    # Start the UI server.
    ls.start_gui()
    
  2. Run python example_video.py in your terminal.

  3. Click on the printed URL to open the app in your browser.

Tip

Call lightly-studio gui instead of ls.start_gui() in Python to skip reindexing an already-loaded dataset.

Ready for a complete, end-to-end workflow? Follow the tutorial Curate a Traffic CCTV Dataset for YOLO Training to explore embeddings, remove near-duplicates, auto-label, and train a model — or browse all tutorials.

How It Works

  • Your Python script creates a LightlyStudio dataset.
  • The dataset.add_<samples>_from_<source> functions read your samples and annotations, calculate embeddings, and save metadata to a local lightly_studio.db file (using DuckDB).
  • ls.start_gui() starts a local backend API server.
  • This server reads from lightly_studio.db and serves data to the UI Application running in your browser (by default http://localhost:8001).
  • Images and videos are streamed from their original local folder or remote storage for display in the UI.

Feature Overview

Datasets

Concepts

Tools

Python API

LightlyStudio has a powerful Python interface. You can not only index datasets but also query and manipulate them using code. It supports local and cloud-hosted image and video folders; see Using Cloud Storage for setup and limitations.