Skip to main content

CLI and Python API for managing CVAT annotations: download, upload, and inspect tasks

Project description

datnvt-cvat-cli

A focused CLI tool and Python library for managing annotations on a CVAT server.

Features

Feature CLI command Python API
Download annotations (without images) datnvt-cvat-cli download client.download_tasks(...)
Download full dataset (annotations + images) datnvt-cvat-cli download --save-images client.download_tasks(..., save_images=True)
Upload annotations to CVAT tasks datnvt-cvat-cli upload client.upload_tasks(...)
List tasks for a project datnvt-cvat-cli list-tasks client.get_tasks(...)
List all projects datnvt-cvat-cli list-projects client.get_projects()
Inspect task metadata datnvt-cvat-cli task-info client.get_task_info(task_id)
Verify server credentials datnvt-cvat-cli check-connection client.check_connection()
Check project availability client.check_project(project_id)
Run batch operations from YAML datnvt-cvat-cli run config.yaml

Installation

pip install datnvt-cvat-cli

Or from source:

git clone https://github.com/datvtn/datnvt-cvat-cli.git
cd datnvt-cvat-cli
pip install -e .

Requires Python ≥ 3.9.

Configuration

Server credentials can be supplied in three ways (highest priority first):

1. CLI flags

datnvt-cvat-cli --url https://cvat.example.com \
         --username myuser \
         --password mypassword \
         --project-id 11 \
         list-tasks

2. YAML config file

# config/server.yaml
url: "https://cvat.example.com"
username: "myuser"
password: "mypassword"
project_id: 11
datnvt-cvat-cli --config config/server.yaml list-tasks
# or
export CVAT_SERVER_CONFIG=config/server.yaml
datnvt-cvat-cli list-tasks

3. Environment variables

export CVAT_URL=https://cvat.example.com
export CVAT_USERNAME=myuser
export CVAT_PASSWORD=mypassword
export CVAT_PROJECT_ID=11

CLI Reference

Global options (apply to all commands)

datnvt-cvat-cli [OPTIONS] COMMAND [ARGS]

Options:
  --config, -c FILE       Server config YAML  [env: CVAT_SERVER_CONFIG]
  --url TEXT              CVAT server URL     [env: CVAT_URL]
  --username, -u TEXT     CVAT username       [env: CVAT_USERNAME]
  --password, -p TEXT     CVAT password       [env: CVAT_PASSWORD]
  --project-id INTEGER    Default project ID  [env: CVAT_PROJECT_ID]
  --verbose, -v           Enable debug logging

download — Download CVAT tasks

Downloads annotations (and optionally images) for one or more tasks.

datnvt-cvat-cli download [OPTIONS]

Options:
  --task-id, -t INTEGER    Task ID (repeat for multiple)  [required]
  --out-dir, -o PATH       Output directory; tasks saved as task{id}/ subdirs
  --out-path PATH          Explicit output path per task (repeat to match --task-id)
  --format, -f TEXT        Annotation format [default: CVAT for images 1.1]
  --save-images / --no-save-images
                           Also download raw images [default: no-save-images]
  --skip-existing / --no-skip-existing
                           Skip tasks already on disk [default: skip-existing]
  --folder-prefix TEXT     Output folder prefix per task [default: task]
                           e.g. --folder-prefix data_ → data_147/ instead of task147/

Supported formats:

  • CVAT for images 1.1 (XML, default)
  • COCO 1.0 (JSON)

Output structure (CVAT format, default):

out_dir/
  task147/
    annotations.xml
    images/          ← only when --save-images
      frame_000001.jpg
      ...
  task150/
    annotations.xml

Examples:

# Download annotations only for tasks 147 and 150
datnvt-cvat-cli --config server.yaml download -t 147 -t 150 --out-dir data/raw

# Download with images (default CVAT XML format)
datnvt-cvat-cli --config server.yaml download -t 147 --out-dir data/raw --save-images

# Download as COCO JSON instead
datnvt-cvat-cli --config server.yaml download -t 147 --out-dir data/raw \
         --format "COCO 1.0"

# Force re-download even if files exist
datnvt-cvat-cli --config server.yaml download -t 147 --out-dir data/raw --no-skip-existing

# Rename output folders: data_147/ instead of task147/
datnvt-cvat-cli --config server.yaml download -t 147 -t 150 --out-dir data/raw \
         --folder-prefix data_

# Custom output path per task
datnvt-cvat-cli --config server.yaml download -t 147 -t 150 \
         --out-path data/task_a --out-path data/task_b

upload — Upload annotations to CVAT

Pushes local annotation files to the corresponding CVAT tasks.

datnvt-cvat-cli upload [OPTIONS]

Options:
  --task-id, -t INTEGER    Task ID (repeat for multiple)  [required]
  --in-dir, -i PATH        Input directory containing task{id}/ subdirs  [required]
  --format, -f TEXT        Annotation format [default: CVAT for images 1.1]

File lookup (in order of preference):

Format Primary Fallback
CVAT 1.1 <in_dir>/task{id}/annotations_pseudo.xml annotations.xml
COCO 1.0 <in_dir>/task{id}/annotations/instances_default_pseudo.json instances_default.json

Examples:

# Upload CVAT XML annotations from data/processed/ for tasks 147 and 150 (default format)
datnvt-cvat-cli --config server.yaml upload -t 147 -t 150 --in-dir data/processed

# Upload COCO JSON annotations
datnvt-cvat-cli --config server.yaml upload -t 147 --in-dir data/processed \
         --format "COCO 1.0"

list-tasks — List tasks

datnvt-cvat-cli list-tasks [OPTIONS]

Options:
  --project-id INTEGER     Filter by project ID (defaults to config project_id)
  --output TEXT            Output format: table (default) or json

Examples:

# List all tasks in the default project
datnvt-cvat-cli --config server.yaml list-tasks

# List tasks for a specific project in JSON
datnvt-cvat-cli --config server.yaml list-tasks --project-id 15 --output json

Sample output:

              Tasks (project_id=11)
┌──────┬──────────────────────────┬────────────┬───────┬──────────────┐
│ ID   │ Name                     │ Status     │ Size  │ Mode         │
├──────┼──────────────────────────┼────────────┼───────┼──────────────┤
│  147 │ Training batch 1         │ completed  │   500 │ annotation   │
│  150 │ Validation set           │ annotation │   200 │ annotation   │
└──────┴──────────────────────────┴────────────┴───────┴──────────────┘
Total: 2 task(s)

list-projects — List projects

datnvt-cvat-cli list-projects [OPTIONS]

Options:
  --output TEXT    Output format: table (default) or json

Examples:

datnvt-cvat-cli --config server.yaml list-projects
datnvt-cvat-cli --config server.yaml list-projects --output json

task-info — Inspect task details

datnvt-cvat-cli task-info [OPTIONS]

Options:
  --task-id, -t INTEGER    Task ID (repeat for multiple)  [required]
  --output TEXT            Output format: table (default) or json

Examples:

# Show details for tasks 147 and 150
datnvt-cvat-cli --config server.yaml task-info -t 147 -t 150

# Get raw JSON for task 147
datnvt-cvat-cli --config server.yaml task-info -t 147 --output json

Sample output:

Task 147: Training batch 1
  Status    : completed
  Size      : 500 frame(s)
  Mode      : annotation
  Project   : 11
  Labels    : door, window, wall
  Created   : 2024-01-10T09:00:00Z
  Updated   : 2024-03-15T14:22:00Z

check-connection — Verify credentials

datnvt-cvat-cli --config server.yaml check-connection
# Connection OK.

run — Batch operations from YAML

Run multiple operations defined in a single YAML file. Before executing any tasks, run performs pre-flight checks: it verifies the CVAT server is reachable and that the configured project is accessible. The run aborts with a non-zero exit code if either check fails.

datnvt-cvat-cli --config server.yaml run config/cvat/tasks.yaml
# or embed server credentials directly in the YAML (see format below)
datnvt-cvat-cli run config/cvat/tasks.yaml

Supported task names:

YAML task name Operation
download_cvat_tasks Download annotations (and optionally images)
upload_anno_with_cvat_tasks Upload local annotations to CVAT

YAML Configuration Files

Download — config/download.yaml

# Download annotations (and optionally images) for a list of tasks.
# Run with: datnvt-cvat-cli --config server.yaml run config/download.yaml

- task: download_cvat_tasks
  parameters:
    # List of CVAT task IDs to download.
    task_ids: [147, 150, 151]

    # Output directory. Each task is saved under <out_dir>/task{id}/.
    out_dir: data/raw

    # Annotation format: "CVAT for images 1.1" (XML, default) or "COCO 1.0" (JSON).
    dataset_format: "CVAT for images 1.1"

    # Set true to also download the raw image files alongside annotations.
    save_images: false

    # Set false to force re-download even when annotation files already exist.
    skip_existing: true

    # Optional: rename output folders using a custom prefix instead of "task".
    # Default: task147/, task150/, ...  |  "data_" → data_147/, data_150/, ...
    # folder_prefix: "data_"

Output layout for CVAT XML format (default):

data/raw/
  task147/
    annotations.xml
    images/           ← only when save_images: true
  task150/
    annotations.xml

Output layout for COCO JSON format:

data/raw/
  task147/
    annotations/
      instances_default.json
    images/           ← only when save_images: true

Upload — config/upload.yaml

Each task specifies its own annotation file path. The format can be set globally and overridden per task.

# Upload annotation files to CVAT — one explicit path per task.
# Run with: datnvt-cvat-cli --config server.yaml run config/upload.yaml

- task: upload_anno_with_cvat_tasks
  parameters:
    # Default annotation format for all tasks below.
    # Can be overridden individually with a "dataset_format" key on any task entry.
    dataset_format: "CVAT for images 1.1"   # "CVAT for images 1.1" (default) or "COCO 1.0"

    tasks:
      - task_id: 147
        annotation_path: data/processed/task147_annotations.xml

      - task_id: 150
        annotation_path: data/processed/task150_annotations.xml

      # Override format for a single task (COCO JSON instead of CVAT XML)
      - task_id: 151
        annotation_path: data/processed/task151_annotations.json
        dataset_format: "COCO 1.0"

Directory-convention fallback — if you prefer the auto-resolved path layout, omit tasks and use in_dir instead:

- task: upload_anno_with_cvat_tasks
  parameters:
    task_ids: [147, 150, 151]
    in_dir: data/processed      # looks for task{id}/ subdirs
    dataset_format: "CVAT for images 1.1"
    # CVAT: <in_dir>/task{id}/annotations_pseudo.xml
    #        (falls back to annotations.xml)
    # COCO: <in_dir>/task{id}/annotations/instances_default_pseudo.json
    #        (falls back to instances_default.json)

Combined download + upload — config/tasks.yaml

# Run both download and upload steps in sequence.
# Run with: datnvt-cvat-cli --config server.yaml run config/tasks.yaml
#
# To embed server credentials directly (overrides --config / env vars),
# add a "server" key to any entry:
#
# - task: download_cvat_tasks
#   server:
#     url: "https://cvat.example.com"
#     username: "myuser"
#     password: "mypassword"
#     project_id: 11
#   parameters:
#     ...

# Step 1: download existing annotations from CVAT
- task: download_cvat_tasks
  parameters:
    task_ids: [147, 150, 151]
    out_dir: data/raw
    dataset_format: "CVAT for images 1.1"
    save_images: false
    skip_existing: true

# Step 2: upload revised annotations back to CVAT (per-task explicit paths)
- task: upload_anno_with_cvat_tasks
  parameters:
    dataset_format: "CVAT for images 1.1"
    tasks:
      - task_id: 147
        annotation_path: data/processed/task147_annotations.xml
      - task_id: 150
        annotation_path: data/processed/task150_annotations.xml
      - task_id: 151
        annotation_path: data/processed/task151_annotations.xml

Python API

from datnvt_cvat_cli import CVATClient, DatasetFormat, ServerConfig

# Instantiate
client = CVATClient(
    url="https://cvat.example.com",
    username="myuser",
    password="mypassword",
    project_id=11,
)

# Or from a ServerConfig object
cfg = ServerConfig(url="...", username="...", password="...", project_id=11)
client = CVATClient.from_config(cfg)

# Pre-flight checks
ok = client.check_connection()          # True if server is reachable and credentials valid
ok = client.check_project()             # True if client.project_id is accessible
ok = client.check_project(project_id=5) # check a specific project

# List projects / tasks
projects = client.get_projects()          # list[dict]
tasks    = client.get_tasks()             # all tasks in default project
tasks    = client.get_tasks(project_id=15)
task_ids = client.get_task_ids()          # list[int]

# Get task metadata
info = client.get_task_info(task_id=147)

# Download annotations for multiple tasks (default: CVAT for images 1.1)
client.download_tasks(
    task_ids=[147, 150],
    out_dir="data/raw",
    fmt=DatasetFormat.CVAT,   # default
    save_images=False,
    skip_existing=True,
    folder_prefix="task",     # default; use "data_" to get data_147/ instead of task147/
)

# Download a single task to a specific path
from pathlib import Path
client.download_annotations(
    task_id=147,
    out_path=Path("data/raw/task147"),
    fmt=DatasetFormat.CVAT,
    save_images=True,
)

# Upload annotations for multiple tasks (default: CVAT for images 1.1)
client.upload_tasks(
    task_ids=[147, 150],
    in_dir="data/processed",
    fmt=DatasetFormat.CVAT,   # default
)

# Upload a single annotation file
client.upload_annotations(
    task_id=147,
    anno_path=Path("data/processed/task147/annotations_pseudo.xml"),
    fmt=DatasetFormat.CVAT,
)

Environment variables

Variable Description
CVAT_SERVER_CONFIG Path to server YAML config file
CVAT_URL CVAT server URL
CVAT_USERNAME CVAT username
CVAT_PASSWORD CVAT password
CVAT_PROJECT_ID Default project ID

Annotation file paths

After download the expected file layout is:

CVAT for images 1.1 (default):

task{id}/
  annotations.xml
  images/           ← only when save_images=True

COCO 1.0:

task{id}/
  annotations/
    instances_default.json
  images/           ← only when save_images=True

When uploading, the client looks for annotations_pseudo.xml / instances_default_pseudo.json first, then falls back to the non-pseudo variants.


License

MIT

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

datnvt_cvat_cli-0.1.0.tar.gz (20.9 kB view details)

Uploaded Source

Built Distribution

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

datnvt_cvat_cli-0.1.0-py3-none-any.whl (16.5 kB view details)

Uploaded Python 3

File details

Details for the file datnvt_cvat_cli-0.1.0.tar.gz.

File metadata

  • Download URL: datnvt_cvat_cli-0.1.0.tar.gz
  • Upload date:
  • Size: 20.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.4

File hashes

Hashes for datnvt_cvat_cli-0.1.0.tar.gz
Algorithm Hash digest
SHA256 e9a6e4ed0963230d356195fcf7756adfbdd9e5db9d811773745ef708d7884b29
MD5 fbf6563042dcf12f258df0d86335e9cf
BLAKE2b-256 29747c6f03e38d02286c055a0de346ffd22c0e2c751f54f9eaa61cf88ea3b1bb

See more details on using hashes here.

File details

Details for the file datnvt_cvat_cli-0.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for datnvt_cvat_cli-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 95ede888baa4829639216d39e39a12eb1ec748b550f52e6f278ba54ccb308563
MD5 ebef06f23e1a6fa141467cd4df36db21
BLAKE2b-256 1f46b57d324524e1fd7f5f6c71b2fb0c5b5bbcda000c587962ab0d0b6b92b4cc

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