Introducción
Los científicos utilizan sistemas automatizados para estudiar grandes ecosistemas.autonomous recording units (ARUs)son utilizados para grabar audio que puede ser utilizado para ayudar a identificar diferentes especies de animales e insectos. Esta información puede ser utilizada para desarrollar una mejor comprensión de la distribución de las especies dentro de un entorno dado.Separación de la canción de pájaros en el salvaje por clasificación“Los ecólogos utilizan las aves para comprender los sistemas alimentarios y la salud forestal, por ejemplo, si hay más hortalizas en un bosque, eso significa que hay mucha madera muerta.” Además, notan el valor de la identificación basada en audio: “[Dado] que las aves comunican y marcan el territorio con canciones y llamadas, es más eficiente identificarlas por oído.
Separación de la canción de pájaros en el salvaje por clasificaciónRecientemente, elBirdCLEF+ 2025La competición se inició enKaggleBajo el paraguas de laImágenesOrganización. ImageCLEF apoya la investigación en la anotación cross-language y la recuperación de imágenes en una variedad de dominios.El objetivo de la competencia es directo: diseñar un modelo de clasificación que pueda predecir con precisión las especies de aves a partir de una grabación de audio.
BirdCLEF+ 2025ImágenesEn un principio, la tarea parece trivial dada la disponibilidad de laCaracterísticas de Google Bird Vocalization (GBV)También conocido comoPerchEl clasificador GBV está entrenado en casi 11.000 especies de aves y por lo tanto es una elección obvia como modelo de clasificación.
Características de Google Bird Vocalization (GBV)Sin embargo, la competencia incluye especies de aves que se encuentran fuera del conjunto de entrenamiento del clasificador GBV. Como resultado, el clasificador GBV sólo logra ~60% de precisión en el conjunto de datos de prueba de la competencia BirdCLEF+ 2025.
Esta guía detalla un enfoque para construir su propio clasificador de vocalización de aves que puede usarse en combinación con el clasificador GBV para clasificar una selección más amplia de especies de aves.ArtículoEl diseño aprovecha el conjunto de datos de la competencia BirdCLEF+ 2025 para la formación.
Datos de entrenamiento
ElBirdCLEF+ 2025 Formación, incluyendo los archivos de soporte, es de aproximadamente 12 GB. Los principales directorios y archivos que componen la estructura del conjunto de datos son:
birdclef_2025
|__ train_audio
|__ train_soundscapes
|__ test_soundscapes
recording_location.txt
taxonomy.csv
train.csv
train_audio
Eltrain_audio
El directorio es el componente más grande del conjunto de datos, que contiene 28.564 grabaciones de audio de.ogg
Las grabaciones de audio se agrupan en subdirectorías que representan cada una de una especie particular de ave, por ejemplo:
train_audio
|__amakin1
|__ [AUDIO FILES]
|__amekes
|__ [AUDIO FILES]
...
Eltaxonomy.csv
El archivo se puede utilizar para buscar los nombres científicos y comunes reales de las especies de aves representadas por los nombres de subdirectorios, por ejemplo:
SUB-DIRECTORY NAME SCIENTIFIC NAME COMMON NAME
amakin1 Chloroceryle amazona Amazon Kingfisher
amekes Falco sparverius American Kestrel
...
El conjunto de datos de la competición incluye 206 especies de aves únicas, es decir, 206 clases.Introduction63 de estas clases sonnocubierto por laGBV ClassifierEstosNon-GBVLas clases generalmente se etiquetan utilizando un identificador numérico de clase:
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
Algunas de lasNon-GBVLas clases se caracterizan por:
- 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
Estas dos condiciones conducen a un desequilibrio significativo entre las clases en cuanto a la cantidad de audio y calidad de audio disponibles.
Muchas de las grabaciones de audio de entrenamiento en ambosGBVyNon-GBVLas clases también incluyen el habla humana, con el hablante anotando la grabación con detalles como la especie de pájaro que se grabó y la ubicación de la grabación.Pero no todos- casos, las anotaciones siguen las vocalizaciones de pájaros registradas.
Las tácticas utilizadas para abordar el desequilibrio de clase y la presencia de anotaciones del habla humana se discuten en elBuilding the ClassifierLa Sección.
train_soundscapes
Eltrain_soundscapes
El directorio contiene casi 10.000unlabeledLas canciones de la banda sonora, como se discutirá en elBuilding the Classifieresta sección, estas grabaciones de audio pueden incorporarse a los datos de entrenamiento a través depseudo-labeling.
test_soundscapes
Eltest_soundscapes
El directorio está vacío, excepto areadme.txt
Este directorio está lleno de un conjunto oculto de audio de prueba cuando se envían los resultados de predicción al concurso BirdCLEF+ 2025.
Construyendo el Classificador
Enfoque básico y fondo
El enfoque básico utilizado porGoogle InvestigaciónPara entrenar su clasificador de vocalización de pájaros es el siguiente:
- Divide el audio grabado en 5 segmentos de segundo.
- Convertir segmentos de audio en espectrogramas de mel.
- Entrenar un clasificador de imagen en los espectrógrafos de mel.
El mismo enfoque se seguirá en esta guía.El clasificador de imágenes que se capacitará es el de GoogleEficiencia B0Si usted está familiarizado con elEfficientNetfamilia de modelos, sabes que fueron diseñados para un procesamiento de imagen eficiente.
Eficiencia B0Sin embargo, antes de que las muestras de audio puedan ser divididas y convertidas en espectrogramas de mel, debemos abordar los problemas de desequilibrio de clase y de anotación humana mencionados en elTraining DataEn general, estos problemas se abordarán respectivamente a través de la ampliación de datos y el recorte de las muestras de audio.
Antes de sumergirse en el diseño real, las siguientes sub-secciones proporcionan una breve información de fondo.
Modelos eficientes
Google ha presentado su familia deEfficientNetmodelos en 2019 como un conjunto deconvolutional neural networkmodelos que superaron a los modelos de última generación, en ese momento, en términos de tamaño y rendimiento.
eficiencia2Los modelos, lanzados en 2021, ofrecen un rendimiento y una eficiencia de parámetros aún mejores.
A pesar de haber entrenadoImágenesLos modelos EfficientNet han demostrado su utilidad cuando se transfiere a otros conjuntos de datos, convirtiéndolos en una elección atractiva como la tecnología de clasificación para este proyecto.
Mel Espectrogramas
Un espectrograma de mel es una representación visual de una señal de audio. podría ser mejor analogizado a un mapa de calor para el sonido.
El eje x de un espectrograma de mel representa la dimensión temporal de la señal de audio, y el eje y representa las frecuencias de los sonidos dentro de la señal. Sin embargo, en lugar de mostrar todas las frecuencias a lo largo de una escala continua, las frecuencias se agrupan enmel bandsEstas bandas son, a su vez, espaciadas utilizando elmel scaleLa escala de la miel es unalogarithmicEs una escala que se aproxima al sistema auditivo humano y cómo los humanos perciben el sonido.Los colores del espectrograma de mel representan la amplitud de los sonidos dentro de las bandas.Los colores más brillantes representan amplitudes más altas, mientras que los colores más oscuros representan amplitudes más bajas.
Diseño
Mi objetivo al discutir el diseño es proporcionar una revisión de alto nivel del enfoque sin entrar en demasiados detalles.Cajas de notas("Note de entrenamiento") que se compone de 4 secciones principales:
- Sección 1: Carga de datos de audio.
- Sección 2: Procesamiento de datos de audio.
- Sección 3: Generación de espectrogramas de mel y preparación de la entrada.
- Capítulo 4: Formación de modelos.
Observará que las primeras 2 celdas de cada sección principal son (1) las importaciones utilizadas por esa sección y (2) unaConfigCélula que define las constantes utilizadas en esa sección y en las secciones posteriores.
En realidad, el libro comienza conSection 0donde se importan los paquetes básicos de Python utilizados en todo el notebook. Esta sección también incluye la lógica para iniciar sesión enWeights & Biases("WandB") para el seguimiento de las carreras de entrenamiento. Necesitarás unir tu propio WandBAPI keyEn el cuaderno como aKaggle SecretUsando el nombreWANDB_API_KEY
.
Como se discutió en laTraining DataEn la sección, los sonidos de entrenamiento sin etiquetas se pueden incorporar a los datos de entrenamiento a través de pseudo-etiquetado.Section 3.5 - Pseudo-LabelingTenga en cuenta que los entornos Kaggle no GPU están limitados a 30 GiB de memoria.
Un modelo entrenado siguiendo la configuración experimental descrita en las subsecciones siguientes ha sido publicado en Kaggle aquí. Si lo desea, puede usar este modelo sin entrenar su propio y saltar directamente a la sección de Inferencia en Ejercicio para ejecutar inferencias en audio de canciones de pájaros.
Un modelo entrenado después de la configuración experimental descrita en las subsecciones siguientes ha sido publicado en KaggleAquíSi lo desea, puede usar este modelo sin entrenar su propio y saltar directamente alRunning InferenceSección para ejecutar la inferencia en el audio de la canción de pájaros.
Sección 1 - Carga de datos de audio
ElAudio Data LoadingSección del cuaderno:
- Extrae aquellas clases en el conjunto de datos de la competencia BirdCLEF+ 2025 que no están cubiertas por el clasificador GBV.
- Carga datos de audio crudo a través del método load_training_audio.
- Crea un directorio processed_audio y guarda una copia de los datos de audio cargados como archivos .wav en ese directorio.
ElConfigLa celda de esta sección incluye aMAX_FILES
Esta constante especifica el número máximo de archivos de audio a cargar de una clase dada.1000
para asegurarse de que todos los archivos de audio se carguen paranon-GBVPuede que necesite ajustar esta constante para su propia configuración experimental. Por ejemplo, si está cargando datos de audio deallEs posible que necesite ajustar esta constante a un valor más bajo para evitar agotar la memoria disponible.
Elload_training_audio
El método puede ser llamado aclasses
parámetro, que es una lista de clases cuyo audio se cargará.non-GBVLas clases se almacenan como una lista y se asignan a la variablemissing_classes
que posteriormente se trasladó a laload_training_audio
El método a través de laclasses
Los parámetros.
# `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']
Puede cargar todas las clases 206 BirdCLEF+ 2025 pasando una lista vacía como el parámetro de las clases.
Puede cargar todas las clases 206 BirdCLEF+ 2025 pasando una lista vacía como el parámetro de las clases.
El método load_training_audio también acepta un parámetro booleano use_slice opcional. Este parámetro funciona con la constante LOAD_SLICE definida en la celda Config. El parámetro use_slice y la constante LOAD_SLICE no se utilizan con esta implementación. Sin embargo, se pueden utilizar para cargar una cantidad específica de audio de cada archivo. Por ejemplo, para cargar solo 5 segundos de audio de cada archivo de audio, ajuste LOAD_SLICE a 160000, que se calcula como 5 veces la tasa de muestreo de 32000; y pase True al parámetro use_slice.
El método load_training_audio también acepta un parámetro booleano use_slice opcional. Este parámetro funciona con la constante LOAD_SLICE definida en la celda Config. El parámetro use_slice y la constante LOAD_SLICE no se utilizan con esta implementación. Sin embargo, se pueden utilizar para cargar una cantidad específica de audio de cada archivo. Por ejemplo, para cargar solo 5 segundos de audio de cada archivo de audio, ajuste LOAD_SLICE a 160000, que se calcula como 5 veces la tasa de muestreo de 32000; y pase True al parámetro use_slice.
Elload_training_audio
El método acepta un booleanomake_copy
Si este parámetro esTrue
La lógica crea aprocessed_audio
directorio y guarda una copia de cada muestra de audio como.wav
archivo al directorio. Las copias de audio se guardan en subdirectorios que reflejan la clase a la que pertenecen.processed_audio
El directorio se utiliza en la sección siguiente para guardar muestras de audio modificadas en el disco sin afectar a los directorios de conjuntos de datos BirdCLEF+ 2025.
Elload_training_audio
El método devuelve un diccionario de datos de audio cargados utilizando los nombres de clases como claves. Cada valor en el diccionario es una lista de tuples del formulario.(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 - Audio Data Processing
The Audio Data ProcessingSección del cuaderno:
- Opcionalmente, tira segmentos silenciosos y cortes de audio para eliminar la mayoría de las anotaciones humanas del audio crudo.
- Optionally augments audio for minority classes to help address the class imbalance. Audio augmentation consists of (1) adding a randomly generated noise signal, (2) changing the tempo of the raw audio, or (3) adding a randomly generated noise signal and changing the tempo of the raw audio.
Sección 2.1 - Detección de segmentos silenciosos
Eldetect_silence
El método se utiliza para "deslizarse" sobre cada muestra de audio crudo e identificar los segmentos silenciosos comparando laroot-mean square (RMS)valor de un segmento dado a un umbral especificado. Si el RMS está por debajo del umbral, el segmento se identifica como un segmento silencioso.Configceldas de esta sección controlan el comportamiento de ladetect_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
The SIL_FRAME
ySIL_HOP
constants can be modified to adjust how the method "slides" over the raw audio. Similarly, the SIL_THRESHOLD
El valor puede ser modificado para hacer que el método sea más agresivo o conservador con respecto a la identificación de segmentos silenciosos.
The method outputs a dictionary of silent segment markers for each file in each class. Audio files with no detected silent segments are identified by empty lists.
{'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
ElUSE_REMOVE_SILENCE_AND_HUMAN_ANNOT
constante definida en elConfigLa celda de esta sección especifica si el audio debe ser despojado de los segmentos silenciososandDescargar Para EliminarMás human annotations.
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
method. Further, it implements logic to handle human annotations based on a simple observation: many audio samples, namely those with human annotations, tendTener la siguiente estructura:
| < 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
La lógica utiliza elANNOT_BREAKPOINT
constant in the Config cell to check if a silent segment marker lies outside the window specified by ANNOT_BREAKPOINT
, expressed in number of seconds. If it does, the logic slices the raw audio at that marker and only retains the data that occurs before it. A manual inspection of processed audio during experimentation revealed this approach to be satisfactory. However, as mentioned in the Training Data section, there are AlgunosLas grabaciones de audio donde la anotación humanaPredecesoresla grabación de la canción de los pájaros. La lógica descrita aquínot 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.
La segunda 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.
Elremove_silence_and_human_annot
el método guarda el audio procesado en el disco bajo el directorioprocessed_audio
via the save_audio
parámetros, que se adoptan comoTrue
El método devuelve un diccionario detotalsegundos de audio procesado para cada clase.
{'1139490': 14, '1192948': 29, '1194042': 24, '126247': 48, '1346504': 40, '134933': 32, '135045': 77, ...}
The get_audio_stats
El método se utiliza a continuaciónremove_silence_and_human_annot
para obtener el número medio de segundos de audio en todas las clases.
Section 2.3 - Calculating Augmentation Turns for Minority Classes
Como se mencionó en elTraining DataAumentar se utiliza en esta sección de notas para ayudar a abordar el desequilibrio aprovechando el número medio de segundos de audio en todas las clases, según lo dispuesto por laget_audio_stats
Clases con segundos totales de audio procesadoAbajoEl promedio se incrementa, elget_augmentation_turns_per_class
El método determina el número de giros de ampliación para cada clase minoritaria utilizando el número medio de segundos por muestra de audio procesada.
TURNS = (AVG_SECS_AUDIO_ACROSS_CLASSES - TOTAL_SECS_AUDIO_FOR_CLASS)/AVG_SECS_PER_AUDIO_SAMPLE
Minority classes further below the average will have more augmentation turns versus minority classes nearer the average which will have fewer augmentation turns.
The get_augmentation_turns_per_class
includes a AVG_SECS_FACTOR
constante que se puede utilizar para ajustar el valor de
El número medio de segundos de audio en todas las clases.La constante puede usarse para hacer que la lógica sea más conservadora o agresiva al calcular el número de giros de ampliación.
The get_augmentation_turns_per_class
includes a AVG_SECS_FACTOR
constante que se puede utilizar para ajustar el valor de
El número medio de segundos de audio en todas las clases.La constante puede usarse para hacer que la lógica sea más conservadora o agresiva al calcular el número de giros de ampliación.
Sección 2.4 - Aumentos en marcha
ElUSE_AUGMENTATIONS
constante definida en elConfigLa celda de esta sección especifica si el audio debe ser aumentado.
USE_AUGMENTATIONS = True
As mentioned earlier, audio augmentation consists of (1) adding a randomly generated noise signal, (2) changing the tempo of the raw audio, or (3) adding a randomly generated noise signal and changing the tempo of the raw audio. The add_noise
ychange_tempo
Los métodos encapsulan la lógica para agregar una señal de ruido y cambiar el ritmo respectivamente.El rango de señal de ruido y el rango de cambio de ritmo se pueden ajustar a través de las siguientes constantes en elConfigLa celda:
NOISE_RNG_LOW = 0.0001
NOISE_RNG_HIGH = 0.0009
TEMPO_RNG_LOW = 0.5
TEMPO_RNG_HIGH = 1.5
Elrun_augmentations
el método ejecuta las ampliaciones utilizando la salida de laget_augmentations_turns_per_class
Para aquellas clases que serán aumentadas, la lógica:
- Selecciona aleatoriamente una muestra de audio procesada (es decir, segmentos silenciosos ya eliminados) para la ampliación.
- Selecciona aleatoriamente la ampliación para realizar: (1) agregar ruido, (2) cambiar el ritmo, o (3) agregar ruido y cambiar el ritmo.
- Guardar el audio aumentado en el disco bajo la clase adecuada dentro del directorio processed_audio.
Mientras que la lógica del notebook aumenta las clases minoritarias con los segundos totales de audio por debajo de la media, ignora aquellas clases con los segundos totales de audio por encima de la media.
Section 3 - Mel Spectrogram Generation and Input Preparation
The Mel Spectrogram Generation and Input Preparation section of the notebook:
- Splits processed audio data into training and validation lists.
- Divide el audio en 5 cuadros de segundo.
- Generates mel spectrograms for each 5 second audio frame.
- Resizes mel spectrograms to a target size of
(224, 224)
. - Opcionalmente carga muestras de datos pseudo-etiquetadas para aumentar los datos de entrenamiento.
- One-hot encodes training data and validation data labels.
- Construye objetos de conjunto de datos de TensorFlow a partir de listas de datos de formación y validación.
- Optionally uses MixUp logic to augment training data.
Sección 3.1 - División de datos de audio procesados
Los datos de audio procesados se cargan desde elprocessed_audio
Los datos se dividen en 4 listas:
training_audio
training_labels
validation_audio
validation_labels
Las etiquetas son, por supuesto, los nombres de clase asociados con los ejemplos de audio.SPLIT
constante definida en elConfigcélula controla la proporción de división entre las listas de datos de formación y de validación. los datos de audio procesados se mueven antes de dividir.
Section 3.2 - Splitting Audio into Frames
El audio se divide en 5 segmentos de segundo utilizando elframe_audio
method, which itself uses the TensorFlow signal.frame
el método para dividir cada ejemplo de audio. Las siguientes constantes en elConfigLa célula controla la operación de división:
FRAME_LENGTH = 5
FRAME_STEP = 5
Section 3.3 - Generating Mel Spectrograms
Los espectrogramas de Mel se generan por cada cuadro de audio de 5 segundos generado enSection 3.2 via the audio2melspec
method. The following constants in the ConfigCélula especifique los parámetros utilizados en la generación de los espectrogramas de mel, como el número de bandas de mel, la frecuencia mínima y la frecuencia máxima:
# 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 potencialidad range of most bird vocalizations. However, some bird species can vocalize outside this range.
Section 3.4 - Resizing Mel Spectrograms
The to_melspectrogram_image
method is used to convert each mel spectrogram to a pillow
Image
object. Each Image
El objeto se reemplaza posteriormente por(224, 224)
que es la dimensión de entrada esperada por el modelo EfficientNet B0.
Section 3.5 - Loading Pseudo-Labeled Data
Como se mencionó en elTraining Data section, the train_soundscapes
El directorio contiene casi 10.000unlabeledgrabaciones de audio de canciones de pájaros. Estas grabaciones de audio se pueden incorporar a los datos depseudo-labeling. A simple process to create pseudo-labeled data is as follows:
- Train a classifier without pseudo-labeled data.
- Descarga de archivos de audio de Soundcape.
- Segmenta cada sonido en 5 cuadros de segundo.
- Generar espectrógrafos de mel para cada cuadro de 5 segundos y cambiar el tamaño a (224, 224).
- Execute predicciones en cada espectrograma de mel redimensionado usando el clasificador que entrenó en el primer paso.
- Mantenga las predicciones por encima de un nivel de confianza deseado y guarde los espectrógrafos de mel para esas predicciones a discos bajo la etiqueta de clase predicha.
- Entrena de nuevo tu clasificador utilizando los datos etiquetados con psuedo.
Los datos pseudo-etiquetados pueden mejorar el rendimiento de su clasificador.Si desea generar sus propios datos pseudo-etiquetados, debe continuar con las secciones restantes para entrenar un clasificadorsindatos pseudo-etiquetados. Luego, utilice su clasificador para crear su propio conjunto de datos pseudo-etiquetados utilizando el proceso descrito anteriormente.
Esta implementación no utiliza datos pseudo-etiquetados. Sin embargo, puede modificar elRunning InferenceSección para generar datos pseudo-etiquetados.
Establezca elUSE_PSEUDO_LABELS
constante en laConfigCélula 2False
Evitar el uso de datos pseudo-etiquetados.
Sección 3.6 - Codificación de etiquetas
The process_labels
El método se utiliza para etiquetas de codificación única. etiquetas de codificación única se devuelven como arreglos NumPy y se añaden a las listas de etiquetas de formación y de validación.
Sección 3.7 - Convertir las listas de datos de formación y validación a TensorFlowDatos
Objetos
Datos
The TensorFlow data.Dataset.from_tensor_slices
El método se utiliza para crear TensorFlowDataset
Objetos de las listas de datos de formación y validación.shuffle
El método se llama en el entrenamientoDataset
object to shuffle training data before batching. The batch
El método se llama en ambosDataset
Objetos para batir los conjuntos de datos de capacitación y validación.BATCH_SIZE
constante en laConfigLa célula controla el tamaño del batch.
Sección 3.8 - Uso de MixUp para aumentar los datos de entrenamiento
Como ya puede saber, MixUp es una técnica de ampliación de datos que mezcla eficazmente dos imágenes para crear una nueva muestra de datos.La clase para la imagen mezclada es una mezcla de las clases asociadas con las 2 imágenes originales.mix_up
method, along with the sample_beta_distribution
method, encapsulates the optional MixUp logic.
Esta implementación utiliza MixUp para aumentar los datos de entrenamiento. Para usar MixUp,USE_MIXUP
constante en laConfigCélula 2True
.
Sección 4 - Formación Modelo
ElModel TrainingSección del cuaderno:
- Inicializa y configura un proyecto WandB para capturar datos de ejecución de entrenamiento.
- Construye y compila el modelo EfficientNet B0.
- Entrena el modelo.
- Guardar el modelo entrenado en disco.
Sección 4.1 - Inicialización y configuración del proyecto WandB
Asegúrese de que ha adjuntado su propia clave de API WandB como un Kaggle Secret al cuaderno y que el método de inicio de sesión WandB en la Sección 0 del cuaderno ha devuelto True.
Asegúrese de que ha adjuntado su propia clave de API WandB como unaKaggle Secretpara el cuaderno y que el WandBlogin
method in Section 0El cuaderno ha vueltoTrue
.
ElConfigcélula en esta sección incluye la lógica para inicializar y configurar un nuevo proyecto WandB (si el proyecto ya no existe) que capturará los datos de ejecución de entrenamiento:
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)
Obviamente, puede cambiar el nombre del proyectomy-bird-vocalization-classifier
a su nombre de proyecto WandB deseado.
Sección 4.2 - Construcción y compilación del modelo EfficientNet B0
The build_model
El método se utiliza para cargar el modelo EfficientNet B0 pre-entrenado con los pesos de ImageNet y sin la capa superior:
model = EfficientNetB0(include_top=False, input_tensor=inputs, weights="imagenet")
El modelo se congela para aprovechar los pesos ImageNet pre-entrenados con el objetivo decongelado(es decir, tren) capas en la fase final del modelo:
# 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)
La constanteUNFREEZE_LAYERS
En laConfigCélula especifica el número de capas para no congelar.
La parte superior del modelo se reconstruye con una finalDense
Una capa que refleja el número de especies de aves.Categorical focal cross-entropyse elige como la función de pérdida para ayudar a abordar el desequilibrio de clase.LOSS_ALPHA
yLOSS_GAMMA
constantes en laConfigLas células se utilizan con la función de pérdida.
Sección 4.3 - Formación Modelo
Elfit
method is called on the compiled model
from Section 4.2para realizar el entrenamiento.Tenga en cuenta que alearning rate schedulerel callback,lr_scheduler
, se utiliza en lugar de una tasa de aprendizaje constante. Una tasa de aprendizaje inicial de4.0e-4
La tasa de aprendizaje disminuye en 2 etapas en función del número de épocas.EPOCHS
constante en laConfigLa celda.
Sección 4.4 - Modelo de ahorro
Elsave
El método se llama compiladomodel
Después del entrenamiento para guardar el modelo en disco.
model.save("bird-vocalization-classifier.keras")
Resultados de entrenamiento
La ejecución del cuaderno debe producir los siguientes resultados de entrenamiento, suponiendo que se utilizó la configuración experimental que se describió en elBuilding the ClassifierSección :
Como se ve, la exactitud está justo por encima del 90% y la exactitud de la validación es de aproximadamente 70% después de la formación durante 30 épocas. Sin embargo, como se ve, la exactitud de la validación fluctúa significativamente. Esta variación se atribuye en parte al desequilibrio de la clase con la memoria disponible limitando el uso de aumentos adicionales para abordar plenamente el desequilibrio. Los resultados sugieren que el modelo sufre de sobrecarga en los datos de entrenamiento y no se generaliza como se esperaba. Sin embargo, el modelo se puede utilizar para predicciones junto al clasificador GBV de acuerdo con el objetivo original.
Correr la inferencia
EsteCajas de notasLa lógica de notas de inferencia utiliza tanto el modelo de clasificador GBV como el modelo que has entrenado en la sección anterior.train_soundscapes
Cada archivo de audio de soundcapes se divide en 5 cuadros de segundo.MAX_FILES
constante definida en elConfigCélula deSection 0 of the notebook controls the number of soundscapes audio files that are loaded for inference.
El cuaderno de inferencia primero genera predicciones utilizando el clasificador GBV. Las predicciones para las 143 clases del conjunto de datos de competencia BirdCLEF+ 2025 conocidas para el clasificador GBV se aislan si la probabilidad máxima entre las 143 clases "conocidas" es superior o igual aGBV_CLASSIFIER_THRESHOLD
, entonces la clase predicida GBV se selecciona como la clase verdadera. Si la probabilidad máxima entre las 143 clases "conocidas" está por debajoGBV_CLASSIFIER_THRESHOLD
, se asume que la clase verdadera está entre las 63 clases "inconocidas" para el clasificador GBV - es decir, las clases utilizadas para entrenar el modelo en la sección anterior. la lógica luego ejecuta predicciones usando el modelo finamente ajustado.
ElGBV_CLASSIFIER_THRESHOLD
La constante está definida en elConfigCélula deSection 5del cuaderno de inferencia. Las predicciones son salida a 2 archivos:
- Un archivo preds.csv que captura la probabilidad de predicción y predicción para cada pieza de sonido de 5 segundos.
- Un archivo submission.csv que captura todas las probabilidades de clase en el formato para el concurso BirdCLEF+ 2025.
Establezca el camino a su modelo finamente ajustado en la primera celda de la Sección 4 del cuaderno de inferencias.
Establezca el camino a su modelo finamente ajustado en la primera celda de la Sección 4 del cuaderno de inferencias.
Trabajo futuro
El cuaderno de entrenamiento se puede utilizar para entrenar un modelo en todas las clases 206 BirdCLEF+ 2025, eliminando la necesidad del clasificador GBV, al menos con respecto al conjunto de datos de la competencia.[]
Para elload_training_audio
El método cargará los datos de audio de todas las clases.MAX_FILES
yLOAD_SLICE
Las constantes se pueden utilizar para limitar la cantidad de audio cargado para trabajar dentro de los límites de un entorno de notas Kaggle.
Por supuesto, se puede entrenar un modelo más preciso utilizando una mayor cantidad de datos de entrenamiento. Idealmente, se utilizaría un mayor número de ampliaciones para abordar el desequilibrio de la clase. Además, se podrían implementar otras técnicas de ampliación, como CutMix, para aumentar aún más los datos de entrenamiento. Sin embargo, estas estrategias requieren un entorno de desarrollo más robusto.