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.
Files changed (144) hide show
  1. visionforge_studio-0.1.0/LICENSE +21 -0
  2. visionforge_studio-0.1.0/PKG-INFO +372 -0
  3. visionforge_studio-0.1.0/README.md +288 -0
  4. visionforge_studio-0.1.0/pyproject.toml +242 -0
  5. visionforge_studio-0.1.0/setup.cfg +4 -0
  6. visionforge_studio-0.1.0/src/visionforge/__init__.py +11 -0
  7. visionforge_studio-0.1.0/src/visionforge/__main__.py +281 -0
  8. visionforge_studio-0.1.0/src/visionforge/blocks/__init__.py +23 -0
  9. visionforge_studio-0.1.0/src/visionforge/blocks/_search_utils.py +175 -0
  10. visionforge_studio-0.1.0/src/visionforge/blocks/anomaly.py +118 -0
  11. visionforge_studio-0.1.0/src/visionforge/blocks/anomaly_runner.py +55 -0
  12. visionforge_studio-0.1.0/src/visionforge/blocks/base.py +25 -0
  13. visionforge_studio-0.1.0/src/visionforge/blocks/batch_prediction.py +166 -0
  14. visionforge_studio-0.1.0/src/visionforge/blocks/classification.py +177 -0
  15. visionforge_studio-0.1.0/src/visionforge/blocks/classification_runner.py +54 -0
  16. visionforge_studio-0.1.0/src/visionforge/blocks/cross_validation.py +455 -0
  17. visionforge_studio-0.1.0/src/visionforge/blocks/detection.py +51 -0
  18. visionforge_studio-0.1.0/src/visionforge/blocks/detection_runner.py +58 -0
  19. visionforge_studio-0.1.0/src/visionforge/blocks/export_onnx.py +63 -0
  20. visionforge_studio-0.1.0/src/visionforge/blocks/grid_search.py +153 -0
  21. visionforge_studio-0.1.0/src/visionforge/blocks/model_comparison.py +161 -0
  22. visionforge_studio-0.1.0/src/visionforge/blocks/random_search.py +221 -0
  23. visionforge_studio-0.1.0/src/visionforge/blocks/registry.py +31 -0
  24. visionforge_studio-0.1.0/src/visionforge/blocks/regression.py +111 -0
  25. visionforge_studio-0.1.0/src/visionforge/blocks/regression_cv.py +250 -0
  26. visionforge_studio-0.1.0/src/visionforge/blocks/regression_runner.py +55 -0
  27. visionforge_studio-0.1.0/src/visionforge/blocks/segmentation.py +110 -0
  28. visionforge_studio-0.1.0/src/visionforge/blocks/segmentation_cv.py +223 -0
  29. visionforge_studio-0.1.0/src/visionforge/blocks/segmentation_runner.py +55 -0
  30. visionforge_studio-0.1.0/src/visionforge/blocks/transfer_learning.py +264 -0
  31. visionforge_studio-0.1.0/src/visionforge/core/__init__.py +14 -0
  32. visionforge_studio-0.1.0/src/visionforge/core/anomaly_data.py +154 -0
  33. visionforge_studio-0.1.0/src/visionforge/core/anomaly_trainer.py +430 -0
  34. visionforge_studio-0.1.0/src/visionforge/core/batch_predict.py +109 -0
  35. visionforge_studio-0.1.0/src/visionforge/core/comparison.py +88 -0
  36. visionforge_studio-0.1.0/src/visionforge/core/data.py +173 -0
  37. visionforge_studio-0.1.0/src/visionforge/core/dataset_fingerprint.py +168 -0
  38. visionforge_studio-0.1.0/src/visionforge/core/detection_data.py +128 -0
  39. visionforge_studio-0.1.0/src/visionforge/core/detection_dataset.py +90 -0
  40. visionforge_studio-0.1.0/src/visionforge/core/detection_metrics.py +108 -0
  41. visionforge_studio-0.1.0/src/visionforge/core/detection_trainer.py +744 -0
  42. visionforge_studio-0.1.0/src/visionforge/core/evaluator.py +131 -0
  43. visionforge_studio-0.1.0/src/visionforge/core/gradcam.py +176 -0
  44. visionforge_studio-0.1.0/src/visionforge/core/latex_export.py +302 -0
  45. visionforge_studio-0.1.0/src/visionforge/core/onnx_export.py +163 -0
  46. visionforge_studio-0.1.0/src/visionforge/core/plotter.py +318 -0
  47. visionforge_studio-0.1.0/src/visionforge/core/preprocessing.py +167 -0
  48. visionforge_studio-0.1.0/src/visionforge/core/regression_data.py +162 -0
  49. visionforge_studio-0.1.0/src/visionforge/core/regression_trainer.py +487 -0
  50. visionforge_studio-0.1.0/src/visionforge/core/replicated_comparison.py +250 -0
  51. visionforge_studio-0.1.0/src/visionforge/core/replicates.py +187 -0
  52. visionforge_studio-0.1.0/src/visionforge/core/segmentation_data.py +225 -0
  53. visionforge_studio-0.1.0/src/visionforge/core/segmentation_trainer.py +556 -0
  54. visionforge_studio-0.1.0/src/visionforge/core/significance.py +346 -0
  55. visionforge_studio-0.1.0/src/visionforge/core/sweep.py +308 -0
  56. visionforge_studio-0.1.0/src/visionforge/core/task_runner.py +42 -0
  57. visionforge_studio-0.1.0/src/visionforge/core/tracking.py +52 -0
  58. visionforge_studio-0.1.0/src/visionforge/core/trainer.py +495 -0
  59. visionforge_studio-0.1.0/src/visionforge/gui/__init__.py +0 -0
  60. visionforge_studio-0.1.0/src/visionforge/gui/api/__init__.py +0 -0
  61. visionforge_studio-0.1.0/src/visionforge/gui/api/dataset_download.py +383 -0
  62. visionforge_studio-0.1.0/src/visionforge/gui/api/detection_export.py +79 -0
  63. visionforge_studio-0.1.0/src/visionforge/gui/api/detection_testing.py +162 -0
  64. visionforge_studio-0.1.0/src/visionforge/gui/api/routes.py +3699 -0
  65. visionforge_studio-0.1.0/src/visionforge/gui/api/schemas.py +642 -0
  66. visionforge_studio-0.1.0/src/visionforge/gui/api/torch_batch_predict.py +162 -0
  67. visionforge_studio-0.1.0/src/visionforge/gui/api/torch_gradcam.py +153 -0
  68. visionforge_studio-0.1.0/src/visionforge/gui/api/torch_onnx_export.py +107 -0
  69. visionforge_studio-0.1.0/src/visionforge/gui/server.py +58 -0
  70. visionforge_studio-0.1.0/src/visionforge/gui/static/assets/bricolage-grotesque-latin-ext-wght-normal-CcLUaPy7.woff2 +0 -0
  71. visionforge_studio-0.1.0/src/visionforge/gui/static/assets/bricolage-grotesque-latin-wght-normal-DLoelf7F.woff2 +0 -0
  72. visionforge_studio-0.1.0/src/visionforge/gui/static/assets/bricolage-grotesque-vietnamese-wght-normal-BUzh504Q.woff2 +0 -0
  73. visionforge_studio-0.1.0/src/visionforge/gui/static/assets/familjen-grotesk-latin-ext-wght-normal-Cvgdx4cy.woff2 +0 -0
  74. visionforge_studio-0.1.0/src/visionforge/gui/static/assets/familjen-grotesk-latin-wght-normal-CfZa4wxB.woff2 +0 -0
  75. visionforge_studio-0.1.0/src/visionforge/gui/static/assets/familjen-grotesk-vietnamese-wght-normal-DKRsWTd7.woff2 +0 -0
  76. visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-cyrillic-400-normal-BSMlKf0J.woff2 +0 -0
  77. visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-cyrillic-400-normal-CEL4l2ZJ.woff +0 -0
  78. visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-cyrillic-500-normal-Ael50iVv.woff +0 -0
  79. visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-cyrillic-500-normal-Bq9vWWag.woff2 +0 -0
  80. visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-cyrillic-600-normal-CTOM6hUh.woff2 +0 -0
  81. visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-cyrillic-600-normal-fLZuRloM.woff +0 -0
  82. visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-cyrillic-ext-400-normal-DMdlQ8Kv.woff +0 -0
  83. visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-cyrillic-ext-400-normal-xuaO2J-f.woff2 +0 -0
  84. visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-cyrillic-ext-500-normal-BIfNGwUT.woff +0 -0
  85. visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-cyrillic-ext-500-normal-BqneJy0T.woff2 +0 -0
  86. visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-cyrillic-ext-600-normal-9HEixskS.woff +0 -0
  87. visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-cyrillic-ext-600-normal-V-xxqcpd.woff2 +0 -0
  88. visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
  89. visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
  90. visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
  91. visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
  92. visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2 +0 -0
  93. visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff +0 -0
  94. visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-latin-ext-400-normal-BmRBH3aV.woff2 +0 -0
  95. visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-latin-ext-400-normal-D3D2R8hC.woff +0 -0
  96. visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-latin-ext-500-normal-CAhNIIs5.woff2 +0 -0
  97. visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-latin-ext-500-normal-CZ70TYgx.woff +0 -0
  98. visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-latin-ext-600-normal-D38SheWl.woff2 +0 -0
  99. visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-latin-ext-600-normal-DmB0ttJJ.woff +0 -0
  100. visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-vietnamese-400-normal-BulugwFq.woff2 +0 -0
  101. visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-vietnamese-400-normal-DDuiU_S-.woff +0 -0
  102. visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-vietnamese-500-normal-C8zxqsMH.woff +0 -0
  103. visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-vietnamese-500-normal-DZ4AoWbu.woff2 +0 -0
  104. visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-vietnamese-600-normal-D2EvbN8M.woff2 +0 -0
  105. visionforge_studio-0.1.0/src/visionforge/gui/static/assets/ibm-plex-mono-vietnamese-600-normal-iLQfcSjf.woff +0 -0
  106. visionforge_studio-0.1.0/src/visionforge/gui/static/assets/index-C9dhnPJf.css +2 -0
  107. visionforge_studio-0.1.0/src/visionforge/gui/static/assets/index-CYSrGwLj.js +46 -0
  108. visionforge_studio-0.1.0/src/visionforge/gui/static/favicon.svg +1 -0
  109. visionforge_studio-0.1.0/src/visionforge/gui/static/icons.svg +24 -0
  110. visionforge_studio-0.1.0/src/visionforge/gui/static/index.html +16 -0
  111. visionforge_studio-0.1.0/src/visionforge/models/__init__.py +3 -0
  112. visionforge_studio-0.1.0/src/visionforge/models/anomaly_factory.py +208 -0
  113. visionforge_studio-0.1.0/src/visionforge/models/detection_factory.py +135 -0
  114. visionforge_studio-0.1.0/src/visionforge/models/factory.py +125 -0
  115. visionforge_studio-0.1.0/src/visionforge/models/registry.py +127 -0
  116. visionforge_studio-0.1.0/src/visionforge/models/regression_factory.py +63 -0
  117. visionforge_studio-0.1.0/src/visionforge/models/segmentation_factory.py +183 -0
  118. visionforge_studio-0.1.0/src/visionforge/models/timm_source.py +35 -0
  119. visionforge_studio-0.1.0/src/visionforge/tasks/__init__.py +33 -0
  120. visionforge_studio-0.1.0/src/visionforge/tasks/base.py +139 -0
  121. visionforge_studio-0.1.0/src/visionforge/tasks/engine.py +367 -0
  122. visionforge_studio-0.1.0/src/visionforge/tasks/registry.py +180 -0
  123. visionforge_studio-0.1.0/src/visionforge/tasks/runner.py +57 -0
  124. visionforge_studio-0.1.0/src/visionforge/tasks/scaffold.py +217 -0
  125. visionforge_studio-0.1.0/src/visionforge/utils/__init__.py +0 -0
  126. visionforge_studio-0.1.0/src/visionforge/utils/anomaly_config.py +150 -0
  127. visionforge_studio-0.1.0/src/visionforge/utils/config.py +521 -0
  128. visionforge_studio-0.1.0/src/visionforge/utils/cuda.py +102 -0
  129. visionforge_studio-0.1.0/src/visionforge/utils/detection_config.py +306 -0
  130. visionforge_studio-0.1.0/src/visionforge/utils/doctor.py +284 -0
  131. visionforge_studio-0.1.0/src/visionforge/utils/environment.py +67 -0
  132. visionforge_studio-0.1.0/src/visionforge/utils/logger.py +52 -0
  133. visionforge_studio-0.1.0/src/visionforge/utils/regression_config.py +241 -0
  134. visionforge_studio-0.1.0/src/visionforge/utils/segmentation_config.py +219 -0
  135. visionforge_studio-0.1.0/src/visionforge/utils/selftest.py +719 -0
  136. visionforge_studio-0.1.0/src/visionforge/utils/selftest_data.py +157 -0
  137. visionforge_studio-0.1.0/src/visionforge_studio.egg-info/PKG-INFO +372 -0
  138. visionforge_studio-0.1.0/src/visionforge_studio.egg-info/SOURCES.txt +142 -0
  139. visionforge_studio-0.1.0/src/visionforge_studio.egg-info/dependency_links.txt +1 -0
  140. visionforge_studio-0.1.0/src/visionforge_studio.egg-info/entry_points.txt +2 -0
  141. visionforge_studio-0.1.0/src/visionforge_studio.egg-info/requires.txt +63 -0
  142. visionforge_studio-0.1.0/src/visionforge_studio.egg-info/top_level.txt +1 -0
  143. visionforge_studio-0.1.0/tests/test_cli_run_dispatch.py +114 -0
  144. 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
+ [![CI](https://github.com/marcus-vreis/VisionForge/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/marcus-vreis/VisionForge/actions/workflows/ci.yml)
88
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](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
+ ![VisionForge — classification panel](docs/images/vf-classification.png)
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
+ ![Multi-seed replicates — same config, N seeds, mean ± 95% CI](docs/images/vf-replicates.png)
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
+ [![CI](https://github.com/marcus-vreis/VisionForge/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/marcus-vreis/VisionForge/actions/workflows/ci.yml)
4
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](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
+ ![VisionForge — classification panel](docs/images/vf-classification.png)
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
+ ![Multi-seed replicates — same config, N seeds, mean ± 95% CI](docs/images/vf-replicates.png)
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)