Узнайте, как создать приложение для распознавания музыкальных жанров с помощью Streamlit и развернуть его на Amazon EC2.

Следует внимательно рассмотреть любые роли, задействованные в проекте, которые напрямую не способствуют достижению цели - как можно скорее передать ценное программное обеспечение в руки пользователей. - Штейн Инге Морисбак

И снова здравствуйте, в первой части этой статьи мы разработали сверточную нейронную сеть для распознавания жанров музыки. В этой части мы разработаем веб-приложение с использованием замечательной библиотеки Streamlit.

Большинство людей, изучающих глубокое обучение или машинное обучение, осваивают, как построить модель, обучить модель, но они не знают, как развернуть модель (включая меня до этого проекта xP). Развертывание модели так же важно, как и ее обучение. Развертывая модель, люди могут ее использовать. Разве не было бы здорово показать друзьям приложение, которое вы разработали для своей модели, вместо того, чтобы запускать модель в блокноте jupyter ?.

Я буду использовать библиотеку Streamlit для создания приложения, а затем разверну его на инстансе Amazon EC2.

Создание приложения

Во-первых, если у вас не установлен Streamlit, используйте следующую команду в терминале для установки

pip install streamlit

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

Сначала создайте скрипт python и напишите в нем весь код приложения.

import streamlit as st
st.write("Music Genre Recognition App") 
st.write("This is a Web App to predict genre of music")
file = st.sidebar.file_uploader("Please Upload Mp3 Audio File Here or Use Demo Of App Below using Preloaded Music",type=["mp3"])

Теперь, чтобы увидеть, как это на самом деле выглядит на веб-странице, вам нужно запустить этот скрипт. Для запуска введите следующую команду в терминале.

streamlit run app.py

Итак, это очень простое веб-приложение, в котором есть загрузчик файлов для загрузки mp3-файла для музыки. Теперь нам нужно написать код для получения входного файла из file_uploader, предварительной обработки и получения прогноза с использованием нашей модели CNN.

Во-первых, давайте импортируем все библиотеки, которые нам потребуются.

from PIL import Imageimport librosa
import numpy as np
import librosa.display
from pydub import AudioSegment
import matplotlib.cm as cm from matplotlib.colors import Normalize

Теперь мы создадим функцию, которая будет конвертировать аудиофайлы mp3 в файлы * .wav, потому что Librosa работает только с файлами * .wav.

def convert_mp3_to_wav(music_file):  
sound = AudioSegment.from_mp3(music_file)      sound.export("music_file.wav",format="wav")

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

def extract(wav_file,t1,t2):  
  wav = AudioSegment.from_wav(wav_file)  
  wav = wav[1000*t1:1000*t2]  
  wav.export("extracted.wav",format='wav')

Вышеупомянутая функция будет сегментировать аудио между временем t1 и t2.

Теперь самая важная часть - создать мел-спектрограмму извлеченного звука. Эта спектрограмма mel будет загружена в модель для прогноза.

def create_melspectrogram(wav_file):  
  y,sr = librosa.load(wav_file,duration=3)  
  mels = librosa.feature.melspectrogram(y=y,sr=sr)    
  fig = plt.Figure()  canvas = FigureCanvas(fig) 
  p = plt.imshow(librosa.power_to_db(mels,ref=np.max))   
  plt.savefig('melspectrogram.png')

Мы создадим функцию для прогнозирования жанра музыки, используя сгенерированную выше спектрограмму mel.

def predict(image_data,model):   
  image = img_to_array(image_data)   
  image = np.reshape(image,(1,288,432,4))   
  prediction =     model.predict(image/255)   
  prediction = prediction.reshape((9,))     
  class_label = np.argmax(prediction)     
  return class_label,prediction
class_labels = ['blues', 'classical', 'country', 'disco', 'hiphop', 'metal', 'pop', 'reggae', 'rock']

Используйте модель, которую вы обучили на наборе данных GTZAN, для прогнозирования здесь. Если вы не знаете, как сохранить и загрузить модель в Keras, обратитесь к разделу Как сохранить и загрузить вашу модель глубокого обучения Keras (machinelearningmastery.com).

class_label - это метка с наивысшей вероятностью, а прогноз фиксирует распределение вероятностей по всем классам (т. е. жанрам).

class_labels - это список, который отображает жанры в числа (то есть индексы списка)

Теперь мы объединим все функции, которые мы написали, чтобы отобразить окончательный результат в нашем веб-приложении.

if file is None:  
  st.text("Please upload an mp3 file")
else:  
  convert_mp3_to_wav(file)  
  extract_relevant("music_file.wav",40,50)   
  create_melspectrogram("extracted.wav")   
  image_data =   load_img('melspectrogram.png',color_mode='rgba',target_size=(288,432))
  class_label,prediction = predict(image_data,model)   
  st.write("## The Genre of Song is "+class_labels[class_label])

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

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

Теперь, когда мы создали наше приложение, мы развернем его с помощью Amazon EC2 Instance.

Развертывание на Amazon EC2

  1. Создайте бесплатную учетную запись на Amazon Web Services, заполните все данные, такие как имя, адрес, почтовый индекс и т. Д. Вам также нужно будет указать данные своей дебетовой карты, но они не будут взимать комиссию.
  2. После создания учетной записи перейдите в Консоль управления AWS.

Выберите, Запустить виртуальную машину с EC2, после этого выберите Amazon Linux 2 AMI (HVM), Тип тома SSD.

3. Выберите тип экземпляра t2.micro, теперь просто перейдите к странице «Настройка группы безопасности», здесь нам нужно создать собственный TCP-порт, потому что Streamlit работает с портом 8501. Выберите добавить правило и введите 8501 в диапазон портов, выберите где угодно в источнике.

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

5. Теперь откройте окно терминала в каталоге, в котором вы сохранили пару ключей (расширение * .pem). Введите в терминал следующее.

chmod 400 name.prem

Это даст необходимые разрешения для файла .pem

6. Теперь подключитесь по ssh к созданному вами экземпляру EC2.

ssh -i your_key_pair_name.pem ec2-user@your public dns address

Вы можете найти свой публичный DNS-адрес в консоли EC2. Вы успешно запустили свой инстанс Amazon EC2.

7. Установите все необходимые пакеты для нашего приложения и модели.

sudo python3 -m pip install librosa llvmlite==0.33.0 numba==0.49.1
sudo yum install libsndfile

Это установит librosa и libsndfile. Теперь нам нужно установить ffmpeg, установка которого требует немного времени, поэтому обратитесь к этой статье Как установить FFMPEG на EC2 под управлением Amazon Linux? | Вивек Маскара | Средний для установки ffmpeg.

После установки ffmpeg, чтобы экспортировать его в наш путь, используйте

export PATH=$PATH:<path where you installed fffmpeg>

Теперь установите тензорный поток

sudo python3 -m pip install --no-cache-dir tensorflow==2.2.0 grpcio==1.24

Мы установили все необходимые пакеты.

8. Создайте репозиторий GitHub, добавьте все необходимые файлы в репозиторий GitHub, включая веса моделей, модель json, скрипт python для приложения. Клонируйте этот репозиторий в свой экземпляр amazon EC2, используя следующее.

git clone https://github.com/username/repository_name.git

9. Измените каталог в репозиторий, который вы только что клонировали, и запустите скрипт python с кодом для приложения.

streamlit run script_name.py --server.port 8501

Доступ к вашему веб-приложению с помощью внешнего URL-адреса, вуаля! Вы только что развернули приложение с помощью Amazon EC2 Instance.

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

tmux new -s StreamSession

Это создаст сеанс tmux, и внутри этого сеанса введите команду, указанную в пункте 9. После этого сначала нажмите Ctrl + b, а затем d, чтобы отключиться от сеанса tmux. Теперь вы можете получить доступ к веб-приложению в любое время, даже после закрытия терминала :).

Вы только что развернули свое приложение, и теперь любой может получить к нему доступ и использовать его, и, конечно же, вы можете показать его своим друзьям 😃.

Вывод

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

Ниже приведены скриншоты разработанного мной веб-приложения.

Вы можете посетить веб-приложение по адресу приложение для распознавания жанров музыки · Streamlit (ec2–3–134–82–239.us-east-2.compute.amazonaws.com)

Пожалуйста, дайте мне знать, если вы сочтете это полезным или нет. Мне всегда нравятся честные отзывы!

Найдите здесь репозиторий GitHub, связанный с этой статьей.

KunalVaidya99 / Классификация музыкальных жанров: приложение для распознавания музыкальных жанров с точностью 89%. (github.com)

использованная литература

  1. Как развернуть приложения Streamlit на AWS Ec2 - JCharisTech
  2. «Как установить FFMPEG на EC2 под управлением Amazon Linux? | Вивек Маскара | Середина"
  3. Справочник по API - документация Streamlit 0.76.0