175 lecturas

Aprendizaje automático para los pájaros: Construyendo su propio clasificador de vocalización de pájaros

por pictureint...20m2025/06/09
Read on Terminal Reader

Demasiado Largo; Para Leer

El concurso BirdCLEF+ 2025 desafía a los usuarios a 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. Esta guía detalla un enfoque para construir su propio clasificador de vocalización de aves que puede usarse en conjunto con el clasificador GBV para clasificar una selección más amplia de especies de aves. El enfoque emplea las mismas técnicas básicas descritas en el artículo de Google Research Separating Birdsong in the Wild for Classification.
featured image - Aprendizaje automático para los pájaros: Construyendo su propio clasificador de vocalización de pájaros
Picture in the Noise HackerNoon profile picture
0-item

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ón

Recientemente, 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ágenes

En 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_audioEl directorio es el componente más grande del conjunto de datos, que contiene 28.564 grabaciones de audio de.oggLas 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.csvEl 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
...


Amazon Kingfisher


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:

  1. Limited training data.
    • Class 1139490, for example, only contains 2 audio recordings. By contrast, class amakin1, which is a “known” GBV class, contains 89 recordings.
  2. Poor recording quality.
    • Highlighting class 1139490 again, both training recordings are of poor quality with one being particularly difficult to discern.

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_soundscapesEl 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_soundscapesEl directorio está vacío, excepto areadme.txtEste 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:

  1. Divide el audio grabado en 5 segmentos de segundo.
  2. Convertir segmentos de audio en espectrogramas de mel.
  3. 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 B0

Sin 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.


EfficientNet model family performance

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.


Sample mel spectrogram

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:

  1. Extrae aquellas clases en el conjunto de datos de la competencia BirdCLEF+ 2025 que no están cubiertas por el clasificador GBV.
  2. Carga datos de audio crudo a través del método load_training_audio.
  3. 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_FILESEsta constante especifica el número máximo de archivos de audio a cargar de una clase dada.1000para 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_audioEl método puede ser llamado aclassespará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_classesque posteriormente se trasladó a laload_training_audioEl método a través de laclassesLos 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_audioEl método acepta un booleanomake_copySi este parámetro esTrueLa lógica crea aprocessed_audiodirectorio y guarda una copia de cada muestra de audio como.wavarchivo al directorio. Las copias de audio se guardan en subdirectorios que reflejan la clase a la que pertenecen.processed_audioEl 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_audioEl 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:

  1. Opcionalmente, tira segmentos silenciosos y cortes de audio para eliminar la mayoría de las anotaciones humanas del audio crudo.
  2. 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_silenceEl 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_FRAMEySIL_HOP constants can be modified to adjust how the method "slides" over the raw audio. Similarly, the SIL_THRESHOLDEl 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_ANNOTconstante 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_annotLa 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_annotel método guarda el audio procesado en el disco bajo el directorioprocessed_audio via the save_audioparámetros, que se adoptan comoTrueEl 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_statsEl método se utiliza a continuaciónremove_silence_and_human_annotpara 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_statsClases con segundos totales de audio procesadoAbajoEl promedio se incrementa, elget_augmentation_turns_per_classEl 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_FACTORconstante 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_FACTORconstante 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_AUGMENTATIONSconstante 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_noiseychange_tempoLos 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_augmentationsel método ejecuta las ampliaciones utilizando la salida de laget_augmentations_turns_per_classPara aquellas clases que serán aumentadas, la lógica:

  1. Selecciona aleatoriamente una muestra de audio procesada (es decir, segmentos silenciosos ya eliminados) para la ampliación.
  2. Selecciona aleatoriamente la ampliación para realizar: (1) agregar ruido, (2) cambiar el ritmo, o (3) agregar ruido y cambiar el ritmo.
  3. 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:

  1. Splits processed audio data into training and validation lists.
  2. Divide el audio en 5 cuadros de segundo.
  3. Generates mel spectrograms for each 5 second audio frame.
  4. Resizes mel spectrograms to a target size of (224, 224).
  5. Opcionalmente carga muestras de datos pseudo-etiquetadas para aumentar los datos de entrenamiento.
  6. One-hot encodes training data and validation data labels.
  7. Construye objetos de conjunto de datos de TensorFlow a partir de listas de datos de formación y validación.
  8. 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_audioLos 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.SPLITconstante 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.frameel 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 ImageEl 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_soundscapesEl 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_LABELSconstante en laConfigCélula 2FalseEvitar el uso de datos pseudo-etiquetados.

Sección 3.6 - Codificación de etiquetas

The process_labelsEl 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 TensorFlowDatosObjetos
Datos

The TensorFlow data.Dataset.from_tensor_slicesEl método se utiliza para crear TensorFlowDatasetObjetos de las listas de datos de formación y validación.shuffleEl método se llama en el entrenamientoDataset object to shuffle training data before batching. The batchEl método se llama en ambosDatasetObjetos para batir los conjuntos de datos de capacitación y validación.BATCH_SIZEconstante 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_MIXUPconstante en laConfigCélula 2True.

Sección 4 - Formación Modelo

ElModel TrainingSección del cuaderno:

  1. Inicializa y configura un proyecto WandB para capturar datos de ejecución de entrenamiento.
  2. Construye y compila el modelo EfficientNet B0.
  3. Entrena el modelo.
  4. 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-classifiera su nombre de proyecto WandB deseado.

Sección 4.2 - Construcción y compilación del modelo EfficientNet B0

The build_modelEl 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_LAYERSEn laConfigCélula especifica el número de capas para no congelar.

La parte superior del modelo se reconstruye con una finalDenseUna 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_ALPHAyLOSS_GAMMAconstantes 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-4La tasa de aprendizaje disminuye en 2 etapas en función del número de épocas.EPOCHSconstante en laConfigLa celda.

Sección 4.4 - Modelo de ahorro

ElsaveEl método se llama compiladomodelDespué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 :

Training results

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_soundscapesCada archivo de audio de soundcapes se divide en 5 cuadros de segundo.MAX_FILESconstante 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_THRESHOLDLa constante está definida en elConfigCélula deSection 5del cuaderno de inferencia. Las predicciones son salida a 2 archivos:

  1. Un archivo preds.csv que captura la probabilidad de predicción y predicción para cada pieza de sonido de 5 segundos.
  2. 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_audioEl método cargará los datos de audio de todas las clases.MAX_FILESyLOAD_SLICELas 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.

Trending Topics

blockchaincryptocurrencyhackernoon-top-storyprogrammingsoftware-developmenttechnologystartuphackernoon-booksBitcoinbooks