Classify Images in Seconds
No GPU Required

Adapt pretrained vision backbones to your classification task in seconds without gradient training. CPU-first, zero configuration, instant adaptation.

Terminal
pip install vyntri

Why Vyntri?

Built for speed, simplicity, and real-world edge deployment.

Instant Adaptation

No training loops, no epochs. Analytic ridge classifier in closed form fast CPU-first adaptation, especially with cached features.

Auto Backbone Selection

LogME scoring + top-k validation automatically picks the best backbone. Choose from MobileNetV3, ResNet18, ResNet50, EfficientNet-B0, or ConvNeXt. Use candidates to limit the search.

Continual Learning

Add new classes without retraining. update() maintains sufficient statistics and re-solves from them sequential matches joint.

Folder-per-Class

No config files, no annotations. Just organize images into folders named by class and point Vyntri at them.

Advanced Analytics

FK discriminative whitening, SLCE projection, Ledoit-Wolf shrinkage research-validated methods with honest trade-offs.

Clean Python API

Fit, predict, evaluate, update, fine-tune, save, clear_cache, and __repr__ a clean, validated Python API with method chaining.

Quick Example

Go from folder of images to trained classifier in 5 lines.

Quick Start

quick_start.py
from vyntri import Vyntri
from vyntri.data import split

# Split your dataset into train/val/test
s = split("./my_dataset", train=0.7, test=0.2, seed=42)

# Fit a model
model = Vyntri()
model.fit(train=s.train, val=s.val)

# What classes did the model learn?
print(model.classes_)  # ['cats', 'dogs', 'birds']

# Evaluate on test set
result = model.evaluate(s.test)
print(result.accuracy, result.macro_f1)

# Predict a single image
prediction = model.predict("test.jpg")
print(prediction.label, prediction.confidence)

# Save and load
model.save("model.vyntri")
model = Vyntri.load("model.vyntri")

Continual Learning

update_example.py
from vyntri import Vyntri
from vyntri.data import split

# Load saved model
model = Vyntri.load("model.vyntri")

# Add new data — new classes are detected automatically
result = model.update("./new_data")
print(f"New classes: {result.new_classes}")

# Fine-tune for extra accuracy (optional)
s_finetune = split("./my_dataset", train=0.7, test=0.2, seed=42)
model.fine_tune(
    s_finetune,
    scope="last_layer",
    epochs=3
)

# Save updated model
model.save("model.vyntri")

Four Steps to Adaptation

From raw images to a deployed classifier fully automated.

1

Analyze

Dataset intelligence fingerprints your data class balance, image resolution, and dataset warnings.

2

Select

Auto-select backbone via LogME scoring + top-k validation. Five backbones supported, candidates controllable.

3

Extract

Frozen pre-trained backbone extracts feature vectors. Cached on disk for instant re-runs.

4

Adapt

FK discriminative whitening + analytic ridge classifier in closed form. No gradient descent.

Dataset Format

Vyntri expects a simple folder-per-class structure. No YAML configs, no annotation files.

Expected structure
my_dataset/
├── cat/
   ├── img001.jpg
   ├── img002.jpg
   └── ...
├── dog/
   ├── img001.jpg
   └── ...
└── bird/
    ├── img001.jpg
    └── ...

Supports JPG, JPEG, PNG, BMP, TIFF, and WebP formats.