Прогнозирование меток на основе извлечения функций файла WAV

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

Распознавание звуковых событий и классификация звуков - сложная задача машинного обучения. Один из самых сложных аспектов - найти набор данных для меток, которые вы хотите классифицировать. Имея такой ограниченный объем данных, мы решили расширить их до наборов данных, отличных от строго образцов животных. После обнаружения некоторых наборов данных необходимо преодолеть следующие препятствия:

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

Изучение данных

Вот наборы данных, которые мы исследовали для этого проекта:

AudioSet - это крупномасштабный набор данных размером 2,3 ГБ, опубликованный в 2017 году, содержащий 2084320 видеороликов YouTube с 527 метками. Множество сложных проектов GitHub было построено вокруг обширного Google AudioSet, включая собственный классификатор / средство извлечения функций VGGish Tensorflow от Google, а также его преемник YouTube-8m. IBM улучшила работу Google, предложив нейронную сеть внимания для AudioSet, которая достигает средней средней точности (mAP) 0,360. Проще говоря, этот набор данных сложен; он содержит сэмплы с несколькими метками разного качества, которые требуют выделения функций на основе внимания и разделения аудиоклипов для распознавания звуковых событий в реальном времени. Мы решили не работать с этим набором данных.

Щелкните здесь, чтобы увидеть пример качества AudioSet. Клип длительностью 50–60 секунд помечен словами Ревущие кошки, речь, речь ребенка / речь ребенка, игра детей, животное. Насколько сложно услышать львиный рык?

Мы также отклонили набор данных Bird Audio Detection Challenge. Изначально он был выпущен как «задача исследования данных для создания надежного и масштабируемого алгоритма обнаружения птиц». Набор данных имеет узкую область применения. Мы хотели работать с более широким набором данных, который предлагал бы больше возможностей для изучения извлечения и анализа признаков по более широкому спектру более разнообразных меток.

Чтобы не усложнять задачу, мы решили ограничить наше внимание и создать классификаторы для следующих наборов данных:

Kaggle Audio Cats and Dogs - это высококачественный несбалансированный набор данных для двухзначной классификации аудио. Этот набор данных также был выбран на частоте 16 Гц; однако, в отличие от предыдущего набора данных Kaggle, эти файлы WAV имеют переменную длину. Этикетка с кошкой содержит 164 файла WAV, что соответствует 1323 секундам звука, тогда как этикетка с собакой содержит 113 файлов WAV, всего 598 секунд звука.

Хотя набор данных несбалансирован, сравнивая рисунок 1 и рисунок 2, мы видим, что одиночное кошачье мяуканье значительно дольше по продолжительности, чем лай собаки.

Kaggle Environemntal Sounds Classification содержит 2500 файлов WAV, сэмплированных с частотой 16 кГц для 50 различных классов. Набор данных сбалансирован; каждый класс или метка имеет 40 аудиосэмплов по 5 секунд каждый, которые были объединены по классам, чтобы получить 50 волновых файлов по 3 минуты. 20сек. Авторы создали конкурс Kaggle, чтобы обратить внимание на классификацию необработанного аудио, как это сделано в задаче классификации« Сеть Wavenet ».

Объединив данные обоих соревнований Kaggle, у нас есть следующие ярлыки классов, на основе которых можно построить классификатор звуков животных. На рисунке 3 показан пример формы сигнала для каждого класса меток.

На рисунках 4 и 5 показаны формы сигналов от остальных меток из набора данных Environmental Sounds.

UrbanSound8K - это самый большой набор данных, который мы решили использовать для наших классификаторов. Набор данных содержит 8732 файла WAV продолжительностью не более 4 секунд в 10 различных классах:

UrbanSound8K Labels:
  - air_conditioner
  - car_horn
  - children_playing
  - dog_bark
  - drilling
  - enginge_idling
  - gun_shot
  - jackhammer
  - siren
  - street_music

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

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

Давайте визуализируем набор данных UrbanSounds8K.

Набор данных несбалансирован. На рисунке 7 показано распределение общего количества файлов WAV по этикеткам. На рисунке 8 показана общая продолжительность в секундах всех объединенных образцов на этикетке.

Предварительная обработка аудио

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

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

Вот краткое объяснение того, как Audacity устраняет фоновый шум.

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

Мы использовали пакет Python под названием noisereduce, который реализует аналогичный алгоритм шумоподавления. Этот алгоритм принимает два входа:

  1. Аудиоклип шум, содержащий прототипный шум аудиоклипа.
  2. Аудиоклип signal, содержащий сигнал и шум, которые необходимо удалить.

Ниже показан клип, на котором изображено карканье некоторых ворон. На заднем плане отчетливо слышен сильный последовательный порыв ветра по всей волновой форме.

import librosa
import noisereduce as nr
# crows cawing
fn = "environmental-sound-classification-50/audio/2-108767-B-9.wav"
audio_data, sampling_rate = librosa.load(fn)
# sound of wind blowing
noisy_part = audio_data[8000:10000]
# perform noise reduction
reduced_noise = nr.reduce_noise(audio_clip=audio_data,
noise_clip=noisy_part, verbose=True)

noisy_part был выбран тщательно с помощью инспекции; это утомительный процесс для выполнения с большим набором данных, образцы WAV которого были записаны с использованием различного оборудования и методов в различных средах и настройках.

Подавление шума - это утомительный процесс, выполняемый вручную с большим набором данных.

Шумность файла WAV может быть разной. Файл WAV может быть загрязнен множеством различных типов фоновых шумов. В наборе данных Kaggle Environmental Sounds фоновый шум сильно различается. Например. WAV-файлы лягушки часто были скрыты скрежетом сверчков, собачьим лаем, смешанным с эхом и щебетанием птиц, и кошачьим мурлыканьем, заглушенным гулом печи или холодильника.

После уменьшения зашумленности файла WAV мы остаемся с чистой формой волны двух вороньих коров; однако более 50% результирующей формы сигнала - это пустой шум. Чтобы исключить вероятность того, что наша модель ML ошибочно узнает, что коровы звучат как пустой шум, мы можем обрезать эти части формы волны. Для этого мы снова вернемся к библиотеке LibROSA, а именно к librosa.effect.trim .

import librosa
trimmed, index = librosa.effects.trim(reduced_noise, top_db=20, frame_length=512, hop_length=64)

Параметр top_db позволяет нам указать «порог (в децибелах) ниже ссылки, который следует рассматривать как тишину». По умолчанию это эталонное значение сравнивается с пиковой мощностью сигнала, которая рассчитывается с использованием np.max numpy. Подобно выбору формы волны, это эталонное значение необходимо тщательно учитывать для каждого файла WAV. Пиковая мощность коровы-вороны может варьироваться от WAV до WAV (возможно, птица находится дальше от аудиозаписи), в то время как дБ ветра остается постоянным.

Извлечение функций

Что такое MFCC, Chroma_STFT, Melspectrogram и Spectral Contrast?

Во-первых, форма сигнала, используемая для более поздних визуализаций, чтобы обеспечить ссылку на рисунке 14.

Во-вторых, давайте кратко рассмотрим шкалу частот mel. Шкала Mel является альтернативой шкале Герца, которая основана на том, как люди воспринимают высоту звука. По мере того, как частота в шкале Гц увеличивается, людям требуется все больше и больше расстояния, чтобы ощутить такое же увеличение высоты звука. Это особенно заметно на частоте 500 Гц. Может показаться, что это не имеет большого значения, но преобразование в шкалу mel - обычная практика в машинном обучении звука и повышает точность модели за счет более линейного разделения информации о высоте тона. Название сокращено от мелодия, что указывает на его использование при сравнении высоты тона.

Не существует установленной формулы для преобразования в шкалу Mel, но все формулы включают логарифм того или иного типа. Одна из наиболее часто используемых формул приведена ниже вместе с визуальным сравнением шкал Hz и mel на Рисунке 15.

Теперь мы можем перейти к нашему фактическому извлечению функций, которое мы выполнили на Python с использованием пакета Librosa и в результате получили 187 функций. Мы получили следующие характеристики: MFCC, STFT_Chroma, Melspectrogram и Spectral Contrast. Все были получены с использованием размера окна FT 2048 и шага 512 при частоте дискретизации 22 500 Гц. Это соответствует окну ~ 91 мс с перекрытием ~ 22 мс, или 87 окнам в 2-секундном клипе.

Классификация звука часто предлагается как проблема классификации MFCC.

Сначала мы рассмотрим коэффициенты MFCC или мелкочастотного кепстра. В частности, мы используем кепстр мощности для устранения фазы, который предоставляет информацию о скорости изменения полос частотного спектра. Чтобы получить это, мы выполняем преобразование Фурье на форме входного сигнала, преобразуем полученный спектр в полосу частот Mel, затем снимаем логарифмы степеней каждой частоты и выполняем дискретное косинусное преобразование. Результирующие значения - это 40 коэффициентов, меняющихся с течением времени, которые мы усредняем и используем в качестве характеристик. Пример визуализации приведен ниже на рисунке 16.

STFT_Chroma - это хроматограмма, использующая кратковременное преобразование Фурье. Хромограмма основана на 12 классах основного тона, представленных набором {C, C♯, D, D♯, E, F, F♯, G, G♯, A, A♯, B}. Преобразование агрегирует информацию о каждом шаге в пределах выборки как функцию в каждом окне FT, поэтому мы усредняем данные и получаем из этого дополнительные 12 функций. Это полезно для получения информации о высоте звука независимо от тембра. Пример визуализации ниже на рисунке 17.

Melspectrogram предоставляет дополнительные 128 функций. Спектрограмма Mel сначала берет спектрограмму образца, затем преобразует частоты в частоты Mel. 128 функций представляют собой элементы разрешения по частоте выборки, которые усредняются по времени. Это полезно для получения информации о частоте в зависимости от времени, хотя мы усредняем компонент времени, чтобы получить информацию о частоте всей выборки. Пример спектрограммы показан ниже на рисунке 18.

Спектральный контраст используется для классификации сигналов с широким и узким частотным диапазоном с помощью STFT. Контраст рассчитывается путем взятия разницы между спектральным пиком и спадом в поддиапазоне. Высокий контраст приводит к узкополосным сигналам, а низкий контраст - к широкополосным сигналам. Мы равномерно разделяем сигнал на 7 частотных поддиапазонов и вычисляем контраст во времени. Они становятся дополнительными 7 функциями, когда мы усредняем все временные значения.

Построение модели

Обзор

Наша модель классификации аудио использует последовательную модель из пакета keras python. Модель состоит из четырех плотных слоев, которые имеют количество выходов 256, 128, 64 и n_classes, а вход первого слоя динамически устанавливается на 187 (количество функций, которые мы можем извлечь). Каждый слой связан с функцией активации ReLu, за исключением последнего слоя, который использовал функцию активации Softmax.

model = Sequential()
model.add(Dense(256, activation='relu',       input_dim=x_train.shape[1]))
model.add(Dense(128, activation='relu'))
model.add(Dense(64, activation='relu'))
model.add(Dense(n_classes, activation='softmax'))
model.compile(loss='sparse_categorical_crossentropy', optimizer=optimizer, metrics=['accuracy'])

Он компилируется с функцией потерь «sparse_categorical_crossentropy» с оптимизатором Adam. Его набор скорости обучения, который мы обнаружили, оказался наиболее эффективным на уровне 0,001. Мы обучили модель на наборах по 10 аудиофайлов в пакете, и мы обнаружили, что наиболее оптимальным прогоном было обучение ее примерно 60 эпох. Меньше эпох - и мы рискуем попасть в «провал» точности, который обычно случается между 20–40 эпохами, а большее количество эпох было бы пустой тратой вычислительных мощностей и времени.

Сохранение и загрузка модели

Что касается данных, мы смогли загрузить данные с помощью пакета librosa python. Мы загрузили необработанные файлы .wav и извлекли ряд функций (описанных выше). Затем, чтобы сэкономить время, мы сохранили все функции всех файлов в отдельном файле .hdf5, который можно было быстро прочитать при последующих итерациях.

Для сохранения и загрузки самих весов модели это было сложно, так как существует известная нерешенная ошибка с сохранением и загрузкой весов keras. После долгих размышлений мы нашли обходной путь, использовав ModelCheckpoint Кераса в качестве обратного вызова в функции подгонки нашей модели, чтобы сохранить веса для каждой эпохи. Загрузка этих гирь, похоже, сработала.

… Есть известный нерешенный баг с сохранением и загрузкой весов keras.

Что касается того, почему мы использовали этот Keras и эту последовательную модель, мы предприняли много попыток использовать другие пакеты python, включая использование torch с моделью, аналогичной AlexNet; однако были ошибки при попытке подогнать модель к 187 функциям, которые заблокировали нашу попытку.

Анализируем наши классификаторы CNN

В этом разделе мы представим наши метрики для трех разных аудиоклассификаторов CNN:

  1. Классификатор Kaggle Cat vs Dog
  2. Классификатор животных с 12 этикетками
  3. Классификатор UrbanSounds8K

Классификатор кошек против собак

Используя разделение теста на поезд Kaggle для набора данных Кошка против собаки, мы записали следующие показатели для нашего классификатора с двумя метками.

Testing Accuracy:  0.918367326259613
AUC ROC:           0.929824561403508
Cross Entropy:     1.46
Accuracy by Label:
  dog: 83.673469
  cat: 100.000000
Mispredicted Files:
  ./data/kaggle_cats_dogs/cats_dogs/dog_barking_109.wav
  ./data/kaggle_cats_dogs/cats_dogs/dog_barking_10.wav
  ./data/kaggle_cats_dogs/cats_dogs/dog_barking_3.wav
  ./data/kaggle_cats_dogs/cats_dogs/dog_barking_18.wav
  ./data/kaggle_cats_dogs/cats_dogs/dog_barking_5.wav
  ./data/kaggle_cats_dogs/cats_dogs/dog_barking_112.wav
  ./data/kaggle_cats_dogs/cats_dogs/dog_barking_94.wav
  ./data/kaggle_cats_dogs/cats_dogs/dog_barking_104.wav

Для этого случайного начального числа наш классификатор работал исключительно хорошо; однако некоторые прогоны случайного начального числа работали немного хуже. Ниже приведены показатели для худшей модели.

Testing Accuracy:  0.8979591727256775
ROC AUC: 0.9040169133192388
Testing Cross Entropy: 1.42
Accuracy by Label:
  dog: 83.673469
  cat: 95.918367

Этикетка для собак неизменно оказывалась менее надежной. Наиболее естественным объяснением результатов является большая разница в количестве обучающих данных между двумя метками.

Используя разделение поезд-тест соревнований Kaggle, наши модели всегда имели ROC AUC ›0,90 и не более 10 ошибочных прогнозов.

Однако если копнуть глубже, станет очевидным еще одно наблюдение. Независимо от случайного начального числа и перетасовки дрессировки, один и тот же набор файлов WAV собаки обычно неверно предсказывается. Из ошибочно предсказанных WAV, показанных для нашего лучшего классификатора, эти три выделены жирным шрифтом почти в каждой модели:

Mispredicted Files:
  dog_barking_109.wav (no dog present)
  dog_barking_18.wav  (world's saddest dog bark)
  dog_barking_94.wav  (dogs or birds...I can't even tell)
  dog_barking_5.wav   (many dogs barking)
  dog_barking_112.wav (dog bark with heavy echo)

Глядя на формы волн на Рисунке 23, ни одна из них не похожа на типичный лай собаки на Рисунке 2. Чтобы улучшить этот классификатор, файлы WAV можно разделить на события лай собаки в результате получается набор данных с большим количеством сэмплов более мелких и точных звуков.

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

Классификатор звуков животных

Для этого классификатора мы достигли нашей первоначальной цели нашего предложения: создать модель, способную классифицировать звуки животных по нескольким ярлыкам. Набор данных, который мы использовали, представляет собой комбинацию набора данных Kaggle Cats vs Dogs и подмножества данных только о животных из набора данных Kaggle Environmental Sounds. В результирующем наборе данных есть 12 разных меток.

Мы получили точность обучения 100% и точность теста 97,22% с потерей перекрестной энтропии обучения 1% и потерей перекрестной энтропии теста 13%, когда данные были разделены на 80–20 для обучения и тестирования. Используя различные начальные числа случайных чисел и разбиения на обучающие тесты, наша модель стабильно достигла точности примерно 95%.

На рисунке 26 ниже представлена ​​матрица неточностей для нашего классификатора животных. Обычно ярлык chirping_birds был самым непредсказуемым. Мы связываем эти ошибочные прогнозы с тем фактом, что звук щебетания птиц часто появляется как фоновый шум в сэмплах наших лейблов.

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

Классификатор UrbanSounds8K

Ниже приведены наши показатели для 10 моделей классификации с использованием рекомендованных 10-кратных предопределенных разделений перекрестной проверки из веб-страницы набора данных UrbanSounds8K.

Model 1 metrics:
	Testing Accuracy:      0.7064327597618103
	Testing Cross Entropy: 7.02
Model 2 metrics:
	Testing Accuracy:      0.49211710691452026
	Testing Cross Entropy: 14.06
Model 3 metrics:
	Testing Accuracy:      0.4864864945411682
	Testing Cross Entropy: 8.72
Model 4 metrics:
	Testing Accuracy:      0.5252525210380554
	Testing Cross Entropy: 6.80
Model 5 metrics:
	Testing Accuracy:      0.5950854420661926
	Testing Cross Entropy: 5.15
Model 6 metrics:
	Testing Accuracy:      0.5078979134559631
	Testing Cross Entropy: 8.65
Model 7 metrics:
	Testing Accuracy:      0.560859203338623
	Testing Cross Entropy: 7.41
Model 8 metrics:
	Testing Accuracy:      0.48759305477142334
	Testing Cross Entropy: 8.55
Model 9 metrics:
	Testing Accuracy:      0.6115196347236633
	Testing Cross Entropy: 11.25
Model 10 metrics:
	Testing Accuracy:      0.9784946441650391
	Testing Cross Entropy: 0.08
Average Accuracy: 0.5951738774776458
Average Loss:     7.768968606546696

Model 1 соответствует модели, обученной на 2–10 свертках данных и протестированной на свертке 1. Отсюда мы взяли среднее значение всех моделей и построили среднюю точность для каждой метки на рисунке 15.

Мы видим, что одни модели работают намного лучше, чем другие. Например, Model 10 имеет точность 97,89%, тогда как Model 8 имеет точность 48,76%. UrbanSound8K отметил, что некоторые складки сложнее других. На рисунке 16 ниже показана матрица неточностей для Model 5, модели, наиболее репрезентативной для средних значений.

Точность этих моделей значительно хуже, чем у нашего классификатора кошек и собак. В основном это можно отнести к большему набору данных. Кроме того, в отличие от набора данных Kaggle Cats and Dogs, который преимущественно состоял из образцов WAV с метками переднего плана, набор данных UrbanSounds8K разделен на передний план и фон образцы . Три метки с точностью ниже 50%: air_conditioner, jackhammer и engine_drilling. Самым низким из трех является air_conditioner со средней точностью 31,75%. Учитывая, что случайное угадывание приведет к точности 10%, мы можем сделать вывод, что при средней точности по всем меткам 59,51% наша модель работает примерно в 6 раз лучше, чем модель случайного угадывания.

Обсуждение и заключительные мысли

Мы успешно создали два классификатора животных: кошка против собаки и животное с 12 метками, которые могут предсказать правильную метку аудиофайла WAV. По мере того как размер нашего набора данных и разнообразие меток увеличивались, особенно когда мы применяли нашу модель к набору данных UrbanSounds8K, мы наблюдали снижение точности. В основном мы приписываем это сигналам, которые содержат несколько меток, или сигналам, основная метка которых относится к фоновому шуму, а не к фоновому шуму.

С другой стороны, мы изо всех сил пытались применить нашу CNN к более сложным, слабо размеченным наборам данных, таким как Google AudioSet. Для создания надежных и точных аудиоклассификаторов, способных классифицировать звуки на уровне, сопоставимом с уровнем человеческого уха, необходима CNN, основанная на внимании. Кроме того, для очистки наборов данных необходимо использовать средство извлечения функций и аудиоклассификатор: разбивать сэмплы WAV с несколькими пометками и событиями переднего плана, и фоновыми событиями на отдельные звуковые события. Наконец, модели, обученные исключительно на шуме или выборке фона или переднего плана, могут быть использованы для создания лучшего предсказателя. Файлы WAV можно сначала передать через модель, которая отделяет хорошие функции от плохих функций, или фоновые функции по сравнению с функции переднего плана.

Ссылки и код GitHub

Ознакомьтесь с нашим проектом на GitHub здесь!