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.
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/PKG-INFO +1 -1
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/pyproject.toml +2 -1
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_embeddings.py +4 -5
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_metadata.py +14 -12
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_version.py +2 -2
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_completeness.py +10 -11
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_compute_stats.py +2 -2
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_image_stats.py +10 -3
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_frames.py +24 -13
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_locate.py +2 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_segments.py +5 -5
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_split.py +143 -32
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_stitch.py +5 -5
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_video_proxies.py +122 -7
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/extractors/_videotorch.py +93 -60
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/protocols.py +28 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/quality/_duplicates.py +20 -19
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/quality/_outliers.py +59 -20
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/quality/_shared.py +2 -1
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/scope/_coverage.py +174 -40
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/shift/_drift/_base.py +10 -1
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/shift/_drift/_wasserstein.py +164 -60
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/.gitignore +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/LICENSE +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/README.md +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/__init__.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_experimental.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_helpers.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_log.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/__init__.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_aggregate.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_collisions.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_columns.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_corrections.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_encoding.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_filters.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_input.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_keyed.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_known.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_links.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_loading.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_reductions.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_serialize.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_source_groups.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_store.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_structurers/__init__.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_structurers/_accumulator.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_structurers/_base.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_structurers/_block.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_structurers/_classification.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_structurers/_data.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_structurers/_dataset.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_structurers/_detection.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_structurers/_factors.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_structurers/_frames.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_structurers/_gather.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_structurers/_instances.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_structurers/_layout.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_structurers/_ordering.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_structurers/_propagation.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_structurers/_reporting.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_structurers/_reserved.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_structurers/_select.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_structurers/_source_index.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_metadata/_structurers/_tracking.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/_ontology.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/bias/__init__.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/bias/_balance.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/bias/_diversity.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/bias/_parity.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/config.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/__init__.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_alignment.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_annotation_match.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_ap_bounds.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_association.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_ber.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_bin.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_calculators/__init__.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_calculators/_base.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_calculators/_cache.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_calculators/_descriptivestats.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_calculators/_dimensionstats.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_calculators/_egostats.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_calculators/_hashstats.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_calculators/_persistencestats.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_calculators/_pixelstats.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_calculators/_redundancystats.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_calculators/_register.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_calculators/_registry.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_calculators/_video_base.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_calculators/_video_register.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_calculators/_visualstats.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_clusterer.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_combination_scores.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_compute_ratios.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_concentration.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_consensus.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_coverage.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_divergence.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_diversity.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_effective_n.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_ego_stats.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_fast_hdbscan/_cluster_trees.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_fast_hdbscan/_disjoint_set.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_fast_hdbscan/_mst.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_feature_distance.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_hash.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_hash_index.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_label_alignment.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_label_cooccurrence.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_label_coverage.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_label_errors.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_label_parity.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_label_reconciliation.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_label_stats.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_local_panels.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_metadata_insights.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_mst.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_mutual_info.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_nullmodel.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_ontology_validation.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_parity.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_persistence.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_rank.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_rao_scott.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_sequence_match.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_sequence_residuals.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_temporal.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_track_stats.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_uap.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_video_runner.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/core/_video_stats.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/__init__.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_camera_travel.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_chain.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_classbalance.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_classfilter.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_crop.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_crops.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_filter.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_geometry.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_indices.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_invalidates.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_label_selectors.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_limit.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_merge.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_planners.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_quality_gate.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_reads.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_relabel.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_resize.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_reverse.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_selectchannels.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_selectors.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_shuffle.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_torchvision.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_tracks.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_unzip.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/data/_view.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/exceptions.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/extractors/__init__.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/extractors/_bovw.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/extractors/_flatten.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/extractors/_geometry.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/extractors/_onnx.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/extractors/_scores.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/extractors/_torch.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/extractors/_uncertainty.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/flags.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/models/__init__.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/models/_backends.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/models/_input.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/models/_metadata.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/models/_predictors.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/performance/__init__.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/performance/_aggregator.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/performance/_feasibility.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/performance/_feasibility_classification.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/performance/_feasibility_constants.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/performance/_feasibility_decide.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/performance/_feasibility_evidence.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/performance/_feasibility_target.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/performance/_feasibility_units.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/performance/_output.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/performance/_sufficiency.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/performance/schedules.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/py.typed +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/quality/__init__.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/quality/_factor_stats.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/quality/_outliers_neighbors.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/quality/_outliers_rows.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/quality/_outliers_scores.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/scope/__init__.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/scope/_prioritize.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/scope/_representation.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/shift/__init__.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/shift/_drift/__init__.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/shift/_drift/_chunk.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/shift/_drift/_domain_classifier.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/shift/_drift/_domain_spec.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/shift/_drift/_kneighbors.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/shift/_drift/_known_domains.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/shift/_drift/_mmd.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/shift/_drift/_reconstruction.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/shift/_drift/_univariate.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/shift/_ood/__init__.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/shift/_ood/_base.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/shift/_ood/_domain_classifier.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/shift/_ood/_kneighbors.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/shift/_ood/_reconstruction.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/shift/_shared/__init__.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/shift/_shared/_domain_classifier.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/shift/_shared/_kneighbors.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/shift/_shared/_reconstruction.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/shift/update_strategies.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/types/__init__.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/types/_array.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/types/_config.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/types/_evaluator.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/types/_execution.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/types/_factors.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/types/_index.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/types/_known_factors.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/types/_ontology.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/types/_output.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/types/_removal.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/types/_schema.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/types/_target.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/types/_task.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/types/_track.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/utils/__init__.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/utils/_array.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/utils/_internal.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/utils/_mask.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/utils/_merge.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/utils/data.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/utils/losses.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/utils/models.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/utils/onnx.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/utils/preprocessing.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/utils/scipy/__init__.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/utils/scipy/stats.py +0 -0
- {dataeval-1.2.0rc0 → dataeval-1.2.0rc2}/src/dataeval/utils/thresholds.py +0 -0
- {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.
|
|
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.
|
|
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:
|
|
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:
|
|
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:
|
|
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 :
|
|
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:
|
|
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:
|
|
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) ->
|
|
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
|
-
|
|
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:
|
|
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 :
|
|
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:
|
|
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 :
|
|
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:
|
|
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(
|
|
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.
|
|
22
|
-
__version_tuple__ = version_tuple = (1, 2, 0, '
|
|
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
|
-
#
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
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,
|
|
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] |
|
|
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
|
|
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] |
|
|
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] |
|
|
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
|
-
|
|
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
|
|
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 :
|
|
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.
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
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:
|
|
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) ->
|
|
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:
|
|
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 :
|
|
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:
|
|
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) ->
|
|
243
|
+
def source(self) -> Dataset[MultiobjectTrackingDatum]:
|
|
244
244
|
"""Underlying tracking dataset wrapped by this view."""
|
|
245
245
|
return self._dataset
|
|
246
246
|
|