Open-source Python package for image classification and regression built on timm + torchvision
Project description
FujiCV
Open-source Python package for image classification and regression, built on timm + torchvision.
Features
- Backbone factory — instantly load any timm or torchvision model with a single call; classifier head auto-stripped, output dimension auto-detected.
- Task heads — ClassificationHead, RegressionHead, MultiLabelHead.
- Custom layers — LinearBNDropout, GeM pooling, AttentionPool, SqueezeExcite.
- ModelBuilder — assemble backbone + custom layers + head; dummy forward pass validates shapes at build time.
- Albumentations pipelines — light / medium / heavy augmentation presets, ImageNet normalisation, deterministic val transforms.
- CSVImageDataset — reads any CSV-driven image dataset; pre-validates files, skips missing with a warning; supports classification, regression, multilabel.
- Loss functions — 15 losses across classification, regression, and multilabel
tasks, all registered in
LOSS_REGISTRY. Includes CORAL and CORN ordinal regression losses. - Metrics — 16 metrics across all tasks, registered in
METRIC_REGISTRY. - Trainer — AMP, gradient clipping, early stopping, best/last checkpointing,
history CSV. Multi-GPU via automatic
DataParallelwhen multiple CUDA devices are present. - HPO — Optuna hyperparameter search via
fujicv.hpo.run_hpo; install withpip install "fujicv[hpo]". - WandbLogger — W&B integration via env-var only (
WANDB_API_KEY); graceful no-op when W&B is absent. - Evaluation — confusion matrix, ROC/PR curves, t-SNE, Grad-CAM (CNN), attention rollout (ViT).
- Inference —
Predictor.from_checkpointfor single image and batch inference. - ONNX export — export and numeric verification.
Installation
# Core (CPU)
pip install fujicv
# With W&B logging
pip install "fujicv[wandb]"
# With ONNX export
pip install "fujicv[onnx]"
# Dev / testing
pip install "fujicv[dev]"
PyTorch is not included as a transitive dependency on PyPI. Install it separately following the official instructions to pick the right CUDA version.
Quick Start
1. Classification
from fujicv.models.builder import ModelBuilder
from fujicv.losses import get_loss
from fujicv.metrics import get_metric
from fujicv.engine.trainer import Trainer
from fujicv.data import build_splits, build_dataloaders
from fujicv.utils import load_config, set_seed
set_seed(42)
cfg = load_config("examples/configs/classification_example.yaml")
train_df, val_df, test_df = build_splits(cfg["dataset"])
train_loader, val_loader, _ = build_dataloaders(
train_df, val_df, test_df, cfg["dataset"], cfg["augmentation"]
)
model = ModelBuilder(
backbone_name="resnet50",
task="classification",
num_outputs=10,
pretrained=True,
).build()
import torch.optim as optim
trainer = Trainer(
model=model,
train_loader=train_loader,
val_loader=val_loader,
loss_fn=get_loss("LabelSmoothingCE", {"smoothing": 0.1}),
metrics={"Accuracy": get_metric("Accuracy"), "F1": get_metric("F1")},
optimizer=optim.AdamW(model.parameters(), lr=3e-4),
epochs=30,
task="classification",
output_dir="outputs/",
)
history = trainer.train()
2. Using the example scripts
# Train
python examples/train.py --config examples/configs/classification_example.yaml
# Evaluate (with attention maps)
python examples/evaluate.py \
--config examples/configs/classification_example.yaml \
--checkpoint outputs/classification/best.pt \
--with-attention-maps
3. Inference
from fujicv.inference import Predictor
from fujicv.models.builder import ModelBuilder
model_skeleton = ModelBuilder(
backbone_name="resnet50", task="classification", num_outputs=10, pretrained=False
).build()
predictor = Predictor.from_checkpoint("outputs/classification/best.pt", model=model_skeleton)
label, confidence = predictor.predict("path/to/image.jpg")
print(f"Predicted: {label} ({confidence:.1%})")
4. ONNX Export
from fujicv.export import to_onnx, verify_onnx
to_onnx(model, "model.onnx")
verify_onnx(model, "model.onnx")
Package Layout
fujicv/
models/ backbone factory, heads, custom layers, ModelBuilder
data/ CSVImageDataset, transforms, dataloader factory
losses/ 13 loss functions + registry
metrics/ 16 metric callables + registry
engine/ Trainer, WandbLogger, callbacks
eval/ plots, report, ROC/PR curves, t-SNE, attention maps
utils/ Registry, set_seed, config loader
inference/ Predictor
export/ ONNX export & verification
tests/
examples/
configs/ YAML configs for each task type
train.py
evaluate.py
Supported Tasks
| Task | Loss examples | Metric examples |
|---|---|---|
| Classification / Multiclass | CrossEntropyLoss, FocalLoss, LabelSmoothingCE | Accuracy, F1, AUROC |
| Regression | MSELoss, HuberLoss, QuantileLoss | MAE, RMSE, R2Score |
| Multi-label | BCEWithLogitsLoss, AsymmetricLoss, FocalBCELoss | HammingLoss, mAP, PerLabelAUROC |
Security
See SECURITY.md for the full policy. Key points:
- No hardcoded credentials anywhere in the codebase.
- W&B API key read from
WANDB_API_KEYenvironment variable only. - Loss/metric functions are pure tensor operations with no network calls.
Contributing
- Fork the repository and create a feature branch.
- Install in editable mode:
pip install -e ".[dev]" - Run the checks locally:
ruff check fujicv/ tests/ mypy fujicv/ pytest tests/ detect-secrets scan
- Open a pull request — CI will run automatically.
Validated Results
| Dataset | Model | Epochs | Device | Val Accuracy |
|---|---|---|---|---|
| MNIST | ResNet-18 (scratch) | 5 | CPU | 98.6% |
Changelog
See CHANGELOG.md for the full release history.
License
Apache 2.0 — Copyright (c) 2025 FujiCV Contributors.
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file fujicv-1.7.0.tar.gz.
File metadata
- Download URL: fujicv-1.7.0.tar.gz
- Upload date:
- Size: 98.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e35204f52b4f31d79bb2685355c7dc0fb3a93a809f2813291b33e0bf492e62eb
|
|
| MD5 |
d8bcd558fbe8249a0a55fbf6eac3dfd8
|
|
| BLAKE2b-256 |
bc73d1fb55fa1863c5e2396d2457a2ac5195a2e6b46f86878178a2588ff3fc0c
|
File details
Details for the file fujicv-1.7.0-py3-none-any.whl.
File metadata
- Download URL: fujicv-1.7.0-py3-none-any.whl
- Upload date:
- Size: 97.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0d45bc89401e961ae59fc6ead2f636b19b761b5a7cd503de9797575be4a10d09
|
|
| MD5 |
29d0f409661d8c02e95a1a58ba4edb7a
|
|
| BLAKE2b-256 |
82efff3086ab46547f5497c5930dda7ebae90ce3726d2ff04a8af04574960390
|