Apple делает машинное обучение доступным для всех. Благодаря последним достижениям в CoreML 3 и новому приложению CreateML очень легко сделать ваши приложения умнее. В этом посте мы создадим приложение, которое будет определять музыкальные инструменты в песнях.

Https://www.youtube.com/watch?v=T-TUhxC4WsY&feature=emb_title

В видео использованы следующие песни: U2 - Иногда ты не можешь сделать это самостоятельно, Pink Floyd - Comfortably numb и Coldplay - Christmas Lights. Не стесняйтесь пробовать его с другими и оставлять отзывы.

Создать ML

CreateML был анонсирован в прошлом году как инструмент Swift, помогающий создавать модели машинного обучения. До этого года вам придется делать модели на игровой площадке, написав код Swift. Однако в этом году появилось новое приложение CreateML, поставляемое с Xcode 11 (для его использования требуется macOS Catalina). Он доступен в Xcode - ›Open Developer Tool -› Create ML.

Чтобы начать работу с Create ML, создайте новый проект. Для начала доступны несколько шаблонов, таких как классификация изображений, обнаружение объектов, классификации текста, классификация звуков и т. Д.

Очевидно, нам понадобится звуковой классификатор. Выберите его и дайте название проекту. Мой назывался MySoundClassifier по умолчанию.

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

Данные обучения

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

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

В разделе «Ввод данных» в разделе «Данные для обучения» добавьте папку для обучения сверху. Для данных проверки оставьте это автоматически.

Нажав кнопку воспроизведения, вы можете начать обучение модели. Для меня это длилось около 12 минут.

Пройдемся по обнаруженным метрикам. Во-первых, Create ML правильно определил, что существует 11 классов для этой проблемы классификации звуков. Затем у нас есть обучение и проверка точности. Для меня это 93% и 73% соответственно.

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

Данные тестирования

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

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

require 'fileutils'
parts.each do |part|
   Dir.entries(part).select { |f|
   if File.extname(f) == ".txt"
       basename = File.basename(f, ".txt")
       filePath = "#{part}/#{f}"
       File.readlines(filePath).each do |line|
       testDir = "test"
       Dir.mkdir(testDir) unless File.exists?(testDir)
       directoryPath = "#{testDir}/#{line}".strip!
       Dir.mkdir(directoryPath) unless File.exists?(directoryPath)
       audioFile = "#{part}/#{basename}.wav"
       FileUtils.cp(audioFile, directoryPath)
   end
end
}
end

Зайдите в свой терминал и запустите скрипт (назовем его организовать.rb) в корневой папке, где расположены три подпапки с данными тестирования: ruby ​​organization.rb.

В случае успеха вы увидите новую папку под названием test с одиннадцатью подпапками для классов для тестирования. Добавьте те, которые в тестировании находятся в Create ML. Для меня точность составила около 40%, что далеко от идеала, но это хорошая отправная точка.

Вы можете легко экспортировать модель Core ML, перетащив ее из Create ML в проект iOS.

Разберем содержимое созданной модели. Как видите, это предварительная обработка звукового анализа, затем нейронная сеть и затем классификатор GLM. Create ML разобрался во всех этих вещах самостоятельно, мы ничего не указали. Его размер довольно небольшой, около 5,5 МБ, хотя данных для обучения и тестирования было более 10 ГБ.

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

Но как мы собираемся преобразовать данные из пользовательской записи в этот многомерный массив?

SoundAnalysis

К счастью, Apple позаботилась и об этом. SoundAnalysis - это новый фреймворк из iOS 13, который принимает аудиопоток и использует его в запросе классификации для Core ML. Он выполняет все необходимые преобразования, чтобы использовать его в прогнозировании Core ML.

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

private func startAudioEngine() {
audioEngine.prepare()
do {
try audioEngine.start()
} catch {
showAudioError()
}
}
private func prepareForRecording() {
let inputNode = audioEngine.inputNode
let recordingFormat = inputNode.outputFormat(forBus: 0)
streamAnalyzer = SNAudioStreamAnalyzer(format: recordingFormat)
inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) {
[unowned self] (buffer, when) in
self.queue.async {
self.streamAnalyzer.analyze(buffer,
atAudioFramePosition: when.sampleTime)
}
}
startAudioEngine()
}

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

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

private func createClassificationRequest() {
do {
let request = try SNClassifySoundRequest(mlModel: soundClassifier.model)
try streamAnalyzer.add(request, withObserver: self)
} catch {
fatalError("error adding the classification request")
}
}

Как мы обрабатываем результаты? Как вы можете видеть выше, мы устанавливаем
(в данном случае ViewController) в качестве наблюдателя анализатора потока. Это означает, что нам придется реализовать протокол - SNResultsObserving.

extension ViewController: SNResultsObserving {
func request(_ request: SNRequest, didProduce result: SNResult) {
guard let result = result as? SNClassificationResult else { return }
var temp = [(label: String, confidence: Float)]()
let sorted = result.classifications.sorted { (first, second) -> Bool in
return first.confidence > second.confidence
}
for classification in sorted {
let confidence = classification.confidence * 100
if confidence > 5 {
temp.append((label: classification.identifier, confidence: Float(confidence)))
}
}
results = temp
}
}

Метод делегата возвращается как SNClassificationResult каждый раз, когда что-то классифицируется. Это вызывается много раз в секунду. Что мы делаем, так это то, что сначала сортируем результаты, фильтруем их и преобразуем, чтобы они были представлены в виде таблицы.

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

Подводя итог, можно сказать, что добавить машинное обучение проще с Create ML и его многочисленными шаблонами для нескольких задач ML. Результаты классификации удовлетворительны, но есть что улучшить. Во-первых, нужно добавить больше инструментов, потому что теперь, если что-то не распознается, оно классифицируется неправильно.

Что вы думаете об этом? Вы уже пробовали классификацию звуков? Есть ли у вас какие-нибудь интересные варианты использования? Напишите свои мысли и комментарии в разделе ниже.

Первоначально опубликовано на http://martinmitrevski.com 9 декабря 2019 г.