evaluators 2.0.0__tar.gz → 2.1.0__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 (51) hide show
  1. {evaluators-2.0.0 → evaluators-2.1.0}/PKG-INFO +3 -1
  2. {evaluators-2.0.0 → evaluators-2.1.0}/pyproject.toml +4 -1
  3. evaluators-2.0.0/sources/evaluators/integrations/pl.py → evaluators-2.1.0/sources/evaluators/integrations/lightning.py +19 -21
  4. {evaluators-2.0.0 → evaluators-2.1.0}/README.md +0 -0
  5. {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/__init__.py +0 -0
  6. {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/_engine.py +0 -0
  7. {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/_streams.py +0 -0
  8. {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/cli/__main__.py +0 -0
  9. {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/cli/memory.py +0 -0
  10. {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/constants.py +0 -0
  11. {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/memory/__init__.py +0 -0
  12. {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/memory/encoded_memmap/__init__.py +0 -0
  13. {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/memory/encoded_memmap/_reader.py +0 -0
  14. {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/memory/encoded_memmap/_writer.py +0 -0
  15. {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/memory/interfaces.py +0 -0
  16. {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/memory/lmdb/__init__.py +0 -0
  17. {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/memory/lmdb/_reader.py +0 -0
  18. {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/memory/lmdb/_writer.py +0 -0
  19. {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/memory/memmap/__init__.py +0 -0
  20. {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/memory/memmap/_buffers.py +0 -0
  21. {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/memory/memmap/_reader.py +0 -0
  22. {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/memory/memmap/_writer.py +0 -0
  23. {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/memory/schema.py +0 -0
  24. {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/memory/utils/encoding.py +0 -0
  25. {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/metrics/__init__.py +0 -0
  26. {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/metrics/adapters/coco.py +0 -0
  27. {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/metrics/adapters/trackeval.py +0 -0
  28. {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/metrics/domain/depth.py +0 -0
  29. {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/metrics/domain/dvps.py +0 -0
  30. {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/metrics/domain/segmentation/__init__.py +0 -0
  31. {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/metrics/domain/segmentation/_utils.py +0 -0
  32. {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/metrics/domain/segmentation/panoptic.py +0 -0
  33. {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/metrics/domain/segmentation/semantic.py +0 -0
  34. {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/metrics/domain/step.py +0 -0
  35. {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/metrics/domain/tracking.py +0 -0
  36. {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/metrics/stats.py +0 -0
  37. {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/presets/__init__.py +0 -0
  38. {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/presets/cityscapes.py +0 -0
  39. {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/presets/kitti.py +0 -0
  40. {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/presets/semkitti.py +0 -0
  41. {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/scheduling/__init__.py +0 -0
  42. {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/scheduling/_catalog.py +0 -0
  43. {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/scheduling/_partitioner.py +0 -0
  44. {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/types.py +0 -0
  45. {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/utils/comms.py +0 -0
  46. {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/utils/tensor_ops.py +0 -0
  47. {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/visuals/__init__.py +0 -0
  48. {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/visuals/metric.py +0 -0
  49. {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/visuals/tools/__init__.py +0 -0
  50. {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/visuals/tools/_visualizer.py +0 -0
  51. {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/visuals/tools/transform.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: evaluators
3
- Version: 2.0.0
3
+ Version: 2.1.0
4
4
  Summary: Various scene understanding and perception evaluation metrics.
5
5
  Author: Kurt Stolle
6
6
  Author-email: Kurt Stolle <kurt@computer.org>
@@ -27,7 +27,9 @@ Requires-Dist: lmdb
27
27
  Requires-Dist: tifffile
28
28
  Requires-Dist: pydantic
29
29
  Requires-Dist: opencv-python>=4.13.0.92
30
+ Requires-Dist: lightning>=2.6.1 ; extra == 'lightning'
30
31
  Requires-Python: >=3.13, <3.14
32
+ Provides-Extra: lightning
31
33
  Description-Content-Type: text/markdown
32
34
 
33
35
  # Scalable Distributed Evaluation for Computer Vision
@@ -4,7 +4,7 @@ build-backend = "uv_build"
4
4
 
5
5
  [project]
6
6
  name = "evaluators"
7
- version = "2.0.0"
7
+ version = "2.1.0"
8
8
  description = "Various scene understanding and perception evaluation metrics."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.13, <3.14"
@@ -37,6 +37,9 @@ dependencies = [
37
37
  "opencv-python>=4.13.0.92",
38
38
  ]
39
39
 
40
+ [project.optional-dependencies]
41
+ lightning = ["lightning>=2.6.1"]
42
+
40
43
  [dependency-groups]
41
44
  dev = [
42
45
  "hypothesis>=6.140.2",
@@ -13,12 +13,9 @@ Exports
13
13
  import logging
14
14
  import shutil
15
15
  from pathlib import Path
16
- from typing import Type
17
16
 
18
17
  from evaluators import MetricStream, run_offline_evaluation
19
18
  from evaluators.memory import (
20
- EncodedMemmapTemporalWriter,
21
- LMDBTemporalWriter,
22
19
  MemmapTemporalWriter,
23
20
  TemporalWriterProtocol,
24
21
  )
@@ -39,34 +36,33 @@ class _DistributedWriterBase(Callback):
39
36
  self,
40
37
  output_dir: str | Path,
41
38
  *,
42
- chunk_size_frames: int = 1_000,
43
- backend: Type[TemporalWriterProtocol] = MemmapTemporalWriter,
39
+ backend: type[TemporalWriterProtocol] = MemmapTemporalWriter,
44
40
  **backend_kwargs,
45
41
  ) -> None:
46
42
  super().__init__()
47
43
  self.output_dir = Path(output_dir)
48
- self.chunk_size_frames = chunk_size_frames
49
44
  self.backend = backend
50
45
  self.backend_kwargs = backend_kwargs
51
- # Map: stream_name -> (MetricStream, TemporalWriterProtocol)
52
- self._active_streams: dict[str, tuple[MetricStream, TemporalWriterProtocol]] = {}
46
+ # Map: stream_name -> (MetricStream, Backend)
47
+ self._active_streams: dict[
48
+ str, tuple[MetricStream, TemporalWriterProtocol]
49
+ ] = {}
53
50
 
54
51
  def _setup_streams(self, pl_module: LightningModule) -> None:
55
52
  """Discovers MetricStreams and binds them to dedicated writers."""
56
53
  self._active_streams = {}
57
54
 
58
- discovered_streams: list[MetricStream] = []
59
-
60
55
  # Robust Discovery: Walk the module tree using standard PyTorch traversal
61
- for module in pl_module.modules():
62
- if isinstance(module, MetricStream):
63
- discovered_streams.append(module)
56
+ discovered_streams: list[MetricStream] = [
57
+ module for module in pl_module.modules() if isinstance(module, MetricStream)
58
+ ]
64
59
 
65
60
  if not discovered_streams:
66
61
  if comms.get_rank() == 0:
67
62
  logger.warning(
68
- f"No MetricStreams found in {pl_module.__class__.__name__}. "
69
- f"{self.__class__.__name__} will be idle."
63
+ "No MetricStreams found in %s; %s will be idle.",
64
+ pl_module.__class__.__name__,
65
+ self.__class__.__name__,
70
66
  )
71
67
  return
72
68
 
@@ -75,22 +71,22 @@ class _DistributedWriterBase(Callback):
75
71
  stream_dir = self.output_dir / stream.name
76
72
 
77
73
  if stream.schema is None:
78
- raise RuntimeError(
74
+ msg = (
79
75
  f"MetricStream '{stream.name}' has no schema defined. "
80
76
  "Explicit schemas are required for storage backends."
81
77
  )
78
+ raise RuntimeError(msg)
82
79
 
83
80
  writer = self.backend(
84
81
  output_dir=str(stream_dir),
85
82
  schema=stream.schema,
86
- chunk_size_frames=self.chunk_size_frames,
87
83
  **self.backend_kwargs,
88
84
  )
89
85
  stream.bind(writer)
90
86
  self._active_streams[stream.name] = (stream, writer)
91
87
 
92
88
  def _close_writers(self) -> None:
93
- """Closes all writers and clears the active streams list."""
89
+ """Close all writers and clears the active streams list."""
94
90
  for name, (_, writer) in self._active_streams.items():
95
91
  writer.close()
96
92
  logger.debug("Closed writer for stream: %s", name)
@@ -129,7 +125,7 @@ class DistributedEvaluationCallback(_DistributedWriterBase):
129
125
  output_dir: str | Path,
130
126
  *,
131
127
  chunk_size_frames: int = 1_000,
132
- backend: Type[TemporalWriterProtocol] = MemmapTemporalWriter,
128
+ backend: type[TemporalWriterProtocol] = MemmapTemporalWriter,
133
129
  keep_artifacts: bool = True,
134
130
  **backend_kwargs,
135
131
  ) -> None:
@@ -180,7 +176,7 @@ class DistributedEvaluationCallback(_DistributedWriterBase):
180
176
  comms.barrier()
181
177
  if not self.keep_artifacts and comms.get_rank() == 0:
182
178
  shutil.rmtree(self.output_dir)
183
-
179
+
184
180
  self._active_streams = {}
185
181
 
186
182
 
@@ -193,6 +189,8 @@ class DistributedInferenceWriter(_DistributedWriterBase):
193
189
  def on_predict_start(self, trainer: Trainer, pl_module: LightningModule) -> None:
194
190
  self._setup_streams(pl_module)
195
191
 
196
- def on_predict_epoch_end(self, trainer: Trainer, pl_module: LightningModule) -> None:
192
+ def on_predict_epoch_end(
193
+ self, trainer: Trainer, pl_module: LightningModule
194
+ ) -> None:
197
195
  self._close_writers()
198
196
  self._active_streams = {}
File without changes