britekit 0.1.0__tar.gz → 0.1.2__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.

Potentially problematic release.


This version of britekit might be problematic. Click here for more details.

Files changed (125) hide show
  1. {britekit-0.1.0 → britekit-0.1.2}/PKG-INFO +1 -1
  2. {britekit-0.1.0 → britekit-0.1.2}/britekit/__about__.py +1 -1
  3. {britekit-0.1.0 → britekit-0.1.2}/britekit/commands/_ensemble.py +44 -28
  4. {britekit-0.1.0 → britekit-0.1.2}/britekit/commands/_init.py +5 -2
  5. {britekit-0.1.0 → britekit-0.1.2}/.gitignore +0 -0
  6. {britekit-0.1.0 → britekit-0.1.2}/LICENSE.txt +0 -0
  7. {britekit-0.1.0 → britekit-0.1.2}/README.md +0 -0
  8. {britekit-0.1.0 → britekit-0.1.2}/britekit/__init__.py +0 -0
  9. {britekit-0.1.0 → britekit-0.1.2}/britekit/commands/__init__.py +0 -0
  10. {britekit-0.1.0 → britekit-0.1.2}/britekit/commands/_analyze.py +0 -0
  11. {britekit-0.1.0 → britekit-0.1.2}/britekit/commands/_audioset.py +0 -0
  12. {britekit-0.1.0 → britekit-0.1.2}/britekit/commands/_calibrate.py +0 -0
  13. {britekit-0.1.0 → britekit-0.1.2}/britekit/commands/_ckpt_ops.py +0 -0
  14. {britekit-0.1.0 → britekit-0.1.2}/britekit/commands/_db_add.py +0 -0
  15. {britekit-0.1.0 → britekit-0.1.2}/britekit/commands/_db_delete.py +0 -0
  16. {britekit-0.1.0 → britekit-0.1.2}/britekit/commands/_embed.py +0 -0
  17. {britekit-0.1.0 → britekit-0.1.2}/britekit/commands/_extract.py +0 -0
  18. {britekit-0.1.0 → britekit-0.1.2}/britekit/commands/_find_dup.py +0 -0
  19. {britekit-0.1.0 → britekit-0.1.2}/britekit/commands/_inat.py +0 -0
  20. {britekit-0.1.0 → britekit-0.1.2}/britekit/commands/_pickle.py +0 -0
  21. {britekit-0.1.0 → britekit-0.1.2}/britekit/commands/_plot.py +0 -0
  22. {britekit-0.1.0 → britekit-0.1.2}/britekit/commands/_reextract.py +0 -0
  23. {britekit-0.1.0 → britekit-0.1.2}/britekit/commands/_reports.py +0 -0
  24. {britekit-0.1.0 → britekit-0.1.2}/britekit/commands/_search.py +0 -0
  25. {britekit-0.1.0 → britekit-0.1.2}/britekit/commands/_train.py +0 -0
  26. {britekit-0.1.0 → britekit-0.1.2}/britekit/commands/_tune.py +0 -0
  27. {britekit-0.1.0 → britekit-0.1.2}/britekit/commands/_wav2mp3.py +0 -0
  28. {britekit-0.1.0 → britekit-0.1.2}/britekit/commands/_xeno.py +0 -0
  29. {britekit-0.1.0 → britekit-0.1.2}/britekit/commands/_youtube.py +0 -0
  30. {britekit-0.1.0 → britekit-0.1.2}/britekit/core/__init__.py +0 -0
  31. {britekit-0.1.0 → britekit-0.1.2}/britekit/install/data/audioset/class_inclusion.csv +0 -0
  32. {britekit-0.1.0 → britekit-0.1.2}/britekit/install/data/audioset/class_list.csv +0 -0
  33. {britekit-0.1.0 → britekit-0.1.2}/britekit/install/data/audioset/curated/aircraft.csv +0 -0
  34. {britekit-0.1.0 → britekit-0.1.2}/britekit/install/data/audioset/curated/car.csv +0 -0
  35. {britekit-0.1.0 → britekit-0.1.2}/britekit/install/data/audioset/curated/chainsaw.csv +0 -0
  36. {britekit-0.1.0 → britekit-0.1.2}/britekit/install/data/audioset/curated/cow.csv +0 -0
  37. {britekit-0.1.0 → britekit-0.1.2}/britekit/install/data/audioset/curated/cricket.csv +0 -0
  38. {britekit-0.1.0 → britekit-0.1.2}/britekit/install/data/audioset/curated/dog.csv +0 -0
  39. {britekit-0.1.0 → britekit-0.1.2}/britekit/install/data/audioset/curated/rain.csv +0 -0
  40. {britekit-0.1.0 → britekit-0.1.2}/britekit/install/data/audioset/curated/rooster.csv +0 -0
  41. {britekit-0.1.0 → britekit-0.1.2}/britekit/install/data/audioset/curated/sheep.csv +0 -0
  42. {britekit-0.1.0 → britekit-0.1.2}/britekit/install/data/audioset/curated/siren.csv +0 -0
  43. {britekit-0.1.0 → britekit-0.1.2}/britekit/install/data/audioset/curated/speech.csv +0 -0
  44. {britekit-0.1.0 → britekit-0.1.2}/britekit/install/data/audioset/curated/truck.csv +0 -0
  45. {britekit-0.1.0 → britekit-0.1.2}/britekit/install/data/audioset/curated/wind.csv +0 -0
  46. {britekit-0.1.0 → britekit-0.1.2}/britekit/install/data/audioset/unbalanced_train_segments.csv +0 -0
  47. {britekit-0.1.0 → britekit-0.1.2}/britekit/install/data/classes.csv +0 -0
  48. {britekit-0.1.0 → britekit-0.1.2}/britekit/install/data/ignore.txt +0 -0
  49. {britekit-0.1.0 → britekit-0.1.2}/britekit/install/yaml/base_config.yaml +0 -0
  50. {britekit-0.1.0 → britekit-0.1.2}/britekit/install/yaml/samples/cfg_infer.yaml +0 -0
  51. {britekit-0.1.0 → britekit-0.1.2}/britekit/install/yaml/samples/train_dla.yaml +0 -0
  52. {britekit-0.1.0 → britekit-0.1.2}/britekit/install/yaml/samples/train_effnet.yaml +0 -0
  53. {britekit-0.1.0 → britekit-0.1.2}/britekit/install/yaml/samples/train_gernet.yaml +0 -0
  54. {britekit-0.1.0 → britekit-0.1.2}/britekit/install/yaml/samples/train_hgnet.yaml +0 -0
  55. {britekit-0.1.0 → britekit-0.1.2}/britekit/install/yaml/samples/train_timm.yaml +0 -0
  56. {britekit-0.1.0 → britekit-0.1.2}/britekit/install/yaml/samples/train_vovnet.yaml +0 -0
  57. {britekit-0.1.0 → britekit-0.1.2}/britekit/install/yaml/samples/tune_dropout.yaml +0 -0
  58. {britekit-0.1.0 → britekit-0.1.2}/britekit/install/yaml/samples/tune_learning_rate.yaml +0 -0
  59. {britekit-0.1.0 → britekit-0.1.2}/britekit/install/yaml/samples/tune_optimizer.yaml +0 -0
  60. {britekit-0.1.0 → britekit-0.1.2}/britekit/install/yaml/samples/tune_smooth.yaml +0 -0
  61. {britekit-0.1.0 → britekit-0.1.2}/install/data/audioset/class_inclusion.csv +0 -0
  62. {britekit-0.1.0 → britekit-0.1.2}/install/data/audioset/class_list.csv +0 -0
  63. {britekit-0.1.0 → britekit-0.1.2}/install/data/audioset/curated/aircraft.csv +0 -0
  64. {britekit-0.1.0 → britekit-0.1.2}/install/data/audioset/curated/car.csv +0 -0
  65. {britekit-0.1.0 → britekit-0.1.2}/install/data/audioset/curated/chainsaw.csv +0 -0
  66. {britekit-0.1.0 → britekit-0.1.2}/install/data/audioset/curated/cow.csv +0 -0
  67. {britekit-0.1.0 → britekit-0.1.2}/install/data/audioset/curated/cricket.csv +0 -0
  68. {britekit-0.1.0 → britekit-0.1.2}/install/data/audioset/curated/dog.csv +0 -0
  69. {britekit-0.1.0 → britekit-0.1.2}/install/data/audioset/curated/rain.csv +0 -0
  70. {britekit-0.1.0 → britekit-0.1.2}/install/data/audioset/curated/rooster.csv +0 -0
  71. {britekit-0.1.0 → britekit-0.1.2}/install/data/audioset/curated/sheep.csv +0 -0
  72. {britekit-0.1.0 → britekit-0.1.2}/install/data/audioset/curated/siren.csv +0 -0
  73. {britekit-0.1.0 → britekit-0.1.2}/install/data/audioset/curated/speech.csv +0 -0
  74. {britekit-0.1.0 → britekit-0.1.2}/install/data/audioset/curated/truck.csv +0 -0
  75. {britekit-0.1.0 → britekit-0.1.2}/install/data/audioset/curated/wind.csv +0 -0
  76. {britekit-0.1.0 → britekit-0.1.2}/install/data/audioset/unbalanced_train_segments.csv +0 -0
  77. {britekit-0.1.0 → britekit-0.1.2}/install/data/classes.csv +0 -0
  78. {britekit-0.1.0 → britekit-0.1.2}/install/data/ignore.txt +0 -0
  79. {britekit-0.1.0 → britekit-0.1.2}/install/yaml/base_config.yaml +0 -0
  80. {britekit-0.1.0 → britekit-0.1.2}/install/yaml/samples/cfg_infer.yaml +0 -0
  81. {britekit-0.1.0 → britekit-0.1.2}/install/yaml/samples/train_dla.yaml +0 -0
  82. {britekit-0.1.0 → britekit-0.1.2}/install/yaml/samples/train_effnet.yaml +0 -0
  83. {britekit-0.1.0 → britekit-0.1.2}/install/yaml/samples/train_gernet.yaml +0 -0
  84. {britekit-0.1.0 → britekit-0.1.2}/install/yaml/samples/train_hgnet.yaml +0 -0
  85. {britekit-0.1.0 → britekit-0.1.2}/install/yaml/samples/train_timm.yaml +0 -0
  86. {britekit-0.1.0 → britekit-0.1.2}/install/yaml/samples/train_vovnet.yaml +0 -0
  87. {britekit-0.1.0 → britekit-0.1.2}/install/yaml/samples/tune_dropout.yaml +0 -0
  88. {britekit-0.1.0 → britekit-0.1.2}/install/yaml/samples/tune_learning_rate.yaml +0 -0
  89. {britekit-0.1.0 → britekit-0.1.2}/install/yaml/samples/tune_optimizer.yaml +0 -0
  90. {britekit-0.1.0 → britekit-0.1.2}/install/yaml/samples/tune_smooth.yaml +0 -0
  91. {britekit-0.1.0 → britekit-0.1.2}/pyproject.toml +0 -0
  92. {britekit-0.1.0 → britekit-0.1.2}/src/britekit/cli.py +0 -0
  93. {britekit-0.1.0 → britekit-0.1.2}/src/britekit/core/analyzer.py +0 -0
  94. {britekit-0.1.0 → britekit-0.1.2}/src/britekit/core/audio.py +0 -0
  95. {britekit-0.1.0 → britekit-0.1.2}/src/britekit/core/augmentation.py +0 -0
  96. {britekit-0.1.0 → britekit-0.1.2}/src/britekit/core/base_config.py +0 -0
  97. {britekit-0.1.0 → britekit-0.1.2}/src/britekit/core/config_loader.py +0 -0
  98. {britekit-0.1.0 → britekit-0.1.2}/src/britekit/core/data_module.py +0 -0
  99. {britekit-0.1.0 → britekit-0.1.2}/src/britekit/core/dataset.py +0 -0
  100. {britekit-0.1.0 → britekit-0.1.2}/src/britekit/core/exceptions.py +0 -0
  101. {britekit-0.1.0 → britekit-0.1.2}/src/britekit/core/pickler.py +0 -0
  102. {britekit-0.1.0 → britekit-0.1.2}/src/britekit/core/plot.py +0 -0
  103. {britekit-0.1.0 → britekit-0.1.2}/src/britekit/core/predictor.py +0 -0
  104. {britekit-0.1.0 → britekit-0.1.2}/src/britekit/core/reextractor.py +0 -0
  105. {britekit-0.1.0 → britekit-0.1.2}/src/britekit/core/trainer.py +0 -0
  106. {britekit-0.1.0 → britekit-0.1.2}/src/britekit/core/tuner.py +0 -0
  107. {britekit-0.1.0 → britekit-0.1.2}/src/britekit/core/util.py +0 -0
  108. {britekit-0.1.0 → britekit-0.1.2}/src/britekit/models/base_model.py +0 -0
  109. {britekit-0.1.0 → britekit-0.1.2}/src/britekit/models/dla.py +0 -0
  110. {britekit-0.1.0 → britekit-0.1.2}/src/britekit/models/effnet.py +0 -0
  111. {britekit-0.1.0 → britekit-0.1.2}/src/britekit/models/gernet.py +0 -0
  112. {britekit-0.1.0 → britekit-0.1.2}/src/britekit/models/head_factory.py +0 -0
  113. {britekit-0.1.0 → britekit-0.1.2}/src/britekit/models/hgnet.py +0 -0
  114. {britekit-0.1.0 → britekit-0.1.2}/src/britekit/models/model_loader.py +0 -0
  115. {britekit-0.1.0 → britekit-0.1.2}/src/britekit/models/timm_model.py +0 -0
  116. {britekit-0.1.0 → britekit-0.1.2}/src/britekit/models/vovnet.py +0 -0
  117. {britekit-0.1.0 → britekit-0.1.2}/src/britekit/occurrence_db/occurrence_data_provider.py +0 -0
  118. {britekit-0.1.0 → britekit-0.1.2}/src/britekit/occurrence_db/occurrence_db.py +0 -0
  119. {britekit-0.1.0 → britekit-0.1.2}/src/britekit/testing/base_tester.py +0 -0
  120. {britekit-0.1.0 → britekit-0.1.2}/src/britekit/testing/per_minute_tester.py +0 -0
  121. {britekit-0.1.0 → britekit-0.1.2}/src/britekit/testing/per_recording_tester.py +0 -0
  122. {britekit-0.1.0 → britekit-0.1.2}/src/britekit/testing/per_segment_tester.py +0 -0
  123. {britekit-0.1.0 → britekit-0.1.2}/src/britekit/training_db/extractor.py +0 -0
  124. {britekit-0.1.0 → britekit-0.1.2}/src/britekit/training_db/training_data_provider.py +0 -0
  125. {britekit-0.1.0 → britekit-0.1.2}/src/britekit/training_db/training_db.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: britekit
3
- Version: 0.1.0
3
+ Version: 0.1.2
4
4
  Summary: Core functions for bioacoustic recognizers.
5
5
  Project-URL: Documentation, https://github.com/jhuus/BriteKit#readme
6
6
  Project-URL: Issues, https://github.com/jhuus/BriteKit/issues
@@ -1,4 +1,4 @@
1
1
  # SPDX-FileCopyrightText: 2025-present Jan Huus <jhuus1@gmail.com>
2
2
  #
3
3
  # SPDX-License-Identifier: MIT
4
- __version__ = "0.1.0"
4
+ __version__ = "0.1.2"
@@ -11,34 +11,24 @@ import click
11
11
  from britekit.core.config_loader import get_config
12
12
  from britekit.core import util
13
13
 
14
- def _eval_ensemble(ensemble, temp_dir, annotations_path, recording_dir):
15
- import shutil
16
-
17
- from britekit.core.analyzer import Analyzer
14
+ def _eval_ensemble(ensemble, dataframe_dict, annotations_path, recordings_path, inference_output_dir):
15
+ import pandas as pd
18
16
  from britekit.testing.per_segment_tester import PerSegmentTester
19
17
 
20
- # delete any checkpoints in the temp dir
21
- for filename in os.listdir(temp_dir):
22
- file_path = os.path.join(temp_dir, filename)
23
- os.remove(file_path)
24
-
25
- # copy checkpoints to the temp dir
26
- for file_path in ensemble:
27
- file_name = Path(file_path).name
28
- dest_path = os.path.join(temp_dir, file_name)
29
- shutil.copyfile(file_path, dest_path)
18
+ # create a dataframe with the average scores for the ensemble
19
+ avg_df: pd.DataFrame = dataframe_dict[ensemble[0]].copy()
20
+ avg_df["score"] = sum(dataframe_dict[ckpt_path]["score"] for ckpt_path in ensemble) / len(ensemble)
30
21
 
31
- # run inference on the given test
32
- util.set_logging(level=logging.ERROR) # suppress logging during inference and analysis
33
- label_dir = "ensemble_evaluation_labels"
34
- inference_output_dir = str(Path(recording_dir) / label_dir)
35
- Analyzer().run(recording_dir, inference_output_dir)
22
+ # save the dataframe to the usual inference output location
23
+ scores_csv_path = str(Path(inference_output_dir) / 'scores.csv')
24
+ avg_df.to_csv(scores_csv_path, index=False)
36
25
 
37
- min_score = 0.8 # irrelevant really
38
26
  with tempfile.TemporaryDirectory() as output_dir:
27
+ util.set_logging(level=logging.ERROR) # suppress logging during test reporting
28
+ min_score = 0.8 # arbitrary threshold
39
29
  tester = PerSegmentTester(
40
30
  annotations_path,
41
- recording_dir,
31
+ recordings_path,
42
32
  inference_output_dir,
43
33
  output_dir,
44
34
  min_score,
@@ -47,6 +37,7 @@ def _eval_ensemble(ensemble, temp_dir, annotations_path, recording_dir):
47
37
 
48
38
  pr_stats = tester.get_pr_auc_stats()
49
39
  roc_stats = tester.get_roc_auc_stats()
40
+ util.set_logging() # restore logging
50
41
 
51
42
  scores = {
52
43
  "macro_pr": pr_stats["macro_pr_auc"],
@@ -55,11 +46,9 @@ def _eval_ensemble(ensemble, temp_dir, annotations_path, recording_dir):
55
46
  "micro_roc": roc_stats["micro_roc_auc_trained"]
56
47
  }
57
48
 
58
- shutil.rmtree(inference_output_dir)
59
- util.set_logging() # restore logging
60
-
61
49
  return scores
62
50
 
51
+
63
52
  def ensemble(
64
53
  cfg_path: Optional[str]=None,
65
54
  ckpt_path: str="",
@@ -87,7 +76,13 @@ def ensemble(
87
76
  import glob
88
77
  import itertools
89
78
  import math
79
+ import os
90
80
  import random
81
+ import shutil
82
+
83
+ import pandas as pd
84
+
85
+ from britekit.core.analyzer import Analyzer
91
86
 
92
87
  if metric not in ["macro_pr", "micro_pr", "macro_roc", "micro_roc"]:
93
88
  logging.error(f"Error: invalid metric ({metric})")
@@ -106,10 +101,29 @@ def ensemble(
106
101
  if not recordings_path:
107
102
  recordings_path = str(Path(annotations_path).parent)
108
103
 
109
- with tempfile.TemporaryDirectory() as temp_dir:
110
- cfg.misc.ckpt_folder = temp_dir
104
+ with tempfile.TemporaryDirectory() as ensemble_dir:
105
+ cfg.misc.ckpt_folder = ensemble_dir
111
106
  cfg.infer.min_score = 0
112
107
 
108
+ # get a dataframe of predictions per checkpoint
109
+ label_dir = "ensemble_evaluation_labels"
110
+ inference_output_dir = str(Path(recordings_path) / label_dir)
111
+ scores_csv_path = str(Path(inference_output_dir) / 'scores.csv')
112
+ dataframe_dict = {}
113
+ for ckpt_path in ckpt_paths:
114
+ ckpt_name = Path(ckpt_path).name
115
+ logging.info(f"Running inference with {ckpt_name}")
116
+ dest_path = str(Path(ensemble_dir) / ckpt_name)
117
+ shutil.copyfile(ckpt_path, dest_path)
118
+
119
+ util.set_logging(level=logging.ERROR) # suppress logging during inference
120
+ Analyzer().run(recordings_path, inference_output_dir, rtype='csv')
121
+ util.set_logging()
122
+
123
+ df = pd.read_csv(scores_csv_path)
124
+ dataframe_dict[ckpt_path] = df
125
+ os.remove(dest_path)
126
+
113
127
  best_score = 0
114
128
  best_ensemble = None
115
129
  count = 1
@@ -118,7 +132,7 @@ def ensemble(
118
132
  # Exhaustive search
119
133
  logging.info("Doing exhaustive search")
120
134
  for ensemble in itertools.combinations(ckpt_paths, ensemble_size):
121
- scores = _eval_ensemble(ensemble, temp_dir, annotations_path, recordings_path)
135
+ scores = _eval_ensemble(ensemble, dataframe_dict, annotations_path, recordings_path, inference_output_dir)
122
136
  logging.info(f"For ensemble {count} of {total_combinations}, score = {scores[metric]:.4f}")
123
137
  if scores[metric] > best_score:
124
138
  best_score = scores[metric]
@@ -133,7 +147,7 @@ def ensemble(
133
147
  ensemble = tuple(sorted(random.sample(ckpt_paths, ensemble_size)))
134
148
  if ensemble not in seen:
135
149
  seen.add(ensemble)
136
- scores = _eval_ensemble(ensemble, temp_dir, annotations_path, recordings_path)
150
+ scores = _eval_ensemble(ensemble, dataframe_dict, annotations_path, recordings_path, inference_output_dir)
137
151
  logging.info(f"For ensemble {count} of {num_tries}, score = {scores[metric]:.4f}")
138
152
  if scores[metric] > best_score:
139
153
  best_score = scores[metric]
@@ -141,6 +155,8 @@ def ensemble(
141
155
 
142
156
  count += 1
143
157
 
158
+ shutil.rmtree(inference_output_dir)
159
+
144
160
  logging.info(f"Best score = {best_score:.4f}")
145
161
 
146
162
  assert best_ensemble is not None
@@ -3,7 +3,7 @@ import logging
3
3
  from pathlib import Path
4
4
  from importlib.resources import files as pkg_files
5
5
  from importlib.abc import Traversable
6
- from typing import Iterator, Tuple, List, cast
6
+ from typing import Iterator, Optional, Tuple, List, cast
7
7
 
8
8
  import click
9
9
 
@@ -23,7 +23,7 @@ def _iter_traversable_files(
23
23
  yield (prefix + (child.name,)), child
24
24
 
25
25
 
26
- def init(dest: Path) -> None:
26
+ def init(dest: Optional[Path]=None) -> None:
27
27
  """
28
28
  Setup default BriteKit directory structure and copy packaged sample files.
29
29
 
@@ -55,6 +55,9 @@ def init(dest: Path) -> None:
55
55
  files.append((rel_posix, trav_file))
56
56
 
57
57
  # Copy
58
+ if dest is None:
59
+ dest = Path('.')
60
+
58
61
  dest.mkdir(parents=True, exist_ok=True)
59
62
  copied = 0
60
63
  skipped = 0
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes