dataeval 1.2.0rc0__tar.gz → 1.2.0rc2__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 (245) hide show
  1. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/PKG-INFO +1 -1
  2. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/pyproject.toml +2 -1
  3. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_embeddings.py +4 -5
  4. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_metadata.py +14 -12
  5. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_version.py +2 -2
  6. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_completeness.py +10 -11
  7. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_compute_stats.py +2 -2
  8. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_image_stats.py +10 -3
  9. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_frames.py +24 -13
  10. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_locate.py +2 -0
  11. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_segments.py +5 -5
  12. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_split.py +143 -32
  13. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_stitch.py +5 -5
  14. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_video_proxies.py +122 -7
  15. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/extractors/_videotorch.py +93 -60
  16. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/protocols.py +28 -0
  17. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/quality/_duplicates.py +20 -19
  18. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/quality/_outliers.py +59 -20
  19. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/quality/_shared.py +2 -1
  20. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/scope/_coverage.py +174 -40
  21. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/shift/_drift/_base.py +10 -1
  22. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/shift/_drift/_wasserstein.py +164 -60
  23. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/.gitignore +0 -0
  24. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/LICENSE +0 -0
  25. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/README.md +0 -0
  26. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/__init__.py +0 -0
  27. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_experimental.py +0 -0
  28. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_helpers.py +0 -0
  29. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_log.py +0 -0
  30. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/__init__.py +0 -0
  31. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_aggregate.py +0 -0
  32. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_collisions.py +0 -0
  33. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_columns.py +0 -0
  34. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_corrections.py +0 -0
  35. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_encoding.py +0 -0
  36. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_filters.py +0 -0
  37. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_input.py +0 -0
  38. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_keyed.py +0 -0
  39. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_known.py +0 -0
  40. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_links.py +0 -0
  41. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_loading.py +0 -0
  42. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_reductions.py +0 -0
  43. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_serialize.py +0 -0
  44. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_source_groups.py +0 -0
  45. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_store.py +0 -0
  46. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_structurers/__init__.py +0 -0
  47. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_structurers/_accumulator.py +0 -0
  48. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_structurers/_base.py +0 -0
  49. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_structurers/_block.py +0 -0
  50. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_structurers/_classification.py +0 -0
  51. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_structurers/_data.py +0 -0
  52. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_structurers/_dataset.py +0 -0
  53. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_structurers/_detection.py +0 -0
  54. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_structurers/_factors.py +0 -0
  55. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_structurers/_frames.py +0 -0
  56. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_structurers/_gather.py +0 -0
  57. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_structurers/_instances.py +0 -0
  58. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_structurers/_layout.py +0 -0
  59. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_structurers/_ordering.py +0 -0
  60. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_structurers/_propagation.py +0 -0
  61. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_structurers/_reporting.py +0 -0
  62. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_structurers/_reserved.py +0 -0
  63. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_structurers/_select.py +0 -0
  64. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_structurers/_source_index.py +0 -0
  65. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_structurers/_tracking.py +0 -0
  66. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_ontology.py +0 -0
  67. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/bias/__init__.py +0 -0
  68. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/bias/_balance.py +0 -0
  69. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/bias/_diversity.py +0 -0
  70. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/bias/_parity.py +0 -0
  71. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/config.py +0 -0
  72. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/__init__.py +0 -0
  73. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_alignment.py +0 -0
  74. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_annotation_match.py +0 -0
  75. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_ap_bounds.py +0 -0
  76. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_association.py +0 -0
  77. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_ber.py +0 -0
  78. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_bin.py +0 -0
  79. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_calculators/__init__.py +0 -0
  80. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_calculators/_base.py +0 -0
  81. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_calculators/_cache.py +0 -0
  82. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_calculators/_descriptivestats.py +0 -0
  83. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_calculators/_dimensionstats.py +0 -0
  84. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_calculators/_egostats.py +0 -0
  85. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_calculators/_hashstats.py +0 -0
  86. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_calculators/_persistencestats.py +0 -0
  87. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_calculators/_pixelstats.py +0 -0
  88. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_calculators/_redundancystats.py +0 -0
  89. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_calculators/_register.py +0 -0
  90. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_calculators/_registry.py +0 -0
  91. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_calculators/_video_base.py +0 -0
  92. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_calculators/_video_register.py +0 -0
  93. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_calculators/_visualstats.py +0 -0
  94. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_clusterer.py +0 -0
  95. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_combination_scores.py +0 -0
  96. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_compute_ratios.py +0 -0
  97. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_concentration.py +0 -0
  98. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_consensus.py +0 -0
  99. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_coverage.py +0 -0
  100. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_divergence.py +0 -0
  101. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_diversity.py +0 -0
  102. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_effective_n.py +0 -0
  103. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_ego_stats.py +0 -0
  104. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_fast_hdbscan/_cluster_trees.py +0 -0
  105. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_fast_hdbscan/_disjoint_set.py +0 -0
  106. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_fast_hdbscan/_mst.py +0 -0
  107. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_feature_distance.py +0 -0
  108. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_hash.py +0 -0
  109. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_hash_index.py +0 -0
  110. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_label_alignment.py +0 -0
  111. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_label_cooccurrence.py +0 -0
  112. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_label_coverage.py +0 -0
  113. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_label_errors.py +0 -0
  114. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_label_parity.py +0 -0
  115. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_label_reconciliation.py +0 -0
  116. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_label_stats.py +0 -0
  117. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_local_panels.py +0 -0
  118. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_metadata_insights.py +0 -0
  119. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_mst.py +0 -0
  120. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_mutual_info.py +0 -0
  121. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_nullmodel.py +0 -0
  122. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_ontology_validation.py +0 -0
  123. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_parity.py +0 -0
  124. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_persistence.py +0 -0
  125. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_rank.py +0 -0
  126. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_rao_scott.py +0 -0
  127. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_sequence_match.py +0 -0
  128. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_sequence_residuals.py +0 -0
  129. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_temporal.py +0 -0
  130. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_track_stats.py +0 -0
  131. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_uap.py +0 -0
  132. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_video_runner.py +0 -0
  133. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_video_stats.py +0 -0
  134. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/__init__.py +0 -0
  135. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_camera_travel.py +0 -0
  136. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_chain.py +0 -0
  137. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_classbalance.py +0 -0
  138. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_classfilter.py +0 -0
  139. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_crop.py +0 -0
  140. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_crops.py +0 -0
  141. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_filter.py +0 -0
  142. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_geometry.py +0 -0
  143. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_indices.py +0 -0
  144. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_invalidates.py +0 -0
  145. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_label_selectors.py +0 -0
  146. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_limit.py +0 -0
  147. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_merge.py +0 -0
  148. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_planners.py +0 -0
  149. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_quality_gate.py +0 -0
  150. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_reads.py +0 -0
  151. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_relabel.py +0 -0
  152. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_resize.py +0 -0
  153. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_reverse.py +0 -0
  154. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_selectchannels.py +0 -0
  155. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_selectors.py +0 -0
  156. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_shuffle.py +0 -0
  157. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_torchvision.py +0 -0
  158. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_tracks.py +0 -0
  159. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_unzip.py +0 -0
  160. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_view.py +0 -0
  161. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/exceptions.py +0 -0
  162. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/extractors/__init__.py +0 -0
  163. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/extractors/_bovw.py +0 -0
  164. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/extractors/_flatten.py +0 -0
  165. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/extractors/_geometry.py +0 -0
  166. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/extractors/_onnx.py +0 -0
  167. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/extractors/_scores.py +0 -0
  168. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/extractors/_torch.py +0 -0
  169. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/extractors/_uncertainty.py +0 -0
  170. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/flags.py +0 -0
  171. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/models/__init__.py +0 -0
  172. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/models/_backends.py +0 -0
  173. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/models/_input.py +0 -0
  174. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/models/_metadata.py +0 -0
  175. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/models/_predictors.py +0 -0
  176. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/performance/__init__.py +0 -0
  177. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/performance/_aggregator.py +0 -0
  178. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/performance/_feasibility.py +0 -0
  179. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/performance/_feasibility_classification.py +0 -0
  180. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/performance/_feasibility_constants.py +0 -0
  181. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/performance/_feasibility_decide.py +0 -0
  182. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/performance/_feasibility_evidence.py +0 -0
  183. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/performance/_feasibility_target.py +0 -0
  184. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/performance/_feasibility_units.py +0 -0
  185. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/performance/_output.py +0 -0
  186. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/performance/_sufficiency.py +0 -0
  187. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/performance/schedules.py +0 -0
  188. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/py.typed +0 -0
  189. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/quality/__init__.py +0 -0
  190. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/quality/_factor_stats.py +0 -0
  191. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/quality/_outliers_neighbors.py +0 -0
  192. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/quality/_outliers_rows.py +0 -0
  193. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/quality/_outliers_scores.py +0 -0
  194. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/scope/__init__.py +0 -0
  195. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/scope/_prioritize.py +0 -0
  196. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/scope/_representation.py +0 -0
  197. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/shift/__init__.py +0 -0
  198. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/shift/_drift/__init__.py +0 -0
  199. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/shift/_drift/_chunk.py +0 -0
  200. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/shift/_drift/_domain_classifier.py +0 -0
  201. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/shift/_drift/_domain_spec.py +0 -0
  202. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/shift/_drift/_kneighbors.py +0 -0
  203. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/shift/_drift/_known_domains.py +0 -0
  204. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/shift/_drift/_mmd.py +0 -0
  205. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/shift/_drift/_reconstruction.py +0 -0
  206. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/shift/_drift/_univariate.py +0 -0
  207. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/shift/_ood/__init__.py +0 -0
  208. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/shift/_ood/_base.py +0 -0
  209. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/shift/_ood/_domain_classifier.py +0 -0
  210. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/shift/_ood/_kneighbors.py +0 -0
  211. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/shift/_ood/_reconstruction.py +0 -0
  212. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/shift/_shared/__init__.py +0 -0
  213. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/shift/_shared/_domain_classifier.py +0 -0
  214. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/shift/_shared/_kneighbors.py +0 -0
  215. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/shift/_shared/_reconstruction.py +0 -0
  216. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/shift/update_strategies.py +0 -0
  217. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/types/__init__.py +0 -0
  218. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/types/_array.py +0 -0
  219. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/types/_config.py +0 -0
  220. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/types/_evaluator.py +0 -0
  221. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/types/_execution.py +0 -0
  222. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/types/_factors.py +0 -0
  223. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/types/_index.py +0 -0
  224. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/types/_known_factors.py +0 -0
  225. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/types/_ontology.py +0 -0
  226. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/types/_output.py +0 -0
  227. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/types/_removal.py +0 -0
  228. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/types/_schema.py +0 -0
  229. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/types/_target.py +0 -0
  230. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/types/_task.py +0 -0
  231. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/types/_track.py +0 -0
  232. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/utils/__init__.py +0 -0
  233. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/utils/_array.py +0 -0
  234. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/utils/_internal.py +0 -0
  235. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/utils/_mask.py +0 -0
  236. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/utils/_merge.py +0 -0
  237. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/utils/data.py +0 -0
  238. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/utils/losses.py +0 -0
  239. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/utils/models.py +0 -0
  240. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/utils/onnx.py +0 -0
  241. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/utils/preprocessing.py +0 -0
  242. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/utils/scipy/__init__.py +0 -0
  243. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/utils/scipy/stats.py +0 -0
  244. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/utils/thresholds.py +0 -0
  245. {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/utils/training.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: dataeval
3
- Version: 1.2.0rc0
3
+ Version: 1.2.0rc2
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
  Project-URL: Homepage, https://dataeval.ai/
6
6
  Project-URL: Repository, https://github.com/aria-ml/dataeval/
@@ -128,8 +128,9 @@ type = [
128
128
  ]
129
129
  docs = [
130
130
  "numpy>=1.24.2", # floor capped by the JATIC program standard; uv.lock resolves current
131
+ "av>=12.0.0",
131
132
  "certifi>=2024.07.04",
132
- "dataeval-plots[plotly]>=0.0.15",
133
+ "dataeval-plots[plotly]>=0.0.16",
133
134
  "ipykernel>=6.26.0",
134
135
  "ipywidgets>=8.1.1",
135
136
  "jinja2>=3.1.6",
@@ -19,9 +19,8 @@ from dataeval.extractors import FlattenExtractor
19
19
  from dataeval.protocols import (
20
20
  AnnotatedDataset,
21
21
  Array,
22
- ArrayLike,
23
- Dataset,
24
22
  FeatureExtractor,
23
+ ImageDataset,
25
24
  ProgressCallback,
26
25
  )
27
26
  from dataeval.utils.data import requires_maite_dataset, unwrap_image
@@ -121,7 +120,7 @@ class Embeddings(Array, FeatureExtractor):
121
120
  def __init__(
122
121
  self,
123
122
  # Technically more permissive than ImageClassificationDataset or ObjectDetectionDataset
124
- dataset: Dataset[tuple[ArrayLike, Any, Any]] | Dataset[ArrayLike] | None = None,
123
+ dataset: ImageDataset | None = None,
125
124
  extractor: FeatureExtractor | None = None,
126
125
  batch_size: int | None = None,
127
126
  path: Path | str | None = None,
@@ -184,7 +183,7 @@ class Embeddings(Array, FeatureExtractor):
184
183
  return self._dataset is not None
185
184
 
186
185
  @requires_maite_dataset("dataset", expected="image_only")
187
- def bind(self, dataset: Dataset[tuple[ArrayLike, Any, Any]] | Dataset[ArrayLike]) -> Self:
186
+ def bind(self, dataset: ImageDataset) -> Self:
188
187
  """Bind this instance to a dataset.
189
188
 
190
189
  Attaches a dataset to this Embeddings instance for embedding computation.
@@ -414,7 +413,7 @@ class Embeddings(Array, FeatureExtractor):
414
413
  # In-memory only
415
414
  self._embeddings = np.empty(full_shape, dtype=dtype)
416
415
 
417
- def new(self, dataset: Dataset[tuple[ArrayLike, Any, Any]] | Dataset[ArrayLike]) -> Self:
416
+ def new(self, dataset: ImageDataset) -> Self:
418
417
  """
419
418
  Create new Embeddings instance with a different dataset.
420
419
 
@@ -93,8 +93,8 @@ from dataeval.core._bin import (
93
93
  from dataeval.core._compute_stats import FactorResult, StatsResult
94
94
  from dataeval.exceptions import NotFittedError, ShapeMismatchError
95
95
  from dataeval.protocols import (
96
- AnnotatedDataset,
97
96
  Array,
97
+ Dataset,
98
98
  DatumMetadata,
99
99
  FeatureExtractor,
100
100
  ProgressCallback,
@@ -549,7 +549,7 @@ class Metadata(Array, FeatureExtractor):
549
549
 
550
550
  Parameters
551
551
  ----------
552
- dataset : AnnotatedDataset or None, default None
552
+ dataset : Dataset or None, default None
553
553
  Dataset that provides original targets and metadata for processing. When None,
554
554
  creates an unbound instance that can be used as a reusable feature extractor.
555
555
  Use :meth:`bind` to attach a dataset later, or pass data directly to :meth:`__call__`.
@@ -650,7 +650,7 @@ class Metadata(Array, FeatureExtractor):
650
650
  @requires_maite_dataset("dataset", expected="any_target")
651
651
  def __init__(
652
652
  self,
653
- dataset: AnnotatedDataset[tuple[Any, Any, DatumMetadata]] | None = None,
653
+ dataset: Dataset[tuple[Any, Any, DatumMetadata]] | None = None,
654
654
  *,
655
655
  task: TaskOverride | None = None,
656
656
  continuous_factor_bins: Mapping[str, int | Sequence[float]] | None = None,
@@ -999,7 +999,7 @@ class Metadata(Array, FeatureExtractor):
999
999
  def load(
1000
1000
  cls,
1001
1001
  path: Path | str,
1002
- dataset: AnnotatedDataset[tuple[Any, Any, DatumMetadata]] | None = None,
1002
+ dataset: Dataset[tuple[Any, Any, DatumMetadata]] | None = None,
1003
1003
  *,
1004
1004
  continuous_factor_bins: Mapping[str, int | Sequence[float]] | None = None,
1005
1005
  encoding: str | Path | Mapping[str, FactorEncoding] | None = None,
@@ -1271,7 +1271,7 @@ class Metadata(Array, FeatureExtractor):
1271
1271
  return self._dataset is not None
1272
1272
 
1273
1273
  @property
1274
- def dataset(self) -> AnnotatedDataset[tuple[Any, Any, DatumMetadata]] | None:
1274
+ def dataset(self) -> Dataset[tuple[Any, Any, DatumMetadata]] | None:
1275
1275
  """The dataset these factors describe, or None when none is bound.
1276
1276
 
1277
1277
  Metadata references its dataset; it does not contain it or serve its images.
@@ -1283,7 +1283,7 @@ class Metadata(Array, FeatureExtractor):
1283
1283
 
1284
1284
  Returns
1285
1285
  -------
1286
- AnnotatedDataset or None
1286
+ Dataset or None
1287
1287
  The bound dataset, the same object that was passed in.
1288
1288
 
1289
1289
  Example
@@ -1301,7 +1301,7 @@ class Metadata(Array, FeatureExtractor):
1301
1301
  return self._dataset is not None or self._is_structured
1302
1302
 
1303
1303
  @requires_maite_dataset("dataset", expected="any_target")
1304
- def bind(self, dataset: AnnotatedDataset[tuple[Any, Any, DatumMetadata]]) -> Self:
1304
+ def bind(self, dataset: Dataset[tuple[Any, Any, DatumMetadata]]) -> Self:
1305
1305
  """Bind this instance to a dataset.
1306
1306
 
1307
1307
  Attaches a dataset to this Metadata instance for metadata extraction.
@@ -1309,7 +1309,7 @@ class Metadata(Array, FeatureExtractor):
1309
1309
 
1310
1310
  Parameters
1311
1311
  ----------
1312
- dataset : AnnotatedDataset
1312
+ dataset : Dataset
1313
1313
  Dataset to bind for metadata extraction.
1314
1314
 
1315
1315
  Returns
@@ -1501,7 +1501,7 @@ class Metadata(Array, FeatureExtractor):
1501
1501
  return data[index]
1502
1502
  raise TypeError("Index must be an int, str, or slice.")
1503
1503
 
1504
- def new(self, dataset: AnnotatedDataset[tuple[Any, Any, DatumMetadata]]) -> Self:
1504
+ def new(self, dataset: Dataset[tuple[Any, Any, DatumMetadata]]) -> Self:
1505
1505
  """Create new Metadata instance with a different dataset.
1506
1506
 
1507
1507
  Generate a new Metadata object using the same configuration
@@ -1509,7 +1509,7 @@ class Metadata(Array, FeatureExtractor):
1509
1509
 
1510
1510
  Parameters
1511
1511
  ----------
1512
- dataset : AnnotatedDataset
1512
+ dataset : Dataset
1513
1513
  Dataset that provides metadata for the new Metadata instance.
1514
1514
 
1515
1515
  Returns
@@ -1672,7 +1672,7 @@ class Metadata(Array, FeatureExtractor):
1672
1672
  data = derived.factor_data
1673
1673
  return data[:, [columns[name] for name in names]]
1674
1674
 
1675
- def _fit(self, data: AnnotatedDataset[tuple[Any, Any, DatumMetadata]]) -> None:
1675
+ def _fit(self, data: Dataset[tuple[Any, Any, DatumMetadata]]) -> None:
1676
1676
  """Bind to ``data`` and freeze the encoding derived from it.
1677
1677
 
1678
1678
  Notes
@@ -5146,7 +5146,9 @@ class Metadata(Array, FeatureExtractor):
5146
5146
  data = hold_back_invalid_known(data)
5147
5147
 
5148
5148
  unique_labels = np.unique(data.class_labels) if len(data.class_labels) else np.array([], dtype=np.intp)
5149
- self._index2label = build_index2label(self._dataset.metadata.get("index2label", None), unique_labels)
5149
+ self._index2label = build_index2label(
5150
+ (getattr(self._dataset, "metadata", None) or {}).get("index2label", None), unique_labels
5151
+ )
5150
5152
  self._adopt(structurer, data)
5151
5153
  # From the bound dataset rather than the `_structuring_source` replacement: the replacement holds
5152
5154
  # the datums of a view, and it is the view's own chain that says which items share a root.
@@ -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 = '1.2.0rc0'
22
- __version_tuple__ = version_tuple = (1, 2, 0, 'rc0')
21
+ __version__ = version = '1.2.0rc2'
22
+ __version_tuple__ = version_tuple = (1, 2, 0, 'rc2')
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -27,10 +27,13 @@ class CompletenessResult(TypedDict):
27
27
  space actually spanned by embeddings.
28
28
  nearest_neighbor_pairs : Sequence[tuple[int, int]]
29
29
  Sequence of tuples (i, j) representing point indices and their nearest neighbors,
30
- sorted by decreasing nearest neighbor distance. Each pair appears only once.
30
+ sorted by decreasing nearest neighbor distance. Each pair appears only once, so two
31
+ points that are each other's nearest neighbor share one entry. ``j`` is never ``i``,
32
+ even when ``i`` has an exact duplicate.
31
33
  nearest_neighbor_distances : Sequence[float]
32
34
  Distance between each pair in ``nearest_neighbor_pairs``, aligned 1:1 and sharing
33
35
  the same decreasing order. The small-distance tail flags near-duplicate samples.
36
+ Each point's own nearest-neighbor distance is the smallest among the pairs it is in.
34
37
  """
35
38
 
36
39
  completeness: float
@@ -246,16 +249,12 @@ def completeness(embeddings: Array) -> CompletenessResult:
246
249
  nearest_neighbor_distances=[],
247
250
  )
248
251
 
249
- # Fit nearest neighbors model (k=2 because first neighbor is always the point itself)
250
- nn_model = NearestNeighbors(n_neighbors=2, algorithm="auto")
251
- nn_model.fit(embeddings)
252
-
253
- # Get distances and indices for nearest neighbors
254
- distances, indices = nn_model.kneighbors(embeddings)
255
-
256
- # Extract the actual nearest neighbor (second column, index 1)
257
- nearest_neighbors = indices[:, 1]
258
- nearest_distances = distances[:, 1]
252
+ # Each point's nearest other point. Querying the fitted points themselves (no X) makes sklearn drop each
253
+ # point from its own neighbors by index, which stays right for exact duplicates: there a zero-distance tie
254
+ # can rank the point after its copy, so "the first neighbor is the point itself" does not hold.
255
+ distances, indices = NearestNeighbors(n_neighbors=1).fit(embeddings).kneighbors()
256
+ nearest_neighbors = indices[:, 0]
257
+ nearest_distances = distances[:, 0]
259
258
 
260
259
  # Create pairs, deduplicating so each pair appears only once
261
260
  seen_pairs = set()
@@ -10,7 +10,7 @@ from typing_extensions import TypedDict, TypeVar
10
10
  from dataeval._experimental import deprecated
11
11
  from dataeval.core._calculators._base import Calculator
12
12
  from dataeval.flags import ImageStats
13
- from dataeval.protocols import ArrayLike, Dataset, ProgressCallback
13
+ from dataeval.protocols import ArrayLike, ImageDataset, ProgressCallback
14
14
  from dataeval.types import Aggregator, SourceIndex, StatsMap
15
15
  from dataeval.utils.preprocessing import (
16
16
  BoxLike,
@@ -166,7 +166,7 @@ def _produced_stat_names(calculators: Sequence[tuple[type[Calculator[Any]], Flag
166
166
 
167
167
  @deprecated(since="1.2", removal="2.0", alternative="image_stats")
168
168
  def compute_stats(
169
- data: Iterable[ArrayLike] | Dataset[ArrayLike] | Dataset[tuple[ArrayLike, Any, Any]],
169
+ data: Iterable[ArrayLike] | ImageDataset,
170
170
  *,
171
171
  boxes: Iterable[Iterable[BoxLike] | None] | None = None,
172
172
  stats: StatsRequest = ImageStats.ALL,
@@ -28,7 +28,14 @@ from dataeval.core._compute_stats import (
28
28
  )
29
29
  from dataeval.data import unzip_dataset
30
30
  from dataeval.flags import ImageStats
31
- from dataeval.protocols import ArrayLike, Dataset, ObjectDetectionTarget, ProgressCallback, _is_protocol_instance
31
+ from dataeval.protocols import (
32
+ ArrayLike,
33
+ Dataset,
34
+ ImageDataset,
35
+ ObjectDetectionTarget,
36
+ ProgressCallback,
37
+ _is_protocol_instance,
38
+ )
32
39
  from dataeval.types import FactorLevel, SourceIndex
33
40
  from dataeval.utils._internal import PoolWrapper
34
41
  from dataeval.utils.preprocessing import (
@@ -825,7 +832,7 @@ def _aggregate_batch(
825
832
 
826
833
 
827
834
  def image_stats( # noqa: C901
828
- data: Iterable[ArrayLike] | Dataset[ArrayLike] | Dataset[tuple[ArrayLike, Any, Any]],
835
+ data: Iterable[ArrayLike] | ImageDataset,
829
836
  *,
830
837
  boxes: Iterable[Iterable[BoxLike] | None] | None = None,
831
838
  stats: StatsRequest = ImageStats.ALL,
@@ -845,7 +852,7 @@ def image_stats( # noqa: C901
845
852
 
846
853
  Parameters
847
854
  ----------
848
- data : Iterable[ArrayLike] | Dataset[ArrayLike] | Dataset[tuple[ArrayLike, Any, Any]]
855
+ data : Iterable[ArrayLike] | ImageDataset
849
856
  An iterable of images or a Dataset to compute statistics on.
850
857
  boxes : Iterable[Iterable[BoxLike] | None] | None
851
858
  Optional bounding boxes for each image. If None, defers to the data provided.
@@ -23,24 +23,26 @@ from dataeval.data._selectors import (
23
23
  _StageTrace,
24
24
  sequence_infos,
25
25
  )
26
- from dataeval.data._video_proxies import checked_index, inherited_metadata
26
+ from dataeval.data._video_proxies import as_tracking, checked_index, inherited_metadata
27
27
  from dataeval.flags import ImageStats
28
28
  from dataeval.protocols import (
29
29
  AnnotatedDataset,
30
30
  ArrayLike,
31
+ Dataset,
31
32
  DatasetMetadata,
32
33
  DatumMetadata,
33
- MultiobjectTrackingDataset,
34
+ MultiobjectTrackingDatum,
34
35
  MultiobjectTrackingTarget,
35
36
  ObjectDetectionDatum,
36
37
  ObjectDetectionTarget,
37
38
  SingleFrameObjectTrackingTarget,
39
+ VideoDataset,
38
40
  )
39
41
  from dataeval.types import FactorLevel, SourceIndex
40
42
  from dataeval.types._target import instance_arrays
41
43
  from dataeval.types._track import frame_number
42
44
  from dataeval.utils._array import as_numpy
43
- from dataeval.utils.data import requires_maite_dataset
45
+ from dataeval.utils.data import validate_dataset
44
46
  from dataeval.utils.preprocessing import BoundingBox, normalize_image_shape
45
47
 
46
48
  _logger = get_logger(__name__)
@@ -202,9 +204,10 @@ class SequenceFrames(AnnotatedDataset[ObjectDetectionDatum]):
202
204
 
203
205
  Parameters
204
206
  ----------
205
- dataset : MultiobjectTrackingDataset
207
+ dataset : VideoDataset
206
208
  The source dataset. Each datum is a MAITE ``(VideoStream, MultiobjectTrackingTarget,
207
- metadata)`` 3-tuple.
209
+ metadata)`` 3-tuple. The dataset's own ``metadata`` attribute, when it has one, supplies the ``id`` and
210
+ ``index2label`` of the view; without it the view is named ``dataset-frames`` and has no class names.
208
211
  selector : FrameSelector or None, default None
209
212
  Which frames take part, and what to record about each. None keeps every frame
210
213
  (:class:`~dataeval.data.AllFrames`). See :class:`~dataeval.data.FrameSelector`.
@@ -232,6 +235,7 @@ class SequenceFrames(AnnotatedDataset[ObjectDetectionDatum]):
232
235
  --------
233
236
  :class:`~dataeval.data.FrameSelector` : The frame-selection extension point
234
237
  :class:`~dataeval.data.DetectionCrops` : The same reframing one level down
238
+ :doc:`/notebooks/h2_select_frames` : Thin each video to a budget of frames and read what a kept frame stands for
235
239
 
236
240
  Notes
237
241
  -----
@@ -279,10 +283,10 @@ class SequenceFrames(AnnotatedDataset[ObjectDetectionDatum]):
279
283
  factor through the ordinary path. ``sequence`` as a factor is what
280
284
  ``split_on=["sequence"]`` needs to keep every frame of one video on one side of a split. The
281
285
  split's fractions then count videos rather than frames: over five videos, ``test_frac=0.2``
282
- aims at one whole video, however many frames it has. With more than 20 distinct values
283
- :class:`~dataeval.Metadata` bins ``sequence`` automatically, so a group is then a run of
284
- consecutive videos (a video is still never split) and the fractions count those runs. For one
285
- group per video, pass ``Metadata(frames, factor_levels={"sequence": range(n_videos)})``.
286
+ aims at one whole video, however many frames it has. The split groups by the recorded
287
+ ``sequence`` values, so every video is a group of its own however many there are, even where
288
+ there are too many for :class:`~dataeval.Metadata` to score one at a time and it bins
289
+ ``sequence`` for the bias evaluators.
286
290
 
287
291
  Frames of one video are not independent samples, so :class:`~dataeval.bias.Parity` clusters
288
292
  them by their source video, and :class:`~dataeval.bias.Balance` counts a video as one
@@ -317,12 +321,18 @@ class SequenceFrames(AnnotatedDataset[ObjectDetectionDatum]):
317
321
  >>> stats = image_stats(frames, stats=ImageStats.HASH) # doctest: +SKIP
318
322
  """
319
323
 
320
- @requires_maite_dataset("dataset", expected="multiobject_tracking")
321
324
  def __init__(
322
325
  self,
323
- dataset: MultiobjectTrackingDataset,
326
+ dataset: VideoDataset,
324
327
  selector: FrameSelector | None = None,
325
328
  ) -> None:
329
+ # Videos with no targets become a tracking dataset of frames with no detections, so everything below
330
+ # reads one kind of dataset. The check is the one the signature would have made.
331
+ dataset = as_tracking(dataset)
332
+ if dataset is not None:
333
+ validate_dataset(
334
+ dataset, expected="multiobject_tracking", arg_name="dataset", caller="SequenceFrames.__init__"
335
+ )
326
336
  self._dataset = dataset
327
337
  self._selector = AllFrames() if selector is None else selector
328
338
  self._reads_pixels = bool(self._selector.needs & FrameInput.PIXELS)
@@ -381,11 +391,12 @@ class SequenceFrames(AnnotatedDataset[ObjectDetectionDatum]):
381
391
  # ------------------------------------------------------------------
382
392
 
383
393
  @property
384
- def source(self) -> MultiobjectTrackingDataset:
394
+ def source(self) -> Dataset[MultiobjectTrackingDatum]:
385
395
  """The tracking dataset this wraps -- one link up the chain.
386
396
 
387
397
  Named to match :attr:`~dataeval.data.View.source`, so a mixed wrapping chain is walkable
388
- through one public attribute and an invalidating operation inside it stays visible.
398
+ through one public attribute and an invalidating operation inside it stays visible. For a dataset of
399
+ videos with no targets this is the tracking dataset that gives every frame none, not the dataset passed in.
389
400
  """
390
401
  return self._dataset
391
402
 
@@ -15,6 +15,7 @@ from numpy.typing import NDArray
15
15
 
16
16
  from dataeval.data._crops import CropPolicy, FillType, RegionType, SquareType
17
17
  from dataeval.data._tracks import build_tracks
18
+ from dataeval.data._video_proxies import as_tracking
18
19
  from dataeval.data._view import View
19
20
  from dataeval.protocols import (
20
21
  DatumMetadata,
@@ -519,6 +520,7 @@ class SourceLocator:
519
520
  """
520
521
 
521
522
  def __init__(self, dataset: Any, *, source: Any | None = None) -> None:
523
+ dataset = as_tracking(dataset)
522
524
  self._dataset = dataset
523
525
  self._view = dataset if isinstance(dataset, View) else None
524
526
  # A view's root, not its `source`: `resolve_indices` steps one link, and a chain of
@@ -25,9 +25,9 @@ from dataeval.data._video_proxies import (
25
25
  from dataeval.flags import ImageStats
26
26
  from dataeval.protocols import (
27
27
  AnnotatedDataset,
28
+ Dataset,
28
29
  DatasetMetadata,
29
30
  DatumMetadata,
30
- MultiobjectTrackingDataset,
31
31
  MultiobjectTrackingDatum,
32
32
  )
33
33
  from dataeval.utils.data import requires_maite_dataset
@@ -79,7 +79,7 @@ def _plan_costs(plan: NDArray[np.intp], info: SequenceInfo) -> tuple[int, int]:
79
79
 
80
80
 
81
81
  def _plan_dataset(
82
- dataset: MultiobjectTrackingDataset, planner: SegmentPlanner
82
+ dataset: Dataset[MultiobjectTrackingDatum], planner: SegmentPlanner
83
83
  ) -> tuple[list[SequenceInfo], list[NDArray[np.intp]], set[int], int, int]:
84
84
  """Compute segment plans for each video in the dataset without decoding frames."""
85
85
  sequences: list[SequenceInfo] = []
@@ -120,7 +120,7 @@ class VideoSegments(AnnotatedDataset[MultiobjectTrackingDatum]):
120
120
 
121
121
  Parameters
122
122
  ----------
123
- dataset : MultiobjectTrackingDataset
123
+ dataset : Dataset of MultiobjectTrackingDatum
124
124
  The source tracking dataset.
125
125
  planner : SegmentPlanner
126
126
  Planner determining where to cut each video. See :class:`~dataeval.data.Window`
@@ -181,7 +181,7 @@ class VideoSegments(AnnotatedDataset[MultiobjectTrackingDatum]):
181
181
  @requires_maite_dataset("dataset", expected="multiobject_tracking")
182
182
  def __init__(
183
183
  self,
184
- dataset: MultiobjectTrackingDataset,
184
+ dataset: Dataset[MultiobjectTrackingDatum],
185
185
  planner: SegmentPlanner,
186
186
  *,
187
187
  timestamps: TimestampPolicy = "source",
@@ -240,7 +240,7 @@ class VideoSegments(AnnotatedDataset[MultiobjectTrackingDatum]):
240
240
  # ------------------------------------------------------------------
241
241
 
242
242
  @property
243
- def source(self) -> MultiobjectTrackingDataset:
243
+ def source(self) -> Dataset[MultiobjectTrackingDatum]:
244
244
  """Underlying tracking dataset wrapped by this view."""
245
245
  return self._dataset
246
246