From 84d01d2b9ff8252f1b9d66e2a67ded2e71c12ce2 Mon Sep 17 00:00:00 2001 From: MJWeldy <56649341+MJWeldy@users.noreply.github.com> Date: Sat, 5 Aug 2023 20:15:35 -0700 Subject: [PATCH 01/10] Update analyzer.py added feature extraction --- src/birdnetlib/analyzer.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/birdnetlib/analyzer.py b/src/birdnetlib/analyzer.py index 16716fb..b03a596 100644 --- a/src/birdnetlib/analyzer.py +++ b/src/birdnetlib/analyzer.py @@ -53,6 +53,7 @@ def __init__( custom_species_list=None, classifier_model_path=None, classifier_labels_path=None, + fetch_embeddings=False ): self.name = "Analyzer" self.model_name = "BirdNET-Analyzer" @@ -204,6 +205,9 @@ def analyze_recording(self, recording): if self.use_custom_classifier: pred = self.predict_with_custom_classifier(c)[0] + elif fetch_embeddings: + features = self.predict_with_custom_classifier(c)[0] + return features else: pred = self.predict(c)[0] @@ -299,7 +303,9 @@ def predict_with_custom_classifier(self, sample): features = INTERPRETER.get_tensor(OUTPUT_LAYER_INDEX) feature_vector = features - + if fetch_embedding: + return features + C_INTERPRETER = self.custom_interpreter C_INPUT_LAYER_INDEX = self.custom_input_layer_index C_OUTPUT_LAYER_INDEX = self.custom_output_layer_index From fd1a3f4dc1709561776edd1e4df1513a0285889f Mon Sep 17 00:00:00 2001 From: MJWeldy <56649341+MJWeldy@users.noreply.github.com> Date: Sat, 5 Aug 2023 20:26:54 -0700 Subject: [PATCH 02/10] Update analyzer.py converted input variable to self --- src/birdnetlib/analyzer.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/birdnetlib/analyzer.py b/src/birdnetlib/analyzer.py index b03a596..0d73e63 100644 --- a/src/birdnetlib/analyzer.py +++ b/src/birdnetlib/analyzer.py @@ -73,6 +73,8 @@ def __init__( self.results = [] self.custom_species_list = [] + self.fetch_embeddings = fetch_embeddings + self.classifier_model_path = classifier_model_path self.classifier_labels_path = classifier_labels_path self.use_custom_classifier = ( @@ -205,7 +207,7 @@ def analyze_recording(self, recording): if self.use_custom_classifier: pred = self.predict_with_custom_classifier(c)[0] - elif fetch_embeddings: + elif self.fetch_embeddings: features = self.predict_with_custom_classifier(c)[0] return features else: @@ -303,7 +305,7 @@ def predict_with_custom_classifier(self, sample): features = INTERPRETER.get_tensor(OUTPUT_LAYER_INDEX) feature_vector = features - if fetch_embedding: + if self.fetch_embedding: return features C_INTERPRETER = self.custom_interpreter From e06113166aa48e53e73e87ab6b16e06b422ad1d9 Mon Sep 17 00:00:00 2001 From: MJWeldy <56649341+MJWeldy@users.noreply.github.com> Date: Sat, 5 Aug 2023 20:32:56 -0700 Subject: [PATCH 03/10] Update analyzer.py typo --- src/birdnetlib/analyzer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/birdnetlib/analyzer.py b/src/birdnetlib/analyzer.py index 0d73e63..6e5a445 100644 --- a/src/birdnetlib/analyzer.py +++ b/src/birdnetlib/analyzer.py @@ -53,7 +53,7 @@ def __init__( custom_species_list=None, classifier_model_path=None, classifier_labels_path=None, - fetch_embeddings=False + fetch_embeddings=None, ): self.name = "Analyzer" self.model_name = "BirdNET-Analyzer" @@ -305,7 +305,7 @@ def predict_with_custom_classifier(self, sample): features = INTERPRETER.get_tensor(OUTPUT_LAYER_INDEX) feature_vector = features - if self.fetch_embedding: + if self.fetch_embeddings: return features C_INTERPRETER = self.custom_interpreter From 74ff8af26411f14cfe16901b71cc5801c59c7ded Mon Sep 17 00:00:00 2001 From: MJWeldy <56649341+MJWeldy@users.noreply.github.com> Date: Sat, 5 Aug 2023 20:40:56 -0700 Subject: [PATCH 04/10] Update analyzer.py another --- src/birdnetlib/analyzer.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/birdnetlib/analyzer.py b/src/birdnetlib/analyzer.py index 6e5a445..ed9dad6 100644 --- a/src/birdnetlib/analyzer.py +++ b/src/birdnetlib/analyzer.py @@ -73,7 +73,10 @@ def __init__( self.results = [] self.custom_species_list = [] - self.fetch_embeddings = fetch_embeddings + if fetch_embeddings=="1": + self.fetch_embeddings = True + else + self.fetch_embeddings = False self.classifier_model_path = classifier_model_path self.classifier_labels_path = classifier_labels_path From 2d41c14c476cfc61440788f680d419455ff59ed6 Mon Sep 17 00:00:00 2001 From: MJWeldy <56649341+MJWeldy@users.noreply.github.com> Date: Sat, 5 Aug 2023 20:46:14 -0700 Subject: [PATCH 05/10] Update analyzer.py --- src/birdnetlib/analyzer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/birdnetlib/analyzer.py b/src/birdnetlib/analyzer.py index ed9dad6..4b6e7c1 100644 --- a/src/birdnetlib/analyzer.py +++ b/src/birdnetlib/analyzer.py @@ -73,7 +73,7 @@ def __init__( self.results = [] self.custom_species_list = [] - if fetch_embeddings=="1": + if fetch_embeddings==1: self.fetch_embeddings = True else self.fetch_embeddings = False @@ -210,7 +210,7 @@ def analyze_recording(self, recording): if self.use_custom_classifier: pred = self.predict_with_custom_classifier(c)[0] - elif self.fetch_embeddings: + elif self.fetch_embeddings == True : features = self.predict_with_custom_classifier(c)[0] return features else: From 206589293547aa6e64c7800cffd740e7ba55d423 Mon Sep 17 00:00:00 2001 From: MJWeldy <56649341+MJWeldy@users.noreply.github.com> Date: Sat, 5 Aug 2023 20:47:31 -0700 Subject: [PATCH 06/10] Update analyzer.py --- src/birdnetlib/analyzer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/birdnetlib/analyzer.py b/src/birdnetlib/analyzer.py index 4b6e7c1..d9fcbb5 100644 --- a/src/birdnetlib/analyzer.py +++ b/src/birdnetlib/analyzer.py @@ -75,7 +75,7 @@ def __init__( if fetch_embeddings==1: self.fetch_embeddings = True - else + else: self.fetch_embeddings = False self.classifier_model_path = classifier_model_path From 30cb0717eafdbc4cb013f771f0dd585935b0eb9d Mon Sep 17 00:00:00 2001 From: MJWeldy <56649341+MJWeldy@users.noreply.github.com> Date: Sat, 5 Aug 2023 20:55:42 -0700 Subject: [PATCH 07/10] Update analyzer.py --- src/birdnetlib/analyzer.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/birdnetlib/analyzer.py b/src/birdnetlib/analyzer.py index d9fcbb5..cb89696 100644 --- a/src/birdnetlib/analyzer.py +++ b/src/birdnetlib/analyzer.py @@ -72,11 +72,13 @@ def __init__( self.labels = [] self.results = [] self.custom_species_list = [] - - if fetch_embeddings==1: + + print(fetch_embeddings) + if fetch_embeddings: self.fetch_embeddings = True else: self.fetch_embeddings = False + print(self.fetch_embeddings) self.classifier_model_path = classifier_model_path self.classifier_labels_path = classifier_labels_path From 98c1796b4e88de7f3c04d2294ef6681f98465d4f Mon Sep 17 00:00:00 2001 From: MJWeldy <56649341+MJWeldy@users.noreply.github.com> Date: Sat, 5 Aug 2023 21:04:26 -0700 Subject: [PATCH 08/10] Update analyzer.py --- src/birdnetlib/analyzer.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/birdnetlib/analyzer.py b/src/birdnetlib/analyzer.py index cb89696..a4a7b06 100644 --- a/src/birdnetlib/analyzer.py +++ b/src/birdnetlib/analyzer.py @@ -78,6 +78,7 @@ def __init__( self.fetch_embeddings = True else: self.fetch_embeddings = False + self.fetch_embeddings = True print(self.fetch_embeddings) self.classifier_model_path = classifier_model_path From f1378a29639439a4dcbb0fb6b9a7627bd6532640 Mon Sep 17 00:00:00 2001 From: MJWeldy <56649341+MJWeldy@users.noreply.github.com> Date: Sat, 5 Aug 2023 22:08:14 -0700 Subject: [PATCH 09/10] Update analyzer.py working --- src/birdnetlib/analyzer.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/birdnetlib/analyzer.py b/src/birdnetlib/analyzer.py index a4a7b06..ece315c 100644 --- a/src/birdnetlib/analyzer.py +++ b/src/birdnetlib/analyzer.py @@ -73,13 +73,10 @@ def __init__( self.results = [] self.custom_species_list = [] - print(fetch_embeddings) if fetch_embeddings: self.fetch_embeddings = True else: self.fetch_embeddings = False - self.fetch_embeddings = True - print(self.fetch_embeddings) self.classifier_model_path = classifier_model_path self.classifier_labels_path = classifier_labels_path @@ -209,13 +206,15 @@ def analyze_recording(self, recording): start = 0 end = recording.sample_secs results = {} + features = [] for c in recording.chunks: if self.use_custom_classifier: pred = self.predict_with_custom_classifier(c)[0] - elif self.fetch_embeddings == True : - features = self.predict_with_custom_classifier(c)[0] - return features + elif self.fetch_embeddings == True: + feature = self.predict_with_custom_classifier(c) + features.append(feature) + continue else: pred = self.predict(c)[0] @@ -238,7 +237,9 @@ def analyze_recording(self, recording): end = start + recording.sample_secs self.results = results + self.features_list = features recording.detection_list = self.detections + recording.features_list = self.features_list def load_model(self): print("load model", not self.use_custom_classifier) @@ -258,7 +259,7 @@ def load_model(self): self.input_layer_index = self.input_details[0]["index"] # Get classification output or feature embeddings - if self.use_custom_classifier: + if self.use_custom_classifier or self.fetch_embeddings: self.output_layer_index = self.output_details[0]["index"] - 1 else: self.output_layer_index = self.output_details[0]["index"] @@ -312,7 +313,7 @@ def predict_with_custom_classifier(self, sample): feature_vector = features if self.fetch_embeddings: - return features + return feature_vector C_INTERPRETER = self.custom_interpreter C_INPUT_LAYER_INDEX = self.custom_input_layer_index From d69aacbdc339447446805d1096f330249f642fc1 Mon Sep 17 00:00:00 2001 From: MJWeldy <56649341+MJWeldy@users.noreply.github.com> Date: Sat, 5 Aug 2023 22:09:22 -0700 Subject: [PATCH 10/10] Update main.py --- src/birdnetlib/main.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/birdnetlib/main.py b/src/birdnetlib/main.py index 338e647..e5bb7a9 100644 --- a/src/birdnetlib/main.py +++ b/src/birdnetlib/main.py @@ -29,6 +29,7 @@ def __init__( self.analyzer = analyzer self.detections_dict = {} # Old format self.detection_list = [] + self.features_list = [] self.analyzed = False self.week_48 = week_48 self.date = date @@ -94,6 +95,9 @@ def detections(self): qualified_detections.append(detection) return qualified_detections + @property + def features(self): + return self.features_list @property def as_dict(self): @@ -299,4 +303,4 @@ def as_dict(self): if __name__ == "__main__": - pass \ No newline at end of file + pass