dataeval 0.86.1__py3-none-any.whl → 0.86.3__py3-none-any.whl

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.
@@ -19,7 +19,7 @@ def _validate_data(
19
19
  images: Array | Sequence[Array],
20
20
  labels: Array | Sequence[int] | Sequence[Array] | Sequence[Sequence[int]],
21
21
  bboxes: Array | Sequence[Array] | Sequence[Sequence[Array]] | Sequence[Sequence[Sequence[float]]] | None,
22
- metadata: Sequence[dict[str, Any]] | None,
22
+ metadata: Sequence[dict[str, Any]] | dict[str, Sequence[Any]] | None,
23
23
  ) -> None:
24
24
  # Validate inputs
25
25
  dataset_len = len(images)
@@ -30,7 +30,13 @@ def _validate_data(
30
30
  raise ValueError(f"Number of labels ({len(labels)}) does not match number of images ({dataset_len}).")
31
31
  if bboxes is not None and len(bboxes) != dataset_len:
32
32
  raise ValueError(f"Number of bboxes ({len(bboxes)}) does not match number of images ({dataset_len}).")
33
- if metadata is not None and len(metadata) != dataset_len:
33
+ if metadata is not None and (
34
+ len(metadata) != dataset_len
35
+ if isinstance(metadata, Sequence)
36
+ else any(
37
+ not isinstance(metadatum, Sequence) or len(metadatum) != dataset_len for metadatum in metadata.values()
38
+ )
39
+ ):
34
40
  raise ValueError(f"Number of metadata ({len(metadata)}) does not match number of images ({dataset_len}).")
35
41
 
36
42
  if datum_type == "ic":
@@ -56,6 +62,14 @@ def _validate_data(
56
62
  raise ValueError(f"Unknown datum type '{datum_type}'. Must be 'ic' or 'od'.")
57
63
 
58
64
 
65
+ def _listify_metadata(
66
+ metadata: Sequence[dict[str, Any]] | dict[str, Sequence[Any]] | None,
67
+ ) -> Sequence[dict[str, Any]] | None:
68
+ if isinstance(metadata, dict):
69
+ return [{k: v[i] for k, v in metadata.items()} for i in range(len(next(iter(metadata.values()))))]
70
+ return metadata
71
+
72
+
59
73
  def _find_max(arr: ArrayLike) -> Any:
60
74
  if not isinstance(arr, (bytes, str)) and isinstance(arr, (Iterable, Sequence, Array)):
61
75
  if isinstance(arr[0], (Iterable, Sequence, Array)):
@@ -175,7 +189,7 @@ class CustomObjectDetectionDataset(BaseAnnotatedDataset[Sequence[Sequence[int]]]
175
189
  def to_image_classification_dataset(
176
190
  images: Array | Sequence[Array],
177
191
  labels: Array | Sequence[int],
178
- metadata: Sequence[dict[str, Any]] | None,
192
+ metadata: Sequence[dict[str, Any]] | dict[str, Sequence[Any]] | None,
179
193
  classes: Sequence[str] | None,
180
194
  name: str | None = None,
181
195
  ) -> ImageClassificationDataset:
@@ -188,7 +202,7 @@ def to_image_classification_dataset(
188
202
  The images to use in the dataset.
189
203
  labels : Array | Sequence[int]
190
204
  The labels to use in the dataset.
191
- metadata : Sequence[dict[str, Any]] | None
205
+ metadata : Sequence[dict[str, Any]] | dict[str, Sequence[Any]] | None
192
206
  The metadata to use in the dataset.
193
207
  classes : Sequence[str] | None
194
208
  The classes to use in the dataset.
@@ -198,14 +212,14 @@ def to_image_classification_dataset(
198
212
  ImageClassificationDataset
199
213
  """
200
214
  _validate_data("ic", images, labels, None, metadata)
201
- return CustomImageClassificationDataset(images, labels, metadata, classes, name)
215
+ return CustomImageClassificationDataset(images, labels, _listify_metadata(metadata), classes, name)
202
216
 
203
217
 
204
218
  def to_object_detection_dataset(
205
219
  images: Array | Sequence[Array],
206
220
  labels: Array | Sequence[Array] | Sequence[Sequence[int]],
207
221
  bboxes: Array | Sequence[Array] | Sequence[Sequence[Array]] | Sequence[Sequence[Sequence[float]]],
208
- metadata: Sequence[dict[str, Any]] | None,
222
+ metadata: Sequence[dict[str, Any]] | dict[str, Sequence[Any]] | None,
209
223
  classes: Sequence[str] | None,
210
224
  name: str | None = None,
211
225
  ) -> ObjectDetectionDataset:
@@ -220,7 +234,7 @@ def to_object_detection_dataset(
220
234
  The labels to use in the dataset.
221
235
  bboxes : Array | Sequence[Array] | Sequence[Sequence[Array]] | Sequence[Sequence[Sequence[float]]]
222
236
  The bounding boxes (x0,y0,x1,y0) to use in the dataset.
223
- metadata : Sequence[dict[str, Any]] | None
237
+ metadata : Sequence[dict[str, Any]] | dict[str, Sequence[Any]] | None
224
238
  The metadata to use in the dataset.
225
239
  classes : Sequence[str] | None
226
240
  The classes to use in the dataset.
@@ -230,4 +244,4 @@ def to_object_detection_dataset(
230
244
  ObjectDetectionDataset
231
245
  """
232
246
  _validate_data("od", images, labels, bboxes, metadata)
233
- return CustomObjectDetectionDataset(images, labels, bboxes, metadata, classes, name)
247
+ return CustomObjectDetectionDataset(images, labels, bboxes, _listify_metadata(metadata), classes, name)
@@ -183,9 +183,11 @@ class MILCO(BaseODDataset[NDArray[Any]], BaseDatasetNumpyMixin):
183
183
  boxes: list[list[float]] = []
184
184
  with open(annotation) as f:
185
185
  for line in f.readlines():
186
- out = line.strip().split(" ")
186
+ out = line.strip().split()
187
187
  labels.append(int(out[0]))
188
+
188
189
  xcenter, ycenter, width, height = [float(out[1]), float(out[2]), float(out[3]), float(out[4])]
190
+
189
191
  x0 = xcenter - width / 2
190
192
  x1 = x0 + width
191
193
  y0 = ycenter - height / 2
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dataeval
3
- Version: 0.86.1
3
+ Version: 0.86.3
4
4
  Summary: DataEval provides a simple interface to characterize image data and its impact on model performance across classification and object-detection tasks
5
5
  Home-page: https://dataeval.ai/
6
6
  License: MIT
@@ -29,6 +29,7 @@ Requires-Dist: numba (>=0.59.1)
29
29
  Requires-Dist: numpy (>=1.24.2)
30
30
  Requires-Dist: pandas (>=2.0)
31
31
  Requires-Dist: pillow (>=10.3.0)
32
+ Requires-Dist: polars (>=1.0.0)
32
33
  Requires-Dist: requests
33
34
  Requires-Dist: scikit-learn (>=1.5.0)
34
35
  Requires-Dist: scipy (>=1.10)
@@ -1,16 +1,15 @@
1
- dataeval/__init__.py,sha256=oC55_G8B7aR_QRKVy5fQtolW71aKDzMSixWge3cHn3M,1636
1
+ dataeval/__init__.py,sha256=Z_VUOb2gf--uAtqeXyzIPUm11noNeEj16OSfkc6H6-Y,1636
2
2
  dataeval/_log.py,sha256=C7AGkIRzymvYJ0LQXtnShiy3i5Xrp8T58JzIHHguk_Q,365
3
3
  dataeval/config.py,sha256=hjad0TK1UmaKQlUuxqxt64_OAUqZkHjicBf06cvTyrQ,4082
4
- dataeval/data/__init__.py,sha256=qNnRRiVP_sLthkkHpUrMgI_r8dQK-cC-xoGrrjQeRKc,544
4
+ dataeval/data/__init__.py,sha256=wzQ6uUFLNB3VJR0a2QnRBYwEmwXT93q0WpHu7FmFW1E,486
5
5
  dataeval/data/_embeddings.py,sha256=PFjpdV9bfusCB4taTIYSzx1hP8nJb_KCkZTN8kMw-Hs,12885
6
6
  dataeval/data/_images.py,sha256=3d4Cv-xg5z6_LVtw1eL_QdFwzbDI1cwvPNQblkrMEMk,2622
7
- dataeval/data/_metadata.py,sha256=va5coOR1rRVzFB9SGzmuTj-Oaexs9LobGMA7u2An_eY,15420
7
+ dataeval/data/_metadata.py,sha256=jEfGZhhvry7qtjU47VifL8ZO1hqXg1jntR3CztkaoWU,14462
8
8
  dataeval/data/_selection.py,sha256=r06xeiyK8nTWPLyItkoPQRWZI1i6LATSue_cuEbCdc4,4463
9
- dataeval/data/_split.py,sha256=pSyeJVW2sDoTU9wyi0d7UWqDuPhYvDyEgA0BUldS9Vg,16743
10
- dataeval/data/_targets.py,sha256=pXrHBwT4Pi8DauaOxDVnIMwowWWlXuvSb07ShW7O2zk,3119
9
+ dataeval/data/_split.py,sha256=nQABR05vxil2Qx7-uX4Fm0_DWpibskBGDJOYj_b1u3I,16737
11
10
  dataeval/data/selections/__init__.py,sha256=2m8ZB53wXzqLcqmc6p5atO6graB6ZyiRSNJFxf11X_g,613
12
11
  dataeval/data/selections/_classbalance.py,sha256=7v8ApoL3X8eCZ6fGDNTehE_bZ1loaP3TlhsJLaICVWg,1458
13
- dataeval/data/selections/_classfilter.py,sha256=KQOmcTIcV3ZPWuiwqOmwX0SB5I2qlbxLSlwINUZWOjU,4339
12
+ dataeval/data/selections/_classfilter.py,sha256=bXfoYnWnAfUGsAQSlLufJeF2PfgRKekFHfBx8hv1r3w,4351
14
13
  dataeval/data/selections/_indices.py,sha256=RFsR9z10aM3N0gJSfKrukFpi-LkiQGXoOwXhmOQ5cpg,630
15
14
  dataeval/data/selections/_limit.py,sha256=JG4GmEiNKt3sk4PbOUbBnGGzNlyz72H-kQrt8COMm4Y,512
16
15
  dataeval/data/selections/_prioritize.py,sha256=4dGUvgR7m6NGzzPU0N_bw0Xhujo8b72Wo8L4PGHbvBo,11233
@@ -39,16 +38,16 @@ dataeval/detectors/ood/ae.py,sha256=fTrUfFxv6xUqzKpwMC8rW3JrizA16M_bgzqLuBKMrS0,
39
38
  dataeval/detectors/ood/base.py,sha256=9b-Ljznf0lB1SXF4F_Aj3eJ4Y3ijGEDPMjucUsWOGJM,3051
40
39
  dataeval/detectors/ood/mixin.py,sha256=0_o-1HPvgf3-Lf1MSOIfjj5UB8LTLEBGYtJJfyCCzwc,5431
41
40
  dataeval/metadata/__init__.py,sha256=XDDmJbOZBNM6pL0r6Nbu6oMRoyAh22IDkPYGndNlkZU,316
42
- dataeval/metadata/_distance.py,sha256=T1Umju_QwBiLmn1iUbxZagzBS2VnHaDIdp6j-NpaZuk,4076
43
- dataeval/metadata/_ood.py,sha256=lnKtKModArnUrAhH_XswEtUAhUkh1U_oNsLt1UmNP44,12748
44
- dataeval/metadata/_utils.py,sha256=r8qBJT83RblobD5W5zyTVi6vYi51Dwkqswizdbzss-M,1169
41
+ dataeval/metadata/_distance.py,sha256=AABrGoQyD13z9Fqlz3NyfX0Iow_vjBwAugIv6OSRTTE,4187
42
+ dataeval/metadata/_ood.py,sha256=lNPHouj_9WfM_uTtsaiRaPn46RcVy3YebD1c32vDj-c,8981
43
+ dataeval/metadata/_utils.py,sha256=BcGoYVfA4AkAWpInY5txOc3QBpsGf6cnnUAsHOQTJAE,1210
45
44
  dataeval/metrics/__init__.py,sha256=8VC8q3HuJN3o_WN51Ae2_wXznl3RMXIvA5GYVcy7vr8,225
46
45
  dataeval/metrics/bias/__init__.py,sha256=329S1_3WnWqeU4-qVcbe0fMy4lDrj9uKslWHIQf93yg,839
47
- dataeval/metrics/bias/_balance.py,sha256=l1hTVkVwD85bP20MTthA-I5BkvbytylQkJu3Q6iTuPA,6152
46
+ dataeval/metrics/bias/_balance.py,sha256=L5TR8Twwodulk8xkhE-L7PR-isPGw4LusIjL3ZHIH8c,5525
48
47
  dataeval/metrics/bias/_completeness.py,sha256=BysXU2Jpw33n5dl3acJFEqF3mFGiJLsfG4n5Q2fkTaY,4608
49
48
  dataeval/metrics/bias/_coverage.py,sha256=PeUoOiaghUEdn6Ov8z2-am7-fnBVIPcFbJK7Ty5JObA,3647
50
- dataeval/metrics/bias/_diversity.py,sha256=B_qWVDMZfh818U0qVm8yidquB0H0XvW8N75OWVWXy2g,5814
51
- dataeval/metrics/bias/_parity.py,sha256=PkU3wa77Iyif3McjA510fifTBaph7eJ8iAlI2jQngEM,11374
49
+ dataeval/metrics/bias/_diversity.py,sha256=25udDKmel9IjeVT5nM4dOa1apda66QdRxBc922yuUvI,5830
50
+ dataeval/metrics/bias/_parity.py,sha256=Kmzr9-NXxGzGtj6A-qUa88FTGaRyJU2xQj7tsplXJH4,11427
52
51
  dataeval/metrics/estimators/__init__.py,sha256=Pnds8uIyAovt2fKqZjiHCIP_kVoBWlVllekYuK5UmmU,568
53
52
  dataeval/metrics/estimators/_ber.py,sha256=C30E5LiGGTAfo31zWFYDptDg0R7CTJGJ-a60YgzSkYY,5382
54
53
  dataeval/metrics/estimators/_clusterer.py,sha256=1HrpihGTJ63IkNSOy4Ibw633Gllkm1RxKmoKT5MOgt0,1434
@@ -60,22 +59,22 @@ dataeval/metrics/stats/_boxratiostats.py,sha256=ROZrlqgbowkGfCR5PJ5TL7Og40iMOdUq
60
59
  dataeval/metrics/stats/_dimensionstats.py,sha256=EVO-BlxrZl8qrP09lwPbyWdrG1ZeDtgj4LiswDwEZ1I,2896
61
60
  dataeval/metrics/stats/_hashstats.py,sha256=qa1CYRgOebkxqkALfffaPM-kJ074ZbyfpWbfOfuObSs,4758
62
61
  dataeval/metrics/stats/_imagestats.py,sha256=gUPNgN5Zwzdr7WnSwbve1NXNsyxd5dy3cSnlR_7guCg,3007
63
- dataeval/metrics/stats/_labelstats.py,sha256=lz8I6eSd8tFkmQqy5cOG8hn9yxs0mP-Ic9ratFHiuoU,2813
62
+ dataeval/metrics/stats/_labelstats.py,sha256=bOLH4FEBN4JZ5njdRVjEK7GUb47XBMq9eqYUgXSLmCY,3071
64
63
  dataeval/metrics/stats/_pixelstats.py,sha256=5RCQh0OQkHiCkn3DgCPVxKoFfifX_FOtwsnotADSZ0I,3265
65
64
  dataeval/metrics/stats/_visualstats.py,sha256=0k6bvAL_d66nQMfG7bydCOFJb7B0dhgG7fqCjVTp1sg,3707
66
65
  dataeval/outputs/__init__.py,sha256=geHB5M3QOiFFaQGV4ZwDTTKpqZPvPePbqG7lzaPhaXQ,1741
67
- dataeval/outputs/_base.py,sha256=7KRWFIEw0UHdhb1em92bPE1YqbMYumAW1QD0QfPwVLc,5900
68
- dataeval/outputs/_bias.py,sha256=EjJ6jrxDEJYgUj11EyUhdQvdCUSNeefMe5uD3E73GIo,12261
66
+ dataeval/outputs/_base.py,sha256=-Wa0gFcBVLbfWPMZyCql7x4vGsnkLP4pecsQIeUZ2_Y,5904
67
+ dataeval/outputs/_bias.py,sha256=1OZpKncYTryjPLRHb4d6NlhE27uPT57gCob_5jtjKDI,10456
69
68
  dataeval/outputs/_drift.py,sha256=rKn5vqMR6XNujgSqfHsH76oFkoGsUusquZL2Qy4Ae6Y,4581
70
- dataeval/outputs/_estimators.py,sha256=a2oAIxxEDZ9WLGfMWH8KD-BVUS_SnULRPR-iI9hFPoQ,3047
71
- dataeval/outputs/_linters.py,sha256=3vI8zsSF-JecQut500A629sICidQLWqhEZcj7o7_cfs,6554
69
+ dataeval/outputs/_estimators.py,sha256=mh-R08CgYtmq9ffANDMYR-V4vrZnSjOjEyOMiMDZ2Ic,3091
70
+ dataeval/outputs/_linters.py,sha256=ZClITD4XY99TunS_9ABTl7eauppoUdpCZU1pCVvD0cI,6700
72
71
  dataeval/outputs/_metadata.py,sha256=ffZgpX8KWURPHXpOWjbvJ2KRqWQkS2nWuIjKUzoHhMI,1710
73
72
  dataeval/outputs/_ood.py,sha256=suLKVXULGtXH0rq9eXHI1d3d2jhGmItJtz4QiQd47A4,1718
74
- dataeval/outputs/_stats.py,sha256=YDdVQmFcOvb4_NYc_d2a2JCA0Zkuh1o6_qupQkc_X1w,15142
75
- dataeval/outputs/_utils.py,sha256=HHlGC7sk416m_3Bgn075Qdblz_aPup_UOafJpB0RuXY,893
76
- dataeval/outputs/_workflows.py,sha256=0xSwPxBATa29tvwJtpovjYrq4la9fkbamHM_qsw-Llc,10799
73
+ dataeval/outputs/_stats.py,sha256=KIghl-glm9A_h1eVQDKqdTQg8o2zedltWyX4NkCsv2U,15226
74
+ dataeval/outputs/_utils.py,sha256=NfhYaGT2PZlhIs8ICKUsPWHZXjhWYDkEJqBDdqMeaOM,929
75
+ dataeval/outputs/_workflows.py,sha256=K786mOgegxVi81diUA-qpbwGEkwa8YA7Fk4ttgjJeaY,10831
77
76
  dataeval/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
78
- dataeval/typing.py,sha256=GDMuef-oFFukNtsiKFmsExHdNvYR_j-tQcsCwZ9reow,7198
77
+ dataeval/typing.py,sha256=W8rqFFkAqE5a5ar3MmB-O5gcMJqvoDKXC8Y0ggBqAKo,7216
79
78
  dataeval/utils/__init__.py,sha256=hRvyUK7b3d6JBEV5u47rFcOHEcmDYqAvZQw_T5pDAWw,264
80
79
  dataeval/utils/_array.py,sha256=ftX8S6HKAIUOuc1xd30VC3Pz5yUzRglDpCLisWY_tHs,5888
81
80
  dataeval/utils/_bin.py,sha256=w3eJ2Szw5eapqQ0cGv731rhNgLFGW0cCz2pXo9I6CuY,7296
@@ -84,9 +83,9 @@ dataeval/utils/_fast_mst.py,sha256=pv42flr1Uf5RBa9qDG0YLDXWH7Mr7a9zpauO1HqZXaY,8
84
83
  dataeval/utils/_image.py,sha256=4uxTIOYZZlRJOfNmdA3ek3no3FrLWCK5un48kStMDt8,3578
85
84
  dataeval/utils/_method.py,sha256=9B9JQbgqWJBRhQJb7glajUtWaQzUTIUuvrZ9_bisxsM,394
86
85
  dataeval/utils/_mst.py,sha256=bLmJmu_1Dtj3hC5gQp3oAiJ_7TKtEjahTqusVRRU4eI,2168
87
- dataeval/utils/_plot.py,sha256=zP0bEvtrLdws7r1Jte8Camq-q5K5F6T8iuv3bStnEJc,7116
86
+ dataeval/utils/_plot.py,sha256=3yn5UGL2xUeayPNws2bkvxm9ZCURsVUkpvSrwOqUE7g,7145
88
87
  dataeval/utils/data/__init__.py,sha256=xGzrjrOxOP2DP1tU84AWMKPnSxFvSjM81CTlDg4rNM8,331
89
- dataeval/utils/data/_dataset.py,sha256=5Yt7PzNeeUgm3qy71B_IOW7mKyCfvv8AIqs7Xzv7B9Q,8853
88
+ dataeval/utils/data/_dataset.py,sha256=CFK9h-XPN7J-iF2nXol6keMDbGm6VIweFAMAjXRUlhg,9527
90
89
  dataeval/utils/data/collate.py,sha256=5egEEKhNNCGeNLChO1p6dZ4Wg6x51VEaMNHz7hEZUxI,3936
91
90
  dataeval/utils/data/metadata.py,sha256=L1c2bCiMj0aR0QCoKkjwBujIftJDEMgW_3ZbgeS8WHo,14703
92
91
  dataeval/utils/datasets/__init__.py,sha256=pAXqHX76yAoBI8XB3m6zGuW-u3s3PCoIXG5GDzxH7Zs,572
@@ -94,7 +93,7 @@ dataeval/utils/datasets/_antiuav.py,sha256=kA_ia1fYNcJiz9SpCvh-Z8iSc7iJrdogjBI3s
94
93
  dataeval/utils/datasets/_base.py,sha256=pyfpJda3ku469M3TFRsJn9S2oAiQODOGTlLcdcoEW9U,9031
95
94
  dataeval/utils/datasets/_cifar10.py,sha256=hZc_A30yKYBbv2kvVdEkZ9egyEe6XBUnmksoIAoJ-5Y,8265
96
95
  dataeval/utils/datasets/_fileio.py,sha256=OASFA9uX3KgfyPb5vza12BlZyAi9Y8Al9lUR_IYPcsM,5449
97
- dataeval/utils/datasets/_milco.py,sha256=O4w4Z97tdGU-_us09lPrMNpcPLsXXbKkyPYAWzzvPc4,7870
96
+ dataeval/utils/datasets/_milco.py,sha256=iXf4C1I3Eg_3gHKUe4XPi21yFMBO51zxTIqAkGf9bYg,7869
98
97
  dataeval/utils/datasets/_mixin.py,sha256=S8iii-SoYUsFFYNXjw2thlZkpBvRLnZ4XI8wTqOKXgU,1729
99
98
  dataeval/utils/datasets/_mnist.py,sha256=uz46sE1Go3TgGjG6x2cXckSVQ0mSg2mhgk8BUvLWjb0,8149
100
99
  dataeval/utils/datasets/_ships.py,sha256=6U04HAoM3jgLl1qv-NnxjZeSsBipcqWJBMhBMn5iIUY,5115
@@ -108,7 +107,7 @@ dataeval/utils/torch/models.py,sha256=1idpXyjrYcCBSsbxxRUOto8xr4MJNjDEqQHiIXVU5Z
108
107
  dataeval/utils/torch/trainer.py,sha256=Oc2lK13uPGhmLYbmAqlPWyKxgG4YJFlnSXCqFHUZbdA,5528
109
108
  dataeval/workflows/__init__.py,sha256=ou8y0KO-d6W5lgmcyLjKlf-J_ckP3vilW7wHkgiDlZ4,255
110
109
  dataeval/workflows/sufficiency.py,sha256=j-R8dg4XE6a66p_oTXG2GNzgg3vGk85CTblxhFXaxog,8513
111
- dataeval-0.86.1.dist-info/LICENSE.txt,sha256=uAooygKWvX6NbU9Ran9oG2msttoG8aeTeHSTe5JeCnY,1061
112
- dataeval-0.86.1.dist-info/METADATA,sha256=k9tNiWEDBXit4KU6le2vb1CrArZNxssiW5LHXtVXo0A,5321
113
- dataeval-0.86.1.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
114
- dataeval-0.86.1.dist-info/RECORD,,
110
+ dataeval-0.86.3.dist-info/LICENSE.txt,sha256=uAooygKWvX6NbU9Ran9oG2msttoG8aeTeHSTe5JeCnY,1061
111
+ dataeval-0.86.3.dist-info/METADATA,sha256=1zOfOabm9w57nxAWZw5InEzmqyWRRko10btPqT0h64o,5353
112
+ dataeval-0.86.3.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
113
+ dataeval-0.86.3.dist-info/RECORD,,
dataeval/data/_targets.py DELETED
@@ -1,89 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from typing import Iterator
4
-
5
- __all__ = []
6
-
7
- from dataclasses import dataclass
8
-
9
- import numpy as np
10
- from numpy.typing import NDArray
11
-
12
-
13
- def _len(arr: NDArray, dim: int) -> int:
14
- return 0 if len(arr) == 0 else len(np.atleast_1d(arr) if dim == 1 else np.atleast_2d(arr))
15
-
16
-
17
- @dataclass(frozen=True)
18
- class Targets:
19
- """
20
- Dataclass defining targets for image classification or object detection.
21
-
22
- Attributes
23
- ----------
24
- labels : NDArray[np.intp]
25
- Labels (N,) for N images or objects
26
- scores : NDArray[np.float32]
27
- Probability scores (N, M) for N images of M classes or confidence score (N,) of objects
28
- bboxes : NDArray[np.float32] | None
29
- Bounding boxes (N, 4) for N objects in (x0, y0, x1, y1) format
30
- source : NDArray[np.intp] | None
31
- Source image index (N,) for N objects
32
- size : int
33
- Count of objects
34
- """
35
-
36
- labels: NDArray[np.intp]
37
- scores: NDArray[np.float32]
38
- bboxes: NDArray[np.float32] | None
39
- source: NDArray[np.intp] | None
40
-
41
- def __post_init__(self) -> None:
42
- if (self.bboxes is None) != (self.source is None):
43
- raise ValueError("Either both bboxes and source must be provided or neither.")
44
-
45
- labels = _len(self.labels, 1)
46
- scores = _len(self.scores, 2) if self.bboxes is None else _len(self.scores, 1)
47
- bboxes = labels if self.bboxes is None else _len(self.bboxes, 2)
48
- source = labels if self.source is None else _len(self.source, 1)
49
-
50
- if labels != scores or labels != bboxes or labels != source:
51
- raise ValueError(
52
- "Labels, scores, bboxes and source must be the same length (if provided).\n"
53
- + f" labels: {self.labels.shape}\n"
54
- + f" scores: {self.scores.shape}\n"
55
- + f" bboxes: {None if self.bboxes is None else self.bboxes.shape}\n"
56
- + f" source: {None if self.source is None else self.source.shape}\n"
57
- )
58
-
59
- if self.bboxes is not None and len(self.bboxes) > 0 and self.bboxes.shape[-1] != 4:
60
- raise ValueError("Bounding boxes must be in (x0, y0, x1, y1) format.")
61
-
62
- @property
63
- def size(self) -> int:
64
- return len(self.labels)
65
-
66
- def __len__(self) -> int:
67
- if self.source is None:
68
- return len(self.labels)
69
- return len(np.unique(self.source))
70
-
71
- def __getitem__(self, idx: int, /) -> Targets:
72
- if self.source is None or self.bboxes is None:
73
- return Targets(
74
- np.atleast_1d(self.labels[idx]),
75
- np.atleast_2d(self.scores[idx]),
76
- None,
77
- None,
78
- )
79
- mask = np.where(self.source == idx, True, False)
80
- return Targets(
81
- np.atleast_1d(self.labels[mask]),
82
- np.atleast_1d(self.scores[mask]),
83
- np.atleast_2d(self.bboxes[mask]),
84
- np.atleast_1d(self.source[mask]),
85
- )
86
-
87
- def __iter__(self) -> Iterator[Targets]:
88
- for i in range(len(self.labels)) if self.source is None else np.unique(self.source):
89
- yield self[i]