visionforge-studio 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- visionforge_studio-0.1.0/LICENSE +21 -0
- visionforge_studio-0.1.0/PKG-INFO +372 -0
- visionforge_studio-0.1.0/README.md +288 -0
- visionforge_studio-0.1.0/pyproject.toml +242 -0
- visionforge_studio-0.1.0/setup.cfg +4 -0
- visionforge_studio-0.1.0/src/visionforge/__init__.py +11 -0
- visionforge_studio-0.1.0/src/visionforge/__main__.py +281 -0
- visionforge_studio-0.1.0/src/visionforge/blocks/__init__.py +23 -0
- visionforge_studio-0.1.0/src/visionforge/blocks/_search_utils.py +175 -0
- visionforge_studio-0.1.0/src/visionforge/blocks/anomaly.py +118 -0
- visionforge_studio-0.1.0/src/visionforge/blocks/anomaly_runner.py +55 -0
- visionforge_studio-0.1.0/src/visionforge/blocks/base.py +25 -0
- visionforge_studio-0.1.0/src/visionforge/blocks/batch_prediction.py +166 -0
- visionforge_studio-0.1.0/src/visionforge/blocks/classification.py +177 -0
- visionforge_studio-0.1.0/src/visionforge/blocks/classification_runner.py +54 -0
- visionforge_studio-0.1.0/src/visionforge/blocks/cross_validation.py +455 -0
- visionforge_studio-0.1.0/src/visionforge/blocks/detection.py +51 -0
- visionforge_studio-0.1.0/src/visionforge/blocks/detection_runner.py +58 -0
- visionforge_studio-0.1.0/src/visionforge/blocks/export_onnx.py +63 -0
- visionforge_studio-0.1.0/src/visionforge/blocks/grid_search.py +153 -0
- visionforge_studio-0.1.0/src/visionforge/blocks/model_comparison.py +161 -0
- visionforge_studio-0.1.0/src/visionforge/blocks/random_search.py +221 -0
- visionforge_studio-0.1.0/src/visionforge/blocks/registry.py +31 -0
- visionforge_studio-0.1.0/src/visionforge/blocks/regression.py +111 -0
- visionforge_studio-0.1.0/src/visionforge/blocks/regression_cv.py +250 -0
- visionforge_studio-0.1.0/src/visionforge/blocks/regression_runner.py +55 -0
- visionforge_studio-0.1.0/src/visionforge/blocks/segmentation.py +110 -0
- visionforge_studio-0.1.0/src/visionforge/blocks/segmentation_cv.py +223 -0
- visionforge_studio-0.1.0/src/visionforge/blocks/segmentation_runner.py +55 -0
- visionforge_studio-0.1.0/src/visionforge/blocks/transfer_learning.py +264 -0
- visionforge_studio-0.1.0/src/visionforge/core/__init__.py +14 -0
- visionforge_studio-0.1.0/src/visionforge/core/anomaly_data.py +154 -0
- visionforge_studio-0.1.0/src/visionforge/core/anomaly_trainer.py +430 -0
- visionforge_studio-0.1.0/src/visionforge/core/batch_predict.py +109 -0
- visionforge_studio-0.1.0/src/visionforge/core/comparison.py +88 -0
- visionforge_studio-0.1.0/src/visionforge/core/data.py +173 -0
- visionforge_studio-0.1.0/src/visionforge/core/dataset_fingerprint.py +168 -0
- visionforge_studio-0.1.0/src/visionforge/core/detection_data.py +128 -0
- visionforge_studio-0.1.0/src/visionforge/core/detection_dataset.py +90 -0
- visionforge_studio-0.1.0/src/visionforge/core/detection_metrics.py +108 -0
- visionforge_studio-0.1.0/src/visionforge/core/detection_trainer.py +744 -0
- visionforge_studio-0.1.0/src/visionforge/core/evaluator.py +131 -0
- visionforge_studio-0.1.0/src/visionforge/core/gradcam.py +176 -0
- visionforge_studio-0.1.0/src/visionforge/core/latex_export.py +302 -0
- visionforge_studio-0.1.0/src/visionforge/core/onnx_export.py +163 -0
- visionforge_studio-0.1.0/src/visionforge/core/plotter.py +318 -0
- visionforge_studio-0.1.0/src/visionforge/core/preprocessing.py +167 -0
- visionforge_studio-0.1.0/src/visionforge/core/regression_data.py +162 -0
- visionforge_studio-0.1.0/src/visionforge/core/regression_trainer.py +487 -0
- visionforge_studio-0.1.0/src/visionforge/core/replicated_comparison.py +250 -0
- visionforge_studio-0.1.0/src/visionforge/core/replicates.py +187 -0
- visionforge_studio-0.1.0/src/visionforge/core/segmentation_data.py +225 -0
- visionforge_studio-0.1.0/src/visionforge/core/segmentation_trainer.py +556 -0
- visionforge_studio-0.1.0/src/visionforge/core/significance.py +346 -0
- visionforge_studio-0.1.0/src/visionforge/core/sweep.py +308 -0
- visionforge_studio-0.1.0/src/visionforge/core/task_runner.py +42 -0
- visionforge_studio-0.1.0/src/visionforge/core/tracking.py +52 -0
- visionforge_studio-0.1.0/src/visionforge/core/trainer.py +495 -0
- visionforge_studio-0.1.0/src/visionforge/gui/__init__.py +0 -0
- visionforge_studio-0.1.0/src/visionforge/gui/api/__init__.py +0 -0
- visionforge_studio-0.1.0/src/visionforge/gui/api/dataset_download.py +383 -0
- visionforge_studio-0.1.0/src/visionforge/gui/api/detection_export.py +79 -0
- visionforge_studio-0.1.0/src/visionforge/gui/api/detection_testing.py +162 -0
- visionforge_studio-0.1.0/src/visionforge/gui/api/routes.py +3699 -0
- visionforge_studio-0.1.0/src/visionforge/gui/api/schemas.py +642 -0
- visionforge_studio-0.1.0/src/visionforge/gui/api/torch_batch_predict.py +162 -0
- visionforge_studio-0.1.0/src/visionforge/gui/api/torch_gradcam.py +153 -0
- visionforge_studio-0.1.0/src/visionforge/gui/api/torch_onnx_export.py +107 -0
- visionforge_studio-0.1.0/src/visionforge/gui/server.py +58 -0
- visionforge_studio-0.1.0/src/visionforge/gui/static/assets/bricolage-grotesque-latin-ext-wght-normal-CcLUaPy7.woff2 +0 -0
- visionforge_studio-0.1.0/src/visionforge/gui/static/assets/bricolage-grotesque-latin-wght-normal-DLoelf7F.woff2 +0 -0
- visionforge_studio-0.1.0/src/visionforge/gui/static/assets/bricolage-grotesque-vietnamese-wght-normal-BUzh504Q.woff2 +0 -0
- visionforge_studio-0.1.0/src/visionforge/gui/static/assets/familjen-grotesk-latin-ext-wght-normal-Cvgdx4cy.woff2 +0 -0
- visionforge_studio-0.1.0/src/visionforge/gui/static/assets/familjen-grotesk-latin-wght-normal-CfZa4wxB.woff2 +0 -0
- visionforge_studio-0.1.0/src/visionforge/gui/static/assets/familjen-grotesk-vietnamese-wght-normal-DKRsWTd7.woff2 +0 -0
- visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-cyrillic-400-normal-BSMlKf0J.woff2 +0 -0
- visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-cyrillic-400-normal-CEL4l2ZJ.woff +0 -0
- visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-cyrillic-500-normal-Ael50iVv.woff +0 -0
- visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-cyrillic-500-normal-Bq9vWWag.woff2 +0 -0
- visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-cyrillic-600-normal-CTOM6hUh.woff2 +0 -0
- visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-cyrillic-600-normal-fLZuRloM.woff +0 -0
- visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-cyrillic-ext-400-normal-DMdlQ8Kv.woff +0 -0
- visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-cyrillic-ext-400-normal-xuaO2J-f.woff2 +0 -0
- visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-cyrillic-ext-500-normal-BIfNGwUT.woff +0 -0
- visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-cyrillic-ext-500-normal-BqneJy0T.woff2 +0 -0
- visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-cyrillic-ext-600-normal-9HEixskS.woff +0 -0
- visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-cyrillic-ext-600-normal-V-xxqcpd.woff2 +0 -0
- visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
- visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
- visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
- visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
- visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2 +0 -0
- visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff +0 -0
- visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-latin-ext-400-normal-BmRBH3aV.woff2 +0 -0
- visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-latin-ext-400-normal-D3D2R8hC.woff +0 -0
- visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-latin-ext-500-normal-CAhNIIs5.woff2 +0 -0
- visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-latin-ext-500-normal-CZ70TYgx.woff +0 -0
- visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-latin-ext-600-normal-D38SheWl.woff2 +0 -0
- visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-latin-ext-600-normal-DmB0ttJJ.woff +0 -0
- visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-vietnamese-400-normal-BulugwFq.woff2 +0 -0
- visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-vietnamese-400-normal-DDuiU_S-.woff +0 -0
- visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-vietnamese-500-normal-C8zxqsMH.woff +0 -0
- visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-vietnamese-500-normal-DZ4AoWbu.woff2 +0 -0
- visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-vietnamese-600-normal-D2EvbN8M.woff2 +0 -0
- visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-vietnamese-600-normal-iLQfcSjf.woff +0 -0
- visionforge_studio-0.1.0/src/visionforge/gui/static/assets/index-C9dhnPJf.css +2 -0
- visionforge_studio-0.1.0/src/visionforge/gui/static/assets/index-CYSrGwLj.js +46 -0
- visionforge_studio-0.1.0/src/visionforge/gui/static/favicon.svg +1 -0
- visionforge_studio-0.1.0/src/visionforge/gui/static/icons.svg +24 -0
- visionforge_studio-0.1.0/src/visionforge/gui/static/index.html +16 -0
- visionforge_studio-0.1.0/src/visionforge/models/__init__.py +3 -0
- visionforge_studio-0.1.0/src/visionforge/models/anomaly_factory.py +208 -0
- visionforge_studio-0.1.0/src/visionforge/models/detection_factory.py +135 -0
- visionforge_studio-0.1.0/src/visionforge/models/factory.py +125 -0
- visionforge_studio-0.1.0/src/visionforge/models/registry.py +127 -0
- visionforge_studio-0.1.0/src/visionforge/models/regression_factory.py +63 -0
- visionforge_studio-0.1.0/src/visionforge/models/segmentation_factory.py +183 -0
- visionforge_studio-0.1.0/src/visionforge/models/timm_source.py +35 -0
- visionforge_studio-0.1.0/src/visionforge/tasks/__init__.py +33 -0
- visionforge_studio-0.1.0/src/visionforge/tasks/base.py +139 -0
- visionforge_studio-0.1.0/src/visionforge/tasks/engine.py +367 -0
- visionforge_studio-0.1.0/src/visionforge/tasks/registry.py +180 -0
- visionforge_studio-0.1.0/src/visionforge/tasks/runner.py +57 -0
- visionforge_studio-0.1.0/src/visionforge/tasks/scaffold.py +217 -0
- visionforge_studio-0.1.0/src/visionforge/utils/__init__.py +0 -0
- visionforge_studio-0.1.0/src/visionforge/utils/anomaly_config.py +150 -0
- visionforge_studio-0.1.0/src/visionforge/utils/config.py +521 -0
- visionforge_studio-0.1.0/src/visionforge/utils/cuda.py +102 -0
- visionforge_studio-0.1.0/src/visionforge/utils/detection_config.py +306 -0
- visionforge_studio-0.1.0/src/visionforge/utils/doctor.py +284 -0
- visionforge_studio-0.1.0/src/visionforge/utils/environment.py +67 -0
- visionforge_studio-0.1.0/src/visionforge/utils/logger.py +52 -0
- visionforge_studio-0.1.0/src/visionforge/utils/regression_config.py +241 -0
- visionforge_studio-0.1.0/src/visionforge/utils/segmentation_config.py +219 -0
- visionforge_studio-0.1.0/src/visionforge/utils/selftest.py +719 -0
- visionforge_studio-0.1.0/src/visionforge/utils/selftest_data.py +157 -0
- visionforge_studio-0.1.0/src/visionforge_studio.egg-info/PKG-INFO +372 -0
- visionforge_studio-0.1.0/src/visionforge_studio.egg-info/SOURCES.txt +142 -0
- visionforge_studio-0.1.0/src/visionforge_studio.egg-info/dependency_links.txt +1 -0
- visionforge_studio-0.1.0/src/visionforge_studio.egg-info/entry_points.txt +2 -0
- visionforge_studio-0.1.0/src/visionforge_studio.egg-info/requires.txt +63 -0
- visionforge_studio-0.1.0/src/visionforge_studio.egg-info/top_level.txt +1 -0
- visionforge_studio-0.1.0/tests/test_cli_run_dispatch.py +114 -0
- visionforge_studio-0.1.0/tests/test_example_configs.py +46 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Marcus Vinícius Reis
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,372 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: visionforge-studio
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Local-first computer-vision experimentation platform: five task families, multi-seed replicates with confidence intervals, K-fold CV, sweeps and full run provenance — on your own GPU.
|
|
5
|
+
Author-email: Marcus Reis <marcusvinicius0083@gmail.com>
|
|
6
|
+
License: MIT License
|
|
7
|
+
|
|
8
|
+
Copyright (c) 2026 Marcus Vinícius Reis
|
|
9
|
+
|
|
10
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
11
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
12
|
+
in the Software without restriction, including without limitation the rights
|
|
13
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
14
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
15
|
+
furnished to do so, subject to the following conditions:
|
|
16
|
+
|
|
17
|
+
The above copyright notice and this permission notice shall be included in all
|
|
18
|
+
copies or substantial portions of the Software.
|
|
19
|
+
|
|
20
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
21
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
22
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
23
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
24
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
25
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
26
|
+
SOFTWARE.
|
|
27
|
+
|
|
28
|
+
Project-URL: Repository, https://github.com/marcus-vreis/VisionForge
|
|
29
|
+
Project-URL: Documentation, https://github.com/marcus-vreis/VisionForge/tree/main/documentation
|
|
30
|
+
Requires-Python: >=3.13
|
|
31
|
+
Description-Content-Type: text/markdown
|
|
32
|
+
License-File: LICENSE
|
|
33
|
+
Requires-Dist: pydantic>=2.0
|
|
34
|
+
Requires-Dist: pydantic-settings>=2.0
|
|
35
|
+
Requires-Dist: loguru>=0.7
|
|
36
|
+
Requires-Dist: scikit-learn>=1.4
|
|
37
|
+
Requires-Dist: matplotlib>=3.8
|
|
38
|
+
Requires-Dist: seaborn>=0.13
|
|
39
|
+
Requires-Dist: onnx>=1.16
|
|
40
|
+
Requires-Dist: onnxruntime>=1.18
|
|
41
|
+
Requires-Dist: pyyaml>=6.0
|
|
42
|
+
Requires-Dist: rich>=13.0
|
|
43
|
+
Requires-Dist: fastapi>=0.115
|
|
44
|
+
Requires-Dist: uvicorn>=0.30
|
|
45
|
+
Provides-Extra: cpu
|
|
46
|
+
Requires-Dist: torch>=2.3; extra == "cpu"
|
|
47
|
+
Requires-Dist: torchvision>=0.18; extra == "cpu"
|
|
48
|
+
Provides-Extra: cu118
|
|
49
|
+
Requires-Dist: torch>=2.3; extra == "cu118"
|
|
50
|
+
Requires-Dist: torchvision>=0.18; extra == "cu118"
|
|
51
|
+
Provides-Extra: cu121
|
|
52
|
+
Requires-Dist: torch>=2.3; extra == "cu121"
|
|
53
|
+
Requires-Dist: torchvision>=0.18; extra == "cu121"
|
|
54
|
+
Provides-Extra: cu124
|
|
55
|
+
Requires-Dist: torch>=2.3; extra == "cu124"
|
|
56
|
+
Requires-Dist: torchvision>=0.18; extra == "cu124"
|
|
57
|
+
Provides-Extra: cu126
|
|
58
|
+
Requires-Dist: torch>=2.3; extra == "cu126"
|
|
59
|
+
Requires-Dist: torchvision>=0.18; extra == "cu126"
|
|
60
|
+
Provides-Extra: detection
|
|
61
|
+
Requires-Dist: ultralytics>=8.3; extra == "detection"
|
|
62
|
+
Provides-Extra: timm
|
|
63
|
+
Requires-Dist: timm>=1.0; extra == "timm"
|
|
64
|
+
Provides-Extra: optuna
|
|
65
|
+
Requires-Dist: optuna>=3.0; extra == "optuna"
|
|
66
|
+
Provides-Extra: tensorboard
|
|
67
|
+
Requires-Dist: tensorboard>=2.0; extra == "tensorboard"
|
|
68
|
+
Provides-Extra: roboflow
|
|
69
|
+
Requires-Dist: roboflow>=1.1; extra == "roboflow"
|
|
70
|
+
Provides-Extra: kaggle
|
|
71
|
+
Requires-Dist: kaggle>=1.6; extra == "kaggle"
|
|
72
|
+
Provides-Extra: huggingface
|
|
73
|
+
Requires-Dist: datasets>=2.0; extra == "huggingface"
|
|
74
|
+
Provides-Extra: dev
|
|
75
|
+
Requires-Dist: pytest>=8.0; extra == "dev"
|
|
76
|
+
Requires-Dist: pytest-cov>=5.0; extra == "dev"
|
|
77
|
+
Requires-Dist: ruff>=0.4; extra == "dev"
|
|
78
|
+
Requires-Dist: mypy>=1.10; extra == "dev"
|
|
79
|
+
Requires-Dist: codespell>=2.3; extra == "dev"
|
|
80
|
+
Requires-Dist: pre-commit>=4.0; extra == "dev"
|
|
81
|
+
Requires-Dist: bump-my-version>=0.24; extra == "dev"
|
|
82
|
+
Requires-Dist: types-PyYAML>=6.0; extra == "dev"
|
|
83
|
+
Dynamic: license-file
|
|
84
|
+
|
|
85
|
+
# VisionForge
|
|
86
|
+
|
|
87
|
+
[](https://github.com/marcus-vreis/VisionForge/actions/workflows/ci.yml)
|
|
88
|
+
[](LICENSE)
|
|
89
|
+
|
|
90
|
+
**A local-first computer-vision experimentation platform for researchers.**
|
|
91
|
+
Train, validate and compare models on your own GPU — no cloud, no notebooks,
|
|
92
|
+
no copy-pasted training loops. PyTorch + FastAPI + React in one Python process.
|
|
93
|
+
|
|
94
|
+
VisionForge replaces ad-hoc Jupyter workflows with a clean, testable, reproducible
|
|
95
|
+
system where the numbers you report are numbers you can defend: every run records
|
|
96
|
+
its full provenance, and every comparison can be replicated across seeds with
|
|
97
|
+
confidence intervals.
|
|
98
|
+
|
|
99
|
+

|
|
100
|
+
|
|
101
|
+
## Five task families, one interface
|
|
102
|
+
|
|
103
|
+
| Task | Models | Metrics |
|
|
104
|
+
|---|---|---|
|
|
105
|
+
| **Classification** | ResNet 18/34/50/101, EfficientNet B1/B7, VGG 16/19, AlexNet, timm, custom | Accuracy, F1, Precision, Recall, AUC-ROC, confusion matrix, ROC/PR curves |
|
|
106
|
+
| **Object detection** | Ultralytics YOLOv8/9/10/11/12/26, RT-DETR · torchvision Faster R-CNN, SSD, RetinaNet | mAP@50, mAP@50-95, box loss |
|
|
107
|
+
| **Image regression** | CNN backbones + linear head (CSV manifest datasets), timm, custom | MSE, RMSE, MAE, R² |
|
|
108
|
+
| **Semantic segmentation** | DeepLabV3, FCN, LR-ASPP, U-Net, custom | mean IoU, Dice, pixel accuracy |
|
|
109
|
+
| **Anomaly detection** | Convolutional autoencoder, PatchCore (unsupervised, MVTec-style) | image AUROC, threshold, F1 |
|
|
110
|
+
| **Your own task** (SDK) | any `nn.Module` — you write 4 hooks in one Python file | any metrics you declare (`higher`/`lower` direction-aware) |
|
|
111
|
+
|
|
112
|
+
Every task panel follows the same canonical layout: experiment name + YAML
|
|
113
|
+
export/import, a strategy selector, model, training, dataset (with pre-training
|
|
114
|
+
stats), preprocessing filters and augmentation with live preview.
|
|
115
|
+
|
|
116
|
+
## Built for defensible results
|
|
117
|
+
|
|
118
|
+

|
|
119
|
+
|
|
120
|
+
- **Multi-seed replicates** — train the same config N times under different
|
|
121
|
+
seeds and report `metric = mean ± 95% CI` (Student-t) instead of a single
|
|
122
|
+
point estimate.
|
|
123
|
+
- **K-fold cross-validation** — classification, regression and segmentation;
|
|
124
|
+
per-fold metrics + mean ± std, with fold-leakage-safe transforms.
|
|
125
|
+
- **Hyperparameter sweeps** — grid, random, or Optuna TPE over any config field
|
|
126
|
+
by dot-path; one-click architecture-comparison preset.
|
|
127
|
+
- **Paired significance testing** — compare N configurations over the *same*
|
|
128
|
+
seeds and get the difference, its bootstrap CI, a paired t or Wilcoxon test
|
|
129
|
+
(chosen and justified per comparison), Cohen's `d_z`, and Holm-Bonferroni
|
|
130
|
+
correction across the family. It refuses to compare runs whose seeds do not
|
|
131
|
+
line up, and flags when the seed count makes significance unreachable — so
|
|
132
|
+
"not significant" is never mistaken for "no effect".
|
|
133
|
+
- **Paper-ready output** — every replicates / sweep / K-fold / comparison
|
|
134
|
+
report is also written as a `booktabs` LaTeX table, with notes stating what
|
|
135
|
+
each interval covers and which correction was applied.
|
|
136
|
+
- **Full provenance** — every run writes a versioned `run.json` with the exact
|
|
137
|
+
config, seed, per-epoch history, environment (Python, torch/torchvision,
|
|
138
|
+
numpy, CUDA, cuDNN, GPU model) and a **dataset fingerprint**, so "same data"
|
|
139
|
+
is a checkable claim rather than a shared path.
|
|
140
|
+
- **Reproducibility knobs** — seeded runs, optional deterministic cuDNN mode,
|
|
141
|
+
config schema versioning with migrations, YAML round-trip (export from the
|
|
142
|
+
GUI, re-run from the CLI).
|
|
143
|
+
- **Post-training tooling** — run history with multi-run comparison and config
|
|
144
|
+
diff, per-checkpoint testing on new datasets, batch prediction to CSV,
|
|
145
|
+
Grad-CAM explainability, ONNX export with PyTorch-vs-runtime latency
|
|
146
|
+
benchmark, TensorBoard scalars per run.
|
|
147
|
+
- **Dataset utilities** — split auto-detection, per-split stats (class balance,
|
|
148
|
+
image/mask pairing, manifest checks with target distributions), one-shot
|
|
149
|
+
download from torchvision / Roboflow / Kaggle / Hugging Face.
|
|
150
|
+
|
|
151
|
+
## Installation
|
|
152
|
+
|
|
153
|
+
Requirements: **Python 3.13+**. Node.js is only needed to build the frontend
|
|
154
|
+
from source — the published package already ships the built UI.
|
|
155
|
+
|
|
156
|
+
> **On PyPI the distribution is `visionforge-studio`** — the bare
|
|
157
|
+
> `visionforge` name belongs to an unrelated project. The import name, the CLI
|
|
158
|
+
> command and the project itself are still `visionforge`.
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
pip install "visionforge-studio[cu121]" # NVIDIA CUDA 12.1
|
|
162
|
+
visionforge doctor # confirms the right wheel for your GPU
|
|
163
|
+
visionforge gui
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### From source
|
|
167
|
+
|
|
168
|
+
For development, or to run an unreleased commit:
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
git clone https://github.com/marcus-vreis/VisionForge.git
|
|
172
|
+
cd VisionForge
|
|
173
|
+
uv venv
|
|
174
|
+
# Windows: .venv\Scripts\activate Linux/macOS: source .venv/bin/activate
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
PyTorch is intentionally **not** a plain dependency — its build must match your
|
|
178
|
+
hardware, and a resolver cannot pick correctly between the CPU and CUDA wheels
|
|
179
|
+
(ADR-005). You choose one via a **hardware extra**, and the right index is
|
|
180
|
+
already wired up for it:
|
|
181
|
+
|
|
182
|
+
```bash
|
|
183
|
+
uv pip install -e ".[cu121,dev]" # NVIDIA CUDA 12.1
|
|
184
|
+
# also available: cu118 · cu124 · cu126 · cpu
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
Not sure which? Ask, and it prints the exact line for your machine:
|
|
188
|
+
|
|
189
|
+
```bash
|
|
190
|
+
visionforge doctor
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
It reads your driver *and* any torch already installed, so on a machine whose
|
|
194
|
+
GPU works it says so instead of recommending a downgrade.
|
|
195
|
+
|
|
196
|
+
Build the web UI once (it is then served by the Python backend — end users
|
|
197
|
+
never need Node):
|
|
198
|
+
|
|
199
|
+
```bash
|
|
200
|
+
cd frontend && npm install && npm run build && cd ..
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
Check the install actually works before pointing it at your data:
|
|
204
|
+
|
|
205
|
+
```bash
|
|
206
|
+
visionforge --version
|
|
207
|
+
visionforge selftest --quick # trains every task on synthetic data, ~15s
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
### Optional extras
|
|
211
|
+
|
|
212
|
+
| Extra | Enables |
|
|
213
|
+
|---|---|
|
|
214
|
+
| `detection` | Ultralytics YOLO / RT-DETR backends |
|
|
215
|
+
| `timm` | hundreds of extra backbones via `model.timm_model` |
|
|
216
|
+
| `optuna` | TPE-guided sweeps (`mode="optuna"`) |
|
|
217
|
+
| `tensorboard` | per-epoch scalars under `<run_dir>/tensorboard/` |
|
|
218
|
+
| `roboflow` / `kaggle` / `huggingface` | one-shot dataset download providers |
|
|
219
|
+
|
|
220
|
+
```bash
|
|
221
|
+
uv pip install -e ".[detection,optuna,tensorboard]"
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
## Quickstart
|
|
225
|
+
|
|
226
|
+
> New here? The step-by-step walkthrough — install → built-in dataset download
|
|
227
|
+
> → first run → replicates with confidence intervals → YAML re-run — lives in
|
|
228
|
+
> [`docs/QUICKSTART.md`](docs/QUICKSTART.md).
|
|
229
|
+
|
|
230
|
+
**GUI** (recommended):
|
|
231
|
+
|
|
232
|
+
```bash
|
|
233
|
+
visionforge gui # opens http://127.0.0.1:8000
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
Pick a task tab, point the dataset picker at your data (stats render
|
|
237
|
+
immediately), choose a strategy — single run, K-fold, sweep or replicates —
|
|
238
|
+
and press *Treinar*. A live monitor streams epochs; results land in the run
|
|
239
|
+
history with plots, markdown model cards and artifact paths.
|
|
240
|
+
|
|
241
|
+
**CLI** (automation):
|
|
242
|
+
|
|
243
|
+
```bash
|
|
244
|
+
visionforge run configs/baseline.yaml # classification
|
|
245
|
+
visionforge run configs/detection.yaml # any task — dispatched by config
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
Configs exported from the GUI are the exact wire payload, so they re-run
|
|
249
|
+
identically from the CLI. All artifacts (checkpoints, plots, `run.json`,
|
|
250
|
+
reports) are written under `outputs/`.
|
|
251
|
+
|
|
252
|
+
## Custom models
|
|
253
|
+
|
|
254
|
+
Drop a Python file into `user_models/` and register it:
|
|
255
|
+
|
|
256
|
+
```python
|
|
257
|
+
from visionforge.models.registry import register_model
|
|
258
|
+
|
|
259
|
+
@register_model("my_net")
|
|
260
|
+
def build_my_net(num_outputs: int) -> nn.Module: ...
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
Select it via `model.custom_model` — works for classification, regression and
|
|
264
|
+
segmentation. See `user_models/README.md`.
|
|
265
|
+
|
|
266
|
+
## Custom tasks — define a whole new task family (ADR-058)
|
|
267
|
+
|
|
268
|
+
When your research doesn't fit the five built-in tasks, define your own in
|
|
269
|
+
**one documented Python file** — no React, no FastAPI, no training loop:
|
|
270
|
+
|
|
271
|
+
```bash
|
|
272
|
+
visionforge new-task cell_counting # writes user_tasks/cell_counting.py
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
The generated template **trains out of the box** on synthetic data. Fill four
|
|
276
|
+
hooks — `build_model`, `build_loaders`, `compute_loss`, `compute_metrics` —
|
|
277
|
+
and a Pydantic `Config` whose fields become a validated form schema. You get,
|
|
278
|
+
with zero extra code:
|
|
279
|
+
|
|
280
|
+
- `GET /api/tasks` · `GET /api/custom/<key>/schema` · `POST /api/custom/<key>/run`
|
|
281
|
+
(live SSE monitor, TensorBoard, versioned `run.json` provenance)
|
|
282
|
+
- `POST /api/custom/<key>/sweep` — grid/random/Optuna over **any** config
|
|
283
|
+
field, including the ones you declared
|
|
284
|
+
- `POST /api/custom/<key>/replicates` — N seeds → mean ± std ± 95% CI
|
|
285
|
+
|
|
286
|
+
Training not epoch-shaped (GANs, EM loops)? Override `run(cfg, ctx)` and own
|
|
287
|
+
the loop while keeping every contract. A working example ships in
|
|
288
|
+
`user_tasks/example_counting/` (a CNN counting dots in synthetic images —
|
|
289
|
+
trains in seconds on CPU). Full walkthrough: [`user_tasks/README.md`](user_tasks/README.md) (PT + EN).
|
|
290
|
+
|
|
291
|
+
## Verifying the install
|
|
292
|
+
|
|
293
|
+
`visionforge doctor` checks your environment; **`visionforge selftest` checks
|
|
294
|
+
the pipeline** — it builds tiny synthetic datasets, starts the real API, and
|
|
295
|
+
trains every task through the same endpoints the browser uses, asserting that
|
|
296
|
+
each run completes, streams live progress, and stores its report:
|
|
297
|
+
|
|
298
|
+
```bash
|
|
299
|
+
visionforge selftest --quick # one run per task (~15s, CPU, offline)
|
|
300
|
+
visionforge selftest # every task x strategy: simple, K-fold, sweep, replicates, comparison
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
```
|
|
304
|
+
case result time detail
|
|
305
|
+
classification/replicates PASS 2.7s accuracy=1.0000±0.0000
|
|
306
|
+
segmentation/cv PASS 2.0s miou=0.0783
|
|
307
|
+
custom/sweep PASS 0.6s best mae=2.4231
|
|
308
|
+
regression/comparison PASS 6.5s best=baseline 1/1 signif.
|
|
309
|
+
...
|
|
310
|
+
27/27 cases passed
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
Filters: `--tasks classification,custom`, `--strategies sweep,replicates`,
|
|
314
|
+
`--json out.json`. Exit code is non-zero if any case fails, so it drops into
|
|
315
|
+
CI as-is. It verifies integrity, not model quality — one epoch on synthetic
|
|
316
|
+
data says nothing about accuracy.
|
|
317
|
+
|
|
318
|
+
## Status
|
|
319
|
+
|
|
320
|
+
**v0.1.0 — first public release.** Usable for real work and under active
|
|
321
|
+
development. Below 1.0 the config schema and HTTP API may change between minor
|
|
322
|
+
releases; configs carry a `schema_version` and are migrated on load, so a YAML
|
|
323
|
+
exported from an older release keeps working.
|
|
324
|
+
|
|
325
|
+
Verified, not asserted: 1274 backend tests and 102 frontend tests gated in CI,
|
|
326
|
+
plus a full matrix of 21 (task × strategy) cases trained on **real** datasets —
|
|
327
|
+
the corpus, the numbers and the one defect it caught are in
|
|
328
|
+
[`documentation/VALIDATION.md`](documentation/VALIDATION.md).
|
|
329
|
+
|
|
330
|
+
Known limits worth knowing before you start:
|
|
331
|
+
|
|
332
|
+
- **One training at a time.** A second submit gets a 409; an experiment queue
|
|
333
|
+
is on the roadmap. Run batches from the CLI in the meantime.
|
|
334
|
+
- **One-click dataset download covers classification only** (the torchvision
|
|
335
|
+
built-ins produce an `ImageFolder`). Detection, regression, segmentation and
|
|
336
|
+
anomaly need a dataset already in their layout — see
|
|
337
|
+
[`documentation/TRAINING_PLAN.md`](documentation/TRAINING_PLAN.md).
|
|
338
|
+
- **No K-fold for detection or anomaly**, by design: Ultralytics owns its
|
|
339
|
+
training loop, and an unsupervised validation fold without anomalies measures
|
|
340
|
+
nothing.
|
|
341
|
+
- **Windows**: keep `training.workers` at 0–2. Each DataLoader worker is a
|
|
342
|
+
process that reloads torch's CUDA DLLs, and eight of them exhaust the page
|
|
343
|
+
file (`WinError 1455`). The default is already 2 there.
|
|
344
|
+
- Dark theme only; a light palette is not designed yet.
|
|
345
|
+
|
|
346
|
+
Found something? [Open an issue](https://github.com/marcus-vreis/VisionForge/issues/new/choose)
|
|
347
|
+
— the template asks for `visionforge --version` and `visionforge doctor`, which
|
|
348
|
+
answers most of the questions up front.
|
|
349
|
+
|
|
350
|
+
## Architecture, decisions and contributing
|
|
351
|
+
|
|
352
|
+
- [`CHANGELOG.md`](CHANGELOG.md) — what shipped in each release
|
|
353
|
+
- `documentation/ARCHITECTURE.md` — layers, modules, boundaries
|
|
354
|
+
- `documentation/DECISIONS.md` — every architecture decision as an ADR (001–065)
|
|
355
|
+
- `documentation/TRAINING_PLAN.md` — the model × strategy matrix, in four
|
|
356
|
+
layers of increasing cost
|
|
357
|
+
- `documentation/VALIDATION.md` — the real-dataset validation record
|
|
358
|
+
- `documentation/CONTRIBUTING.md` — dev setup, test/lint gauntlet, PR flow
|
|
359
|
+
|
|
360
|
+
Backend checks: `pytest` · `ruff check src/ tests/` · `mypy src/`.
|
|
361
|
+
Frontend: `cd frontend && npx vitest run && npx tsc --noEmit`.
|
|
362
|
+
End-to-end: `visionforge selftest` (or `pytest -m slow` for the harness's own
|
|
363
|
+
live cases — they are deselected from the default run).
|
|
364
|
+
|
|
365
|
+
## Citing
|
|
366
|
+
|
|
367
|
+
If VisionForge is useful in your research, please cite it — see
|
|
368
|
+
[`CITATION.cff`](CITATION.cff) (GitHub renders a “Cite this repository” button).
|
|
369
|
+
|
|
370
|
+
## License
|
|
371
|
+
|
|
372
|
+
[MIT](LICENSE)
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
# VisionForge
|
|
2
|
+
|
|
3
|
+
[](https://github.com/marcus-vreis/VisionForge/actions/workflows/ci.yml)
|
|
4
|
+
[](LICENSE)
|
|
5
|
+
|
|
6
|
+
**A local-first computer-vision experimentation platform for researchers.**
|
|
7
|
+
Train, validate and compare models on your own GPU — no cloud, no notebooks,
|
|
8
|
+
no copy-pasted training loops. PyTorch + FastAPI + React in one Python process.
|
|
9
|
+
|
|
10
|
+
VisionForge replaces ad-hoc Jupyter workflows with a clean, testable, reproducible
|
|
11
|
+
system where the numbers you report are numbers you can defend: every run records
|
|
12
|
+
its full provenance, and every comparison can be replicated across seeds with
|
|
13
|
+
confidence intervals.
|
|
14
|
+
|
|
15
|
+

|
|
16
|
+
|
|
17
|
+
## Five task families, one interface
|
|
18
|
+
|
|
19
|
+
| Task | Models | Metrics |
|
|
20
|
+
|---|---|---|
|
|
21
|
+
| **Classification** | ResNet 18/34/50/101, EfficientNet B1/B7, VGG 16/19, AlexNet, timm, custom | Accuracy, F1, Precision, Recall, AUC-ROC, confusion matrix, ROC/PR curves |
|
|
22
|
+
| **Object detection** | Ultralytics YOLOv8/9/10/11/12/26, RT-DETR · torchvision Faster R-CNN, SSD, RetinaNet | mAP@50, mAP@50-95, box loss |
|
|
23
|
+
| **Image regression** | CNN backbones + linear head (CSV manifest datasets), timm, custom | MSE, RMSE, MAE, R² |
|
|
24
|
+
| **Semantic segmentation** | DeepLabV3, FCN, LR-ASPP, U-Net, custom | mean IoU, Dice, pixel accuracy |
|
|
25
|
+
| **Anomaly detection** | Convolutional autoencoder, PatchCore (unsupervised, MVTec-style) | image AUROC, threshold, F1 |
|
|
26
|
+
| **Your own task** (SDK) | any `nn.Module` — you write 4 hooks in one Python file | any metrics you declare (`higher`/`lower` direction-aware) |
|
|
27
|
+
|
|
28
|
+
Every task panel follows the same canonical layout: experiment name + YAML
|
|
29
|
+
export/import, a strategy selector, model, training, dataset (with pre-training
|
|
30
|
+
stats), preprocessing filters and augmentation with live preview.
|
|
31
|
+
|
|
32
|
+
## Built for defensible results
|
|
33
|
+
|
|
34
|
+

|
|
35
|
+
|
|
36
|
+
- **Multi-seed replicates** — train the same config N times under different
|
|
37
|
+
seeds and report `metric = mean ± 95% CI` (Student-t) instead of a single
|
|
38
|
+
point estimate.
|
|
39
|
+
- **K-fold cross-validation** — classification, regression and segmentation;
|
|
40
|
+
per-fold metrics + mean ± std, with fold-leakage-safe transforms.
|
|
41
|
+
- **Hyperparameter sweeps** — grid, random, or Optuna TPE over any config field
|
|
42
|
+
by dot-path; one-click architecture-comparison preset.
|
|
43
|
+
- **Paired significance testing** — compare N configurations over the *same*
|
|
44
|
+
seeds and get the difference, its bootstrap CI, a paired t or Wilcoxon test
|
|
45
|
+
(chosen and justified per comparison), Cohen's `d_z`, and Holm-Bonferroni
|
|
46
|
+
correction across the family. It refuses to compare runs whose seeds do not
|
|
47
|
+
line up, and flags when the seed count makes significance unreachable — so
|
|
48
|
+
"not significant" is never mistaken for "no effect".
|
|
49
|
+
- **Paper-ready output** — every replicates / sweep / K-fold / comparison
|
|
50
|
+
report is also written as a `booktabs` LaTeX table, with notes stating what
|
|
51
|
+
each interval covers and which correction was applied.
|
|
52
|
+
- **Full provenance** — every run writes a versioned `run.json` with the exact
|
|
53
|
+
config, seed, per-epoch history, environment (Python, torch/torchvision,
|
|
54
|
+
numpy, CUDA, cuDNN, GPU model) and a **dataset fingerprint**, so "same data"
|
|
55
|
+
is a checkable claim rather than a shared path.
|
|
56
|
+
- **Reproducibility knobs** — seeded runs, optional deterministic cuDNN mode,
|
|
57
|
+
config schema versioning with migrations, YAML round-trip (export from the
|
|
58
|
+
GUI, re-run from the CLI).
|
|
59
|
+
- **Post-training tooling** — run history with multi-run comparison and config
|
|
60
|
+
diff, per-checkpoint testing on new datasets, batch prediction to CSV,
|
|
61
|
+
Grad-CAM explainability, ONNX export with PyTorch-vs-runtime latency
|
|
62
|
+
benchmark, TensorBoard scalars per run.
|
|
63
|
+
- **Dataset utilities** — split auto-detection, per-split stats (class balance,
|
|
64
|
+
image/mask pairing, manifest checks with target distributions), one-shot
|
|
65
|
+
download from torchvision / Roboflow / Kaggle / Hugging Face.
|
|
66
|
+
|
|
67
|
+
## Installation
|
|
68
|
+
|
|
69
|
+
Requirements: **Python 3.13+**. Node.js is only needed to build the frontend
|
|
70
|
+
from source — the published package already ships the built UI.
|
|
71
|
+
|
|
72
|
+
> **On PyPI the distribution is `visionforge-studio`** — the bare
|
|
73
|
+
> `visionforge` name belongs to an unrelated project. The import name, the CLI
|
|
74
|
+
> command and the project itself are still `visionforge`.
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
pip install "visionforge-studio[cu121]" # NVIDIA CUDA 12.1
|
|
78
|
+
visionforge doctor # confirms the right wheel for your GPU
|
|
79
|
+
visionforge gui
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### From source
|
|
83
|
+
|
|
84
|
+
For development, or to run an unreleased commit:
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
git clone https://github.com/marcus-vreis/VisionForge.git
|
|
88
|
+
cd VisionForge
|
|
89
|
+
uv venv
|
|
90
|
+
# Windows: .venv\Scripts\activate Linux/macOS: source .venv/bin/activate
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
PyTorch is intentionally **not** a plain dependency — its build must match your
|
|
94
|
+
hardware, and a resolver cannot pick correctly between the CPU and CUDA wheels
|
|
95
|
+
(ADR-005). You choose one via a **hardware extra**, and the right index is
|
|
96
|
+
already wired up for it:
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
uv pip install -e ".[cu121,dev]" # NVIDIA CUDA 12.1
|
|
100
|
+
# also available: cu118 · cu124 · cu126 · cpu
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Not sure which? Ask, and it prints the exact line for your machine:
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
visionforge doctor
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
It reads your driver *and* any torch already installed, so on a machine whose
|
|
110
|
+
GPU works it says so instead of recommending a downgrade.
|
|
111
|
+
|
|
112
|
+
Build the web UI once (it is then served by the Python backend — end users
|
|
113
|
+
never need Node):
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
cd frontend && npm install && npm run build && cd ..
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
Check the install actually works before pointing it at your data:
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
visionforge --version
|
|
123
|
+
visionforge selftest --quick # trains every task on synthetic data, ~15s
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### Optional extras
|
|
127
|
+
|
|
128
|
+
| Extra | Enables |
|
|
129
|
+
|---|---|
|
|
130
|
+
| `detection` | Ultralytics YOLO / RT-DETR backends |
|
|
131
|
+
| `timm` | hundreds of extra backbones via `model.timm_model` |
|
|
132
|
+
| `optuna` | TPE-guided sweeps (`mode="optuna"`) |
|
|
133
|
+
| `tensorboard` | per-epoch scalars under `<run_dir>/tensorboard/` |
|
|
134
|
+
| `roboflow` / `kaggle` / `huggingface` | one-shot dataset download providers |
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
uv pip install -e ".[detection,optuna,tensorboard]"
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## Quickstart
|
|
141
|
+
|
|
142
|
+
> New here? The step-by-step walkthrough — install → built-in dataset download
|
|
143
|
+
> → first run → replicates with confidence intervals → YAML re-run — lives in
|
|
144
|
+
> [`docs/QUICKSTART.md`](docs/QUICKSTART.md).
|
|
145
|
+
|
|
146
|
+
**GUI** (recommended):
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
visionforge gui # opens http://127.0.0.1:8000
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
Pick a task tab, point the dataset picker at your data (stats render
|
|
153
|
+
immediately), choose a strategy — single run, K-fold, sweep or replicates —
|
|
154
|
+
and press *Treinar*. A live monitor streams epochs; results land in the run
|
|
155
|
+
history with plots, markdown model cards and artifact paths.
|
|
156
|
+
|
|
157
|
+
**CLI** (automation):
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
visionforge run configs/baseline.yaml # classification
|
|
161
|
+
visionforge run configs/detection.yaml # any task — dispatched by config
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
Configs exported from the GUI are the exact wire payload, so they re-run
|
|
165
|
+
identically from the CLI. All artifacts (checkpoints, plots, `run.json`,
|
|
166
|
+
reports) are written under `outputs/`.
|
|
167
|
+
|
|
168
|
+
## Custom models
|
|
169
|
+
|
|
170
|
+
Drop a Python file into `user_models/` and register it:
|
|
171
|
+
|
|
172
|
+
```python
|
|
173
|
+
from visionforge.models.registry import register_model
|
|
174
|
+
|
|
175
|
+
@register_model("my_net")
|
|
176
|
+
def build_my_net(num_outputs: int) -> nn.Module: ...
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
Select it via `model.custom_model` — works for classification, regression and
|
|
180
|
+
segmentation. See `user_models/README.md`.
|
|
181
|
+
|
|
182
|
+
## Custom tasks — define a whole new task family (ADR-058)
|
|
183
|
+
|
|
184
|
+
When your research doesn't fit the five built-in tasks, define your own in
|
|
185
|
+
**one documented Python file** — no React, no FastAPI, no training loop:
|
|
186
|
+
|
|
187
|
+
```bash
|
|
188
|
+
visionforge new-task cell_counting # writes user_tasks/cell_counting.py
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
The generated template **trains out of the box** on synthetic data. Fill four
|
|
192
|
+
hooks — `build_model`, `build_loaders`, `compute_loss`, `compute_metrics` —
|
|
193
|
+
and a Pydantic `Config` whose fields become a validated form schema. You get,
|
|
194
|
+
with zero extra code:
|
|
195
|
+
|
|
196
|
+
- `GET /api/tasks` · `GET /api/custom/<key>/schema` · `POST /api/custom/<key>/run`
|
|
197
|
+
(live SSE monitor, TensorBoard, versioned `run.json` provenance)
|
|
198
|
+
- `POST /api/custom/<key>/sweep` — grid/random/Optuna over **any** config
|
|
199
|
+
field, including the ones you declared
|
|
200
|
+
- `POST /api/custom/<key>/replicates` — N seeds → mean ± std ± 95% CI
|
|
201
|
+
|
|
202
|
+
Training not epoch-shaped (GANs, EM loops)? Override `run(cfg, ctx)` and own
|
|
203
|
+
the loop while keeping every contract. A working example ships in
|
|
204
|
+
`user_tasks/example_counting/` (a CNN counting dots in synthetic images —
|
|
205
|
+
trains in seconds on CPU). Full walkthrough: [`user_tasks/README.md`](user_tasks/README.md) (PT + EN).
|
|
206
|
+
|
|
207
|
+
## Verifying the install
|
|
208
|
+
|
|
209
|
+
`visionforge doctor` checks your environment; **`visionforge selftest` checks
|
|
210
|
+
the pipeline** — it builds tiny synthetic datasets, starts the real API, and
|
|
211
|
+
trains every task through the same endpoints the browser uses, asserting that
|
|
212
|
+
each run completes, streams live progress, and stores its report:
|
|
213
|
+
|
|
214
|
+
```bash
|
|
215
|
+
visionforge selftest --quick # one run per task (~15s, CPU, offline)
|
|
216
|
+
visionforge selftest # every task x strategy: simple, K-fold, sweep, replicates, comparison
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
```
|
|
220
|
+
case result time detail
|
|
221
|
+
classification/replicates PASS 2.7s accuracy=1.0000±0.0000
|
|
222
|
+
segmentation/cv PASS 2.0s miou=0.0783
|
|
223
|
+
custom/sweep PASS 0.6s best mae=2.4231
|
|
224
|
+
regression/comparison PASS 6.5s best=baseline 1/1 signif.
|
|
225
|
+
...
|
|
226
|
+
27/27 cases passed
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
Filters: `--tasks classification,custom`, `--strategies sweep,replicates`,
|
|
230
|
+
`--json out.json`. Exit code is non-zero if any case fails, so it drops into
|
|
231
|
+
CI as-is. It verifies integrity, not model quality — one epoch on synthetic
|
|
232
|
+
data says nothing about accuracy.
|
|
233
|
+
|
|
234
|
+
## Status
|
|
235
|
+
|
|
236
|
+
**v0.1.0 — first public release.** Usable for real work and under active
|
|
237
|
+
development. Below 1.0 the config schema and HTTP API may change between minor
|
|
238
|
+
releases; configs carry a `schema_version` and are migrated on load, so a YAML
|
|
239
|
+
exported from an older release keeps working.
|
|
240
|
+
|
|
241
|
+
Verified, not asserted: 1274 backend tests and 102 frontend tests gated in CI,
|
|
242
|
+
plus a full matrix of 21 (task × strategy) cases trained on **real** datasets —
|
|
243
|
+
the corpus, the numbers and the one defect it caught are in
|
|
244
|
+
[`documentation/VALIDATION.md`](documentation/VALIDATION.md).
|
|
245
|
+
|
|
246
|
+
Known limits worth knowing before you start:
|
|
247
|
+
|
|
248
|
+
- **One training at a time.** A second submit gets a 409; an experiment queue
|
|
249
|
+
is on the roadmap. Run batches from the CLI in the meantime.
|
|
250
|
+
- **One-click dataset download covers classification only** (the torchvision
|
|
251
|
+
built-ins produce an `ImageFolder`). Detection, regression, segmentation and
|
|
252
|
+
anomaly need a dataset already in their layout — see
|
|
253
|
+
[`documentation/TRAINING_PLAN.md`](documentation/TRAINING_PLAN.md).
|
|
254
|
+
- **No K-fold for detection or anomaly**, by design: Ultralytics owns its
|
|
255
|
+
training loop, and an unsupervised validation fold without anomalies measures
|
|
256
|
+
nothing.
|
|
257
|
+
- **Windows**: keep `training.workers` at 0–2. Each DataLoader worker is a
|
|
258
|
+
process that reloads torch's CUDA DLLs, and eight of them exhaust the page
|
|
259
|
+
file (`WinError 1455`). The default is already 2 there.
|
|
260
|
+
- Dark theme only; a light palette is not designed yet.
|
|
261
|
+
|
|
262
|
+
Found something? [Open an issue](https://github.com/marcus-vreis/VisionForge/issues/new/choose)
|
|
263
|
+
— the template asks for `visionforge --version` and `visionforge doctor`, which
|
|
264
|
+
answers most of the questions up front.
|
|
265
|
+
|
|
266
|
+
## Architecture, decisions and contributing
|
|
267
|
+
|
|
268
|
+
- [`CHANGELOG.md`](CHANGELOG.md) — what shipped in each release
|
|
269
|
+
- `documentation/ARCHITECTURE.md` — layers, modules, boundaries
|
|
270
|
+
- `documentation/DECISIONS.md` — every architecture decision as an ADR (001–065)
|
|
271
|
+
- `documentation/TRAINING_PLAN.md` — the model × strategy matrix, in four
|
|
272
|
+
layers of increasing cost
|
|
273
|
+
- `documentation/VALIDATION.md` — the real-dataset validation record
|
|
274
|
+
- `documentation/CONTRIBUTING.md` — dev setup, test/lint gauntlet, PR flow
|
|
275
|
+
|
|
276
|
+
Backend checks: `pytest` · `ruff check src/ tests/` · `mypy src/`.
|
|
277
|
+
Frontend: `cd frontend && npx vitest run && npx tsc --noEmit`.
|
|
278
|
+
End-to-end: `visionforge selftest` (or `pytest -m slow` for the harness's own
|
|
279
|
+
live cases — they are deselected from the default run).
|
|
280
|
+
|
|
281
|
+
## Citing
|
|
282
|
+
|
|
283
|
+
If VisionForge is useful in your research, please cite it — see
|
|
284
|
+
[`CITATION.cff`](CITATION.cff) (GitHub renders a “Cite this repository” button).
|
|
285
|
+
|
|
286
|
+
## License
|
|
287
|
+
|
|
288
|
+
[MIT](LICENSE)
|