Active Labeling System (ALS) with a PyQt6 GUI and active-learning workflow.
Project description
ActiveLabelingSystem
Formerly known as LabelOps.
Local-first AI-assisted image labeling with active learning, manual box tools, background retraining, and dataset version snapshots.
What is new
- Modular app structure (
src/app,src/core,src/features) for cleaner maintenance. - Active learning image prioritization when loading folders (unlabeled images first, sorted by uncertainty).
- Retraining policy engine with multi-signal checks (sample count, time, entropy shift, class balance, confidence drift).
- Dataset versioning from UI with metadata, hash integrity, and manifest tracking.
- Label format selection at folder load time:
COCO JSONorPlain JSON. - Safer persistence:
- autosave per folder (
labels_autosave.json) - internal state store (
.labels_internal.json) - atomic file writes for exports.
- autosave per folder (
- Improved manual labeling UX:
- floating toolbox
- quick class switching (1-9)
- undo/delete shortcuts
- inline floating action toolbar.
- Better training controls in UI:
- force retrain
- live queue/training status
- shadow model promotion with validation warning flow.
Features
Active learning and triage
- Entropy-aware detection metadata is attached to predictions.
- Folder loading prioritizes unlabeled images for high-value review.
- Replay buffer preserves historical samples for continual learning.
Retraining workflow
- Background training via Ray shadow trainer.
- Training trigger policy requires minimum sample count plus at least one urgency signal.
- Promotion flow supports validation and explicit override confirmation.
Dataset versioning
- Create version snapshots from current labels.
- Stores YOLO-style labels, copied images, metadata, and a dataset hash.
- Keeps lineage and latest pointer in
src/datasets/manifest.json.
Label export
Plain JSONoutput (labels.json) for direct app consumption.COCO JSONoutput (labels_coco.json) for downstream ML pipelines.
Manual labeling mode
- Draw boxes directly on the canvas.
- Per-box class assignment with deterministic class colors.
- Save-and-next loop without leaving manual mode.
Project structure
ActiveLabelingSystem/
images/
src/
app/
window.py
dialogs.py
state.py
actions.py
core/
data_manager.py
entropy.py
sample_selector.py
retrain_policy.py
dataset_versioner.py
replay_buffer.py
shadow_trainer.py
training_orchestrator.py
model_manager.py
feedback_validator.py
features/
manual.py
shortcut_manager.py
shortcut_config.py
toolbar_manager.py
toolbar_widget.py
toolbar_styles.py
datasets/
models/
main.py
requirements.txt
run_tests.bat
README.md
GUID.md
Installation
git clone https://github.com/sairam-s0/ActiveLabelingSystem.git
cd ActiveLabelingSystem
python -m venv .venv
# Windows
.venv\Scripts\activate
# Linux/macOS
# source .venv/bin/activate
pip install .
Optional: install CUDA-enabled PyTorch for GPU inference/training from https://pytorch.org/get-started/locally/. Users can install it directly with:
pip install Active-Labeling-System
Run the app
After install:
als
Publish to PyPI (GitHub Actions)
This repo includes .github/workflows/publish-pypi.yml.
- In PyPI, configure Trusted Publisher for this GitHub repo/workflow:
- Owner:
sairam-s0 - Repository:
ActiveLabelingSystem - Workflow:
publish-pypi.yml
- Owner:
- Bump version in
pyproject.toml. - Push a tag like
v0.1.1. - GitHub Actions builds and publishes automatically to PyPI.
How to use
1. Select image folder and output format
- Click
Select Folder. - Choose output format:
COCO JSON-> writeslabels_coco.jsonPlain JSON-> writeslabels.json
- The app also keeps internal state in
.labels_internal.jsonand autosave inlabels_autosave.jsoninside the selected folder.
2. Select classes
- Click
Select Classes. - Pick one or more classes.
- Add custom classes from the same dialog when needed.
3. Start labeling
- Click
START. - Review detections and use bottom actions:
Accept (A)Reject (R)Skip (N)Manual (M)
4. Manual mode (box drawing)
- Draw boxes by click-drag on canvas.
- Save boxes and move next with:
SpaceorEnter-> save and nextEsc-> exit manual modeCtrl+Z-> undo last boxDelete-> delete last box1..9-> switch class index
5. Monitor active learning and training
- Left panel shows:
- entropy of current image
- queue size
- training progress/status.
- Use
Force Retrainif you want to bypass normal policy checks (still requires minimum samples).
6. Version and promote
Create Versioncreates a dataset snapshot insrc/datasets/v_YYYYMMDD_HHMMSS/.List Versionsshows stored versions and metadata.Promote Shadowpromotes trained candidate model to active model.
Output files and artifacts
For each selected image folder:
labels.jsonorlabels_coco.json(selected format).labels_internal.json(internal metadata store)labels_autosave.json(session recovery)
Notes
- If Ray is unavailable, labeling still works; background training features are reduced.
- If class mapping is not available yet, trainer creation waits until first labels are saved.
- Restart app after model promotion for a clean reload of active weights.
Contributing
Please read CONTRIBUTING.md.
License
MIT. See LICENSE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file active_labeling_system-0.1.0.tar.gz.
File metadata
- Download URL: active_labeling_system-0.1.0.tar.gz
- Upload date:
- Size: 56.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a3267e7fac0f3f184a0ea19b9c863fe6fbd7654a234e42b08425730e3e013539
|
|
| MD5 |
6ec6ef88882f702b9f88b807d9b2f93b
|
|
| BLAKE2b-256 |
711b425fc1867003b5e2403fe6813578e3071362990d86d7a34285c5f0a9903e
|
Provenance
The following attestation bundles were made for active_labeling_system-0.1.0.tar.gz:
Publisher:
publish-pypi.yml on sairam-s0/ActiveLabelingSystem
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
active_labeling_system-0.1.0.tar.gz -
Subject digest:
a3267e7fac0f3f184a0ea19b9c863fe6fbd7654a234e42b08425730e3e013539 - Sigstore transparency entry: 1226664663
- Sigstore integration time:
-
Permalink:
sairam-s0/ActiveLabelingSystem@1848546309fc223a4646fae648c0d64d8b007f9b -
Branch / Tag:
refs/tags/v0.1.4 - Owner: https://github.com/sairam-s0
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@1848546309fc223a4646fae648c0d64d8b007f9b -
Trigger Event:
push
-
Statement type:
File details
Details for the file active_labeling_system-0.1.0-py3-none-any.whl.
File metadata
- Download URL: active_labeling_system-0.1.0-py3-none-any.whl
- Upload date:
- Size: 65.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bedb49d6cfa3dafbd119e63753b0e3bbbe547b676e9ede7d23814e73a541a518
|
|
| MD5 |
3fa3370a05bef4a6bbb71e554be2af64
|
|
| BLAKE2b-256 |
d99f3282f12edc44188f0492c9e2ddbed2165cd713dfe2d093c3a8d7af669dc9
|
Provenance
The following attestation bundles were made for active_labeling_system-0.1.0-py3-none-any.whl:
Publisher:
publish-pypi.yml on sairam-s0/ActiveLabelingSystem
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
active_labeling_system-0.1.0-py3-none-any.whl -
Subject digest:
bedb49d6cfa3dafbd119e63753b0e3bbbe547b676e9ede7d23814e73a541a518 - Sigstore transparency entry: 1226664679
- Sigstore integration time:
-
Permalink:
sairam-s0/ActiveLabelingSystem@1848546309fc223a4646fae648c0d64d8b007f9b -
Branch / Tag:
refs/tags/v0.1.4 - Owner: https://github.com/sairam-s0
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@1848546309fc223a4646fae648c0d64d8b007f9b -
Trigger Event:
push
-
Statement type: