Skip to content

Commit 6fd9308

Browse files
authored
Allow to run custom classifier files without the labelsfile (#719)
* Allow to run custom classifier files without the labelsfile * added i8n
1 parent e395452 commit 6fd9308

14 files changed

Lines changed: 81 additions & 55 deletions

File tree

birdnet_analyzer/analyze/core.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,11 @@ def _set_params(
207207
if not os.path.isfile(cfg.LABELS_FILE):
208208
cfg.LABELS_FILE = custom_classifier.replace("Model_FP32.tflite", "Labels.txt")
209209

210-
cfg.LABELS = read_lines(cfg.LABELS_FILE)
210+
if not custom_classifier.endswith("Model_FP32.tflite") or not os.path.isfile(cfg.LABELS_FILE):
211+
cfg.LABELS_FILE = None
212+
cfg.LABELS = None
213+
else:
214+
cfg.LABELS = read_lines(cfg.LABELS_FILE)
211215
else:
212216
cfg.APPLY_SIGMOID = False
213217
# our output format
@@ -236,10 +240,13 @@ def _set_params(
236240
cfg.SPECIES_LIST_FILE = None
237241
cfg.SPECIES_LIST = get_species_list(cfg.LATITUDE, cfg.LONGITUDE, cfg.WEEK, cfg.LOCATION_FILTER_THRESHOLD)
238242

239-
lfile = os.path.join(cfg.TRANSLATED_LABELS_PATH, os.path.basename(cfg.LABELS_FILE).replace(".txt", f"_{locale}.txt"))
243+
if cfg.LABELS_FILE:
244+
lfile = os.path.join(cfg.TRANSLATED_LABELS_PATH, os.path.basename(cfg.LABELS_FILE).replace(".txt", f"_{locale}.txt"))
240245

241-
if locale not in ["en"] and os.path.isfile(lfile):
242-
cfg.TRANSLATED_LABELS = read_lines(lfile)
246+
if locale not in ["en"] and os.path.isfile(lfile):
247+
cfg.TRANSLATED_LABELS = read_lines(lfile)
248+
else:
249+
cfg.TRANSLATED_LABELS = cfg.LABELS
243250
else:
244251
cfg.TRANSLATED_LABELS = cfg.LABELS
245252

birdnet_analyzer/analyze/utils.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ def generate_raven_table(timestamps: list[str], result: dict[str, list], afile_p
9090

9191
for c in result[timestamp]:
9292
selection_id += 1
93-
label = cfg.TRANSLATED_LABELS[cfg.LABELS.index(c[0])]
93+
label = cfg.TRANSLATED_LABELS[cfg.LABELS.index(c[0])] if cfg.TRANSLATED_LABELS else c[0]
9494
code = cfg.CODES[c[0]] if c[0] in cfg.CODES else c[0]
9595
rstring += (
9696
f"{selection_id}\tSpectrogram 1\t1\t{start}\t{end}\t{low_freq}\t{high_freq}\t{label.split('_', 1)[-1]}\t{code}\t{c[1]:.4f}\t{afile_path}\t{start}\n"
@@ -130,7 +130,7 @@ def generate_audacity(timestamps: list[str], result: dict[str, list], result_pat
130130
rstring = ""
131131

132132
for c in result[timestamp]:
133-
label = cfg.TRANSLATED_LABELS[cfg.LABELS.index(c[0])]
133+
label = cfg.TRANSLATED_LABELS[cfg.LABELS.index(c[0])] if cfg.TRANSLATED_LABELS else c[0]
134134
ts = timestamp.replace("-", "\t")
135135
lbl = label.replace("_", ", ")
136136
rstring += f"{ts}\t{lbl}\t{c[1]:.4f}\n"
@@ -165,7 +165,7 @@ def generate_kaleidoscope(timestamps: list[str], result: dict[str, list], afile_
165165
start, end = timestamp.split("-", 1)
166166

167167
for c in result[timestamp]:
168-
label = cfg.TRANSLATED_LABELS[cfg.LABELS.index(c[0])]
168+
label = cfg.TRANSLATED_LABELS[cfg.LABELS.index(c[0])] if cfg.TRANSLATED_LABELS else c[0]
169169
rstring += "{},{},{},{},{},{},{},{:.4f},{:.4f},{:.4f},{},{},{}\n".format(
170170
parent_folder.rstrip("/"),
171171
folder_name,
@@ -220,7 +220,7 @@ def generate_csv(timestamps: list[str], result: dict[str, list], afile_path: str
220220

221221
for c in result[timestamp]:
222222
start, end = timestamp.split("-", 1)
223-
label = cfg.TRANSLATED_LABELS[cfg.LABELS.index(c[0])]
223+
label = cfg.TRANSLATED_LABELS[cfg.LABELS.index(c[0])] if cfg.TRANSLATED_LABELS else c[0]
224224
rstring += f"{start},{end},{label.split('_', 1)[0]},{label.split('_', 1)[-1]},{c[1]:.4f},{afile_path}"
225225

226226
if columns_map:
@@ -648,6 +648,9 @@ def analyze_file(item) -> dict[str, str] | None:
648648
# Get prediction
649649
pred = p[i]
650650

651+
if not cfg.LABELS:
652+
cfg.LABELS = [f"Species-{i}_Species-{i}" for i in range(len(pred))]
653+
651654
# Assign scores to labels
652655
p_labels = [
653656
p

birdnet_analyzer/gui/utils.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -596,15 +596,21 @@ def species_lists(opened=True):
596596
def on_custom_classifier_selection_click():
597597
file = select_file(("TFLite classifier (*.tflite)",), state_key="custom_classifier_file")
598598

599-
if file:
600-
labels = os.path.splitext(file)[0] + "_Labels.txt"
599+
if not file:
600+
return None, None
601601

602-
if not os.path.isfile(labels):
603-
labels = file.replace("Model_FP32.tflite", "Labels.txt")
602+
base_name = os.path.splitext(file)[0]
603+
labels = base_name + "_Labels.txt"
604604

605-
return file, gr.File(value=[file, labels], visible=True)
605+
if not os.path.isfile(labels):
606+
labels = file.replace("Model_FP32.tflite", "Labels.txt")
606607

607-
return None, None
608+
if not file.endswith("Model_FP32.tflite") or not os.path.isfile(labels):
609+
gr.Warning(loc.localize("species-list-custom-classifier-no-labelfile-warning"))
610+
611+
return file, gr.File(value=[file], visible=True)
612+
613+
return file, gr.File(value=[file, labels], visible=True)
608614

609615
classifier_selection_button.click(
610616
on_custom_classifier_selection_click,

birdnet_analyzer/lang/de.json

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
"analyze-locale-dropdown-info": "Lokalisierung für die übersetzten Trivialnamen der Arten in der Ausgabe",
33
"analyze-locale-dropdown-label": "Lokalisierung",
44
"analyze-start-button-label": "Analysieren",
5+
"embedding-file-output-accordion-label": "Dateiausgabe",
56
"embedding-settings-accordion-label": "Einstellungen",
67
"embedding-settings-audio-speed-slider-info": "Negative Werte verlangsamen das Audio, positive Werte beschleunigen es. Die Einstellung wird in der Datenbank gespeichert.",
78
"embedding-settings-audio-speed-slider-label": "Audio Geschwindigkeitsanpassung",
@@ -18,10 +19,6 @@
1819
"embeddings-db-already-exists-info": "Die Datenbank ist bereits vorhanden, wobei die Optionen für Audiogeschwindigkeit und Bandpassfilter aus den Datenbankeinstellungen verwendet werden.",
1920
"embeddings-db-dir-validation-message": "Bitte wählen Sie ein Datenbankverzeichnis aus",
2021
"embeddings-db-name-validation-message": "Bitte geben Sie einen Namen für die Datenbank an",
21-
"embedding-file-output-accordion-label": "Dateiausgabe",
22-
"embeddings-tab-file-output-directory-textbox-placeholder": "Wenn nicht ausgewählt, werden keine Ausgabedateien erzeugt.",
23-
"embeddings-tab-file-output-directory-textbox-label": "Ausgabeverzeichnis",
24-
"embeddings-select-file-output-directory-button-label": "Ausgabeverzeichnis auswählen",
2522
"embeddings-extract-tab-title": "Extrahieren",
2623
"embeddings-input-dir-validation-message": "Bitte wählen Sie ein Eingabeverzeichnis aus",
2724
"embeddings-search-crop-mode-radio-info": "Anpassen, wie das Abfrage Beispiel zugeschnitten wird, falls es länger als der Modellinput ist.",
@@ -45,9 +42,12 @@
4542
"embeddings-search-select-query-button-label": "Abfrage Beispiel auswählen",
4643
"embeddings-search-start-button-label": "Suche starten",
4744
"embeddings-search-tab-title": "Suche",
45+
"embeddings-select-file-output-directory-button-label": "Ausgabeverzeichnis auswählen",
4846
"embeddings-tab-dataset-info": "Wählen Sie den Namen für das Dataset",
4947
"embeddings-tab-dataset-label": "Dataset",
5048
"embeddings-tab-db-info": "Der Name der Datenbank",
49+
"embeddings-tab-file-output-directory-textbox-label": "Ausgabeverzeichnis",
50+
"embeddings-tab-file-output-directory-textbox-placeholder": "Wenn nicht ausgewählt, werden keine Ausgabedateien erzeugt.",
5151
"embeddings-tab-finish-info": "Extrahieren der Embeddings abgeschlossen. Gespeichert nach:",
5252
"embeddings-tab-select-db-directory-button-label": "Wählen Sie das Datenbankverzeichnis",
5353
"embeddings-tab-select-input-directory-button-label": "Wählen Sie das Audioverzeichnis (rekursiv)",
@@ -240,6 +240,7 @@
240240
"species-list-coordinates-week-slider-info": "Geben Sie die Woche des Jahres an, in der die Aufnahme gemacht wurde. Jeder Monat ist dabei in vier Wochen unterteilt wird. Wählen Sie einen Wert von 1 bis 48.",
241241
"species-list-coordinates-week-slider-label": "Woche",
242242
"species-list-coordinates-yearlong-checkbox-label": "Ganzjährig",
243+
"species-list-custom-classifier-no-labelfile-warning": "Keine Label-Datei im Format <customclassifier>_Labels.txt gefunden.",
243244
"species-list-custom-classifier-selection-button-label": "Klassifikator auswählen",
244245
"species-list-custom-list-file-label": "Datei",
245246
"species-list-radio-info": "Filtern Sie Arten, die in der Ausgabe enthalten sind.",

birdnet_analyzer/lang/en.json

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
"analyze-locale-dropdown-info": "Locale for the translated species common names in the output",
33
"analyze-locale-dropdown-label": "Locale",
44
"analyze-start-button-label": "Analyze",
5+
"embedding-file-output-accordion-label": "File output settings",
56
"embedding-settings-accordion-label": "Settings",
67
"embedding-settings-audio-speed-slider-info": "Negative values slow down, positive values speed up. The audio speed modification will be stored in the database.",
78
"embedding-settings-audio-speed-slider-label": "Audio speed modification",
@@ -18,10 +19,6 @@
1819
"embeddings-db-already-exists-info": "Database already exists, using audio speed and bandpass filter options from database settings.",
1920
"embeddings-db-dir-validation-message": "Please select a directory for the database",
2021
"embeddings-db-name-validation-message": "Please specify a name for the database",
21-
"embedding-file-output-accordion-label": "File output settings",
22-
"embeddings-tab-file-output-directory-textbox-placeholder": "If not selected, file output will be omitted.",
23-
"embeddings-tab-file-output-directory-textbox-label": "File output directory",
24-
"embeddings-select-file-output-directory-button-label": "Select file output directory",
2522
"embeddings-extract-tab-title": "Extract",
2623
"embeddings-input-dir-validation-message": "Please select an input directory",
2724
"embeddings-search-crop-mode-radio-info": "Adjust how to crop the query sample if it is longer than the model input.",
@@ -45,9 +42,12 @@
4542
"embeddings-search-select-query-button-label": "Select query sample",
4643
"embeddings-search-start-button-label": "Start search",
4744
"embeddings-search-tab-title": "Search",
45+
"embeddings-select-file-output-directory-button-label": "Select file output directory",
4846
"embeddings-tab-dataset-info": "Specify the dataset name",
4947
"embeddings-tab-dataset-label": "Dataset",
5048
"embeddings-tab-db-info": "The name of the database",
49+
"embeddings-tab-file-output-directory-textbox-label": "File output directory",
50+
"embeddings-tab-file-output-directory-textbox-placeholder": "If not selected, file output will be omitted.",
5151
"embeddings-tab-finish-info": "Finished extracting embeddings to:",
5252
"embeddings-tab-select-db-directory-button-label": "Select database directory",
5353
"embeddings-tab-select-input-directory-button-label": "Select input directory (recursive)",
@@ -240,6 +240,7 @@
240240
"species-list-coordinates-week-slider-info": "Specify the week of the year the recording was made, using a simplified system where each month is divided into four weeks. Choose a value from 1 to 48.",
241241
"species-list-coordinates-week-slider-label": "Week",
242242
"species-list-coordinates-yearlong-checkbox-label": "Year-round",
243+
"species-list-custom-classifier-no-labelfile-warning": "No label file found in the format <customclassifier>_Labels.txt.",
243244
"species-list-custom-classifier-selection-button-label": "Select classifier",
244245
"species-list-custom-list-file-label": "File",
245246
"species-list-radio-info": "Filter species that are included in output.",

birdnet_analyzer/lang/fi.json

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
"analyze-locale-dropdown-info": "Kieli käännetyille lajien yleisnimille tuloksissa",
33
"analyze-locale-dropdown-label": "Kieli",
44
"analyze-start-button-label": "Analysoi",
5+
"embedding-file-output-accordion-label": "Tiedostotulosteen asetukset",
56
"embedding-settings-accordion-label": "Asetukset",
67
"embedding-settings-audio-speed-slider-info": "Negatiiviset arvot hidastavat, positiiviset nopeuttavat. Äänen nopeuden muutos tallennetaan tietokantaan.",
78
"embedding-settings-audio-speed-slider-label": "Äänen nopeuden muutos",
@@ -41,18 +42,17 @@
4142
"embeddings-search-select-query-button-label": "Valitse kysely-näyte",
4243
"embeddings-search-start-button-label": "Aloita haku",
4344
"embeddings-search-tab-title": "Haku",
45+
"embeddings-select-file-output-directory-button-label": "Valitse tiedostotulosteen hakemisto",
4446
"embeddings-tab-dataset-info": "Määritä tietoaineiston nimi",
4547
"embeddings-tab-dataset-label": "Tietoaineisto",
4648
"embeddings-tab-db-info": "Tietokannan nimi",
49+
"embeddings-tab-file-output-directory-textbox-label": "Tiedostotulosteen hakemisto",
50+
"embeddings-tab-file-output-directory-textbox-placeholder": "Jos ei valittu, tiedostotulostetta ei luoda.",
4751
"embeddings-tab-finish-info": "Upotukset poimittu kohteeseen:",
4852
"embeddings-tab-select-db-directory-button-label": "Valitse tietokantahakemisto",
4953
"embeddings-tab-select-input-directory-button-label": "Valitse syötehakemisto (rekursiivinen)",
5054
"embeddings-tab-start-button-label": "Poimi upotukset",
5155
"embeddings-tab-title": "Upotukset",
52-
"embedding-file-output-accordion-label": "Tiedostotulosteen asetukset",
53-
"embeddings-tab-file-output-directory-textbox-placeholder": "Jos ei valittu, tiedostotulostetta ei luoda.",
54-
"embeddings-tab-file-output-directory-textbox-label": "Tiedostotulosteen hakemisto",
55-
"embeddings-select-file-output-directory-button-label": "Valitse tiedostotulosteen hakemisto",
5656
"eval-tab-accuracy-checkbox-info": "Tarkkuus mittaa mallin oikeiden ennusteiden prosenttiosuutta.",
5757
"eval-tab-annotation-col-accordion-label": "Merkintäsarakkeet",
5858
"eval-tab-annotation-selection-button-label": "Valitse merkintäkansio",
@@ -240,6 +240,7 @@
240240
"species-list-coordinates-week-slider-info": "Määritä viikko, jolloin äänitys tehtiin, käyttäen yksinkertaistettua järjestelmää, jossa jokainen kuukausi on jaettu neljään viikkoon. Valitse arvo väliltä 1-48.",
241241
"species-list-coordinates-week-slider-label": "Viikko",
242242
"species-list-coordinates-yearlong-checkbox-label": "Ympärivuotinen",
243+
"species-list-custom-classifier-no-labelfile-warning": "Label-tiedostoa muodossa <customclassifier>_Labels.txt ei löytynyt.",
243244
"species-list-custom-classifier-selection-button-label": "Valitse luokittelija",
244245
"species-list-custom-list-file-label": "Tiedosto",
245246
"species-list-radio-info": "Suodata lajit, jotka näytetään tuloksissa.",

birdnet_analyzer/lang/fr.json

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
"analyze-locale-dropdown-info": "Locale pour les noms communs des espèces traduits dans les résultats",
33
"analyze-locale-dropdown-label": "Locale",
44
"analyze-start-button-label": "Analyser",
5+
"embedding-file-output-accordion-label": "Paramètres de sortie de fichier",
56
"embedding-settings-accordion-label": "Paramètres",
67
"embedding-settings-audio-speed-slider-info": "Les valeurs négatives ralentissent, les valeurs positives accélèrent. La modification de la vitesse audio sera stockée dans la base de données.",
78
"embedding-settings-audio-speed-slider-label": "Modification de la vitesse audio",
@@ -41,18 +42,17 @@
4142
"embeddings-search-select-query-button-label": "Sélectionner l'échantillon de requête",
4243
"embeddings-search-start-button-label": "Démarrer la recherche",
4344
"embeddings-search-tab-title": "Recherche",
45+
"embeddings-select-file-output-directory-button-label": "Sélectionner le répertoire de sortie de fichier",
4446
"embeddings-tab-dataset-info": "Spécifiez le nom du jeu de données",
4547
"embeddings-tab-dataset-label": "Jeu de données",
4648
"embeddings-tab-db-info": "Le nom de la base de données",
49+
"embeddings-tab-file-output-directory-textbox-label": "Répertoire de sortie de fichier",
50+
"embeddings-tab-file-output-directory-textbox-placeholder": "Si non sélectionné, la sortie de fichier sera omise.",
4751
"embeddings-tab-finish-info": "Extraction des incorporations terminée vers :",
4852
"embeddings-tab-select-db-directory-button-label": "Sélectionner le répertoire de la base de données",
4953
"embeddings-tab-select-input-directory-button-label": "Sélectionner le répertoire d'entrée (récursif)",
5054
"embeddings-tab-start-button-label": "Extraire les incorporations",
5155
"embeddings-tab-title": "Incorporations",
52-
"embedding-file-output-accordion-label": "Paramètres de sortie de fichier",
53-
"embeddings-tab-file-output-directory-textbox-placeholder": "Si non sélectionné, la sortie de fichier sera omise.",
54-
"embeddings-tab-file-output-directory-textbox-label": "Répertoire de sortie de fichier",
55-
"embeddings-select-file-output-directory-button-label": "Sélectionner le répertoire de sortie de fichier",
5656
"eval-tab-accuracy-checkbox-info": "La précision mesure le pourcentage de prédictions correctes faites par le modèle.",
5757
"eval-tab-annotation-col-accordion-label": "Colonnes d'annotation",
5858
"eval-tab-annotation-selection-button-label": "Sélectionner le répertoire d'annotations",
@@ -240,6 +240,7 @@
240240
"species-list-coordinates-week-slider-info": "Spécifiez la semaine de l'année où l'enregistrement a été effectué, en utilisant un système simplifié où chaque mois est divisé en quatre semaines. Choisissez une valeur de 1 à 48.",
241241
"species-list-coordinates-week-slider-label": "Semaine",
242242
"species-list-coordinates-yearlong-checkbox-label": "Toute l'année",
243+
"species-list-custom-classifier-no-labelfile-warning": "Aucun fichier de labels trouvé au format <customclassifier>_Labels.txt.",
243244
"species-list-custom-classifier-selection-button-label": "Sélectionner un classificateur",
244245
"species-list-custom-list-file-label": "Fichier",
245246
"species-list-radio-info": "Filtrer les espèces qui sont incluses dans le résultat.",

0 commit comments

Comments
 (0)