Skip to main content

Universal Annotation Tool for images

Project description

📦 Universal Annotator

A modern, high-performance image annotation tool for computer vision datasets.

PyPI Version Python Version License

Universal Annotator is a powerful, desktop-grade, and user-friendly tool engineered for creating high-quality bounding box annotations with exceptional speed. It's built for computer vision practitioners who demand a fast, flexible, and reliable annotation workflow.

🔥 Key Features

🧰 Core Annotation & Data

  • Format Flexibility: Supports TXT (YOLO), JSON, and COCO formats with auto-detection.
  • Bounding Boxes: Create, edit, move, and resize annotations efficiently.
  • Nested Annotations: The ability to draw boxes inside existing boxes.
  • Smart Data Handling:
    • Intelligent natural sorting (e.g., image_2.jpg before image_10.jpg).
    • Smart JSON class discovery.
    • Automatic label file creation prompt for new datasets.
  • Reliable Workflow: Auto-save when navigating, selection memory (restores selection per image).
  • Image Support: Supports common formats: JPG, PNG, BMP, TIFF, WebP.

🎨 User Experience (UI/UX)

  • Professional Dark Theme: Advanced, high-contrast dark UI for reduced eye strain.
  • Optimized Navigation: Mouse-wheel image zoom, full menu bar, and rich status bar.
  • Speed-Focused Shortcuts: Descriptive tooltips and a comprehensive help dialog (F1) with optimized keyboard shortcuts.
  • Modes: Dedicated Edit Mode (E) and View Mode (V) for focused work.

🚀 Installation

Universal Annotator is available directly on PyPI.

Install from PyPI

pip install universal-annotator

Run the Application

universal-annotator

Optional: Use a Virtual Environment

It is highly recommended to use a virtual environment to manage dependencies:

python3 -m venv venv
source venv/bin/activate       # On Linux/macOS
# venv\Scripts\activate        # On Windows
pip install universal-annotator
universal-annotator

🧭 Basic Usage Guide

1. Load Dataset

  • Select your Image Folder and your Label Folder.
  • The annotation format is auto-detected.
  • If the label folder is empty, the app will offer to create label files in your chosen format (TXT, JSON, or COCO).

2. Draw Bounding Boxes

  • Press E to switch to Edit Mode.
  • Press M to switch to Draw Mode.
  • Click & drag to draw a new box.
  • Select a class from the popup dialog.
  • Navigate between images with A (Previous) / D (Next) keys or the navigation buttons.

3. Edit Annotations

  • Select an existing box to move or resize it.
  • Drag the box handles to resize.
  • Press Delete to remove the selected box.
  • Draw nested boxes inside existing annotations.

4. Save

  • Press S to save manually.
  • Alternatively, enable Auto Save in the UI settings.
  • The status bar will confirm all save actions.

📁 Supported Annotation Formats

Format Structure Notes
TXT <class_id> <x_center> <y_center> <width> <height> Standard YOLO format.
JSON {"annotations": [{"bbox": [x, y, w, h], "category_id": 0}]} Custom simple JSON structure.
COCO Fully supported Reads and writes _annotations.coco.json.

🗂 Exporters & Converters

The tool includes powerful conversion utilities. All conversion tools are non-destructive and avoid overwriting your root labels.

Outputs are placed into dedicated folders, such as converted_txt/, converted_json/, etc.

Supported Conversions:

  • TXTJSON
  • JSONTXT
  • TXTCOCO JSON
  • COCOJSON
  • COCOTXT
  • JSON FolderCOCO merge

🎮 Keyboard Shortcuts

Key Action
A Previous Image
D Next Image
S Save
E Edit Mode
V View Mode
M Draw Bounding Box
X Exit Draw Mode
Delete Remove selected box
F1 Help dialog / View shortcuts

⚙ Configuration

You can easily customize the tool's behavior and class definitions:

  • Classes: Edit sample_classes/classes.txt to define your class names:
    person
    car
    bicycle
    dog
    cat
    
  • App Settings: Edit utils/config.py to change default settings like colors, line widths, app name, and version.

🛠 Troubleshooting

Issue Solution
Images not loading Ensure file formats are supported (JPG, PNG, etc.) and check folder permissions.
Labels not found Verify that label filenames match image filenames and the correct label folder is selected.
Shortcuts not working Make sure the application window is focused.

🚧 Known Limitations & Future Enhancements

Known Limitations (v0.1.4)

  • No in-place label editing (must delete and recreate a box to change its class).
  • Only rectangular bounding boxes are supported.

🛠️ Future Enhancements

  • Polygon and segmentation support (High Priority)
  • Change class label of existing box
  • Customizable keyboard shortcuts
  • Analytics dashboard
  • Undo/Redo functionality
  • Plugin system

🤝 Contributing

Pull requests are welcome! If you have a feature idea or a bug fix, please check out the contribution guide:

📄 See the CONTRIBUTING_UI.md file for details.

📄 License

                              LICENSE
                         Version  18 Nov 2025

THIS SOFTWARE LICENSE IS PROVIDED "ALL CAPS" SO THAT YOU KNOW IT IS SUPER SERIOUS AND YOU DON'T MESS AROUND WITH COPYRIGHT LAW BECAUSE YOU WILL GET IN TROUBLE HERE ARE SOME OTHER BUZZWORDS COMMONLY IN THESE THINGS WARRANTIES LIABILITY CONTRACT TORT LIABLE CLAIMS RESTRICTION MERCHANTABILITY. NOW HERE'S THE REAL LICENSE:

  1. It's a public domain.
  2. Do whatever you want with it.

👨‍💻 Author & Version

  • Author: Madan Mohan Jha
  • Current Version: v0.1.8
  • Updated: November 2025

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

universal_annotator-0.1.8.tar.gz (597.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

universal_annotator-0.1.8-py3-none-any.whl (692.6 kB view details)

Uploaded Python 3

File details

Details for the file universal_annotator-0.1.8.tar.gz.

File metadata

  • Download URL: universal_annotator-0.1.8.tar.gz
  • Upload date:
  • Size: 597.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.10 {"installer":{"name":"uv","version":"0.9.10"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for universal_annotator-0.1.8.tar.gz
Algorithm Hash digest
SHA256 9d8887849ee840046a3ab0384aca8297ef7d0044da058c83d1f64f14cbb94e11
MD5 1d93e3979eea383038a5f84710f4aff2
BLAKE2b-256 acd6639d13ecf23da42d4d1dd3c4cdf7ad04e02d546ea6cc2000edc11628fa31

See more details on using hashes here.

File details

Details for the file universal_annotator-0.1.8-py3-none-any.whl.

File metadata

  • Download URL: universal_annotator-0.1.8-py3-none-any.whl
  • Upload date:
  • Size: 692.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.10 {"installer":{"name":"uv","version":"0.9.10"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for universal_annotator-0.1.8-py3-none-any.whl
Algorithm Hash digest
SHA256 ed0fd0b2c254dc7c927a492b58ecca28831f4ef61d01f4f3055fa2ee5d15febc
MD5 506d23b848dfaac2271cab0da71fd499
BLAKE2b-256 1406cb7c7f6cb13de2204b5b97bca225ce4426600955c02284c373e0c68d2fb9

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page