Skip to main content
Geti Library

A low-code transfer learning framework for training, evaluating, optimizing, and deploying computer vision models


Key FeaturesSupported Tasks & ModelsInstallationUsageCommand-Line ScriptsDocsLicense

PyPI

python pytorch openvino numpy

Codecov OpenSSF Scorecard Pre-Merge Test License Downloads


Geti Library - getitune

The Geti™ library (getitune) is a low-code transfer learning framework for Computer Vision. Its API and CLI let you train, evaluate, optimize, and deploy models quickly, even without deep expertise in deep learning. It supports diverse combinations of model architectures, learning methods, and task types built on PyTorch and the OpenVINO™ toolkit.

Each supported task ships with curated "recipes": YAML files that bundle the model, data pipeline, and training configuration into a single one-stop entry point. Recipes are validated on standard datasets so you get a strong baseline out of the box.

Key Features

  • Multi-task support: classification, object detection, instance segmentation, semantic segmentation, and keypoint detection, see the full model list below.
  • Tiling for large images across detection and segmentation tasks.
  • Multiple backends: train with PyTorch Lightning, Ultralytics YOLO, export and run inference with ONNX and OpenVINO™.
  • Hardware acceleration: Intel GPU (XPU) and NVIDIA CUDA support.
  • Datumaro data frontend with automatic format detection (COCO, YOLO, VOC, native).
  • Distributed training across multiple GPUs.
  • Mixed-precision training to reduce memory and increase batch size.
  • Class-incremental learning to extend an existing model with new classes.
  • Deployment to OpenVINO™ IR and ONNX formats, with inference via OpenVINO™ ModelAPI.

Supported Tasks & Models

All recipes live under src/getitune/recipe/<task>/. Pass any of these YAMLs directly to the API as model=.... Recipes whose name ends in _tile enable the tiling pipeline for large images.

Task Recipe directory Example recipes
Classification (multi-class / multi-label) multi_class_cls, multi_label_cls dino_v2, vit_tiny, efficientnet_b0, efficientnet_b3, efficientnet_v2, mobilenet_v3_large, yolo26_{n,s,m,l,x}_cls, timm_generic (any timm backbone by name, e.g. resnet50.a1_in1k, convnext_tiny.in12k)
Object detection detection atss_mobilenetv2, ssd_mobilenetv2, yolox_{tiny,s,l,x}, rtdetr_50, dfine_x, deim_dfine_{l,m,x}, deimv2_{s,m,l}, edgecrafter_{s,m,l,x}, rfdetr_{nano,small,medium,large}, yolo11_{n,s,m,l,x}, yolo12_{n,s,m,l,x}, yolo26_{n,s,m,l,x}
Instance segmentation instance_segmentation maskrcnn_{r50,swint,efficientnetb2b}, rtmdet_inst_tiny, rfdetr_seg_{nano,small,medium,large,xlarge,2xlarge}, yolo11_{n,s,m,l,x}_seg, yolo26_{n,s,m,l,x}_seg
Semantic segmentation semantic_segmentation dino_v2, litehrnet_{s,18,x}, segnext_{t,s,b}, yolo26_{n,s,m,l,x}_sem (with _tile variants)
Keypoint detection keypoint_detection rtmpose_tiny

Each task directory also ships an openvino_model.yaml recipe for running and optimizing pre-exported OpenVINO IR models via OVEngine.


Installation

# With uv (recommended)
# CPU-only by default
uv pip install "getitune"

# Or with pip
pip install "getitune"

# For hardware-specific PyTorch wheels, see "Advanced Installation: Specify Hardware Backend" below.
Advanced Installation: Specify Hardware Backend

getitune ships three mutually exclusive extras that select the right PyTorch wheel for your hardware:

Extra PyTorch wheel Use when Setup Guide
[cpu] torch==2.12.1+cpu (Linux/Windows) or default torch==2.12.1 (macOS) No GPU, or running on Apple silicon.
[xpu] torch==2.12.1+xpu + triton-xpu Intel discrete or integrated GPUs. Intel GPU drivers
[cuda] torch==2.12.1+cu130 NVIDIA GPUs with CUDA 13.0 drivers. NVIDIA CUDA Toolkit
# Intel GPU (XPU)
uv pip install "getitune[xpu]" --extra-index-url https://download.pytorch.org/whl/xpu

# NVIDIA GPU (CUDA 13.0)
uv pip install "getitune[cuda]" --extra-index-url https://download.pytorch.org/whl/cu128

# CPU-only (no extra index needed)
uv pip install "getitune[cpu]"
Advanced Installation: Install from Source with Ultralytics YOLO Support
git clone https://github.com/open-edge-platform/geti.git
cd geti/library

# Recommended: use uv to honor the lockfile
uv sync                      # CPU-only
uv sync --extra xpu          # Intel GPU (XPU) — setup: https://github.com/intel/compute-runtime/releases
uv sync --extra cuda         # NVIDIA GPU (CUDA 13.0) — setup: https://developer.nvidia.com/cuda-13-0-0-download-archive

# Or with pip in a virtual environment
python -m venv .venv && source .venv/bin/activate

# CPU-only
pip install -e ".[cpu]"

# Intel GPU (XPU)
pip install -e ".[xpu]" \
  --extra-index-url https://download.pytorch.org/whl/xpu

# NVIDIA GPU (CUDA 13.0)
pip install -e ".[cuda]" \
  --extra-index-url https://download.pytorch.org/whl/cu130
Advanced Installation: Install from Source with Legacy CUDA Support (12.6)

By default, the [cuda] extra builds torch/torchvision against CUDA 13.0, which doesn't support older NVIDIA GPU architectures (Volta, Maxwell, Pascal). If you have one of these GPUs, patch the project to use CUDA 12.6 instead:

git clone https://github.com/open-edge-platform/geti.git
cd geti/library

# Replace CUDA 13.0 with CUDA 12.6 in pyproject.toml and refresh the lockfile
just patch-for-legacy-gpu-support

# Then install as usual, e.g. with uv
uv sync --extra cuda         # NVIDIA GPU (CUDA 12.6) — setup: https://developer.nvidia.com/cuda-12-6-0-download-archive

# Or with pip in a virtual environment
python -m venv .venv && source .venv/bin/activate
pip install -e ".[cuda]" \
  --extra-index-url https://download.pytorch.org/whl/cu126

Usage

Discovering Recipes and Models

To explore available models and recipes:

from getitune.utils import list_models

# List all available models names
all_models = list_models()

# List all available recipes / configuration files (full YAML paths)
all_recipes = list_models(return_recipes=True)

# Filter by task
detection_models = list_models(task="DETECTION")

# Filter by pattern
efficient_models = list_models(pattern="*efficient*")

Then pass any model name to create_engine(model="...", data="...").


Training

Getitune supports an API-based training approach:

from getitune.engine import create_engine

# Initialize and train using a recipe and dataset
engine = create_engine(
    model="src/getitune/recipe/classification/multi_class_cls/efficientnet_b0.yaml", # any supported model name from the model catalog (see below example), recipe.yaml path or instantiated model class directly
    data="tests/assets/classification_cifar10", # path to dataset root (any supported format, e.g., COCO, VOC, YOLO, Datumaro) or DataModule instance
    work_dir="./my_workspace",  # Defaults to "./getitune-workspace"
    device="auto",              # "auto", "cpu", "gpu", "0", "xpu", etc.
)
engine.train(max_epochs=50)
engine.test()

Export

Export a trained model to OpenVINO IR or ONNX format:

from getitune.engine import create_engine
from getitune.types import ExportFormat, ExportPrecision

engine = create_engine(
    model="efficientnet_b0",
    data="/path/to/dataset",
    work_dir="./my_workspace",
)
engine.train(max_epochs=50)

# Export to FP32 OpenVINO IR (default)
ov_ir_path = engine.export()

# Export to FP32 ONNX
onnx_path = engine.export(export_format=ExportFormat.ONNX)

# Export to FP16 ONNX. Same for OpenVINO IR.
onnx_path = engine.export(export_format=ExportFormat.ONNX, precision=ExportPrecision.FP16)

NMS-based detection and instance-segmentation models are exported without NMS in the graph by default; ModelAPI applies NMS using the embedded metadata. MaskRCNN, MaskRCNNTV, and RTMDetInst always embed NMS because their export paths do not support raw outputs, regardless of export_nms. To embed NMS in the exported graph for models that support the option, pass export_nms=True explicitly:

onnx_path = engine.export(export_format=ExportFormat.ONNX, export_nms=True)

Validation and Inference

Getitune provides inference via PyTorch and OpenVINO backends (utilizing ModelAPI):

from getitune.engine import create_engine

# PyTorch inference with model name
engine = create_engine(
    model="efficientnet_b0",
    data="/path/to/dataset",
)
test_metrics = engine.test() # test on test subset
predictions = engine.predict() # predict on test subset
# OpenVINO inference (from exported model)
ov_engine = create_engine(
    model="/path/to/exported_model.xml",
    data="/path/to/dataset",
)
ov_engine.test() # test on test subset
ov_engine.predict() # predict on test subset
# ONNX inference (from exported model)
ov_engine = create_engine(
    model="/path/to/exported_model.onnx",
    data="/path/to/dataset",
)
ov_engine.test() # test on test subset
ov_engine.predict() # predict on test subset

Optimization

Apply post-training quantization to reduce model size and accelerate inference:

from getitune.engine import create_engine

# Load an exported OpenVINO model and optimize it
ov_engine = create_engine(
    model="/path/to/exported_model.xml",
    data="/path/to/dataset",
)
ov_engine.optimize()  # post-training quantization via NNCF
test_metrics = ov_engine.test() # test on test subset with optimized model
predictions = ov_engine.predict() # predict on test subset with optimized model

Dataset Support

When you pass a path to data=, getitune uses Datumaro to auto-detect the dataset format. Supported formats:

Format Detection method
COCO annotations/ directory with COCO JSON files
YOLO data.yaml file (Ultralytics layout)
Pascal VOC JPEGImages/, Annotations/, ImageSets/ directories
Datumaro (native) metadata.json + data.parquet at root

Zip archives are also accepted, Datumaro extracts them on import.

# Works the same regardless of format, just point to the dataset root
engine = create_engine(
    data="/path/to/dataset_root",
    model="src/getitune/recipe/detection/yolox_s.yaml",
)
engine.train()

Advanced Usage

Direct Backend Engine Usage

The backends engines can also be instantiated directly:

# -- Lightning Backend --
from getitune.backend.lightning.engine import LightningEngine
from getitune.models import EfficientNet

engine = LightningEngine(
    model=EfficientNet(label_info=10, model_name="efficientnet_b0"),
    data="/path/to/dataset",
    work_dir="./my_workspace",
    device="auto",
)
engine.train(max_epochs=50)
engine.test()
engine.export()


# -- Ultralytics Backend --
from getitune.backend.ultralytics.engine import UltralyticsEngine
from getitune.backend.ultralytics.models import UltralyticsDetectionModel

engine = UltralyticsEngine(
    model=UltralyticsDetectionModel(model_name="yolo26s", label_info=10),  # or datamodule.label_info
    data="/path/to/yolo_dataset/data.yaml",
    work_dir="./yolo_workspace",
    device="auto",
)
engine.train(epochs=50)
engine.test()
engine.export()

> [!NOTE]
> Ultralytics YOLO models and the `UltralyticsEngine` backend require [installing from source](#advanced-installation-install-from-source) with the `[ultralytics]` extra.
> The PyPI package does **not** include Ultralytics support.


# -- OpenVINO Backend (inference) --
from getitune.backend.openvino.engine import OVEngine

engine = OVEngine(
    model="/path/to/exported_model.xml",
    data="/path/to/dataset",
)
engine.test()
engine.optimize()
Common Engine Parameters

Customize engine creation with the following parameters:

engine = create_engine(
    model="efficientnet_b0",
    data="/path/to/data",
    work_dir="./my_workspace",         # Working directory for checkpoints/logs; defaults to "./getitune-workspace"
    device="gpu",                       # "auto", "cpu", "gpu", "0", "1", "xpu", etc.
    checkpoint="/path/to/weights.pt",  # Optional pretrained checkpoint for warm-start training
    task="MULTI_CLASS_CLS",             # Required only if model name matches multiple tasks
)
engine.train(max_epochs=50)
Override training hyperparameters

You can override engine-level training parameters directly:

engine.train(
    max_epochs=50,
    seed=42,
    deterministic=True,
    precision="16-mixed",          # mixed-precision training
    gradient_clip_val=1.0,
    check_val_every_n_epoch=5,
)

For model-level hyperparameters like learning rate and optimizer, you can pass them when instantiating a model class directly:

from torch.optim import AdamW
from getitune.models import EfficientNet

model = EfficientNet(
    label_info=datamodule.label_info, # or simply num_classes, e.g., int value
    model_name="efficientnet_b0",
    optimizer=lambda params: AdamW(params, lr=0.001, weight_decay=0.01),
)

engine = create_engine(data=datamodule, model=model)
engine.train(max_epochs=100)

Alternatively, you can set these in a custom recipe YAML (copy and modify an existing one):

# my_recipe.yaml — custom learning rate and optimizer
task: MULTI_CLASS_CLS
model:
  class_path: getitune.backend.lightning.models.classification.multiclass_models.efficientnet.EfficientNetMulticlassCls
  init_args:
    label_info: 1000
    model_name: efficientnet_b0

    optimizer:
      class_path: torch.optim.AdamW
      init_args:
        lr: 0.001
        weight_decay: 0.01

    scheduler:
      class_path: getitune.backend.lightning.schedulers.LinearWarmupSchedulerCallable
      init_args:
        num_warmup_steps: 5
        main_scheduler_callable:
          class_path: lightning.pytorch.cli.ReduceLROnPlateau
          init_args:
            mode: max
            factor: 0.5
            patience: 3
            monitor: val/accuracy

data: src/getitune/recipe/_base_/data/classification.yaml

overrides:
  max_epochs: 100
Override augmentations and datamodule

For augmentations, override the data config. Augmentations run on CPU (augmentations_cpu) and GPU (augmentations_gpu) separately:

# my_data.yaml — stronger augmentations
task: MULTI_CLASS_CLS
input_size: [224, 224]
train_subset:
  subset_name: train
  batch_size: 32
  num_workers: 8
  augmentations_cpu:
    - class_path: torchvision.transforms.v2.RandomResizedCrop
      init_args:
        size: [224, 224]
        scale: [0.08, 1.0]
  augmentations_gpu:
    - class_path: kornia.augmentation.RandomHorizontalFlip
      init_args:
        p: 0.5
    - class_path: kornia.augmentation.ColorJiggle
      init_args:
        brightness: 0.4
        contrast: 0.4
        saturation: 0.4
        hue: 0.1
        p: 0.8
    - class_path: kornia.augmentation.RandomGaussianBlur
      init_args:
        kernel_size: [3, 3]
        sigma: [0.1, 2.0]
        p: 0.3
    - class_path: kornia.augmentation.Normalize
      init_args:
        mean: [0.485, 0.456, 0.406]
        std: [0.229, 0.224, 0.225]

Then reference your custom data config from your recipe with data: my_data.yaml.

Augmentations can also be overridden directly via the API by creating a DataModule instance and passing it to the engine:

from getitune.data.module import DataModule
from getitune.config.data import SubsetConfig
from getitune.models import EfficientNet
import kornia.augmentation as K
from torchvision.transforms import v2

datamodule = DataModule(
    task="MULTI_CLASS_CLS",
    data_root="tests/assets/classification_cifar10",
    train_subset=SubsetConfig(
        augmentations_cpu=[
            v2.Resize((256, 256)),
        ],
        augmentations_gpu=[
            K.RandomErasing(p=0.5),
            K.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.1),
        ],
        batch_size=32,
        num_workers=8,
    ),
    val_subset=SubsetConfig(
        subset_name="val",
        augmentations_cpu=[
            v2.Resize((256, 256)),
        ],
        batch_size=32,
        num_workers=8,
    ),
    test_subset=SubsetConfig(
        subset_name="test",
        augmentations_cpu=[
            v2.Resize((256, 256)),
        ],
        batch_size=32,
        num_workers=8,
    ),
)

model = EfficientNet(label_info=datamodule.label_info, model_name="efficientnet_b0")
engine = create_engine(data=datamodule, model=model)
engine.train()

Available model classes:

  • Detection: ATSS, SSD, YOLOX, RTDETR, DFine, DEIMDFine, DEIMV2, RFDETR, EdgeCrafter, UltralyticsDetectionModel
  • Instance segmentation: MaskRCNN, MaskRCNNTV, RTMDetInst, RFDETRSeg, UltralyticsInstSegModel
  • Semantic segmentation: DinoV2Seg, LiteHRNet, SegNext, UltralyticsSemanticSegModel
  • Classification: EfficientNet, MobileNetV3, VisionTransformer, TimmModel, TVModel, UltralyticsMultiClassClsModel
  • Keypoint: RTMPose

Command-Line Scripts

The scripts/ directory ships ready-to-use command-line entry points that wrap the getitune API for common workflows (training, evaluation, export, benchmarking, and prediction). They are plain Python scripts — run them directly with your getitune environment active.

train.py

Train, test, and optionally export/quantize a getitune model from the CLI. Accepts a model name or recipe, dataset root, device, epochs, batch size, and precision, with flags to disable early stopping and to export (--export) to OpenVINO/ONNX and quantize (--quantize) to INT8.

# Train, test, and export to OpenVINO FP16
python scripts/train.py \
    --model src/getitune/recipe/detection/yolox_s.yaml \
    --data-root /path/to/dataset \
    --epochs 50 \
    --export --export-format openvino --export-precision fp16

# Train and quantize the exported model to INT8
python scripts/train.py \
    --model yolox_s \
    --data-root /path/to/dataset \
    --export --quantize

test.py

Evaluate a trained model (torch .ckpt/.pt/.pth, or exported OV/ONNX) on a dataset and print the resulting metrics. Supports a task-aware --metric override (e.g. f1-score, map, dice, miou, pck) mapped per task, so invalid combinations like map for multiclass classification are rejected.

# Evaluate an exported OpenVINO model with the default recipe metrics
python scripts/test.py \
    --model /path/to/exported_model.xml \
    --data-root /path/to/dataset

# Evaluate a torch checkpoint with explicit metrics (DETECTION task)
python scripts/test.py \
    --model ckpt.ckpt --recipe yolox_s --task DETECTION \
    --data-root /path/to/dataset \
    --metric f1-score map

# Supported metrics per task:
#   MULTI_CLASS_CLS:        accuracy, f1-score
#   MULTI_LABEL_CLS:        accuracy, f1-score, map
#   DETECTION:              f1-score, map
#   INSTANCE_SEGMENTATION:  f1-score, map
#   SEMANTIC_SEGMENTATION:  dice, miou
#   KEYPOINT_DETECTION:     pck, pck-score

export.py

Export a getitune model to OpenVINO or ONNX at FP32/FP16, or to INT8 via post-training quantization. Defaults to OpenVINO FP16; INT8 requires a dataset root for the calibration step.

# Export to OpenVINO FP16 (default)
python scripts/export.py \
    --model yolox_s --checkpoint /path/to/ckpt.ckpt \
    --data-root /path/to/dataset

# Export to ONNX FP32 from a recipe/model and checkpoint
python scripts/export.py \
    --model yolox_s --checkpoint /path/to/ckpt.ckpt \
    --data-root /path/to/dataset \
    --format onnx --precision fp32

# Export to OpenVINO INT8 (quantized)
python scripts/export.py \
    --model yolox_s --checkpoint /path/to/ckpt.ckpt \
    --data-root /path/to/dataset \
    --precision int8

predict.py

Run inference with an OV/ONNX/torch model on a dataset or images folder and write the predictions to a COCO-format JSON file (bounding boxes, RLE masks for segmentation, and keypoints). Uses coco_utils.py for the conversion.

# Predict with an exported OpenVINO model on an images folder
python scripts/predict.py \
    --model /path/to/exported_model.xml \
    --input /path/to/images \
    --output predictions.json

# Predict with a torch checkpoint
python scripts/predict.py \
    --model ckpt.ckpt --recipe yolox_s --task DETECTION \
    --input /path/to/dataset \
    --output predictions.json

benchmark.py

Prepare a model (export a recipe or quantize to INT8 as needed) and run OpenVINO benchmark_app against it, forwarding device, batch, input shape, hint, and iteration/time options for latency/throughput measurement.

# Benchmark an exported OpenVINO model on CPU
python scripts/benchmark.py \
    --model /path/to/exported_model.xml \
    --data-root /path/to/dataset \
    --device CPU

# Export + quantize a recipe to INT8, then benchmark
python scripts/benchmark.py \
    --model yolox_s --checkpoint /path/to/ckpt.ckpt \
    --data-root /path/to/dataset \
    --precision int8 --device CPU

License

The core Geti™ Library (getitune) is licensed under Apache License Version 2.0. By contributing to the project, you agree to the license and copyright terms therein and release your contribution under these terms.

Ultralytics YOLO models are distributed under the AGPL-3.0 license, an OSI approved license ideal for open-source research, academic, and personal projects. For commercial use, enhanced support, and tailored licensing terms, please explore flexible Ultralytics licensing options at https://www.ultralytics.com/license.


Download files

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

Source Distribution

getitune-0.3.0.tar.gz (4.2 MB view details)

Uploaded Source

Built Distribution

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

getitune-0.3.0-py3-none-any.whl (1.1 MB view details)

Uploaded Python 3

File details

Details for the file getitune-0.3.0.tar.gz.

File metadata

  • Download URL: getitune-0.3.0.tar.gz
  • Upload date:
  • Size: 4.2 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for getitune-0.3.0.tar.gz
Algorithm Hash digest
SHA256 3eee58d9471030ee5eb4490f35f7f7671e5f9c00270d915a02cc297fdd6cefee
MD5 88558105f27cb42e8cb277fbb7a7f3f2
BLAKE2b-256 d8d9ed9a3b6a61a41c3c7f99242666734369d888fb192931363e5c274d2e383f

See more details on using hashes here.

Provenance

The following attestation bundles were made for getitune-0.3.0.tar.gz:

Publisher: publish.yaml on open-edge-platform/geti

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file getitune-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: getitune-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 1.1 MB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for getitune-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 3e94c77d78dc26f149e98b6f7649e6add372cff24739ed371cfdd134e3f55bd4
MD5 646196bf276a1512bbf49b20832f5794
BLAKE2b-256 8ff7b168ddf459e1330a7fb75db90b08e8e9491124bd46aa7e8de38b854f1ecd

See more details on using hashes here.

Provenance

The following attestation bundles were made for getitune-0.3.0-py3-none-any.whl:

Publisher: publish.yaml on open-edge-platform/geti

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

0.3.0 This release

2 files

0.2.0

2 files

0.1.3

2 files

0.1.2

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page