| | |
All-in-one quality control for annotated image datasets: LabelMe and YOLO.
Description
AIO QC is a desktop app for checking annotated image datasets before you train: broken files, wrong or
inconsistent label names, sloppy or duplicate shapes, split leakage and probable mislabels.
It shows every problem on the image, lets you fix it in the same window, and keeps the original of every file it
changes, so any change can be undone. It is written in Python and uses Qt for its graphical interface.
QC drawer, Review and Zoom
Validation, Crop Gallery and Review Grid.
Stats and Dark appearance
Features
- LabelMe (v5 and v6, every shape type) and YOLO datasets (detection, segmentation, OBB, pose; flat or split), plus image classification (class folders or LabelMe flags) — the layout is detected automatically
- Ranked checks, worst first, each jumping straight to the problem on the image:
- Dataset — Dataset Stats · Validation · Empty Annotations · Duplicate Images (exact and perceptual, split leakage) · Image Quality · Split Health
- Labels — Label Ambiguities · Label Mapping (view-only renames and merges) · Remove / Re-order Classes · Guidelines
- Shapes — Crop Gallery · Duplicate Shapes · Outliers · Sequence Check (video frames) · Dim / Area · Relationship Rules
- Models — Model Check (report card, confusion, label-error estimate) · OCR Check · Visual Similarity (DINOv3 / SigLIP2 / CLIP), with your models running in their own environment
- Review — Issues Inbox · QC Sampling (error-rate estimate with a verdict) · Review Grid · Saved Views · Coverage Map · Smart Filter · QC Report · Export & Split
- Fix on the image: move, reshape, relabel, delete or draw shapes, with exact undo / redo
- Fix in Editor: hand files to LabelMe or labelImg and get them checked again when they are saved
- Review marks (OK / flag / note) with a next-unreviewed workflow
- Hand-off batches for annotators, merged back with a three-way compare
- Per-class labelling guidelines with good and bad example crops, exportable as one HTML page
- File history: who changed what, when and with which tool — preview any version and revert it
- Data Prep: unzip, combine and flatten, find orphans, integrity check, exact duplicates, resize — each with a preview and undo
- Sketch on the image and ROI capture with real image coordinates
- Export & Split: train / val / test splits that keep duplicates, video frames and OCR identities together, exported as YOLO, LabelMe, COCO or class folders
- Built for big datasets: cached indexing, background work, virtualised lists — fluid at millions of files and shapes
- Safe by design: confirmations, atomic writes, originals kept in a compressed backup store, deletes are moves to a trash folder
Installation
There are 2 options to install AIO QC:
Option 1: Using pip
pip install aio-qc
# with the optional extras (faster JSON, natural sort, YAML, Pillow):
pip install "aio-qc[full]"
# the latest version from GitHub:
# pip install git+https://github.com/spreetkaran/aio-qc.git
Option 2: Using standalone executable (easiest)
Download the zip for your system from the Releases page — no Python needed:
- standalone: one program file,
AIO-QC.exeon Windows - portable: one folder that keeps its settings, logs and editor environments inside it (runs from a USB stick and leaves nothing on the PC)
Supported Python and platforms
| Python | 3.10 – 3.13 |
| Qt | Qt6 (PyQt6) |
| OS | Windows / macOS / Linux |
| Required | PyQt6, NumPy, OpenCV, loguru |
| Optional | natsort, Pillow, PyYAML, orjson (picked up automatically) |
Model-based checks (Model Check, OCR Check, Visual Similarity) run your detector, embedding or OCR models in their own Python environment that you choose, so AIO QC itself never needs PyTorch or a GPU.
Usage
aio-qc # open the app (pip install)
aio-qc-console # the same, with the log in a terminal
AIO_QC --version # print the version
AIO_QC --logger-level debug # verbose log in aio_qc_tool.log
Click Open Dir (Ctrl+O) or drop a dataset folder on the window; the layout is detected automatically. On the
first start a short Get Started tour shows you around (Help ▸ Get Started brings it back), and F1 opens the
user guide.
Supported datasets
| Layout | Detected when | Notes |
|---|---|---|
| LabelMe | *.json anywhere under the folder |
v5 and v6, all shape types; sub-folders become filters; imageData optional |
| YOLO | images/ + labels/ |
detection, segmentation, OBB, pose; data.yaml / classes.txt |
| YOLO split | <split>/images + <split>/labels |
train / val / test, and any split name |
| Classification: class folders | <class>/<image>, optionally under splits |
changing a class moves the file |
| Classification: LabelMe flags | flags in LabelMe JSONs | multi-label flags supported |
Keyboard shortcuts
Everything has a key; press ? in the app for the live key map (type to filter, click to run).
| Keys | Action | Keys | Action |
|---|---|---|---|
D / A |
next / previous image | S / X / U |
mark OK / flag / clear |
Ctrl+K |
command palette | F6 |
next panel |
Alt+1…6 |
open a QC tab | F11 |
focus mode (image only) |
Ctrl+0 / Ctrl+1 |
fit / 100 % | double-click | zoom in ↔ back to fit |
Ctrl+Z / Ctrl+Shift+Z |
undo / redo an edit | Ctrl+H |
file history |
P / O |
sketch / ROI capture | F1 |
user guide |
Your data is safe
- Nothing changes without a confirmation. Views, statistics, label mappings and display adjustments never touch files.
- Atomic writes: a crash can never leave a half-written annotation, and images are never modified.
- Originals are kept in
<dataset>/.aio_qc/backups.sqlitebefore every rewrite (compressed, deduplicated) and restored byte for byte. - Deletes are moves into
<dataset>/.aio_qc_trash/. - Changes made by other programs are noticed and re-read; AIO QC never overwrites them.
- Everything the app stores for a dataset lives in
<dataset>/.aio_qc/— delete that folder to reset it; your annotations are not in it.
FAQ
- Does AIO QC change my annotation files? Only when you apply a fix, edit on the image, merge a batch or move files, and always after a confirmation. The original is stored first, so every change can be undone.
- Do I need a GPU or PyTorch? No. The core app needs neither. Model-based checks run your models in a separate Python environment that you point the app to (the app can create one), using a GPU when there is one.
- My LabelMe JSONs embed the image (
imageData). Is that supported? Yes. Images are read fromimageDatawhen there is no image file, and Data Prep ▸ Combine & flatten can restore the image files. - Where are the logs?
aio_qc_tool.login the folder you started the app from (rotated at 10 MB); Tools ▸ Logs shows this session's errors. A native crash leavesaio_qc_crash.log.
How to build standalone executable
PyInstaller cannot cross-compile: build on the system you are building for.
AIO_QC_PATH=./AIO_QC
pyinstaller aio-qc/AIO_QC/__main__.py \
--name=AIO-QC \
--windowed \
--noconfirm \
--specpath=build \
--add-data="$(AIO_QC_PATH)/icons:AIO_QC/icons" \
--add-data="$(AIO_QC_PATH)/fonts:AIO_QC/fonts" \
--add-data="$(AIO_QC_PATH)/editors:AIO_QC/editors" \
--add-data="$(AIO_QC_PATH)/validators:AIO_QC/validators" \
--onedir
Development
git clone https://github.com/spreetkaran/aio-qc.git
cd aio-qc
pip install -e ".[full]"
AIO_QC --logger-level debug
AIO_QC/
├── __main__.py entry point
├── app.py main window; the QC_TOOLS registry builds the tabs, menus and shortcuts
├── core/ Qt-free logic (datasets, checks, backups, history, sampling, data prep …)
├── widgets/ the UI: canvas, panels, tool windows, animations
├── editors/ bundled LabelMe / labelImg sources for Fix in Editor
├── icons/, fonts/ assets
├── help_guide.py the in-app user guide (F1)
└── CHANGES.md changelog
Issues and pull requests are welcome. Please include the app version, your OS and,
for bugs, the relevant part of aio_qc_tool.log. Logic belongs in core/ (Qt-free, testable); UI in widgets/.
Acknowledgement
- labelme and labelImg — bundled (modified) as the external editors of Fix in Editor.
- Phosphor Icons — the basis of many of the app's icons.
- Inter, JetBrains Mono, Source Code Pro and AV Hershey Simplex — the bundled fonts.
License
AIO QC is released under the MIT License. Copyright (c) 2026 Preetkaran Singh.
It bundles third-party components that keep their own licenses — notably the labelme sources (GPL-3.0), which run
as a separate program for Fix in Editor. See THIRD_PARTY_NOTICES.md; the full license
texts are in licenses/.
Metadata
Release files for aio-qc 1.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| aio_qc-1.0.0.tar.gz | 7.1 MB | Without provenance | Details for aio_qc-1.0.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| aio_qc-1.0.0-py3-none-any.whl | Python 3 | none | any | Details for aio_qc-1.0.0-py3-none-any.whl |
Total release size: 14.4 MB
Release files / aio_qc-1.0.0.tar.gz
| Download URL | aio_qc-1.0.0.tar.gz |
|---|---|
| Size | 7.1 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
63dfa76964aa1f785e53109b721da2738139b76d57b693bf860a465db028300c
|
|
BLAKE2b-256 checksum How to use checksums |
df82a939191950b51ba885207fbb001cab2a042b1e05bd4f45ab3006ed5cb24b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.9
|
Release files / aio_qc-1.0.0-py3-none-any.whl
| Download URL | aio_qc-1.0.0-py3-none-any.whl |
|---|---|
| Size | 7.3 MB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
c1f6945bdae0b1cc4a69cdcf3e8568b1d6322ffeceba91d5156e965f3a102ac3
|
|
BLAKE2b-256 checksum How to use checksums |
e6ba3719cf0c349f0dd06a7c4b02bac4a79c4c875447fce5d12986bedc1a590a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.9
|
Security for aio-qc 1.0.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.