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.
- {evaluators-2.0.0 → evaluators-2.1.0}/PKG-INFO +3 -1
- {evaluators-2.0.0 → evaluators-2.1.0}/pyproject.toml +4 -1
- evaluators-2.0.0/sources/evaluators/integrations/pl.py → evaluators-2.1.0/sources/evaluators/integrations/lightning.py +19 -21
- {evaluators-2.0.0 → evaluators-2.1.0}/README.md +0 -0
- {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/__init__.py +0 -0
- {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/_engine.py +0 -0
- {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/_streams.py +0 -0
- {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/cli/__main__.py +0 -0
- {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/cli/memory.py +0 -0
- {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/constants.py +0 -0
- {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/memory/__init__.py +0 -0
- {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/memory/encoded_memmap/__init__.py +0 -0
- {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/memory/encoded_memmap/_reader.py +0 -0
- {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/memory/encoded_memmap/_writer.py +0 -0
- {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/memory/interfaces.py +0 -0
- {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/memory/lmdb/__init__.py +0 -0
- {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/memory/lmdb/_reader.py +0 -0
- {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/memory/lmdb/_writer.py +0 -0
- {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/memory/memmap/__init__.py +0 -0
- {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/memory/memmap/_buffers.py +0 -0
- {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/memory/memmap/_reader.py +0 -0
- {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/memory/memmap/_writer.py +0 -0
- {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/memory/schema.py +0 -0
- {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/memory/utils/encoding.py +0 -0
- {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/metrics/__init__.py +0 -0
- {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/metrics/adapters/coco.py +0 -0
- {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/metrics/adapters/trackeval.py +0 -0
- {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/metrics/domain/depth.py +0 -0
- {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/metrics/domain/dvps.py +0 -0
- {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/metrics/domain/segmentation/__init__.py +0 -0
- {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/metrics/domain/segmentation/_utils.py +0 -0
- {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/metrics/domain/segmentation/panoptic.py +0 -0
- {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/metrics/domain/segmentation/semantic.py +0 -0
- {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/metrics/domain/step.py +0 -0
- {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/metrics/domain/tracking.py +0 -0
- {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/metrics/stats.py +0 -0
- {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/presets/__init__.py +0 -0
- {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/presets/cityscapes.py +0 -0
- {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/presets/kitti.py +0 -0
- {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/presets/semkitti.py +0 -0
- {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/scheduling/__init__.py +0 -0
- {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/scheduling/_catalog.py +0 -0
- {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/scheduling/_partitioner.py +0 -0
- {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/types.py +0 -0
- {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/utils/comms.py +0 -0
- {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/utils/tensor_ops.py +0 -0
- {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/visuals/__init__.py +0 -0
- {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/visuals/metric.py +0 -0
- {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/visuals/tools/__init__.py +0 -0
- {evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/visuals/tools/_visualizer.py +0 -0
- {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.
|
|
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.
|
|
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
|
-
|
|
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,
|
|
52
|
-
self._active_streams: dict[
|
|
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
|
-
|
|
62
|
-
if isinstance(module, MetricStream)
|
|
63
|
-
|
|
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
|
-
|
|
69
|
-
|
|
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
|
-
|
|
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
|
-
"""
|
|
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:
|
|
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(
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/metrics/domain/segmentation/__init__.py
RENAMED
|
File without changes
|
{evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/metrics/domain/segmentation/_utils.py
RENAMED
|
File without changes
|
{evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/metrics/domain/segmentation/panoptic.py
RENAMED
|
File without changes
|
{evaluators-2.0.0 → evaluators-2.1.0}/sources/evaluators/metrics/domain/segmentation/semantic.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|