Introduction
Les scientifiques utilisent des systèmes automatisés pour étudier de grands écosystèmes.autonomous recording units (ARUs)sont utilisés pour enregistrer l'audio qui peut être utilisé pour aider à identifier différentes espèces d'animaux et d'insectes. Ces informations peuvent être utilisées pour développer une meilleure compréhension de la distribution des espèces au sein d'un environnement donné.Séparer la chanson des oiseaux dans le sauvage pour la classification"Les écologistes utilisent les oiseaux pour comprendre les systèmes alimentaires et la santé des forêts - par exemple, s'il y a plus de forestiers dans une forêt, cela signifie qu'il y a beaucoup de bois mort."En outre, ils notent la valeur de l'identification audio-basée: "[Puisque] les oiseaux communiquent et marquent le territoire avec des chansons et des appels, il est le plus efficace de les identifier par l'oreille.
Séparer la chanson des oiseaux dans le sauvage pour la classificationRécemment, leLe BirdCLEF+ 2025La compétition lancéeKaggleSous le parapluie de laImagerieImageCLEF soutient l'enquête sur l'annotation et la récupération d'images dans une variété de domaines.L'objectif de la compétition est direct: concevoir un modèle de classification qui peut prédire avec précision les espèces d'oiseaux à partir d'un enregistrement audio.
Le BirdCLEF+ 2025ImagerieAu début, la tâche semble triviale étant donné la disponibilité duGoogle Bird Vocalization (GBV) Classifiateurégalement connu commePerchLe classificateur GBV est formé sur près de 11 000 espèces d’oiseaux et constitue donc un choix évident en tant que modèle de classification.
Google Bird Vocalization (GBV) ClassifiateurCependant, la compétition inclut les espèces d'oiseaux qui se trouvent en dehors de l'ensemble de formation du classificateur GBV. En conséquence, le classificateur GBV n'atteint que ~60% de précision sur le groupe de données de test de la compétition BirdCLEF+ 2025.
Ce guide détaille une approche pour construire votre propre classificateur de vocalisation des oiseaux qui peut être utilisé en combinaison avec le classificateur GBV pour classer une sélection plus large d'espèces d'oiseaux.Article deLa conception utilise le dataset de compétition BirdCLEF+ 2025 pour la formation.
Données de formation
LeLes données de formation BirdCLEF+ 2025, y compris les fichiers de support, est d'environ 12 Go. Les principaux répertoires et fichiers qui composent la structure des ensembles de données sont:
birdclef_2025
|__ train_audio
|__ train_soundscapes
|__ test_soundscapes
recording_location.txt
taxonomy.csv
train.csv
train_audio
Letrain_audio
Le répertoire est le plus grand composant de l'ensemble de données, contenant 28 564 enregistrements audio de formation..ogg
Les enregistrements audio sont regroupés en sous-répertoires qui représentent chacune une espèce particulière d'oiseau, par exemple :
train_audio
|__amakin1
|__ [AUDIO FILES]
|__amekes
|__ [AUDIO FILES]
...
Letaxonomy.csv
Le fichier peut être utilisé pour rechercher les noms scientifiques et communs réels des espèces d'oiseaux représentés par les noms de sous-répertoire, par exemple :
SUB-DIRECTORY NAME SCIENTIFIC NAME COMMON NAME
amakin1 Chloroceryle amazona Amazon Kingfisher
amekes Falco sparverius American Kestrel
...
L'ensemble de données de la compétition comprend 206 espèces d'oiseaux uniques, c'est-à-dire 206 classes.Introduction64 de ces classes sontpascouvert par leGBV ClassifierCesNon-GBVLes classes sont généralement étiquetées à l'aide d'un identifiant numérique de classe :
1139490, 1192948, 1194042, 126247, 1346504, 134933, 135045, 1462711, 1462737, 1564122, 21038, 21116, 21211, 22333, 22973, 22976, 24272, 24292, 24322, 41663, 41778, 41970, 42007, 42087, 42113, 46010, 47067, 476537, 476538, 48124, 50186, 517119, 523060, 528041, 52884, 548639, 555086, 555142, 566513, 64862, 65336, 65344, 65349, 65373, 65419, 65448, 65547, 65962, 66016, 66531, 66578, 66893, 67082, 67252, 714022, 715170, 787625, 81930, 868458, 963335, grasal4, verfly, y00678
Certains desNon-GBVLes classes sont caractérisées par :
- Limited training data.
- Class
1139490
, for example, only contains 2 audio recordings. By contrast, classamakin1
, which is a “known” GBV class, contains 89 recordings.
- Class
- Poor recording quality.
- Highlighting class
1139490
again, both training recordings are of poor quality with one being particularly difficult to discern.
- Highlighting class
Ces deux conditions conduisent à un déséquilibre significatif entre les classes en termes de quantité de qualité audio et audio disponibles.
La plupart des enregistrements audio de formation à travers les deuxGBV and Non-GBVLes classes comprennent également le langage humain, avec l'orateur annotant l'enregistrement avec des détails tels que l'espèce d'oiseau qui a été enregistré et l'emplacement de l'enregistrement.Mais pas tous- les cas, les annotations suivent les vocalisations des oiseaux enregistrées.
Les tactiques utilisées pour faire face au déséquilibre de classe et à la présence d’annotations de la parole humaine sont discutées dans leBuilding the ClassifierLa section .
train_soundscapes
Letrain_soundscapes
La bibliothèque compte près de 10 000unlabeled audio recordings of birdsong. As will be discussed in the Building the Classifiersection, ces enregistrements audio peuvent être incorporés dans les données de formation viapseudo-labeling.
test_soundscapes
Letest_soundscapes
Le tableau est vide, sauf pour unreadme.txt
Ce répertoire est rempli d'un ensemble caché d'audio de test lors de la soumission des résultats de prédiction au concours BirdCLEF+ 2025.
Construire le classificateur
Approche de base et contexte
L’approche de base utilisée parRecherche Googlepour former leur classificateur de vocalisation des oiseaux est le suivant:
- Diviser l'audio enregistré en 5 segments de seconde.
- Convertir les segments audio en spectrogrammes mel.
- Formez un classificateur d'image sur les spectrogrammes de mel.
La même approche sera suivie dans ce guide.Le classificateur d'image qui sera formé est celui de GoogleEfficacité B0Si vous êtes familier avec leEfficientNetfamille de modèles, vous savez qu'ils ont été conçus pour un traitement d'image efficace.
Efficacité B0Cependant, avant que les échantillons audio puissent être divisés et convertis en spectrogrammes de mollusques, nous devons faire face aux problèmes de déséquilibre de classe et d'annotation humaine mentionnés dans le document.Training Data section. Broadly, these problems will be addressed respectively via data augmentation and slicing the audio samples.
Avant de plonger dans la conception réelle, les sous-sections suivantes fournissent quelques informations de fond brèves.
Modèles efficaces
Google a dévoilé sa famille deEfficientNetmodèles en 2019 comme un ensemble deconvolutional neural networkDes modèles qui dépassaient les modèles de pointe, à l’époque, en termes de taille et de performance.
Efficacité2Les modèles, lancés en 2021, offrent une performance et une efficacité paramétriques encore meilleures.
Bien que formé àImaginaireLes modèles EfficientNet ont démontré leur utilité lorsqu’ils sont transférés à d’autres ensembles de données, ce qui en fait un choix attrayant en tant que technologie de classification pour ce projet.
Spectrogrammes de Mel
Un spectrogramme de mel est une représentation visuelle d'un signal audio. Il pourrait être le mieux analogisé à une carte thermique pour le son.
L'axe x d'un spectrogramme de mel représente la dimension temporelle du signal audio, et l'axe y représente les fréquences des sons dans le signal. Cependant, au lieu d'afficher toutes les fréquences le long d'une échelle continue, les fréquences sont regroupées enmel bandsCes bandes sont, à leur tour, espacées en utilisant lemel scaleL’échelle du miel est unelogarithmicC'est une échelle qui rapproche le système auditif humain et la façon dont les humains perçoivent le son.Les couleurs du spectrogramme de la farine représentent l'amplitude des sons dans les bandes.Les couleurs plus brillantes représentent des amplitudes plus élevées tandis que les couleurs plus sombres représentent des amplitudes plus basses.
Le design
Mon objectif dans la discussion de la conception est de fournir un examen de haut niveau de l'approche sans entrer dans trop de détails.Télécharger Notebook(« note d’entraînement ») qui se compose de 4 sections principales :
- Section 1: Audio data loading.
- Section 2 : Traitement des données audio.
- Section 3: Génération et préparation des spectrogrammes Mel.
- Chapitre 4 : Formation des modèles.
Vous remarquerez que les 2 premières cellules de chaque section principale sont (1) les importations utilisées par cette section et (2) uneConfigcellule définissant les constantes utilisées dans cette section et dans les sections ultérieures.
L’écriture commence en fait parSection 0où les paquets Python de base utilisés dans l'ensemble du bloc-notes sont importés. Cette section comprend également la logique pour vous connecter àWeights & Biases("WandB") pour suivre les cours d'entraînement. Vous devrez joindre votre propre WandBAPI keyDans le cahier comme aKaggle SecretUtiliser le nomWANDB_API_KEY
.
Comme nous l’avons discuté dans laTraining Datasection, les sonorités de formation non étiquetées peuvent être incorporées dans les données de formation via la pseudo-étiquetage.Section 3.5 - Pseudo-LabelingGardez à l'esprit que les environnements Kaggle non GPU sont limités à 30 GiB de mémoire.
Un modèle formé suivant la configuration expérimentale décrite dans les sous-sections suivantes a été posté sur Kaggle ici. Si vous le souhaitez, vous pouvez utiliser ce modèle sans vous entraîner vous-même et sauter directement à la section Running Inference pour exécuter une inference sur l'audio de la chanson d'oiseau.
Un modèle formé suivant la configuration expérimentale décrite dans les sous-sections suivantes a été posté sur Kaggle ici. Si vous le souhaitez, vous pouvez utiliser ce modèle sans vous entraîner vous-même et sauter directement à la section Running Inference pour exécuter une inference sur l'audio de la chanson d'oiseau.
Section 1 - Téléchargement de données audio
LeAudio Data LoadingSection du Notebook :
- Extrait des classes de l'ensemble de données de la compétition BirdCLEF+ 2025 qui ne sont pas couvertes par le classificateur GBV.
- Télécharge les données audio brutes via la méthode load_training_audio.
- Créer un répertoire processed_audio et enregistrer une copie des données audio chargées en tant que fichiers .wav dans ce répertoire.
LeConfigLa cellule de cette section comprend uneMAX_FILES
Cette constante spécifie le nombre maximum de fichiers audio à charger à partir d'une classe donnée.1000
pour vous assurer que tous les fichiers audio sont chargés pournon-GBVVous devrez peut-être ajuster cette constante pour votre propre configuration expérimentale. Par exemple, si vous téléchargez des données audio à partir deallDans les classes, vous devrez peut-être définir cette constante à une valeur inférieure pour éviter d’épuiser la mémoire disponible.
Leload_training_audio
La méthode peut être appelée Aclasses
paramètre, qui est une liste de classes dont l'audio sera chargé.non-GBVLes classes sont stockées en tant que liste et affectées à la variablemissing_classes
Ce qui est ensuite transmis à laload_training_audio
La méthode via leclasses
Le paramètre.
# `missing_classes` list
['1139490', '1192948', '1194042', '126247', '1346504', '134933', '135045', '1462711', '1462737', '1564122', '21038', '21116', '21211', '22333', '22973', '22976', '24272', '24292', '24322', '41663', '41778', '41970', '42007', '42087', '42113', '46010', '47067', '476537', '476538', '48124', '50186', '517119', '523060', '528041', '52884', '548639', '555086', '555142', '566513', '64862', '65336', '65344', '65349', '65373', '65419', '65448', '65547', '65962', '66016', '66531', '66578', '66893', '67082', '67252', '714022', '715170', '787625', '81930', '868458', '963335', 'grasal4', 'verfly', 'y00678']
Vous pouvez charger toutes les 206 classes BirdCLEF+ 2025 en passant une liste vide en tant que paramètre des classes.
Vous pouvez charger toutes les classes 206 BirdCLEF+ 2025 en passant une liste vide en tant queclasses
Le paramètre.
La méthode load_training_audio accepte également un paramètre boolean use_slice optionnel. Ce paramètre fonctionne avec la constante LOAD_SLICE définie dans la cellule Config. Le paramètre use_slice et la constante LOAD_SLICE ne sont pas utilisés avec cette mise en œuvre. Cependant, ils peuvent être utilisés pour charger une quantité spécifique d'audio de chaque fichier. Par exemple, pour charger seulement 5 secondes d'audio de chaque fichier audio, définissez LOAD_SLICE à 160000, ce qui est calculé comme 5 fois le taux d'échantillonnage de 32000; et passez True au paramètre use_slice.
La méthode load_training_audio accepte également un paramètre boolean use_slice optionnel. Ce paramètre fonctionne avec la constante LOAD_SLICE définie dans la cellule Config. Le paramètre use_slice et la constante LOAD_SLICE ne sont pas utilisés avec cette mise en œuvre. Cependant, ils peuvent être utilisés pour charger une quantité spécifique d'audio de chaque fichier. Par exemple, pour charger seulement 5 secondes d'audio de chaque fichier audio, définissez LOAD_SLICE à 160000, ce qui est calculé comme 5 fois le taux d'échantillonnage de 32000; et passez True au paramètre use_slice.
The load_training_audio
La méthode accepte un booleanmake_copy
Lorsque ce paramètre estTrue
La logique crée unprocessed_audio
répertoire et enregistre une copie de chaque échantillon audio comme un.wav
Les copies audio sont enregistrées dans des sous-répertoires reflétant la classe à laquelle elles appartiennent.processed_audio
Le répertoire est utilisé dans la section suivante pour enregistrer les échantillons audio modifiés sur le disque sans affecter les répertoires de datasets BirdCLEF+ 2025.
Leload_training_audio
méthode renvoie un dictionnaire de données audio chargées en utilisant les noms de classe comme clés. Chaque valeur dans le dictionnaire est une liste de tuples du formulaire(AUDIO_FILENAME, AUDIO_DATA)
:
{'1139490': [('CSA36389.ogg', tensor([[-7.3379e-06, 1.0008e-05, -8.9483e-06, ..., 2.9978e-06,
3.4201e-06, 3.8700e-06]])), ('CSA36385.ogg', tensor([[-2.9545e-06, 2.9259e-05, 2.8138e-05, ..., -5.8680e-09, -2.3467e-09, -2.6546e-10]]))], '1192948': [('CSA36388.ogg', tensor([[ 3.7417e-06, -5.4138e-06, -3.3517e-07, ..., -2.4159e-05, -1.6547e-05, -1.8537e-05]])), ('CSA36366.ogg', tensor([[ 2.6916e-06, -1.5655e-06, -2.1533e-05, ..., -2.0132e-05, -1.9063e-05, -2.4438e-05]])), ('CSA36373.ogg', tensor([[ 3.4144e-05, -8.0636e-06, 1.4903e-06, ..., -3.8835e-05, -4.1840e-05, -4.0731e-05]])), ('CSA36358.ogg', tensor([[-1.6201e-06, 2.8240e-05, 2.9543e-05, ..., -2.9203e-04, -3.1059e-04, -2.8100e-04]]))], '1194042': [('CSA18794.ogg', tensor([[ 3.0655e-05, 4.8817e-05, 6.2794e-05, ..., -5.1450e-05,
-4.8535e-05, -4.2476e-05]])), ('CSA18802.ogg', tensor([[ 6.6640e-05, 8.8530e-05, 6.4143e-05, ..., 5.3802e-07, -1.7509e-05, -4.8914e-06]])), ('CSA18783.ogg', tensor([[-8.6866e-06, -6.3421e-06, -3.1125e-05, ..., -1.7946e-04, -1.6407e-04, -1.5334e-04]]))] ...}
The method also returns basic statistics describing the data loaded for each class as a comma-separated-value string. You can optionally export these statistics to inspect the data.
class,sampling_rate,num_files,num_secs_loaded,num_files_loaded
1139490,32000,2,194,2
1192948,32000,4,420,4
1194042,32000,3,91,3
...
Section 2 - Traitement des données audio
The Audio Data ProcessingSection du Notebook :
- Optionally strips silent segments and slices audio to eliminate most human annotations from raw audio. Stripping silent segments eliminates irrelevant parts of the audio signal.
- L'augmentation audio consiste à (1) ajouter un signal de bruit généré au hasard, (2) changer le rythme de l'audio brut, ou (3) ajouter un signal de bruit généré au hasard et changer le rythme de l'audio brut.
Section 2.1 - Détection de segments silencieux
The detect_silence
method is used to "slide" over each raw audio sample and identify silent segments by comparing the root-mean square (RMS) value of a given segment to a specified threshold. If the RMS is below the threshold, the segment is identified as a silent segment. The following constants specified in the Configcellules de cette section contrôlent le comportement dudetect_silence
method:
SIL_FRAME_PCT_OF_SR = 0.25
SIL_FRAME = int(SR * SIL_FRAME_PCT_OF_SR)
SIL_HOP = int(1.0 * SIL_FRAME)
SIL_THRESHOLD = 5e-5
SIL_REPLACE_VAL = -1000 # Value used to replace audio signal values within silent segments
LeSIL_FRAME
and SIL_HOP
constants can be modified to adjust how the method "slides" over the raw audio. Similarly, the SIL_THRESHOLD
value can be modified to make the method more aggressive or conservative with respect to identification of silent segments.
La méthode produit un dictionnaire de marqueurs de segments silencieux pour chaque fichier dans chaque classe. fichiers audio sans segments silencieux détectés sont identifiés par des listes vides.
{'1139490': {'CSA36389.ogg': [0, 8000, 16000, 272000, 280000, 288000, 296000, 304000], 'CSA36385.ogg': [0, 8000, 16000, 24000, 240000, 248000, 256000]}, '1192948': {'CSA36388.ogg': [0, 8000, 16000, 24000, 256000, 264000, 272000, 288000], 'CSA36366.ogg': [0, 8000, 16000, 24000, 256000, 264000, 272000, 280000, 288000], 'CSA36373.ogg': [0, 8000, 16000, 24000, 256000, 264000, 272000, 288000], 'CSA36358.ogg': [8000]}, '1194042': {'CSA18794.ogg': [], 'CSA18802.ogg': [], 'CSA18783.ogg': [0, 8000, 16000, 24000, 600000, 608000, 616000]}, '126247': {'XC941297.ogg': [], 'iNat1109254.ogg': [], 'iNat888527.ogg': [], 'iNat320679.ogg': [0], 'iNat888729.ogg': [], 'iNat146584.ogg': []}, '1346504': {'CSA18803.ogg': [0, 8000, 16000, 24000, 3000000, 3008000, 3016000], 'CSA18791.ogg': [], 'CSA18792.ogg': [], 'CSA18784.ogg': [0, 8000, 16000, 1232000, 1240000, 1248000], 'CSA18793.ogg': [0, 8000, 16000, 24000, 888000]} ...}
Section 2.2 - Removing Silent Segments and Eliminating Human Annotations
The USE_REMOVE_SILENCE_AND_HUMAN_ANNOT
constant defined in the Config cell of this section specifies if audio should be stripped of silent segments and sliced to remove Le plusLes annotations humaines.
USE_REMOVE_SILENCE_AND_HUMAN_ANNOT = True
The remove_silence_and_human_annot
method strips silent segments from audio samples using the output from the detect_silence
En outre, il met en œuvre la logique pour traiter les annotations humaines basées sur une simple observation: de nombreux échantillons audio, à savoir ceux avec des annotations humaines,tend to have the following structure:
| < 10s | ~1s | |
| BIRDSONG | SILENCE | HUMAN ANNOTATION |
The birdsong and human annotation sections themselves may contain silent segments. However, as seen in the diagram above, the bird vocalization recordings often occur within the first few seconds of audio. Therefore, a simple, if imperfect, approach to deal with human annotations is to slice audio samples at the first silent segment marker that occurs outside of a specified window, under the assumption that a human annotation follows that silent segment. The remove_silence_and_human_annot
logic uses the ANNOT_BREAKPOINT
constant in the Configcellule pour vérifier si un marqueur de segment silencieux se trouve en dehors de la fenêtre spécifiée parANNOT_BREAKPOINT
Si elle le fait, la logique coupe l'audio brut à ce marqueur et ne conserve que les données qui se produisent avant. Une inspection manuelle de l'audio traité pendant l'expérimentation a révélé que cette approche était satisfaisante.Training Data section, there are someenregistrements audio où l'annotation humaineprecedes the birdsong recording. The logic described here does pas address those cases. Some audio samples feature long sequences of recorded birdsong and these samples often do not have silent segments. Such samples are unaffected by the previously described logic and kept in their entirety.
Une seconde constante,SLICE_FRAME
, can be optionally used in a final processing step to return an even more refined slice of the processed audio. Set SLICE_FRAME
to the number of seconds of processed audio that you want to retain.
The remove_silence_and_human_annot
méthode enregistre l'audio traité sur le disque sous le répertoireprocessed_audio
à travers lesave_audio
paramètre, qui est utilisé commeTrue
La méthode renvoie un dictionnaire deTotalementdes secondes d'audio traitées pour chaque classe.
{'1139490': 14, '1192948': 29, '1194042': 24, '126247': 48, '1346504': 40, '134933': 32, '135045': 77, ...}
The get_audio_stats
La méthode est utilisée comme suitremove_silence_and_human_annot
to get the average number of seconds of audio across all classes.
Section 2.3 - Calculating Augmentation Turns for Minority Classes
As mentioned in the Training Data section, the classes are not balanced. Augmentation is used in this notebook section to help address the imbalance leveraging the average number of seconds of audio across all classes, as provided by the get_audio_stats
Classes avec des secondes totales d'audio traitéesci-dessous the average are augmented. The get_augmentation_turns_per_class
La méthode détermine le nombre de tours d'augmentation pour chaque classe minoritaire en utilisant le nombre moyen de secondes par échantillon audio traité.
TURNS = (AVG_SECS_AUDIO_ACROSS_CLASSES - TOTAL_SECS_AUDIO_FOR_CLASS)/AVG_SECS_PER_AUDIO_SAMPLE
Les classes minoritaires inférieures à la moyenne auront plus de tours d'augmentation par rapport aux classes minoritaires plus proches de la moyenne qui auront moins de tours d'augmentation.
Le get_augmentation_turns_per_class inclut une constante AVG_SECS_FACTOR qui peut être utilisée pour ajuster la valeur pour
La constante peut être utilisée pour rendre la logique plus conservatrice ou plus agressive lors du calcul du nombre de tours d'augmentation.
Le get_augmentation_turns_per_class inclut une constante AVG_SECS_FACTOR qui peut être utilisée pour ajuster la valeur pour
La constante peut être utilisée pour rendre la logique plus conservatrice ou plus agressive lors du calcul du nombre de tours d'augmentation.
Section 2.4 - Running Augmentations
The USE_AUGMENTATIONS
constant defined in the Config cell of this section specifies if audio should be augmented.
USE_AUGMENTATIONS = True
Comme mentionné précédemment, l'augmentation audio consiste à (1) ajouter un signal de bruit généré au hasard, (2) changer le rythme de l'audio brut, ou (3) ajouter un signal de bruit généré au hasard et changer le rythme de l'audio brut.add_noise
etchange_tempo
methods encapsulate the logic for adding a noise signal and changing the tempo respectively. The noise signal range and tempo change range can be adjusted via the following constants in the ConfigLa cellule :
NOISE_RNG_LOW = 0.0001
NOISE_RNG_HIGH = 0.0009
TEMPO_RNG_LOW = 0.5
TEMPO_RNG_HIGH = 1.5
Lerun_augmentations
méthode exécute les augmentations en utilisant la sortie de laget_augmentations_turns_per_class
method. For those classes that will be augmented, the logic:
- Sélectionne au hasard un échantillon audio traité (c'est-à-dire des segments silencieux déjà supprimés) pour augmentation.
- Sélectionne aléatoirement l'augmentation pour effectuer: (1) ajouter du bruit, (2) changer le rythme, ou (3) ajouter du bruit et changer le rythme.
- Saves the augmented audio to disk under the appropriate class within the
processed_audio
directory.
Alors que la logique des notes augmente les classes minoritaires avec des secondes d'audio totales inférieures à la moyenne, elle ignore les classes avec des secondes d'audio totales supérieures à la moyenne.
Section 3 - Mel Spectrogram Generation and Input Preparation
LeMel Spectrogram Generation and Input Preparation section of the notebook:
- Splits processed audio data into training and validation lists.
- Splits audio into 5 second frames.
- Génère des spectrogrammes pour chaque cadre audio de 5 secondes.
- Resizes mel spectrograms to a target size of
(224, 224)
. - Optionally loads pseudo-labeled data samples to augment training data.
- One-hot encodes training data and validation data labels.
- Constructs TensorFlow
Dataset
objects from training and validation data lists. - Optionnellement, il utilise la logique MixUp pour augmenter les données de formation.
Section 3.1 - Splitting Processed Audio Data
Processed audio data is loaded from the processed_audio
folder. The data is split into 4 lists:
training_audio
training_labels
validation_audio
validation_labels
Labels are, of course, the class names associated with the audio examples. The SPLIT
définie en permanence dans laConfig cell controls the split ratio between the training and validation data lists. Processed audio data is shuffled before splitting.
Section 3.2 - Splitting Audio into Frames
Audio is split into 5 second segments using the frame_audio
method, which itself uses the TensorFlow signal.frame
méthode pour diviser chaque exemple audio. Les constantes suivantes dans leConfigLa cellule contrôle l'opération de division :
FRAME_LENGTH = 5
FRAME_STEP = 5
Section 3.3 - Generating Mel Spectrograms
Mel spectrograms are generated for each 5 second audio frame generated in Section 3.2à travers leaudio2melspec
Les constantes suivantes dans laConfig cell specify the parameters used when generating the mel spectrograms, such as the number of mel bands, minimum frequency, and maximum frequency:
# Mel spectrogram parameters
N_FFT = 1024 # FFT size
HOP_SIZE = 256
N_MELS = 256
FMIN = 50 # minimum frequency
FMAX = 14000 # maximum frequency
The frequency band was chosen to reflect the potentialToutefois, certaines espèces d'oiseaux peuvent vocaliser en dehors de cette gamme.
Section 3.4 - Resizing Mel Spectrograms
The to_melspectrogram_image
La méthode est utilisée pour convertir chaque spectrogramme en unpillow
Image
object. Each Image
L'objet est ensuite remis à(224, 224)
qui est la dimension d'entrée attendue par le modèle EfficientNet B0.
Section 3.5 - Téléchargement des données pseudo-labellées
As mentioned in the Training DataSection, letrain_soundscapes
directory contains nearly 10,000 unlabeled audio recordings of birdsong. These audio recordings can be incorporated into the training data via pseudo-labeling. A simple process to create pseudo-labeled data is as follows:
- Train a classifier without pseudo-labeled data.
- Télécharger des fichiers audio audio.
- Segmentez chaque son en 5 frames de seconde.
- Générer des spectrogrammes de farine pour chaque cadre de 5 secondes et redimensionner à (224, 224).
- Run predictions on each resized mel spectrogram using the classifier that you trained in the first step.
- Keep the predictions above a desired confidence level and save the mel spectrograms for those predictions to disk under the predicted class label.
- Train your classifier again using the psuedo-labeled data.
Pseudo-labeled data can improve the performance of your classifier. If you want to generate your own pseudo-labeled data, you should continue with the remaining sections to train a classifier sans pseudo-labeled data. Then, use your classifier to create your own set of pseudo-labeled data using the process outlined above. Finally, re-train your classifier using your pseudo-labeled data.
This implementation does not use pseudo-labeled data. However, you can modify the inference notebook referenced in the Running Inferencegénérer des données pseudo-étiquetées.
Mettez leUSE_PSEUDO_LABELS
constante dans laConfigcellule àFalse
pour contourner l’utilisation de données pseudo-étiquetées.
Section 3.6 - Codage des étiquettes
The process_labels
method is used to one-hot encode labels. One-hot encoded labels are returned as NumPy arrays and added to the training label and validation label lists.
Section 3.7 - Converting Training and Validation Data Lists to TensorFlow Dataset
Objects
Dataset
Le TensorFlowdata.Dataset.from_tensor_slices
La méthode est utilisée pour créer TensorFlowDataset
objects from the training and validation data lists. The shuffle
La méthode est appelée à la formationDataset
object to shuffle training data before batching. The batch
La méthode est appelée les deuxDataset
Objets pour batter les ensembles de données de formation et de validation.BATCH_SIZE
constant in the Config cell controls the batch size.
Section 3.8 - Utilisation de MixUp pour augmenter les données de formation
Comme vous le savez peut-être déjà, MixUp est une technique d'augmentation de données qui mélange efficacement deux images ensemble pour créer un nouvel échantillon de données.mix_up
La méthode, ainsi que lesample_beta_distribution
méthode, encapsule la logique MixUp optionnelle.
This implementation uses MixUp to augment the training data. To use MixUp, set the USE_MIXUP
constante dans laConfig cell to True
.
Chapitre 4 - Formation
LeModel TrainingSection du Notebook :
- Initialiser et configurer un projet WandB pour capturer les données d'exécution de la formation.
- Créer et compiler le modèle EfficientNet B0.
- Entraînez le modèle.
- Saves the trained model to disk.
Section 4.1 - Initialisation et configuration du projet WandB
Ensure that you have attached your own WandB API key as a Kaggle Secretà la note et que le WandBlogin
method in Section 0 of the notebook has returned True
.
Assurez-vous que vous avez joint votre propre clé API WandB en tant queKaggle Secretà la note et que le WandBlogin
Méthode enSection 0Le cahier des notes est de retourTrue
.
LeConfigLa cellule de cette section comprend la logique pour initialiser et configurer un nouveau projet WandB (si le projet n'existe pas déjà) qui capture les données d'exécution de la formation:
wandb.init(project="my-bird-vocalization-classifier")
config = wandb.config
config.batch_size = BATCH_SIZE
config.epochs = 30
config.image_size = IMG_SIZE
config.num_classes = len(LABELS)
Obviously, you can change the project name my-bird-vocalization-classifier
to your desired WandB project name.
Section 4.2 - Building and Compiling the EfficientNet B0 Model
Lebuild_model
La méthode est utilisée pour charger le modèle EfficientNet B0 pré-entraîné avec des poids ImageNet et sans la couche supérieure:
model = EfficientNetB0(include_top=False, input_tensor=inputs, weights="imagenet")
Le modèle est gelé pour tirer parti des poids ImageNet pré-entraînés avec l'objectif de neunfreeze(c'est-à-dire train) les couches dans la phase finale du modèle:
# Unfreeze last `unfreeze_layers` layers and add regularization
for layer in model.layers[-unfreeze_layers:]:
if not isinstance(layer, layers.BatchNormalization):
layer.trainable = True
layer.kernel_regularizer = tf.keras.regularizers.l2(L2_RATE)
The constant UNFREEZE_LAYERS
in the Configcellule spécifie le nombre de couches à ne pas congeler.
La partie supérieure du modèle est reconstruite avec une finaleDense
layer reflecting the number bird species classes. Categorical focal cross-entropyest choisi comme fonction de perte pour aider à résoudre le déséquilibre de classe.LOSS_ALPHA
etLOSS_GAMMA
constants in the ConfigLes cellules sont utilisées avec la fonction de perte.
Section 4.3 - Modèle de formation
Lefit
La méthode est appelée sur le compilémodel
from Section 4.2Pour suivre la formation, notez que alearning rate schedulerLe callback,lr_scheduler
, is used instead of a constant learning rate. An initial learning rate of 4.0e-4
Le taux d'apprentissage est réduit en 2 étapes en fonction du nombre d'époques.EPOCHS
constante dans laConfigde cellule.
Section 4.4 - Modèle d'épargne
Lesave
La méthode est appelée sur le compilémodel
après la formation pour enregistrer le modèle sur disque.
model.save("bird-vocalization-classifier.keras")
Résultats de la formation
L'exécution du bloc-notes devrait produire les résultats de formation suivants, en supposant que vous ayez utilisé la configuration expérimentale décrite dans leBuilding the Classifier section:
Comme on l'a vu, la précision est juste au-dessus de 90% et la précision de validation est d'environ 70% après l'entraînement pendant 30 époques. Cependant, comme on l'a vu, la précision de validation fluctue considérablement. Cette variation est partiellement attribuée au déséquilibre de la classe avec la mémoire disponible limitant l'utilisation d'augmentations supplémentaires pour résoudre pleinement le déséquilibre. Les résultats suggèrent que le modèle souffre d'une suralimentation sur les données d'entraînement et ne généralise pas comme on l'espérait.
Courir à l'inference
CeciTélécharger Notebook("notebook d'inférence") peut être utilisé pour exécuter l'inférence. La logique de notebook d'inférence utilise à la fois le modèle de classificateur GBV et le modèle que vous avez formé dans la section précédente.train_soundscapes
Chaque fichier audio soundcapes est divisé en 5 frames de seconde.MAX_FILES
constant defined in the Config cell of Section 0Le numéro de l'appareil contrôle le nombre de fichiers audio qui sont chargés pour la déduction.
Les prédictions pour les 143 classes de données de la compétition BirdCLEF+ 2025 connues pour le classificateur GBV sont isolées si la probabilité maximale parmi les 143 classes «connues» est supérieure ou égale àGBV_CLASSIFIER_THRESHOLD
, alors la classe prédite GBV est sélectionnée comme la classe vraie. Si la probabilité maximale parmi les 143 classes "connues" est inférieureGBV_CLASSIFIER_THRESHOLD
, on suppose que la vraie classe est parmi les 63 classes "inconnues" pour le classificateur GBV - c'est-à-dire les classes utilisées pour former le modèle dans la section précédente.
LeGBV_CLASSIFIER_THRESHOLD
La constante est définie dans laConfigcellule deSection 5Les prévisions sont la sortie à 2 fichiers:
- A
preds.csv
file that captures the prediction and prediction probability for each 5-second soundscape slice. - Un fichier submission.csv qui capture toutes les probabilités de classe au format du concours BirdCLEF+ 2025.
Définissez le chemin vers votre modèle finement ajusté dans la première cellule de la section 4 du bloc-notes de conclusion.
Définissez le chemin vers votre modèle finement ajusté dans la première cellule deSection 4 of the inference notebook.
Future Work
Le cahier d'apprentissage peut être utilisé pour former un modèle sur toutes les classes 206 BirdCLEF+ 2025, éliminant ainsi la nécessité du classificateur GBV, au moins en ce qui concerne le groupe de données de la compétition.[]
à laload_training_audio
La méthode chargera les données audio de toutes les classes.MAX_FILES
etLOAD_SLICE
Les constantes peuvent être utilisées pour limiter la quantité d'audio chargé afin de travailler dans les limites d'un environnement de note-note Kaggle.
Bien sûr, un modèle plus précis peut être formé en utilisant une plus grande quantité de données de formation. Idéalement, un plus grand nombre d'augmentations serait utilisé pour résoudre le déséquilibre de la classe. En outre, d'autres techniques d'augmentation, telles que CutMix, pourraient être mises en œuvre pour augmenter davantage les données de formation.