Мы видели основы обучения машины, классификации и регрессии. В этой статье мы будем нырять немного глубже и работать над тем, как мы можем выполнять аудио классификацию. Мы будем обучать свертку нейронной сети, многослойной PercePtron и SVM для этой задачи. Один и тот же код может быть легко расширен для обучения других моделей классификации. Я настоятельно рекомендую вам пройти предыдущие статьи по основам классификации, если вы еще этого не сделали.
Главный вопрос вот как мы можем обрабатывать аудиофайлы и преобразовывать его в форму, которую мы можем питаться в наши нейронные сети.
Это займет менее часа, чтобы настроить и получить ваш первый рабочий аудио классификатор! Так что давайте начнем! 😉
Мы будем использовать Python. Прежде чем мы сможем начать кодирование, нам нужно иметь ниже модули. Это можно легко загрузить с помощью PIP.
- керас
- либорда
- SoundDevice
- SoundFile.
- Scikit-Surve
- matplotlib.
Мы собираемся использовать набор данных ESC-10 для классификации звука. Это меченый набор из 400 записей окружающей среды (10 классов, 40 клипов на класс, 5 секунд на клип). Это подмножество большего Набор данных ESC-50
Каждый класс содержит 40 .ogg файлов. Наборы набора данных ESC-10 и ESC-50 были переданы в 5 сгибах равномерных размеров, чтобы зажимы, извлеченные из того же оригинальной записи источника, всегда содержатся в одной сгибе.
Прежде чем мы сможем извлечь функции и обучать нашей модели, нам нужно визуализировать форму волны для различных классов, присутствующих в нашем наборе данных.
import matplotlib.pyplot as plt import numpy as np import wave import soundfile as sf
Ниже функция Visualize_wav ()
Получает файл OGG, читает его с помощью SoundFile Module и возвращает данные и частоту дискретизации. Мы можем использовать sf.wav ()
Функция для записи WAV файла для соответствующего файла OGG. Используя MATPLOTLIB, мы наращиваем сигнальную волну во времени и генерируя график.
def visualize_wav(oggfile): data, samplerate = sf.read(oggfile) if not os.path.exists('sample_wav'): os.mkdir('sample_wav') sf.write('sample_wav/new_file.wav', data, samplerate) spf = wave.open('sample_wav/new_file_Fire.wav') signal = spf.readframes(-1) signal = np.fromstring(signal,'Int16') if spf.getnchannels() == 2: print('just mono files. not stereo') sys.exit(0) # plotting x axis in seconds. create time vector spaced linearly with size of audio file. divide size of signal by frame rate to get stop limit Time = np.linspace(0,len(signal)/samplerate, num = len(signal)) plt.figure(1) plt.title('Signal Wave Vs Time(in sec)') plt.plot(Time, signal) plt.savefig('sample_wav/sample_waveplot_Fire.png', bbox_inches='tight') plt.show()
WavePlot для звука собаки
Вы можете запустить тот же код для генерации волнового графика для разных классов и визуализации разницы.
Для каждого аудиофайла в наборе данных мы выделим MFCC (Cepstrum Mel-Chrade Cepstrum – у нас будет представление изображения для каждого аудиоприкасания) вместе с его этикеткой классификации. Для этого мы будем использовать Librosa’s MFCC ()
Функция, которая генерирует MFCC от аудиоданных временных серий.
get_features ()
Занимает файл .ogg и извлекивает MFCC с помощью библиотеки Librosa.
def get_features(file_name): if file_name: X, sample_rate = sf.read(file_name, dtype='float32') # mfcc (mel-frequency cepstrum) mfccs = librosa.feature.mfcc(y=X, sr=sample_rate, n_mfcc=40) mfccs_scaled = np.mean(mfccs.T,axis=0) return mfccs_scaled
Набор данных загружается внутри папки «DataSet». Мы будем повторять подкаталоги (каждый класс) и извлечь функции из своих файлов OGG. Наконец, мы создадим DataFrame с функцией MFCC и соответствующей классовой меткой.
def extract_features(): # path to dataset containing 10 subdirectories of .ogg files sub_dirs = os.listdir('dataset') sub_dirs.sort() features_list = [] for label, sub_dir in enumerate(sub_dirs): for file_name in glob.glob(os.path.join('dataset',sub_dir,"*.ogg")): print("Extracting file ", file_name) try: mfccs = get_features(file_name) except Exception as e: print("Extraction error") continue features_list.append([mfccs,label]) features_df = pd.DataFrame(features_list,columns = ['feature','class_label']) print(features_df.head()) return features_df
После того, как мы извлекли функции, нам нужно преобразовать их в Numpy Array, чтобы их можно было купить в нейронную сеть.
def get_numpy_array(features_df): X = np.array(features_df.feature.tolist()) y = np.array(features_df.class_label.tolist()) # encode classification labels le = LabelEncoder() # one hot encoded labels yy = to_categorical(le.fit_transform(y)) return X,yy,le
X
и YY
расщепляются в тренировку и тестовые данные в соотношении 80-20.
def get_train_test(X,y): X_train, X_test, y_train, y_test = train_test_split(X,y,test_size = 0.2, random_state = 42) return X_train, X_test, y_train, y_test
Теперь мы определим нашу модель архитектуры. Мы будем использовать KERAS для создания нашей многослойной сети PercePtron.
def create_mlp(num_labels): model = Sequential() model.add(Dense(256,input_shape = (40,))) model.add(Activation('relu')) model.add(Dropout(0.5)) model.add(Dense(256,input_shape = (40,))) model.add(Activation('relu')) model.add(Dropout(0.5)) model.add(Dense(num_labels)) model.add(Activation('softmax')) return model
Как только модель определена, нам нужно компилировать ее, определяя потери, метрики и оптимизатор. Затем модель оснащена для обучения данных X_train
и y_train
Отказ Наша модель обучается на 100 эпох с размером партии 32. Обученная модель наконец сохранена как файл .hd5 на диске. Эта модель может быть загружена позже для прогнозирования.
def train(model,X_train, X_test, y_train, y_test,model_file): # compile the model model.compile(loss = 'categorical_crossentropy',metrics=['accuracy'],optimizer='adam') print(model.summary()) print("training for 100 epochs with batch size 32") model.fit(X_train,y_train,batch_size= 32, epochs = 100, validation_data=(X_test,y_test)) # save model to disk print("Saving model to disk") model.save(model_file)
Это оно! Мы обучили наш экологический звук классификатора !! 😃
Теперь, очевидно, мы хотим проверить, насколько хорошо наша модель выполняет 😛
def compute(X_test,y_test,model_file): # load model from disk loaded_model = load_model(model_file) score = loaded_model.evaluate(X_test,y_test) return score[0],score[1]*100
Test loss 1.5628961682319642 Test accuracy 78.7
Мы также можем предсказать этикетку класса для любого входного файла, который мы предоставляем, используя ниже код –
def predict(filename,le,model_file): model = load_model(model_file) prediction_feature = extract_features.get_features(filename) if model_file == "trained_mlp.h5": prediction_feature = np.array([prediction_feature]) elif model_file == "trained_cnn.h5": prediction_feature = np.expand_dims(np.array([prediction_feature]),axis=2) predicted_vector = model.predict_classes(prediction_feature) predicted_class = le.inverse_transform(predicted_vector) print("Predicted class",predicted_class[0]) predicted_proba_vector = model.predict_proba([prediction_feature]) predicted_proba = predicted_proba_vector[0] for i in range(len(predicted_proba)): category = le.inverse_transform(np.array([i])) print(category[0], "\t\t : ", format(predicted_proba[i], '.32f') )
Эта функция загрузит нашу предварительно обученную модель, извлечь MFCC из входного файла OGG, который вы предоставили, и выходной диапазон вероятностей для каждого класса. Один с максимальной вероятностью является нашим желаемым классом! 😃
Для образца файла OGG класса собака, следующие прогнозы вероятности –
Predicted class 0 0 : 0.96639919281005859375000000000000 1 : 0.00000196780410988139919936656952 2 : 0.00000063572736053174594417214394 3 : 0.00000597824555370607413351535797 4 : 0.02464177832007408142089843750000 5 : 0.00003698830187204293906688690186 6 : 0.00031352625228464603424072265625 7 : 0.00013375715934671461582183837891 8 : 0.00846461206674575805664062500000 9 : 0.00000165236258453660411760210991
Прогнозируется класс 0
который был классовой меткой для Собака
Отказ
Работа над аудиофайлами не так жестко, как это звучало в первую очередь. Аудиофайлы могут быть легко представлены в виде данных временных серий. У нас есть предопределенные библиотеки в Python, что делает нашу задачу более проще.
Вы также можете проверить весь код для этого в My Github Repo. Здесь я обучал SVM, MLP и CNN для одного и того же набора данных и кода устроен в правильных файлах, что позволяет легко понять.
https://github.com/apoorva-dave/Environmental-Sound-Classification
Хотя я подготовил 3 разных моделя для этого, в точности был очень мало дисперсии. Оставьте комментарии, если вы найдете способ улучшить этот счет.
Если вам понравилось, статья показывает некоторые ❤ Оставайтесь настроиться на большее! До тех пор, пока счастливое обучение 😸
Оригинал: “https://dev.to/apoorvadave/environmental-sound-classification-1hhl”