Как группа польских женщин использовала глубокое обучение, акустику и орнитологию для классификации птиц

Вы когда-нибудь задумывались, как зовут птицу, которую вы только что слышали поет? Группа женщин из местного польского отделения организации Women in Machine Learning & Data Science (WiMLDS) не только подумала об этом, но и решила самостоятельно создать решение, позволяющее обнаруживать птиц. виды - в зависимости от звука, который они издают.

Этот проект был разработан как совместная работа над реальной проблемой, которую машинное обучение может помочь решить с помощью типичной структуры проекта в области науки о данных, включая исследование и анализ данных, подготовку данных, создание моделей, анализ результатов (или улучшение модели. ) и финальная презентация.

После нескольких недель работы группе удалось создать решение, которое предсказывает правильное название птицы с точностью 87% на тестовой выборке.

Вам интересно узнать, какое решение было создано? Приглашаем вас отправиться в путешествие в мир пения птиц.

Проблема птиц

Анализ и классификация пения птиц - очень интересная проблема.

У птиц много типов голосов, и разные типы имеют разные функции. Самыми распространенными являются песня и «другие голоса» (например, призывной голос).

Песня «красивее» - мелодичный тип голоса, благодаря которому птицы метят свою территорию и заводят партнеров. Обычно это намного сложнее и длиннее, чем «звонок».

Голоса типа вызова включают в себя контактные, соблазнительные и тревожные голоса. Контактные и привлекающие звонки используются для удержания птиц в группе во время полета или кормления, например, на верхушках деревьев, а тревожные - для предупреждения (например, когда появляется хищник). Чаще всего это короткие и простые голоса.

Пример:

  • Песня представляет собой простой живой ритмичный куплет с немного механическим звучанием, например. «te-ta te-ta te-ta» или трехсложный с другим ударением, «te-te-ta te-te-ta te-te-ta»

"образец"

  • У звонка богатый репертуар. Радостные «пинг-пинг» голоса, веселые «си ют-ти ют-ти» и болтовня «те туи». Осенью часто можно услышать слегка вопросительное, более застенчивое «тэ тэ тиух». Он предупреждает хриплым треском «юн-юн-юн-юнь». Пандусы наполняют лес стойким проникающим звуком «тэ-тэ-тэ-тэ-тэ».

"образец"

Почему классификация птиц по звуку может быть сложной задачей?

Вы можете столкнуться с множеством проблем:

  • фоновый шум - особенно при использовании данных, записанных в городе (например, городской шум, церкви, автомобили)
  • проблема многокомпонентной классификации - когда одновременно поют несколько видов
  • разные типы птичьих песен (как описано ранее)
  • межвидовая дисперсия - может быть разница в пении птиц между одними и теми же видами, живущими в разных регионах или странах
  • проблемы с набором данных - данные могут быть сильно несбалансированными из-за большей популярности одного вида по сравнению с другим, существует большое количество разных видов, и записи могут иметь разную длину и качество записей (объем, чистота)

Итак, как решались проблемы в прошлом?

Распознать птиц по их песням может быть непросто, но это не значит, что это невозможно. Но как справиться с этими проблемами?

Чтобы найти ответ, нужно было погрузиться в исследовательские работы и обнаружить, что большая часть работы была инициирована различными задачами искусственного интеллекта, такими как BirdCLEF и DCASE . К счастью, победители этих соревнований обычно описывают свои подходы, поэтому после проверки списков лидеров были получены некоторые интересные выводы:

  • почти во всех победивших решениях использовались сверточные нейронные сети (CNN) или рекуррентные сверточные нейронные сети (RCNN)
  • разрыв между моделями на основе CNN и неглубокими подходами, основанными на признаках, оставался довольно высоким
  • несмотря на то, что многие записи были довольно шумными, CNN работали хорошо без какого-либо дополнительного удаления шума, и многие команды утверждали, что методы шумоподавления не помогли.
  • методы увеличения данных, по-видимому, широко используются, особенно методы, используемые при обработке звука, такие как временной или частотный сдвиг.
  • некоторые команды-победители успешно подошли к нему с помощью полу-контролируемых методов обучения (псевдо-маркировки), а некоторые увеличили AUC по ансамблю моделей

Но как применить CNN, нейронные сети, предназначенные для извлечения функций из изображений, чтобы классифицировать или сегментировать их, когда у нас есть только звукозаписи? Мел-частотный кепстр (MFCC) - вот ответ.

SOUND_DIR='../data/xeno-canto-dataset-full/Parusmajor/Lithuania/Parusmajor182513.mp3'

# Load the mp3 file
signal, sr = librosa.load(SOUND_DIR,duration=10) # sr = sampling rate
# Plot mel-spectrogram
N_FFT = 1024         
HOP_SIZE = 1024       
N_MELS = 128            
WIN_SIZE = 1024      
WINDOW_TYPE = 'hann' 
FEATURE = 'mel'      
FMIN = 1400 

S = librosa.feature.melspectrogram(y=signal,sr=sr,
                                    n_fft=N_FFT,
                                    hop_length=HOP_SIZE, 
                                    n_mels=N_MELS, 
                                    htk=True, 
                                    fmin=FMIN, 
                                    fmax=sr/2) 

plt.figure(figsize=(10, 4))
librosa.display.specshow(librosa.power_to_db(S**2,ref=np.max), fmin=FMIN,y_axis='linear')
plt.colorbar(format='%+2.0f dB')
plt.show()

Но что это такое и как работает?

Каждый звук, который мы слышим, состоит из нескольких звуковых частот одновременно. Это то, что делает звук «глубоким».

Уловка спектрограммы состоит в том, чтобы визуализировать также эти частоты на одном графике, вместо того, чтобы визуализировать только амплитуду, как в форме волны. Шкала Мел известна как звуковая шкала звуковых высот, которые слушателям кажутся находящимися на равном расстоянии друг от друга. Идея, лежащая в основе этого, связана с тем, как люди слышат. Когда мы соединяем эти две идеи, мы получаем модифицированную спектрограмму (мел-частотный кепстр), которая просто игнорирует звуки, которые люди не слышат, и отображает наиболее важные части.

Чем больше длина звука, из которого создается спектрограмма, тем больше информации вы получаете на изображении, но также тем больше может стать ваша модель. Если в ваших данных много шума или тишины, есть вероятность, что аудио длительностью 5 секунд не уловит нужную информацию. Поэтому было решено создавать изображения из десятков длительных аудиозаписей (и это повысило точность окончательной модели на 10%!). Поскольку птицы поют на высоких частотах, был применен фильтр высоких частот, чтобы убрать ненужный шум.

Пора моделировать!

После создания мел-спектрограмм с фильтром верхних частот из аудиофайлов длительностью 10 секунд данные были разделены на последовательность (90%), проверку (10%) и тестовый набор (10%).

IM_SIZE = (224,224,3) 
BIRDS = ['0Parus', '1Turdu', '2Passe', '3Lusci', '4Phoen', '5Erith',
'6Picap', '7Phoen', '8Garru', '9Passe', '10Cocco', '11Sitta','12Alaud', '13Strep', '14Phyll', '15Delic','16Turdu', '17Phyll','18Fring', '19Sturn', '20Ember', '21Colum', '22Trogl', '23Cardu','24Chlor', '25Motac', '26Turdu']
DATA_PATH = 'data/27_class_10s_2/'
BATCH_SIZE = 16

Встроенные генераторы данных библиотеки Keras заботятся об увеличении данных и нормализации всех спектрограмм.

train_datagen = ImageDataGenerator(preprocessing_function=preprocess_input,  
                                   width_shift_range=0.2,
                                   height_shift_range=0.2,
                                   shear_range=0.2,
                                   zoom_range=0.1,
                                   fill_mode='nearest')
train_batches = train_datagen.flow_from_directory(DATA_PATH+'train',classes=BIRDS, target_size=IM_SIZE, class_mode='categorical', shuffle=True,batch_size=BATCH_SIZE)

valid_datagen = ImageDataGenerator(preprocessing_function=preprocess_input)
valid_batches = valid_datagen.flow_from_directory(DATA_PATH+'val',classes=BIRDS,target_size=IM_SIZE, class_mode='categorical', shuffle=False, batch_size=BATCH_SIZE)
test_datagen = ImageDataGenerator(preprocessing_function=preprocess_input)
test_batches = test_datagen.flow_from_directory(DATA_PATH+'test', classes=BIRDS,target_size=IM_SIZE,class_mode='categorical', shuffle=False,batch_size=BATCH_SIZE)

Окончательная модель была построена на EfficientNetB3 и 27 различных классах (виды птиц) с оптимизатором Adam, категориальной функцией кросс-энтропийных потерь и сбалансированными весами классов. Скорость обучения снизилась на плато.

# Define CNN's architecture 
net = efn.EfficientNetB3(include_top=False,                       weights='imagenet', input_tensor=None,                        input_shape=IM_SIZE)   
x = net.output 
x = Flatten()(x) 
x = Dropout(0.5)(x) 
output_layer = Dense(len(BIRDS), activation='softmax', name='softmax')(x) 
net_final = Model(inputs=net.input, outputs=output_layer)      net_final.compile(optimizer=Adam(),                  loss='categorical_crossentropy', metrics=['accuracy'])
# Estimate class weights for unbalanced dataset 
class_weights = class_weight.compute_class_weight(                'balanced',                 np.unique(train_batches.classes),                  train_batches.classes)  
# Define callbacks 
ModelCheck = ModelCheckpoint('models/efficientnet_checkpoint.h5', monitor='val_loss', verbose=0,                               save_best_only=True, save_weights_only=True, mode='auto', period=1) 
ReduceLR = ReduceLROnPlateau(monitor='val_loss', factor=0.2,                               patience=5, min_lr=3e-4)

# Train the model
net_final.fit_generator(train_batches,
                        validation_data = valid_batches,
                        epochs = 30,
                        steps_per_epoch= 1596,
                        class_weight=class_weights, callbacks[ModelCheck,ReduceLR])

Наконец, решение предсказало правильное название птицы с точностью 87% на тестовом образце с помощью:

  • 11 классов с показателем F1 более 90%
  • 8 классов с показателем F1 от 70% до 90%
  • 2 класса с оценкой F1 от 50% до 70%
  • 6 классов с показателем F1 ниже 50%.

Если вас интересует посмотреть код в блокноте jupyter, вы можете найти его здесь:



Авторы:

Https://medium.com/@magdalenakortas

Https://medium.com/@agnieszkamikolajczyk