dataeval-flow 0.2.0__tar.gz → 0.2.1__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.
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/PKG-INFO +41 -35
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/README.md +23 -23
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/pyproject.toml +34 -19
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_version.py +2 -2
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/config/schemas/_dataset.py +10 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/dataset.py +78 -15
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/.gitignore +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/LICENSE +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/__init__.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/__main__.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/__init__.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_model/__init__.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_model/_coerce.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_model/_discover.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_model/_execution.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_model/_introspect.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_model/_item.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_model/_registry.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_model/_state.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_model/_undo.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_panes/__init__.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_panes/_config_pane.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_panes/_result_pane.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_panes/_task_pane.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_panes/_widgets.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_screens/__init__.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_screens/_base.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_screens/_detail.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_screens/_model.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_screens/_params.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_screens/_pathpicker.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_screens/_section.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_screens/_settings.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_viewmodel/__init__.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_viewmodel/_builder_vm.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_viewmodel/_model_vm.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_viewmodel/_rendering.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_viewmodel/_result_vm.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_viewmodel/_section_vm.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/app.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/cli.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_encoding_cli.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_logging.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/binning.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/cache.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/config/__init__.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/config/_loader.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/config/_merge.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/config/_models.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/config/_paths.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/config/schemas/__init__.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/config/schemas/_extractor.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/config/schemas/_metadata.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/config/schemas/_preprocessor.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/config/schemas/_task.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/config/schemas/_view.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/config/schemas/_workflow.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/embeddings.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/metadata.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/policy.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/preprocessing.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/preprocessors.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/py.typed +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/runner.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/view.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflow/__init__.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflow/_text_report.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflow/base.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflow/orchestrator.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/__init__.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/_common.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/_ontology.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/analysis/__init__.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/analysis/outputs.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/analysis/params.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/analysis/workflow.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/cleaning/__init__.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/cleaning/_internal.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/cleaning/outputs.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/cleaning/params.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/cleaning/report.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/cleaning/workflow.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/coverage/__init__.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/coverage/ontology.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/coverage/outputs.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/coverage/params.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/coverage/report.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/coverage/workflow.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/drift/__init__.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/drift/outputs.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/drift/params.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/drift/report.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/drift/workflow.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/ood/__init__.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/ood/outputs.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/ood/params.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/ood/report.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/ood/workflow.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/parameter_sweep/__init__.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/parameter_sweep/outputs.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/parameter_sweep/params.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/parameter_sweep/workflow.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/prioritization/__init__.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/prioritization/outputs.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/prioritization/params.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/prioritization/report.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/prioritization/workflow.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/splitting/__init__.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/splitting/outputs.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/splitting/params.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/splitting/report.py +0 -0
- {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/splitting/workflow.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: dataeval-flow
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.1
|
|
4
4
|
Summary: DataEval Workflows container for data evaluation
|
|
5
5
|
Project-URL: Homepage, https://github.com/aria-ml/dataeval-flow
|
|
6
6
|
Project-URL: Documentation, https://dataeval-flow.readthedocs.io/
|
|
@@ -29,25 +29,31 @@ Requires-Dist: textual>=3.0; extra == 'app'
|
|
|
29
29
|
Provides-Extra: cpu
|
|
30
30
|
Requires-Dist: torch>=2.2.0; extra == 'cpu'
|
|
31
31
|
Requires-Dist: torchvision>=0.17.0; extra == 'cpu'
|
|
32
|
-
Provides-Extra:
|
|
33
|
-
Requires-Dist: torch>=2.2.0; extra == '
|
|
34
|
-
Requires-Dist: torchvision>=0.17.0; extra == '
|
|
35
|
-
Provides-Extra:
|
|
36
|
-
Requires-Dist: torch>=2.2.0; extra == '
|
|
37
|
-
Requires-Dist: torchvision>=0.17.0; extra == '
|
|
32
|
+
Provides-Extra: cu126
|
|
33
|
+
Requires-Dist: torch>=2.2.0; extra == 'cu126'
|
|
34
|
+
Requires-Dist: torchvision>=0.17.0; extra == 'cu126'
|
|
35
|
+
Provides-Extra: cu130
|
|
36
|
+
Requires-Dist: torch>=2.2.0; extra == 'cu130'
|
|
37
|
+
Requires-Dist: torchvision>=0.17.0; extra == 'cu130'
|
|
38
38
|
Provides-Extra: onnx
|
|
39
39
|
Requires-Dist: onnx>=1.15; extra == 'onnx'
|
|
40
40
|
Requires-Dist: onnxruntime<1.24,>=1.20; (python_version == '3.10') and extra == 'onnx'
|
|
41
41
|
Requires-Dist: onnxruntime>=1.20; (python_version >= '3.11') and extra == 'onnx'
|
|
42
|
-
Provides-Extra: onnx-
|
|
43
|
-
Requires-Dist: onnx>=1.15; extra == 'onnx-
|
|
44
|
-
Requires-Dist: onnxruntime-gpu<1.24,>=1.
|
|
45
|
-
Requires-Dist: onnxruntime-gpu<1.27,>=1.
|
|
46
|
-
Requires-Dist: onnxruntime-gpu<1.27,>=1.24; (python_version >= '3.14') and extra == 'onnx-
|
|
42
|
+
Provides-Extra: onnx-cu126
|
|
43
|
+
Requires-Dist: onnx>=1.15; extra == 'onnx-cu126'
|
|
44
|
+
Requires-Dist: onnxruntime-gpu<1.24,>=1.20; (python_version == '3.10' and extra != 'onnx-cu130') and extra == 'onnx-cu126'
|
|
45
|
+
Requires-Dist: onnxruntime-gpu<1.27,>=1.20; (python_version >= '3.11' and extra != 'onnx-cu130') and extra == 'onnx-cu126'
|
|
46
|
+
Requires-Dist: onnxruntime-gpu<1.27,>=1.24; (python_version >= '3.14' and extra != 'onnx-cu130') and extra == 'onnx-cu126'
|
|
47
|
+
Provides-Extra: onnx-cu130
|
|
48
|
+
Requires-Dist: onnx>=1.15; extra == 'onnx-cu130'
|
|
49
|
+
Requires-Dist: onnxruntime-gpu>=1.27; (python_version >= '3.11' and extra != 'onnx-cu126') and extra == 'onnx-cu130'
|
|
50
|
+
Requires-Dist: onnxruntime>=1.20; (python_version == '3.10' and extra != 'onnx-cu126') and extra == 'onnx-cu130'
|
|
47
51
|
Provides-Extra: ontology
|
|
48
52
|
Requires-Dist: dataeval[ontology]==1.1.0-rc6; extra == 'ontology'
|
|
49
53
|
Provides-Extra: opencv
|
|
50
54
|
Requires-Dist: opencv-python-headless>=4.8.0; extra == 'opencv'
|
|
55
|
+
Provides-Extra: opencv-fips
|
|
56
|
+
Requires-Dist: opencv-python-headless<4.13.0,>=4.8.0; extra == 'opencv-fips'
|
|
51
57
|
Description-Content-Type: text/markdown
|
|
52
58
|
|
|
53
59
|
<!-- markdownlint-disable MD041 -->
|
|
@@ -118,8 +124,8 @@ The guidance below applies to both the container and the Python-library forms.
|
|
|
118
124
|
|
|
119
125
|
DataEval Flow is developed and tested on Linux (Ubuntu 22.04 and 24.04, including
|
|
120
126
|
WSL2). The Python package supports **Python 3.10–3.14**; the CI test matrix runs
|
|
121
|
-
all five. The container images are built on Ubuntu
|
|
122
|
-
|
|
127
|
+
all five. The container images are all built on Ubuntu 24.04 (cpu, cu126, cu130).
|
|
128
|
+
macOS and Windows are supported only through Docker or
|
|
123
129
|
WSL2 and are not part of the CI test matrix — if you hit an issue on those hosts,
|
|
124
130
|
the OS/hardware may be the root cause.
|
|
125
131
|
|
|
@@ -158,17 +164,17 @@ at least the minimum CPU/memory above; size memory to your largest dataset.
|
|
|
158
164
|
## Quick Start
|
|
159
165
|
|
|
160
166
|
```bash
|
|
161
|
-
# 1. Build CUDA
|
|
162
|
-
docker build -f docker/Dockerfile.
|
|
167
|
+
# 1. Build CUDA 12.6 container
|
|
168
|
+
docker build -f docker/Dockerfile.cu126 -t dataeval:cu126 .
|
|
163
169
|
|
|
164
170
|
# 2. Show help
|
|
165
|
-
docker run dataeval:
|
|
171
|
+
docker run dataeval:cu126
|
|
166
172
|
|
|
167
173
|
# 3. Run with data and output
|
|
168
174
|
docker run --gpus all \
|
|
169
175
|
--mount type=bind,source=/path/to/data,target=/dataeval,readonly \
|
|
170
176
|
--mount type=bind,source=/path/to/output,target=/output \
|
|
171
|
-
dataeval:
|
|
177
|
+
dataeval:cu126
|
|
172
178
|
```
|
|
173
179
|
|
|
174
180
|
## Pulling pre-built images
|
|
@@ -180,13 +186,13 @@ if you don't need to modify the code.
|
|
|
180
186
|
**Rolling channel** — tracks the latest commit on `main`. The tag is overwritten on every merge.
|
|
181
187
|
|
|
182
188
|
```bash
|
|
183
|
-
docker pull harbor.jatic.net/aria/dataeval:
|
|
189
|
+
docker pull harbor.jatic.net/aria/dataeval:cu126 # cpu / cu126 / cu130
|
|
184
190
|
```
|
|
185
191
|
|
|
186
192
|
**Pinned release channel** — immutable, version-tagged images cut from `v*` git tags. Use these for reproducible workloads.
|
|
187
193
|
|
|
188
194
|
```bash
|
|
189
|
-
docker pull harbor.jatic.net/aria/dataeval:0.1.0-
|
|
195
|
+
docker pull harbor.jatic.net/aria/dataeval:0.1.0-cu126
|
|
190
196
|
```
|
|
191
197
|
|
|
192
198
|
**Verifying the signature** — every published image is signed with
|
|
@@ -194,11 +200,11 @@ docker pull harbor.jatic.net/aria/dataeval:0.1.0-cu118
|
|
|
194
200
|
[docker/cosign.pub](docker/cosign.pub).
|
|
195
201
|
|
|
196
202
|
```bash
|
|
197
|
-
cosign verify --key docker/cosign.pub harbor.jatic.net/aria/dataeval:
|
|
203
|
+
cosign verify --key docker/cosign.pub harbor.jatic.net/aria/dataeval:cu126
|
|
198
204
|
```
|
|
199
205
|
|
|
200
|
-
Then drop the `dataeval:
|
|
201
|
-
commands above with the fully-qualified `harbor.jatic.net/aria/dataeval:
|
|
206
|
+
Then drop the `dataeval:cu126` reference in the Quick Start `docker run`
|
|
207
|
+
commands above with the fully-qualified `harbor.jatic.net/aria/dataeval:cu126`
|
|
202
208
|
(or pinned version) and skip step 1.
|
|
203
209
|
|
|
204
210
|
> **Note on feature branches.** Containers are only built and published from
|
|
@@ -245,7 +251,7 @@ docker run --gpus all \
|
|
|
245
251
|
--user "$(id -u):$(id -g)" \
|
|
246
252
|
--mount type=bind,source=/path/to/data,target=/dataeval,readonly \
|
|
247
253
|
--mount type=bind,source=/path/to/output,target=/output \
|
|
248
|
-
dataeval:
|
|
254
|
+
dataeval:cu126
|
|
249
255
|
```
|
|
250
256
|
|
|
251
257
|
#### Option 2: Open directory permissions
|
|
@@ -267,7 +273,7 @@ docker run --gpus all \
|
|
|
267
273
|
-e DATAEVAL_DATA=/data \
|
|
268
274
|
--mount type=bind,source=/path/to/data,target=/data,readonly \
|
|
269
275
|
--mount type=bind,source=/path/to/output,target=/output \
|
|
270
|
-
dataeval:
|
|
276
|
+
dataeval:cu126
|
|
271
277
|
```
|
|
272
278
|
|
|
273
279
|
## Environment Variables
|
|
@@ -305,7 +311,7 @@ options, precedence, and examples — via its help command, which is also the
|
|
|
305
311
|
default when the container runs with no pipeline arguments:
|
|
306
312
|
|
|
307
313
|
```bash
|
|
308
|
-
docker run dataeval:
|
|
314
|
+
docker run dataeval:cu126 --help
|
|
309
315
|
```
|
|
310
316
|
|
|
311
317
|
The library form exposes the same options via `python -m dataeval_flow --help`.
|
|
@@ -325,13 +331,13 @@ To specify a config path explicitly:
|
|
|
325
331
|
docker run --gpus all \
|
|
326
332
|
--mount type=bind,source=/path/to/data,target=/dataeval,readonly \
|
|
327
333
|
--mount type=bind,source=/path/to/output,target=/output \
|
|
328
|
-
dataeval:
|
|
334
|
+
dataeval:cu126 --config config/
|
|
329
335
|
|
|
330
336
|
# Single config file
|
|
331
337
|
docker run --gpus all \
|
|
332
338
|
--mount type=bind,source=/path/to/data,target=/dataeval,readonly \
|
|
333
339
|
--mount type=bind,source=/path/to/output,target=/output \
|
|
334
|
-
dataeval:
|
|
340
|
+
dataeval:cu126 --config params.yaml
|
|
335
341
|
```
|
|
336
342
|
|
|
337
343
|
Dataset and model paths in config files are resolved relative to the data root (`/dataeval` by default).
|
|
@@ -444,8 +450,8 @@ DataEval Flow — it accepts the build already present (omit step 1 and you'll g
|
|
|
444
450
|
CUDA-bundled manylinux build of torch from PyPI, which is much larger):
|
|
445
451
|
|
|
446
452
|
```bash
|
|
447
|
-
# 1. Pick your PyTorch build (cpu /
|
|
448
|
-
pip install torch torchvision --index-url https://download.pytorch.org/whl/
|
|
453
|
+
# 1. Pick your PyTorch build (cpu / cu126 / cu130)
|
|
454
|
+
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu130
|
|
449
455
|
|
|
450
456
|
# 2. Install DataEval Flow
|
|
451
457
|
pip install dataeval-flow
|
|
@@ -463,14 +469,14 @@ pip install dataeval-flow
|
|
|
463
469
|
`torchvision` is not installed by default — it is imported lazily and is only needed
|
|
464
470
|
for preprocessing pipelines, the torchvision dataset adapter, and the TUI's transform
|
|
465
471
|
discovery. Install it together with `torch` in step 1 so both come from the same index.
|
|
466
|
-
Feature extras (`onnx`, `onnx-
|
|
472
|
+
Feature extras (`onnx`, `onnx-cu126`, `onnx-cu130`, `opencv`, `app`, `ontology`) work normally under
|
|
467
473
|
pip and are independent of the PyTorch variant:
|
|
468
474
|
|
|
469
475
|
```bash
|
|
470
476
|
pip install "dataeval-flow[onnx,opencv,app]"
|
|
471
477
|
```
|
|
472
478
|
|
|
473
|
-
> **The `cpu` / `
|
|
479
|
+
> **The `cpu` / `cu126` / `cu130` extras do not select a PyTorch variant under pip.**
|
|
474
480
|
> All three declare the same requirements (`torch`, `torchvision`); what distinguishes
|
|
475
481
|
> them is `[tool.uv.sources]`, which routes those packages to the right wheel index.
|
|
476
482
|
> That is project metadata applied by uv when resolving **from source** — it is not
|
|
@@ -481,7 +487,7 @@ pip install "dataeval-flow[onnx,opencv,app]"
|
|
|
481
487
|
`uv` from PyPI:
|
|
482
488
|
|
|
483
489
|
```bash
|
|
484
|
-
uv pip install dataeval-flow --torch-backend cpu # or
|
|
490
|
+
uv pip install dataeval-flow --torch-backend cpu # or cu126 / cu130 / auto
|
|
485
491
|
```
|
|
486
492
|
|
|
487
493
|
`uv` from source (default toolchain; uses committed `uv.lock`) — extras apply here:
|
|
@@ -489,7 +495,7 @@ uv pip install dataeval-flow --torch-backend cpu # or cu118 / cu128 / auto
|
|
|
489
495
|
```bash
|
|
490
496
|
git clone https://github.com/aria-ml/dataeval-flow.git
|
|
491
497
|
cd dataeval-flow
|
|
492
|
-
uv sync --extra cpu # or
|
|
498
|
+
uv sync --extra cpu # or cu126 / cu130; add --extra onnx --extra opencv --extra app as needed
|
|
493
499
|
```
|
|
494
500
|
|
|
495
501
|
`poetry` (source checkout; uses committed `poetry.lock`):
|
|
@@ -514,7 +520,7 @@ Notes:
|
|
|
514
520
|
|
|
515
521
|
- PyTorch is installed from PyPI/`download.pytorch.org` in every path
|
|
516
522
|
(it is no longer maintained on conda-forge).
|
|
517
|
-
- GPU variants (`
|
|
523
|
+
- GPU variants (`cu126`, `cu130`) are only wired through `uv` and
|
|
518
524
|
`pip` today; the Poetry/conda paths install the CPU build of PyTorch.
|
|
519
525
|
|
|
520
526
|
**CLI Usage:**
|
|
@@ -66,8 +66,8 @@ The guidance below applies to both the container and the Python-library forms.
|
|
|
66
66
|
|
|
67
67
|
DataEval Flow is developed and tested on Linux (Ubuntu 22.04 and 24.04, including
|
|
68
68
|
WSL2). The Python package supports **Python 3.10–3.14**; the CI test matrix runs
|
|
69
|
-
all five. The container images are built on Ubuntu
|
|
70
|
-
|
|
69
|
+
all five. The container images are all built on Ubuntu 24.04 (cpu, cu126, cu130).
|
|
70
|
+
macOS and Windows are supported only through Docker or
|
|
71
71
|
WSL2 and are not part of the CI test matrix — if you hit an issue on those hosts,
|
|
72
72
|
the OS/hardware may be the root cause.
|
|
73
73
|
|
|
@@ -106,17 +106,17 @@ at least the minimum CPU/memory above; size memory to your largest dataset.
|
|
|
106
106
|
## Quick Start
|
|
107
107
|
|
|
108
108
|
```bash
|
|
109
|
-
# 1. Build CUDA
|
|
110
|
-
docker build -f docker/Dockerfile.
|
|
109
|
+
# 1. Build CUDA 12.6 container
|
|
110
|
+
docker build -f docker/Dockerfile.cu126 -t dataeval:cu126 .
|
|
111
111
|
|
|
112
112
|
# 2. Show help
|
|
113
|
-
docker run dataeval:
|
|
113
|
+
docker run dataeval:cu126
|
|
114
114
|
|
|
115
115
|
# 3. Run with data and output
|
|
116
116
|
docker run --gpus all \
|
|
117
117
|
--mount type=bind,source=/path/to/data,target=/dataeval,readonly \
|
|
118
118
|
--mount type=bind,source=/path/to/output,target=/output \
|
|
119
|
-
dataeval:
|
|
119
|
+
dataeval:cu126
|
|
120
120
|
```
|
|
121
121
|
|
|
122
122
|
## Pulling pre-built images
|
|
@@ -128,13 +128,13 @@ if you don't need to modify the code.
|
|
|
128
128
|
**Rolling channel** — tracks the latest commit on `main`. The tag is overwritten on every merge.
|
|
129
129
|
|
|
130
130
|
```bash
|
|
131
|
-
docker pull harbor.jatic.net/aria/dataeval:
|
|
131
|
+
docker pull harbor.jatic.net/aria/dataeval:cu126 # cpu / cu126 / cu130
|
|
132
132
|
```
|
|
133
133
|
|
|
134
134
|
**Pinned release channel** — immutable, version-tagged images cut from `v*` git tags. Use these for reproducible workloads.
|
|
135
135
|
|
|
136
136
|
```bash
|
|
137
|
-
docker pull harbor.jatic.net/aria/dataeval:0.1.0-
|
|
137
|
+
docker pull harbor.jatic.net/aria/dataeval:0.1.0-cu126
|
|
138
138
|
```
|
|
139
139
|
|
|
140
140
|
**Verifying the signature** — every published image is signed with
|
|
@@ -142,11 +142,11 @@ docker pull harbor.jatic.net/aria/dataeval:0.1.0-cu118
|
|
|
142
142
|
[docker/cosign.pub](docker/cosign.pub).
|
|
143
143
|
|
|
144
144
|
```bash
|
|
145
|
-
cosign verify --key docker/cosign.pub harbor.jatic.net/aria/dataeval:
|
|
145
|
+
cosign verify --key docker/cosign.pub harbor.jatic.net/aria/dataeval:cu126
|
|
146
146
|
```
|
|
147
147
|
|
|
148
|
-
Then drop the `dataeval:
|
|
149
|
-
commands above with the fully-qualified `harbor.jatic.net/aria/dataeval:
|
|
148
|
+
Then drop the `dataeval:cu126` reference in the Quick Start `docker run`
|
|
149
|
+
commands above with the fully-qualified `harbor.jatic.net/aria/dataeval:cu126`
|
|
150
150
|
(or pinned version) and skip step 1.
|
|
151
151
|
|
|
152
152
|
> **Note on feature branches.** Containers are only built and published from
|
|
@@ -193,7 +193,7 @@ docker run --gpus all \
|
|
|
193
193
|
--user "$(id -u):$(id -g)" \
|
|
194
194
|
--mount type=bind,source=/path/to/data,target=/dataeval,readonly \
|
|
195
195
|
--mount type=bind,source=/path/to/output,target=/output \
|
|
196
|
-
dataeval:
|
|
196
|
+
dataeval:cu126
|
|
197
197
|
```
|
|
198
198
|
|
|
199
199
|
#### Option 2: Open directory permissions
|
|
@@ -215,7 +215,7 @@ docker run --gpus all \
|
|
|
215
215
|
-e DATAEVAL_DATA=/data \
|
|
216
216
|
--mount type=bind,source=/path/to/data,target=/data,readonly \
|
|
217
217
|
--mount type=bind,source=/path/to/output,target=/output \
|
|
218
|
-
dataeval:
|
|
218
|
+
dataeval:cu126
|
|
219
219
|
```
|
|
220
220
|
|
|
221
221
|
## Environment Variables
|
|
@@ -253,7 +253,7 @@ options, precedence, and examples — via its help command, which is also the
|
|
|
253
253
|
default when the container runs with no pipeline arguments:
|
|
254
254
|
|
|
255
255
|
```bash
|
|
256
|
-
docker run dataeval:
|
|
256
|
+
docker run dataeval:cu126 --help
|
|
257
257
|
```
|
|
258
258
|
|
|
259
259
|
The library form exposes the same options via `python -m dataeval_flow --help`.
|
|
@@ -273,13 +273,13 @@ To specify a config path explicitly:
|
|
|
273
273
|
docker run --gpus all \
|
|
274
274
|
--mount type=bind,source=/path/to/data,target=/dataeval,readonly \
|
|
275
275
|
--mount type=bind,source=/path/to/output,target=/output \
|
|
276
|
-
dataeval:
|
|
276
|
+
dataeval:cu126 --config config/
|
|
277
277
|
|
|
278
278
|
# Single config file
|
|
279
279
|
docker run --gpus all \
|
|
280
280
|
--mount type=bind,source=/path/to/data,target=/dataeval,readonly \
|
|
281
281
|
--mount type=bind,source=/path/to/output,target=/output \
|
|
282
|
-
dataeval:
|
|
282
|
+
dataeval:cu126 --config params.yaml
|
|
283
283
|
```
|
|
284
284
|
|
|
285
285
|
Dataset and model paths in config files are resolved relative to the data root (`/dataeval` by default).
|
|
@@ -392,8 +392,8 @@ DataEval Flow — it accepts the build already present (omit step 1 and you'll g
|
|
|
392
392
|
CUDA-bundled manylinux build of torch from PyPI, which is much larger):
|
|
393
393
|
|
|
394
394
|
```bash
|
|
395
|
-
# 1. Pick your PyTorch build (cpu /
|
|
396
|
-
pip install torch torchvision --index-url https://download.pytorch.org/whl/
|
|
395
|
+
# 1. Pick your PyTorch build (cpu / cu126 / cu130)
|
|
396
|
+
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu130
|
|
397
397
|
|
|
398
398
|
# 2. Install DataEval Flow
|
|
399
399
|
pip install dataeval-flow
|
|
@@ -411,14 +411,14 @@ pip install dataeval-flow
|
|
|
411
411
|
`torchvision` is not installed by default — it is imported lazily and is only needed
|
|
412
412
|
for preprocessing pipelines, the torchvision dataset adapter, and the TUI's transform
|
|
413
413
|
discovery. Install it together with `torch` in step 1 so both come from the same index.
|
|
414
|
-
Feature extras (`onnx`, `onnx-
|
|
414
|
+
Feature extras (`onnx`, `onnx-cu126`, `onnx-cu130`, `opencv`, `app`, `ontology`) work normally under
|
|
415
415
|
pip and are independent of the PyTorch variant:
|
|
416
416
|
|
|
417
417
|
```bash
|
|
418
418
|
pip install "dataeval-flow[onnx,opencv,app]"
|
|
419
419
|
```
|
|
420
420
|
|
|
421
|
-
> **The `cpu` / `
|
|
421
|
+
> **The `cpu` / `cu126` / `cu130` extras do not select a PyTorch variant under pip.**
|
|
422
422
|
> All three declare the same requirements (`torch`, `torchvision`); what distinguishes
|
|
423
423
|
> them is `[tool.uv.sources]`, which routes those packages to the right wheel index.
|
|
424
424
|
> That is project metadata applied by uv when resolving **from source** — it is not
|
|
@@ -429,7 +429,7 @@ pip install "dataeval-flow[onnx,opencv,app]"
|
|
|
429
429
|
`uv` from PyPI:
|
|
430
430
|
|
|
431
431
|
```bash
|
|
432
|
-
uv pip install dataeval-flow --torch-backend cpu # or
|
|
432
|
+
uv pip install dataeval-flow --torch-backend cpu # or cu126 / cu130 / auto
|
|
433
433
|
```
|
|
434
434
|
|
|
435
435
|
`uv` from source (default toolchain; uses committed `uv.lock`) — extras apply here:
|
|
@@ -437,7 +437,7 @@ uv pip install dataeval-flow --torch-backend cpu # or cu118 / cu128 / auto
|
|
|
437
437
|
```bash
|
|
438
438
|
git clone https://github.com/aria-ml/dataeval-flow.git
|
|
439
439
|
cd dataeval-flow
|
|
440
|
-
uv sync --extra cpu # or
|
|
440
|
+
uv sync --extra cpu # or cu126 / cu130; add --extra onnx --extra opencv --extra app as needed
|
|
441
441
|
```
|
|
442
442
|
|
|
443
443
|
`poetry` (source checkout; uses committed `poetry.lock`):
|
|
@@ -462,7 +462,7 @@ Notes:
|
|
|
462
462
|
|
|
463
463
|
- PyTorch is installed from PyPI/`download.pytorch.org` in every path
|
|
464
464
|
(it is no longer maintained on conda-forge).
|
|
465
|
-
- GPU variants (`
|
|
465
|
+
- GPU variants (`cu126`, `cu130`) are only wired through `uv` and
|
|
466
466
|
`pip` today; the Poetry/conda paths install the CPU build of PyTorch.
|
|
467
467
|
|
|
468
468
|
**CLI Usage:**
|
|
@@ -28,21 +28,31 @@ dependencies = [
|
|
|
28
28
|
|
|
29
29
|
[project.optional-dependencies]
|
|
30
30
|
cpu = ["torch>=2.2.0", "torchvision>=0.17.0"]
|
|
31
|
-
|
|
32
|
-
|
|
31
|
+
cu126 = ["torch>=2.2.0", "torchvision>=0.17.0"]
|
|
32
|
+
cu130 = ["torch>=2.2.0", "torchvision>=0.17.0"]
|
|
33
33
|
onnx = [
|
|
34
34
|
"onnx>=1.15",
|
|
35
35
|
"onnxruntime>=1.20,<1.24; python_version == '3.10'", # 1.24+ drops cp310 wheels
|
|
36
36
|
"onnxruntime>=1.20; python_version >= '3.11'",
|
|
37
37
|
]
|
|
38
|
-
onnx-gpu
|
|
38
|
+
# One onnx extra per CUDA variant: an onnxruntime-gpu wheel links against a specific
|
|
39
|
+
# CUDA major, so the runtime has to match the torch build (see docker/variants.yaml).
|
|
40
|
+
# The `extra != ...` guards drop the requirement entirely if both are requested, which
|
|
41
|
+
# keeps the published metadata resolvable under pip; uv enforces the exclusion outright
|
|
42
|
+
# via [tool.uv].conflicts.
|
|
43
|
+
onnx-cu126 = [
|
|
39
44
|
"onnx>=1.15",
|
|
40
|
-
|
|
41
|
-
"onnxruntime-gpu>=1.
|
|
42
|
-
"onnxruntime-gpu>=1.
|
|
43
|
-
"onnxruntime-gpu>=1.24,<1.27; python_version >= '3.14'", # 1.24+ for cp314 wheels
|
|
45
|
+
"onnxruntime-gpu>=1.20,<1.24; python_version == '3.10' and extra != 'onnx-cu130'", # 1.24+ drops cp310 wheels
|
|
46
|
+
"onnxruntime-gpu>=1.20,<1.27; python_version >= '3.11' and extra != 'onnx-cu130'", # 1.27+ requires CUDA 13.0
|
|
47
|
+
"onnxruntime-gpu>=1.24,<1.27; python_version >= '3.14' and extra != 'onnx-cu130'", # 1.24+ for cp314 wheels
|
|
44
48
|
]
|
|
45
|
-
|
|
49
|
+
onnx-cu130 = [
|
|
50
|
+
"onnx>=1.15",
|
|
51
|
+
"onnxruntime>=1.20; python_version == '3.10' and extra != 'onnx-cu126'", # CUDA 13.0 is not supported on Python 3.10
|
|
52
|
+
"onnxruntime-gpu>=1.27; python_version >= '3.11' and extra != 'onnx-cu126'",
|
|
53
|
+
]
|
|
54
|
+
opencv = ["opencv-python-headless>=4.8.0"]
|
|
55
|
+
opencv-fips = ["opencv-python-headless>=4.8.0,<4.13.0"] # OpenCV 4.13 and higher are not FIPS compliant
|
|
46
56
|
app = ["textual>=3.0"]
|
|
47
57
|
ontology = ["dataeval[ontology]==1.1.0-rc6"]
|
|
48
58
|
|
|
@@ -150,12 +160,17 @@ constraint-dependencies = [
|
|
|
150
160
|
conflicts = [
|
|
151
161
|
[
|
|
152
162
|
{ extra = "cpu" },
|
|
153
|
-
{ extra = "
|
|
154
|
-
{ extra = "
|
|
163
|
+
{ extra = "cu126" },
|
|
164
|
+
{ extra = "cu130" },
|
|
155
165
|
],
|
|
156
166
|
[
|
|
157
167
|
{ extra = "onnx" },
|
|
158
|
-
{ extra = "onnx-
|
|
168
|
+
{ extra = "onnx-cu126" },
|
|
169
|
+
{ extra = "onnx-cu130" },
|
|
170
|
+
],
|
|
171
|
+
[
|
|
172
|
+
{ extra = "opencv" },
|
|
173
|
+
{ extra = "opencv-fips" },
|
|
159
174
|
]
|
|
160
175
|
]
|
|
161
176
|
|
|
@@ -165,25 +180,25 @@ url = "https://download.pytorch.org/whl/cpu"
|
|
|
165
180
|
explicit = true
|
|
166
181
|
|
|
167
182
|
[[tool.uv.index]]
|
|
168
|
-
name = "pytorch-
|
|
169
|
-
url = "https://download.pytorch.org/whl/
|
|
183
|
+
name = "pytorch-cu126"
|
|
184
|
+
url = "https://download.pytorch.org/whl/cu126"
|
|
170
185
|
explicit = true
|
|
171
186
|
|
|
172
187
|
[[tool.uv.index]]
|
|
173
|
-
name = "pytorch-
|
|
174
|
-
url = "https://download.pytorch.org/whl/
|
|
188
|
+
name = "pytorch-cu130"
|
|
189
|
+
url = "https://download.pytorch.org/whl/cu130"
|
|
175
190
|
explicit = true
|
|
176
191
|
|
|
177
192
|
[tool.uv.sources]
|
|
178
193
|
torch = [
|
|
179
194
|
{ index = "pytorch-cpu", extra = "cpu" },
|
|
180
|
-
{ index = "pytorch-
|
|
181
|
-
{ index = "pytorch-
|
|
195
|
+
{ index = "pytorch-cu126", extra = "cu126" },
|
|
196
|
+
{ index = "pytorch-cu130", extra = "cu130" },
|
|
182
197
|
]
|
|
183
198
|
torchvision = [
|
|
184
199
|
{ index = "pytorch-cpu", extra = "cpu" },
|
|
185
|
-
{ index = "pytorch-
|
|
186
|
-
{ index = "pytorch-
|
|
200
|
+
{ index = "pytorch-cu126", extra = "cu126" },
|
|
201
|
+
{ index = "pytorch-cu130", extra = "cu130" },
|
|
187
202
|
]
|
|
188
203
|
|
|
189
204
|
[tool.poetry]
|
|
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
|
|
|
18
18
|
commit_id: str | None
|
|
19
19
|
__commit_id__: str | None
|
|
20
20
|
|
|
21
|
-
__version__ = version = '0.2.
|
|
22
|
-
__version_tuple__ = version_tuple = (0, 2,
|
|
21
|
+
__version__ = version = '0.2.1'
|
|
22
|
+
__version_tuple__ = version_tuple = (0, 2, 1)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -79,15 +79,25 @@ class CocoDatasetConfig(_DatasetConfigBase):
|
|
|
79
79
|
class YoloDatasetConfig(_DatasetConfigBase):
|
|
80
80
|
"""Dataset config for YOLO format.
|
|
81
81
|
|
|
82
|
+
``path`` is the dataset root — the directory holding ``data.yaml`` and the
|
|
83
|
+
image/label trees — for either Ultralytics arrangement (``images/train/`` +
|
|
84
|
+
``labels/train/`` or ``train/images/`` + ``train/labels/``). Select a split
|
|
85
|
+
with ``split`` rather than by pointing ``path`` at a split subdirectory,
|
|
86
|
+
which puts ``data.yaml`` out of scope and falls back to numeric class names.
|
|
87
|
+
|
|
82
88
|
YAML example::
|
|
83
89
|
|
|
84
90
|
datasets:
|
|
85
91
|
- name: yolo_train
|
|
86
92
|
format: yolo
|
|
87
93
|
path: yolo
|
|
94
|
+
split: train
|
|
88
95
|
"""
|
|
89
96
|
|
|
90
97
|
format: Literal["yolo"] = "yolo"
|
|
98
|
+
split: str | None = None
|
|
99
|
+
yaml_file: str | None = None
|
|
100
|
+
ann_dir: str | None = None
|
|
91
101
|
|
|
92
102
|
|
|
93
103
|
class DatasetProtocolConfig(BaseModel):
|
|
@@ -408,15 +408,54 @@ def load_dataset_coco(path: Path, *, annotations_file: str | None = None, images
|
|
|
408
408
|
return dataset
|
|
409
409
|
|
|
410
410
|
|
|
411
|
-
def load_dataset_yolo(
|
|
411
|
+
def load_dataset_yolo(
|
|
412
|
+
path: Path,
|
|
413
|
+
*,
|
|
414
|
+
split: str | None = None,
|
|
415
|
+
yaml_file: str | None = None,
|
|
416
|
+
ann_dir: str | None = None,
|
|
417
|
+
) -> Any:
|
|
412
418
|
"""Load a YOLO-format object detection dataset via datamaite.
|
|
413
419
|
|
|
414
|
-
datamaite expects the standard ``images/`` + ``labels/`` + ``data.yaml``
|
|
420
|
+
datamaite expects the standard ``images/`` + ``labels/`` + ``data.yaml``
|
|
421
|
+
layout, in either Ultralytics arrangement (``images/train/`` +
|
|
422
|
+
``labels/train/`` or ``train/images/`` + ``train/labels/``), as well as the
|
|
423
|
+
split-less ``images/`` + ``labels/`` variant.
|
|
424
|
+
|
|
425
|
+
Parameters
|
|
426
|
+
----------
|
|
427
|
+
path : Path
|
|
428
|
+
Dataset root — the directory holding ``data.yaml`` and the image/label
|
|
429
|
+
trees. Always point at the root rather than a split subdirectory: the
|
|
430
|
+
root is where the class names are found.
|
|
431
|
+
split : str | None
|
|
432
|
+
Load only this split (``"train"``/``"val"``/``"test"``; aliases such as
|
|
433
|
+
``"validation"`` normalize). Defaults to every split under *path*.
|
|
434
|
+
yaml_file : str | None
|
|
435
|
+
``data.yaml`` path relative to *path*, for a config that is not at the
|
|
436
|
+
root under a conventional name. It is authoritative — a missing file
|
|
437
|
+
or one whose image sources yield nothing gives an empty dataset rather
|
|
438
|
+
than falling back to a scan of *path*.
|
|
439
|
+
ann_dir : str | None
|
|
440
|
+
Label directory relative to *path*, for label trees kept outside the
|
|
441
|
+
conventional ``labels/`` sibling of ``images/``.
|
|
415
442
|
"""
|
|
416
443
|
from datamaite import load_od
|
|
417
444
|
|
|
418
|
-
|
|
419
|
-
|
|
445
|
+
kwargs: dict[str, str] = {}
|
|
446
|
+
if split is not None:
|
|
447
|
+
kwargs["split"] = split
|
|
448
|
+
if yaml_file is not None:
|
|
449
|
+
kwargs["yaml_file"] = yaml_file
|
|
450
|
+
if ann_dir is not None:
|
|
451
|
+
kwargs["ann_dir"] = ann_dir
|
|
452
|
+
dataset = load_od(path, dataset_format="yolo", **kwargs)
|
|
453
|
+
_logger.info(
|
|
454
|
+
"YOLO dataset: loaded %d images from %s%s",
|
|
455
|
+
len(dataset),
|
|
456
|
+
path,
|
|
457
|
+
f" (split={split!r})" if split is not None else "",
|
|
458
|
+
)
|
|
420
459
|
return dataset
|
|
421
460
|
|
|
422
461
|
|
|
@@ -430,6 +469,8 @@ def load_dataset(
|
|
|
430
469
|
task: Literal["image_classification", "object_detection"] = "image_classification",
|
|
431
470
|
annotations_file: str | None = None,
|
|
432
471
|
images_dir: str | None = None,
|
|
472
|
+
yaml_file: str | None = None,
|
|
473
|
+
ann_dir: str | None = None,
|
|
433
474
|
) -> Any:
|
|
434
475
|
"""Load a dataset and convert to MAITE format.
|
|
435
476
|
|
|
@@ -441,7 +482,10 @@ def load_dataset(
|
|
|
441
482
|
path : Path
|
|
442
483
|
Path to the dataset directory.
|
|
443
484
|
split : str | None
|
|
444
|
-
Optional split name to load (e.g. "train", "
|
|
485
|
+
Optional split name to load (e.g. "train", "val"). HuggingFace treats
|
|
486
|
+
it as a subdirectory of *path*; YOLO selects among the splits found
|
|
487
|
+
under the dataset root. Unused by the other formats — COCO selects a
|
|
488
|
+
split through ``annotations_file``.
|
|
445
489
|
dataset_format : Literal["huggingface", "coco", "yolo", "image_folder"]
|
|
446
490
|
Dataset format identifier (default ``"huggingface"``).
|
|
447
491
|
recursive : bool
|
|
@@ -454,6 +498,10 @@ def load_dataset(
|
|
|
454
498
|
Annotations file name (COCO only).
|
|
455
499
|
images_dir : str | None
|
|
456
500
|
Images subdirectory name (COCO only).
|
|
501
|
+
yaml_file : str | None
|
|
502
|
+
``data.yaml`` path relative to *path* (YOLO only).
|
|
503
|
+
ann_dir : str | None
|
|
504
|
+
Label directory relative to *path* (YOLO only).
|
|
457
505
|
|
|
458
506
|
Returns
|
|
459
507
|
-------
|
|
@@ -478,16 +526,19 @@ def load_dataset(
|
|
|
478
526
|
elif dataset_format == "coco":
|
|
479
527
|
dataset = load_dataset_coco(path, annotations_file=annotations_file, images_dir=images_dir)
|
|
480
528
|
elif dataset_format == "yolo":
|
|
481
|
-
dataset = load_dataset_yolo(path)
|
|
529
|
+
dataset = load_dataset_yolo(path, split=split, yaml_file=yaml_file, ann_dir=ann_dir)
|
|
482
530
|
else:
|
|
483
531
|
msg = f"Unsupported dataset format: {dataset_format!r}"
|
|
484
532
|
raise ValueError(msg)
|
|
485
533
|
|
|
486
|
-
|
|
534
|
+
# Only HuggingFace resolves a split to a subdirectory; for YOLO the split is
|
|
535
|
+
# selected inside the root, so the root is what an error should name.
|
|
536
|
+
root = path / split if dataset_format == "huggingface" and split else path
|
|
537
|
+
_reject_empty_dataset(dataset, root, dataset_format, split=split)
|
|
487
538
|
return dataset
|
|
488
539
|
|
|
489
540
|
|
|
490
|
-
def _reject_empty_dataset(dataset: Any, root: Path, dataset_format: str) -> None:
|
|
541
|
+
def _reject_empty_dataset(dataset: Any, root: Path, dataset_format: str, split: str | None = None) -> None:
|
|
491
542
|
"""Raise when a loader yielded zero items.
|
|
492
543
|
|
|
493
544
|
datamaite's loaders log a warning and return an empty dataset when the
|
|
@@ -503,8 +554,16 @@ def _reject_empty_dataset(dataset: Any, root: Path, dataset_format: str) -> None
|
|
|
503
554
|
if len(dataset) > 0:
|
|
504
555
|
return
|
|
505
556
|
|
|
506
|
-
|
|
507
|
-
|
|
557
|
+
detail = f"format={dataset_format!r}" + (f", split={split!r}" if split else "")
|
|
558
|
+
msg = f"Loaded 0 items from {root} ({detail})."
|
|
559
|
+
if dataset_format == "yolo" and split:
|
|
560
|
+
msg += (
|
|
561
|
+
f" No images matched split {split!r} — a YOLO split selection that matches"
|
|
562
|
+
" nothing selects nothing rather than widening back to every split. Check"
|
|
563
|
+
f" that the root holds an images/{split}/ or {split}/images/ tree, or a"
|
|
564
|
+
" data.yaml declaring that split."
|
|
565
|
+
)
|
|
566
|
+
elif dataset_format == "huggingface" and _is_arrow_dump(root):
|
|
508
567
|
msg += (
|
|
509
568
|
" The directory is a `datasets.save_to_disk()` Arrow dump, which the"
|
|
510
569
|
" huggingface loader does not read — it expects the local ImageFolder"
|
|
@@ -569,9 +628,11 @@ def resolve_dataset(config: BaseModel, data_dir: Path | None = None) -> Resolved
|
|
|
569
628
|
"""
|
|
570
629
|
from dataeval_flow.cache import dataset_fingerprint
|
|
571
630
|
from dataeval_flow.config.schemas._dataset import (
|
|
631
|
+
CocoDatasetConfig,
|
|
572
632
|
DatasetProtocolConfig,
|
|
573
633
|
HuggingFaceDatasetConfig,
|
|
574
634
|
ImageFolderDatasetConfig,
|
|
635
|
+
YoloDatasetConfig,
|
|
575
636
|
_DatasetConfigBase,
|
|
576
637
|
)
|
|
577
638
|
|
|
@@ -588,11 +649,13 @@ def resolve_dataset(config: BaseModel, data_dir: Path | None = None) -> Resolved
|
|
|
588
649
|
elif isinstance(config, ImageFolderDatasetConfig):
|
|
589
650
|
kwargs["recursive"] = config.recursive
|
|
590
651
|
kwargs["infer_labels"] = config.infer_labels
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
652
|
+
elif isinstance(config, CocoDatasetConfig):
|
|
653
|
+
kwargs["annotations_file"] = config.annotations_file
|
|
654
|
+
kwargs["images_dir"] = config.images_dir
|
|
655
|
+
elif isinstance(config, YoloDatasetConfig):
|
|
656
|
+
kwargs["split"] = config.split
|
|
657
|
+
kwargs["yaml_file"] = config.yaml_file
|
|
658
|
+
kwargs["ann_dir"] = config.ann_dir
|
|
596
659
|
|
|
597
660
|
from dataeval_flow.config._loader import resolve_path
|
|
598
661
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_viewmodel/_builder_vm.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_viewmodel/_section_vm.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/config/schemas/_preprocessor.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/analysis/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/analysis/workflow.py
RENAMED
|
File without changes
|
{dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/cleaning/__init__.py
RENAMED
|
File without changes
|
{dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/cleaning/_internal.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/cleaning/workflow.py
RENAMED
|
File without changes
|
{dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/coverage/__init__.py
RENAMED
|
File without changes
|
{dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/coverage/ontology.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/coverage/workflow.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/parameter_sweep/__init__.py
RENAMED
|
File without changes
|
{dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/parameter_sweep/outputs.py
RENAMED
|
File without changes
|
{dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/parameter_sweep/params.py
RENAMED
|
File without changes
|
{dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/parameter_sweep/workflow.py
RENAMED
|
File without changes
|
{dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/prioritization/__init__.py
RENAMED
|
File without changes
|
{dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/prioritization/outputs.py
RENAMED
|
File without changes
|
{dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/prioritization/params.py
RENAMED
|
File without changes
|
{dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/prioritization/report.py
RENAMED
|
File without changes
|
{dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/prioritization/workflow.py
RENAMED
|
File without changes
|
{dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/splitting/__init__.py
RENAMED
|
File without changes
|
{dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/splitting/outputs.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/splitting/workflow.py
RENAMED
|
File without changes
|