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.
Metadata
Release files for fujicv 1.9.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| fujicv-1.9.0.tar.gz | 107.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| fujicv-1.9.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 212.0 kB
Release files / fujicv-1.9.0.tar.gz
| Download URL | fujicv-1.9.0.tar.gz |
|---|---|
| Size | 107.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
00354f887f201fda75ccb9cce768e31b10e34ad5cefaa65abac140fcff331c5c
|
|
BLAKE2b-256 checksum How to use checksums |
b96adb2310e6d2a0aa99126995770b9013b0d08f2e8affaca47215aa48dcc12b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.10.11
|
Release files / fujicv-1.9.0-py3-none-any.whl
| Download URL | fujicv-1.9.0-py3-none-any.whl |
|---|---|
| Size | 105.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
906fd6b6137ca8ed494af583b4c64c9949515adbfa1eae5d5f1f87df3491e569
|
|
BLAKE2b-256 checksum How to use checksums |
7f7d9073ee37f44a397fb23e52526c9f3e0d35c93764dbcc3c18fe75073aeb59
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.10.11
|