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.
pip install vyntriWhy 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
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
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.
Analyze
Dataset intelligence fingerprints your data — class balance, image resolution, and dataset warnings.
Select
Auto-select backbone via LogME scoring + top-k validation. Five backbones supported, candidates controllable.
Extract
Frozen pre-trained backbone extracts feature vectors. Cached on disk for instant re-runs.
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.
my_dataset/
├── cat/
│ ├── img001.jpg
│ ├── img002.jpg
│ └── ...
├── dog/
│ ├── img001.jpg
│ └── ...
└── bird/
├── img001.jpg
└── ...Supports JPG, JPEG, PNG, BMP, TIFF, and WebP formats.