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.
Files changed (112) hide show
  1. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/PKG-INFO +41 -35
  2. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/README.md +23 -23
  3. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/pyproject.toml +34 -19
  4. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_version.py +2 -2
  5. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/config/schemas/_dataset.py +10 -0
  6. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/dataset.py +78 -15
  7. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/.gitignore +0 -0
  8. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/LICENSE +0 -0
  9. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/__init__.py +0 -0
  10. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/__main__.py +0 -0
  11. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/__init__.py +0 -0
  12. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_model/__init__.py +0 -0
  13. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_model/_coerce.py +0 -0
  14. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_model/_discover.py +0 -0
  15. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_model/_execution.py +0 -0
  16. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_model/_introspect.py +0 -0
  17. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_model/_item.py +0 -0
  18. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_model/_registry.py +0 -0
  19. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_model/_state.py +0 -0
  20. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_model/_undo.py +0 -0
  21. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_panes/__init__.py +0 -0
  22. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_panes/_config_pane.py +0 -0
  23. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_panes/_result_pane.py +0 -0
  24. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_panes/_task_pane.py +0 -0
  25. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_panes/_widgets.py +0 -0
  26. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_screens/__init__.py +0 -0
  27. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_screens/_base.py +0 -0
  28. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_screens/_detail.py +0 -0
  29. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_screens/_model.py +0 -0
  30. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_screens/_params.py +0 -0
  31. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_screens/_pathpicker.py +0 -0
  32. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_screens/_section.py +0 -0
  33. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_screens/_settings.py +0 -0
  34. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_viewmodel/__init__.py +0 -0
  35. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_viewmodel/_builder_vm.py +0 -0
  36. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_viewmodel/_model_vm.py +0 -0
  37. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_viewmodel/_rendering.py +0 -0
  38. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_viewmodel/_result_vm.py +0 -0
  39. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/_viewmodel/_section_vm.py +0 -0
  40. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/app.py +0 -0
  41. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_app/cli.py +0 -0
  42. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_encoding_cli.py +0 -0
  43. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/_logging.py +0 -0
  44. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/binning.py +0 -0
  45. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/cache.py +0 -0
  46. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/config/__init__.py +0 -0
  47. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/config/_loader.py +0 -0
  48. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/config/_merge.py +0 -0
  49. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/config/_models.py +0 -0
  50. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/config/_paths.py +0 -0
  51. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/config/schemas/__init__.py +0 -0
  52. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/config/schemas/_extractor.py +0 -0
  53. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/config/schemas/_metadata.py +0 -0
  54. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/config/schemas/_preprocessor.py +0 -0
  55. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/config/schemas/_task.py +0 -0
  56. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/config/schemas/_view.py +0 -0
  57. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/config/schemas/_workflow.py +0 -0
  58. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/embeddings.py +0 -0
  59. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/metadata.py +0 -0
  60. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/policy.py +0 -0
  61. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/preprocessing.py +0 -0
  62. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/preprocessors.py +0 -0
  63. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/py.typed +0 -0
  64. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/runner.py +0 -0
  65. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/view.py +0 -0
  66. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflow/__init__.py +0 -0
  67. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflow/_text_report.py +0 -0
  68. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflow/base.py +0 -0
  69. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflow/orchestrator.py +0 -0
  70. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/__init__.py +0 -0
  71. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/_common.py +0 -0
  72. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/_ontology.py +0 -0
  73. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/analysis/__init__.py +0 -0
  74. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/analysis/outputs.py +0 -0
  75. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/analysis/params.py +0 -0
  76. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/analysis/workflow.py +0 -0
  77. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/cleaning/__init__.py +0 -0
  78. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/cleaning/_internal.py +0 -0
  79. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/cleaning/outputs.py +0 -0
  80. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/cleaning/params.py +0 -0
  81. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/cleaning/report.py +0 -0
  82. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/cleaning/workflow.py +0 -0
  83. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/coverage/__init__.py +0 -0
  84. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/coverage/ontology.py +0 -0
  85. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/coverage/outputs.py +0 -0
  86. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/coverage/params.py +0 -0
  87. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/coverage/report.py +0 -0
  88. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/coverage/workflow.py +0 -0
  89. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/drift/__init__.py +0 -0
  90. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/drift/outputs.py +0 -0
  91. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/drift/params.py +0 -0
  92. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/drift/report.py +0 -0
  93. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/drift/workflow.py +0 -0
  94. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/ood/__init__.py +0 -0
  95. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/ood/outputs.py +0 -0
  96. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/ood/params.py +0 -0
  97. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/ood/report.py +0 -0
  98. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/ood/workflow.py +0 -0
  99. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/parameter_sweep/__init__.py +0 -0
  100. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/parameter_sweep/outputs.py +0 -0
  101. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/parameter_sweep/params.py +0 -0
  102. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/parameter_sweep/workflow.py +0 -0
  103. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/prioritization/__init__.py +0 -0
  104. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/prioritization/outputs.py +0 -0
  105. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/prioritization/params.py +0 -0
  106. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/prioritization/report.py +0 -0
  107. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/prioritization/workflow.py +0 -0
  108. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/splitting/__init__.py +0 -0
  109. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/splitting/outputs.py +0 -0
  110. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/splitting/params.py +0 -0
  111. {dataeval_flow-0.2.0 → dataeval_flow-0.2.1}/src/dataeval_flow/workflows/splitting/report.py +0 -0
  112. {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.0
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: cu118
33
- Requires-Dist: torch>=2.2.0; extra == 'cu118'
34
- Requires-Dist: torchvision>=0.17.0; extra == 'cu118'
35
- Provides-Extra: cu128
36
- Requires-Dist: torch>=2.2.0; extra == 'cu128'
37
- Requires-Dist: torchvision>=0.17.0; extra == 'cu128'
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-gpu
43
- Requires-Dist: onnx>=1.15; extra == 'onnx-gpu'
44
- Requires-Dist: onnxruntime-gpu<1.24,>=1.23.2; (python_version == '3.10') and extra == 'onnx-gpu'
45
- Requires-Dist: onnxruntime-gpu<1.27,>=1.23.2; (python_version >= '3.11') and extra == 'onnx-gpu'
46
- Requires-Dist: onnxruntime-gpu<1.27,>=1.24; (python_version >= '3.14') and extra == 'onnx-gpu'
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 22.04 (cu118) and
122
- Ubuntu 24.04 (cpu, cu128). macOS and Windows are supported only through Docker or
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 11.8 container
162
- docker build -f docker/Dockerfile.cu118 -t dataeval:cu118 .
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:cu118
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:cu118
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:cu118 # cpu / cu118 / cu128
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-cu118
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:cu118
203
+ cosign verify --key docker/cosign.pub harbor.jatic.net/aria/dataeval:cu126
198
204
  ```
199
205
 
200
- Then drop the `dataeval:cu118` reference in the Quick Start `docker run`
201
- commands above with the fully-qualified `harbor.jatic.net/aria/dataeval:cu118`
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:cu118
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:cu118
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:cu118 --help
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:cu118 --config config/
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:cu118 --config params.yaml
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 / cu118 / cu128)
448
- pip install torch torchvision --index-url https://download.pytorch.org/whl/cu128
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-gpu`, `opencv`, `app`, `ontology`) work normally under
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` / `cu118` / `cu128` extras do not select a PyTorch variant under pip.**
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 cu118 / cu128 / auto
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 cu118 / cu128; add --extra onnx --extra opencv --extra app as needed
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 (`cu118`, `cu128`) are only wired through `uv` and
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 22.04 (cu118) and
70
- Ubuntu 24.04 (cpu, cu128). macOS and Windows are supported only through Docker or
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 11.8 container
110
- docker build -f docker/Dockerfile.cu118 -t dataeval:cu118 .
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:cu118
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:cu118
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:cu118 # cpu / cu118 / cu128
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-cu118
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:cu118
145
+ cosign verify --key docker/cosign.pub harbor.jatic.net/aria/dataeval:cu126
146
146
  ```
147
147
 
148
- Then drop the `dataeval:cu118` reference in the Quick Start `docker run`
149
- commands above with the fully-qualified `harbor.jatic.net/aria/dataeval:cu118`
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:cu118
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:cu118
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:cu118 --help
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:cu118 --config config/
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:cu118 --config params.yaml
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 / cu118 / cu128)
396
- pip install torch torchvision --index-url https://download.pytorch.org/whl/cu128
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-gpu`, `opencv`, `app`, `ontology`) work normally under
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` / `cu118` / `cu128` extras do not select a PyTorch variant under pip.**
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 cu118 / cu128 / auto
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 cu118 / cu128; add --extra onnx --extra opencv --extra app as needed
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 (`cu118`, `cu128`) are only wired through `uv` and
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
- cu118 = ["torch>=2.2.0", "torchvision>=0.17.0"]
32
- cu128 = ["torch>=2.2.0", "torchvision>=0.17.0"]
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
- # 1.23.2 is the floor for the CUDA 12.8 images (see docker/variants.yaml).
41
- "onnxruntime-gpu>=1.23.2,<1.24; python_version == '3.10'", # 1.24+ drops cp310 wheels
42
- "onnxruntime-gpu>=1.23.2,<1.27; python_version >= '3.11'", # 1.27+ requires CUDA 13.0
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
- opencv = ["opencv-python-headless>=4.8.0"]
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 = "cu118" },
154
- { extra = "cu128" },
163
+ { extra = "cu126" },
164
+ { extra = "cu130" },
155
165
  ],
156
166
  [
157
167
  { extra = "onnx" },
158
- { extra = "onnx-gpu" },
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-cu118"
169
- url = "https://download.pytorch.org/whl/cu118"
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-cu128"
174
- url = "https://download.pytorch.org/whl/cu128"
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-cu118", extra = "cu118" },
181
- { index = "pytorch-cu128", extra = "cu128" },
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-cu118", extra = "cu118" },
186
- { index = "pytorch-cu128", extra = "cu128" },
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.0'
22
- __version_tuple__ = version_tuple = (0, 2, 0)
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(path: Path) -> Any:
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`` layout.
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
- dataset = load_od(path, dataset_format="yolo")
419
- _logger.info("YOLO dataset: loaded %d images from %s", len(dataset), path)
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", "test").
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
- _reject_empty_dataset(dataset, path / split if split else path, dataset_format)
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
- msg = f"Loaded 0 items from {root} (format={dataset_format!r})."
507
- if dataset_format == "huggingface" and _is_arrow_dump(root):
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
- else:
592
- # Coco forwards annotations_file/images_dir; Yolo forwards nothing.
593
- for field_name in ("annotations_file", "images_dir"):
594
- if hasattr(config, field_name):
595
- kwargs[field_name] = getattr(config, field_name)
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