Никогда еще не было так просто переводить примечания к ABC-нотации!

Сферы машинного обучения и глубокого обучения претерпели огромные изменения за последние несколько лет и привели к появлению множества полезных приложений во многих областях. Одна из областей, представляющих интерес, - это оптическое распознавание музыки (OMR). Согласно Википедии, OMR - это область исследований, в которой изучается, как с помощью вычислений читать нотную запись в документах. Цель OMR - научить компьютер читать и интерпретировать ноты и создавать машиночитаемую версию нот. Так что давайте сделаем это!

Краткий ускоренный курс по музыке

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

Испытав этот процесс на себе, я решил, что было бы замечательно, если бы я мог создать веб-приложение, которое могло бы автоматически переводить ноты в нотацию ABC и аннотировать буквы ABC на нотной записи!

Модель глубокого обучения

Так начался мой поиск подходящей архитектуры глубокого обучения, которая могла бы выполнить эту задачу. До этого у меня не было большого опыта работы с моделями оптического распознавания, поэтому я не был уверен, будет ли проводиться какая-либо работа по этой теме. К своему удивлению, я обнаружил замечательную исследовательскую статью, опубликованную Кальво-Сарагосой и др. в 2018 году под заголовком Сквозное нейрооптическое распознавание музыки монофонических партитур в журнале Applied Sciences Journal. Они даже создали набор данных: Печатные изображения нотных нот (PrIMuS), содержащий более 80 000 реальных партитур в обычной западной нотации!

Модель, предложенная Calvo-Zaragoza et al. состояла из сверточной нейронной сети (CNN) для извлечения признаков из входного изображения, за которой следовала двунаправленная сеть с долговременной краткосрочной памятью (BLSTM) для работы с последовательностями, при этом один штат считался одной последовательностью. Выход последнего уровня CNN подключен к входу первого уровня BLSTM, образуя сверточную рекуррентную нейронную сеть (CRNN). Исследователи использовали специальную функцию потерь, функцию потерь Connectionist Temporal Classification (CTC), которая предоставляет средства для оптимизации параметров CRNN так, чтобы она давала правильную последовательность y при заданном входном x. Здесь вход x представляет собой изображение одного нотоносца, а y - соответствующая ему последовательность музыкальных символов.

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

Для получения дополнительной информации об архитектуре CRNN и подробностях эксперимента ознакомьтесь с их статьей здесь для получения дополнительной информации.

Развертывание в Интернете

Если вы просто хотите перейти к коду, нажмите здесь.

Хорошо, теперь, когда мы вкратце ознакомились с архитектурой модели, пришло время для реализации! Исследователи загрузили свои модели, реализованные в Tensorflow, и код на Github. На основе этого я смог быстро настроить модель и подготовиться к ее развертыванию в Интернете. Во-первых, убедитесь, что у вас установлены tenorflow v1, flask и OpenCV. Затем загрузите семантическую модель, обученную исследователями, а также семантический словарь. Также скачайте шрифт Aaargh.ttf, так как он нужен для аннотирования изображения ABC-нотацией. (Если вы хотите обучить модель самостоятельно, перейдите к модели тензорного потока Репозиторий Github для получения инструкций и загрузите Набор данных PrIMuS). Семантический словарь - это, по сути, словарь, который отображает целочисленное представление в фактическую заметку, например, как индекс 348 дает вам note-A2_quarter. Однако, поскольку словарь модели содержит намного больше информации, чем необходимо (например, размер, штриховая линия и т. Д.), Которую не нужно аннотировать, поскольку игрок может просто увидеть ее на самой партитуре, не требуя каких-либо музыкальных знаний, Я обработал выходные данные модели, чтобы включить только буквы ABC со следующим кодом:

notes=[]
 for i in array_of_notes: // array_of_notes contains the full output
 if i[0:5]==”note-”:
 if not i[6].isdigit():
 notes.append(i[5:7])
 else:
 notes.append(i[5])

К счастью, все примечания были отмечены «note-» в качестве первых 5 символов, поэтому было легко взять только те, которые относятся к буквам ABC.

Что делает веб-приложение?

Получив массив, содержащий соответствующие заметки, я затем использовал библиотеку PIL (Python Imaging Library) для аннотирования заметок на самом изображении. Это включало создание нового полностью белого изображения той же ширины и в 1,5 раза превышающей высоту исходного изображения, чтобы расширить исходное изображение. Затем я скопировал исходное изображение на белое изображение с помощью функции Image.paste (). Расширив исходное изображение пустым пространством ниже, я мог затем напечатать буквы ABC, чтобы они шли под нотным станом.

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

На основе предоставленного исследователями кода tensorflow pred.py я реализовал свое веб-приложение с помощью Flask. Flask - это действительно удобный фреймворк для веб-приложений, который позволяет каждому переносить свой код Python в веб-приложение в кратчайшие сроки. Все, что требуется Flask, - это ваш основной код на Python, файлы html и шаблоны css, и все готово!

Взгляд на Flask внимательнее

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

app = Flask(__name__) 

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

if __name__==”__main__”:
 app.run()

Когда python запускает файл, он присваивает скрипту имя "__main__". Следовательно, __name == "__main__" удовлетворен, и app.run () выполняется. После этого вам нужно будет определить некоторые функции и сопоставить их с некоторыми маршрутами, например, определить, как пользователь будет перенаправлен / предсказывать, содержащий аннотированный музыкальный лист, после того, как он загрузит музыкальный лист. Ознакомьтесь с документацией Flask и моим кодом для получения дополнительной информации.

Последние штрихи

Теперь, когда файл python настроен правильно, все, что осталось, - это файлы html и файлы css. Структура папок обычно следующая:

app.py
├── templates
|   ├── html files here
├── static
|   ├── css
|        └── css files here

В этом проекте веб-сайт стилизован под bulma, отличный CSS-фреймворк с открытым исходным кодом, который я настоятельно рекомендую всем! Он прост в использовании, не требует большого количества Javascript и выглядит действительно хорошо.

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

app.py
vocabulary_semantic.txt
Aaargh.ttf
├── Semantic-Model
|   ├── semantic_model.meta
|   └── semantic_model.index
|   └── semantic_model.data-00000-of-00001
├── templates
|   ├── index.html
|   └── result.html
├── static
|   ├── css
|        └── bulma.min.css

Вот и все! Как только все будет настроено, как указано выше, перейдите в терминал / командную строку. Измените каталог на каталог с вашим app.py файлом и запустите python app.py. Подождите несколько секунд, и вы должны получить сообщение о ссылке, по которой вы должны перейти, чтобы просмотреть веб-приложение. Перейдите по URL-адресу, загрузите свой музыкальный лист и получите результат! Аннотированный лист будет сохранен в том же каталоге, что и ваш app.py файл.

Обратите внимание, что в настоящее время модель может работать только с монодическими партитурами (партитурами, состоящими из одной мелодической линии). Так что не ставьте ему слишком сложные оценки!

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

Эта статья также была опубликована здесь в моем блоге.