LOFOP: a modular, enterprise-grade computer vision framework.
Project description
LOFOP
LOFOP is a modular, enterprise-grade computer vision framework built on PyTorch, with its own original detector: LOFOP-Detect. It is an independent design and implementation that follows modern computer-vision engineering practices while remaining self-contained.
Status: published on PyPI (
pip install lofop). Core engine, data subsystem (with visualization), cross-platform native ops, LOFOP-Detect models, training engine (schedulers, early stopping, strong augmentation), full CLI, Python SDK, and verified ONNX (fixed + dynamic shapes) / TensorRT export. 259 tests passing with a coverage-gated CI. Seedocs/architecture.mdfor the subsystem map andCHANGELOG.mdfor release history.
📖 New here? Read the Operator's Manual — a complete, step-by-step guide to installing, training, exporting, deploying, and troubleshooting LOFOP.
What works today
- Datasets — COCO, YOLO, and VOC support through one canonical model: any-to-any conversion,
validation (degenerate/out-of-bounds boxes, missing files, dangling categories), statistics,
and torch-free visualization (
lofop dataset show/lofop.data.draw_boxes). - LOFOP-Detect — an original anchor-free detector (RidgeNet backbone, DeltaFusion neck with
attention only on the cheap stride-32 level, ApexHead with an IoU-quality branch, dynamic top-k
label assignment). Variants are pure config:
n= 1.3M params,s= 3.8M,ex= 20.1M. Design + trade-offs:docs/lofop-detect.md. - Python SDK —
from lofop import Detector: build, train, predict (boxes in original image coordinates), evaluate, and export through one documented class. Full reference:docs/sdk.md. - Training — AMP, EMA weights, config-driven LR schedulers (
warmup_cosine,warmup_linear,constant,step), early stopping, an optional TensorBoard hook, gradient clipping, atomic checkpointing with resume, an opt-in strong-augmentation recipe (2x2 mosaic + color jitter, original tensor-native ops), and a COCO-protocol evaluator (mAP@50, mAP@50:95, precision, recall, F1, per-class precision/recall, confusion matrix). - Cross-platform native ops — IoU and class-aware NMS kernels (20-200x over pure Python) with a
verified-identical Python fallback, so a compiler is never required. The C++ path builds with
g++/clang on Linux/macOS and MinGW/clang/MSVC on Windows;
lofop.ops.backend()reports which is active. - Benchmarking —
lofop benchmarkrenders the standard metric table (mAP, FPS, params, FLOPs, model size) with optional CSV/JSON output (--results-dir), and never prints a number that was not actually measured. - Experiment tracking (MLOps) —
with lofop.mlops.track("runs/registry"):records every training run (settings, environment, per-epoch history, best/final metrics) as plain JSON through the event bus; inspect withlofop runs list / show / compare. Torch-free. - ONNX + TensorRT export —
lofop exportwrites a numerically verified ONNX graph (network + box decoding;--dynamicfor variable input sizes, verified at two resolutions), or a TensorRT engine (--format tensorrt --fp16) via that same ONNX;postprocess_densefinishes inference torch-free with the C++ NMS, so serving hosts need only a runtime + the LOFOP core. Details:docs/deploy.md. - Deployment scaffolding — CPU / CUDA / ONNX Runtime Docker images (
docker/).
Installation
pip install lofop # from PyPI
yay -S lofop # Arch Linux (AUR)
Optional feature sets (extras):
pip install "lofop[models]" # + PyTorch, for lofop.models / lofop.training
pip install "lofop[deploy]" # + onnx, onnxruntime, for ONNX export
pip install "lofop[tensorboard]" # + tensorboard, for the training hook
pip install "lofop[all]" # models + deploy + tensorboard in one go
python -c "from lofop.ops import build_native; build_native()" # optional C++ fast path
From a source checkout instead:
pip install -e ".[dev]" # framework + dev tools (pytest, ruff, build, twine)
Requires Python 3.9+. The core and data layers run without PyTorch (edge/CI friendly); torch
attaches only to the model and training subsystems. Maintainer release steps live in
docs/packaging.md.
Quickstart
Dataset tools (no torch needed):
lofop dataset convert --from coco --source instances.json --to yolo --target out/
lofop dataset validate --format yolo --source out/ # exit 1 on errors
lofop dataset stats --format coco --source instances.json -o stats.md
lofop dataset show --format coco --source instances.json -o vis/ --limit 10
Train and benchmark (five-minute CPU demo that fills the metric table end to end):
python examples/train_shapes.py --epochs 30 --workdir runs/shapes
lofop benchmark --config lofop/configs/lofop-detect/n.yaml --config lofop/configs/lofop-detect/s.yaml -o table.md
lofop predict --config n --checkpoint runs/shapes/checkpoints/best.pt --source image.png
lofop evaluate --config n --checkpoint runs/shapes/checkpoints/best.pt --format coco --source val.json
lofop export --config lofop/configs/lofop-detect/n.yaml --checkpoint runs/shapes/checkpoints/best.pt -o model.onnx
lofop export --config lofop/configs/lofop-detect/n.yaml --format tensorrt --fp16 -o model.engine # NVIDIA GPU
lofop doctor # environment + backend diagnostics
Measured on the fixed-protocol benchmark (benchmarks/quality_benchmark.py, 30 CPU epochs,
128px shapes): mAP@50 0.92, best F1 0.90, 0.8 false positives/image at conf 0.25, 115 FPS
end-to-end predict. Accuracy on a real dataset awaits a full GPU training run — the protocol
is documented in docs/lofop-detect.md, and the table renders - until numbers are measured.
Python SDK — the one-import path (full reference):
from lofop import Detector
det = Detector("lofop-detect-ex", num_classes=2, class_names=["cat", "dog"])
det.train(data_format="coco", train_source="train.json", image_root="images/", epochs=100)
for hit in det.predict("photo.jpg"): # boxes in original image coordinates
print(hit.boxes, hit.scores, hit.labels)
det.export("model.onnx")
Lower-level control remains fully public — registries, Config, Trainer, and the deploy
functions are the same objects the SDK uses:
from lofop import Config, HUB
import lofop.models # registers model components
cfg = Config.load("lofop/configs/lofop-detect/s.yaml")
model = HUB.build(cfg.model) # ready LofopDetect
Custom components plug in without touching the framework:
from lofop.registries import BACKBONES
@BACKBONES.register()
class MyNet: ...
# then in YAML: backbone: {type: backbone/MyNet, ...}
Repository layout
lofop/
core/ # registry, config, events, plugins, logging, exceptions (torch-free)
data/ # canonical dataset model, COCO/YOLO/VOC adapters, validator, statistics
models/ # LOFOP-Detect: RidgeNet, DeltaFusion, ApexHead, losses, assigner
training/ # trainer, EMA, checkpoints, torch data bridge, COCO-protocol evaluator
deploy/ # ONNX + TensorRT export, torch-free post-processing
ops/ + csrc/ # native C++ IoU/NMS with Python fallback
utils/ # model benchmarking (metric table, FLOPs, FPS)
sdk.py # high-level Python SDK: the Detector class (docs/sdk.md)
configs/ # packaged model family definitions (n, s, ex)
cli.py # `lofop` command: dataset / train / benchmark / export
configs/ # training config examples
docker/ # CPU, CUDA, and ONNX Runtime images
docs/ # architecture, per-module references, LOFOP-Detect design doc
benchmarks/ # reusable performance measurement scripts
examples/ # end-to-end runnable demos
tests/ # pytest suite mirroring the package layout (177 tests)
Development
python -m pytest # run the test suite
ruff check lofop tests benchmarks examples # lint
python benchmarks/bench_core.py -o report.md # core engine micro-benchmarks
python benchmarks/bench_ops.py # C++ vs Python ops speedups
python benchmarks/bench_detect.py # detector params + latency
python benchmarks/run_suite.py # full suite -> results.md/.csv/.json
Every push and pull request runs the full test suite (Python 3.9/3.11/3.12, native C++ ops
built), lint, a version-consistency check, and a distribution build check via GitHub Actions
(.github/workflows/ci.yml), so main stays releasable.
Contributing
Contributions are welcome. See CONTRIBUTING.md for setup and the quality gates, CHANGELOG.md for release notes, and SECURITY.md for reporting vulnerabilities. Bug reports and feature requests use the issue templates.
Roadmap
Ordered by expected return: published pretrained checkpoints (GPU training runs),
quality-aware Soft-NMS in the native kernel, letterboxing, a torch-free tracking module,
then inference sources (video/RTSP/webcam), OpenVINO engines, and REST serving. The full
subsystem map with per-phase status lives in docs/architecture.md.
Authors
DURGAMANI SASIKUMAR and Nishanandhini A. (Assistant Professor).
License
Apache License 2.0. See LICENSE.
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 lofop-1.1.3.tar.gz.
File metadata
- Download URL: lofop-1.1.3.tar.gz
- Upload date:
- Size: 116.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
aee25c7b71cf60ac43a0cf971da21b9f920fda0a7b3fe4bc6add492290adf209
|
|
| MD5 |
28c387c1a2f2014934ae3e7879663d05
|
|
| BLAKE2b-256 |
71d6a9b314888dc8bcbeeb9d7acb21b75f5238826fb2a52f5698b726044ac366
|
Provenance
The following attestation bundles were made for lofop-1.1.3.tar.gz:
Publisher:
release.yml on welldropp/LOFOP
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
lofop-1.1.3.tar.gz -
Subject digest:
aee25c7b71cf60ac43a0cf971da21b9f920fda0a7b3fe4bc6add492290adf209 - Sigstore transparency entry: 2185875878
- Sigstore integration time:
-
Permalink:
welldropp/LOFOP@070df6ab65d27cc2ab93c23db77b4cd36eef57f8 -
Branch / Tag:
refs/tags/v1.1.3 - Owner: https://github.com/welldropp
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@070df6ab65d27cc2ab93c23db77b4cd36eef57f8 -
Trigger Event:
push
-
Statement type:
File details
Details for the file lofop-1.1.3-py3-none-any.whl.
File metadata
- Download URL: lofop-1.1.3-py3-none-any.whl
- Upload date:
- Size: 109.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6810d51c26bcc98d64bb356c87fa861b2935ccfa2fadb21255b60507b9f73aa3
|
|
| MD5 |
7124f61aac9159481c00d8d103f42478
|
|
| BLAKE2b-256 |
b450dcb6c9697eb6feebb3198307698d94b02bf5ca09c72837fcf7e3f323ce85
|
Provenance
The following attestation bundles were made for lofop-1.1.3-py3-none-any.whl:
Publisher:
release.yml on welldropp/LOFOP
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
lofop-1.1.3-py3-none-any.whl -
Subject digest:
6810d51c26bcc98d64bb356c87fa861b2935ccfa2fadb21255b60507b9f73aa3 - Sigstore transparency entry: 2185876059
- Sigstore integration time:
-
Permalink:
welldropp/LOFOP@070df6ab65d27cc2ab93c23db77b4cd36eef57f8 -
Branch / Tag:
refs/tags/v1.1.3 - Owner: https://github.com/welldropp
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@070df6ab65d27cc2ab93c23db77b4cd36eef57f8 -
Trigger Event:
push
-
Statement type: