Нейронная сеть YAMNet
Загрузите и разархивируйте модель Audio Toolbox™ для YAMNet.
Тип yamnet
в Командном окне. Если модель Audio Toolbox для YAMNet не установлена, то функция предоставляет ссылку на расположение весов сети. Чтобы скачать модель, щелкните ссылку. Разархивируйте файл в местоположении по пути MATLAB.
Также выполните следующие команды, чтобы загрузить и разархивировать модель YAMNet во временную директорию.
downloadFolder = fullfile(tempdir,'YAMNetDownload'); loc = websave(downloadFolder,'https://ssd.mathworks.com/supportfiles/audio/yamnet.zip'); YAMNetLocation = tempdir; unzip(loc,YAMNetLocation) addpath(fullfile(YAMNetLocation,'yamnet'))
Проверьте успешность установки путем ввода yamnet
в Командном окне. Если сеть установлена, то функция возвращает SeriesNetwork
(Deep Learning Toolbox) объект.
yamnet
ans = SeriesNetwork with properties: Layers: [86×1 nnet.cnn.layer.Layer] InputNames: {'input_1'} OutputNames: {'Sound'}
Загрузите предварительно обученную сверточную нейронную сеть YAMNet и исследуйте слои и классы.
Использование yamnet
для загрузки предварительно обученной сети YAMNet. Выход сеть является SeriesNetwork
(Deep Learning Toolbox) объект.
net = yamnet
net = SeriesNetwork with properties: Layers: [86×1 nnet.cnn.layer.Layer] InputNames: {'input_1'} OutputNames: {'Sound'}
Просмотрите сетевую архитектуру с помощью Layers
свойство. Сеть имеет 86 слоев. Существует 28 слоев с усвояемыми весами: 27 сверточных слоев и 1 полносвязный слой.
net.Layers
ans = 86x1 Layer array with layers: 1 'input_1' Image Input 96×64×1 images 2 'conv2d' Convolution 32 3×3×1 convolutions with stride [2 2] and padding 'same' 3 'b' Batch Normalization Batch normalization with 32 channels 4 'activation' ReLU ReLU 5 'depthwise_conv2d' Grouped Convolution 32 groups of 1 3×3×1 convolutions with stride [1 1] and padding 'same' 6 'L11' Batch Normalization Batch normalization with 32 channels 7 'activation_1' ReLU ReLU 8 'conv2d_1' Convolution 64 1×1×32 convolutions with stride [1 1] and padding 'same' 9 'L12' Batch Normalization Batch normalization with 64 channels 10 'activation_2' ReLU ReLU 11 'depthwise_conv2d_1' Grouped Convolution 64 groups of 1 3×3×1 convolutions with stride [2 2] and padding 'same' 12 'L21' Batch Normalization Batch normalization with 64 channels 13 'activation_3' ReLU ReLU 14 'conv2d_2' Convolution 128 1×1×64 convolutions with stride [1 1] and padding 'same' 15 'L22' Batch Normalization Batch normalization with 128 channels 16 'activation_4' ReLU ReLU 17 'depthwise_conv2d_2' Grouped Convolution 128 groups of 1 3×3×1 convolutions with stride [1 1] and padding 'same' 18 'L31' Batch Normalization Batch normalization with 128 channels 19 'activation_5' ReLU ReLU 20 'conv2d_3' Convolution 128 1×1×128 convolutions with stride [1 1] and padding 'same' 21 'L32' Batch Normalization Batch normalization with 128 channels 22 'activation_6' ReLU ReLU 23 'depthwise_conv2d_3' Grouped Convolution 128 groups of 1 3×3×1 convolutions with stride [2 2] and padding 'same' 24 'L41' Batch Normalization Batch normalization with 128 channels 25 'activation_7' ReLU ReLU 26 'conv2d_4' Convolution 256 1×1×128 convolutions with stride [1 1] and padding 'same' 27 'L42' Batch Normalization Batch normalization with 256 channels 28 'activation_8' ReLU ReLU 29 'depthwise_conv2d_4' Grouped Convolution 256 groups of 1 3×3×1 convolutions with stride [1 1] and padding 'same' 30 'L51' Batch Normalization Batch normalization with 256 channels 31 'activation_9' ReLU ReLU 32 'conv2d_5' Convolution 256 1×1×256 convolutions with stride [1 1] and padding 'same' 33 'L52' Batch Normalization Batch normalization with 256 channels 34 'activation_10' ReLU ReLU 35 'depthwise_conv2d_5' Grouped Convolution 256 groups of 1 3×3×1 convolutions with stride [2 2] and padding 'same' 36 'L61' Batch Normalization Batch normalization with 256 channels 37 'activation_11' ReLU ReLU 38 'conv2d_6' Convolution 512 1×1×256 convolutions with stride [1 1] and padding 'same' 39 'L62' Batch Normalization Batch normalization with 512 channels 40 'activation_12' ReLU ReLU 41 'depthwise_conv2d_6' Grouped Convolution 512 groups of 1 3×3×1 convolutions with stride [1 1] and padding 'same' 42 'L71' Batch Normalization Batch normalization with 512 channels 43 'activation_13' ReLU ReLU 44 'conv2d_7' Convolution 512 1×1×512 convolutions with stride [1 1] and padding 'same' 45 'L72' Batch Normalization Batch normalization with 512 channels 46 'activation_14' ReLU ReLU 47 'depthwise_conv2d_7' Grouped Convolution 512 groups of 1 3×3×1 convolutions with stride [1 1] and padding 'same' 48 'L81' Batch Normalization Batch normalization with 512 channels 49 'activation_15' ReLU ReLU 50 'conv2d_8' Convolution 512 1×1×512 convolutions with stride [1 1] and padding 'same' 51 'L82' Batch Normalization Batch normalization with 512 channels 52 'activation_16' ReLU ReLU 53 'depthwise_conv2d_8' Grouped Convolution 512 groups of 1 3×3×1 convolutions with stride [1 1] and padding 'same' 54 'L91' Batch Normalization Batch normalization with 512 channels 55 'activation_17' ReLU ReLU 56 'conv2d_9' Convolution 512 1×1×512 convolutions with stride [1 1] and padding 'same' 57 'L92' Batch Normalization Batch normalization with 512 channels 58 'activation_18' ReLU ReLU 59 'depthwise_conv2d_9' Grouped Convolution 512 groups of 1 3×3×1 convolutions with stride [1 1] and padding 'same' 60 'L101' Batch Normalization Batch normalization with 512 channels 61 'activation_19' ReLU ReLU 62 'conv2d_10' Convolution 512 1×1×512 convolutions with stride [1 1] and padding 'same' 63 'L102' Batch Normalization Batch normalization with 512 channels 64 'activation_20' ReLU ReLU 65 'depthwise_conv2d_10' Grouped Convolution 512 groups of 1 3×3×1 convolutions with stride [1 1] and padding 'same' 66 'L111' Batch Normalization Batch normalization with 512 channels 67 'activation_21' ReLU ReLU 68 'conv2d_11' Convolution 512 1×1×512 convolutions with stride [1 1] and padding 'same' 69 'L112' Batch Normalization Batch normalization with 512 channels 70 'activation_22' ReLU ReLU 71 'depthwise_conv2d_11' Grouped Convolution 512 groups of 1 3×3×1 convolutions with stride [2 2] and padding 'same' 72 'L121' Batch Normalization Batch normalization with 512 channels 73 'activation_23' ReLU ReLU 74 'conv2d_12' Convolution 1024 1×1×512 convolutions with stride [1 1] and padding 'same' 75 'L122' Batch Normalization Batch normalization with 1024 channels 76 'activation_24' ReLU ReLU 77 'depthwise_conv2d_12' Grouped Convolution 1024 groups of 1 3×3×1 convolutions with stride [1 1] and padding 'same' 78 'L131' Batch Normalization Batch normalization with 1024 channels 79 'activation_25' ReLU ReLU 80 'conv2d_13' Convolution 1024 1×1×1024 convolutions with stride [1 1] and padding 'same' 81 'L132' Batch Normalization Batch normalization with 1024 channels 82 'activation_26' ReLU ReLU 83 'global_average_pooling2d' Global Average Pooling Global average pooling 84 'dense' Fully Connected 521 fully connected layer 85 'softmax' Softmax softmax 86 'Sound' Classification Output crossentropyex with 'Speech' and 520 other classes
Чтобы просмотреть имена классов, выученных сетью, можно просмотреть Classes
свойство выходного слоя классификации (конечного слоя). Просмотрите первые 10 классов, задав первые 10 элементов.
net.Layers(end).Classes(1:10)
ans = 10×1 categorical
Speech
Child speech, kid speaking
Conversation
Narration, monologue
Babbling
Speech synthesizer
Shout
Bellow
Whoop
Yell
Использование analyzeNetwork
(Deep Learning Toolbox), чтобы визуально исследовать сеть.
analyzeNetwork(net)
YAMNet был выпущен с соответствующей онтологией класса звука, которую можно исследовать с помощью yamnetGraph
объект.
ygraph = yamnetGraph;
p = plot(ygraph);
layout(p,'layered')
График онтологии строит графики всех 521 возможных классов звука. Постройте подграфик звуков, относящихся к дыхательным звукам.
allRespiratorySounds = dfsearch(ygraph,"Respiratory sounds");
ygraphSpeech = subgraph(ygraph,allRespiratorySounds);
plot(ygraphSpeech)
Сеть YAMNet требует от вас предварительной обработки и извлечения функций из аудиосигналов путем преобразования их в частоту дискретизации, на которой обучалась сеть, и последующего извлечения перекрывающихся логарифмических спектрограмм. Этот пример проходит необходимую предварительную обработку и редукции данных, необходимые для соответствия предварительной обработки и редукции данных, используемых для обучения YAMNet. The classifySound
функция выполняет эти шаги для вас.
Считайте аудиосигнал, чтобы классифицировать его. Повторно отобразите аудиосигнал на 16 кГц и затем преобразуйте его в одинарную точность.
[audioIn,fs0] = audioread('Counting-16-44p1-mono-15secs.wav');
fs = 16e3;
audioIn = resample(audioIn,fs,fs0);
audioIn = single(audioIn);
Задайте параметры mel spectrogram и затем извлеките функции с помощью melSpectrogram
функция.
FFTLength = 512; numBands = 64; frequencyRange = [125 7500]; windowLength = 0.025*fs; overlapLength = 0.015*fs; melSpect = melSpectrogram(audioIn,fs, ... 'Window',hann(windowLength,'periodic'), ... 'OverlapLength',overlapLength, ... 'FFTLength',FFTLength, ... 'FrequencyRange',frequencyRange, ... 'NumBands',numBands, ... 'FilterBankNormalization','none', ... 'WindowNormalization',false, ... 'SpectrumType','magnitude', ... 'FilterBankDesignDomain','warped');
Преобразуйте спектрограмму mel в шкалу журнала.
melSpect = log(melSpect + single(0.001));
Переориентировать mel spectrogram так, чтобы время было вдоль первой размерности как строки.
melSpect = melSpect.'; [numSTFTWindows,numBands] = size(melSpect)
numSTFTWindows = 1551
numBands = 64
Разбейте спектрограмму на системы координат длины 96 с перекрытием 48. Расположите системы координат вдоль четвертой размерности.
frameWindowLength = 96; frameOverlapLength = 48; hopLength = frameWindowLength - frameOverlapLength; numHops = floor((numSTFTWindows - frameWindowLength)/hopLength) + 1; frames = zeros(frameWindowLength,numBands,1,numHops,'like',melSpect); for hop = 1:numHops range = 1 + hopLength*(hop-1):hopLength*(hop - 1) + frameWindowLength; frames(:,:,1,hop) = melSpect(range,:); end
Создайте сеть YAMNet.
net = yamnet();
Классифицируйте спектрограммные изображения.
classes = classify(net,frames);
Классифицируйте аудиосигнал как наиболее часто встречающийся звук.
mySound = mode(classes)
mySound = categorical
Speech
Загрузите и разархивируйте набор данных компрессора воздуха [1]. Этот набор данных состоит из записей с воздушных компрессоров в исправном состоянии или одном из 7 дефектных состояний.
url = 'https://www.mathworks.com/supportfiles/audio/AirCompressorDataset/AirCompressorDataset.zip'; downloadFolder = fullfile(tempdir,'aircompressordataset'); datasetLocation = tempdir; if ~exist(fullfile(tempdir,'AirCompressorDataSet'),'dir') loc = websave(downloadFolder,url); unzip(loc,fullfile(tempdir,'AirCompressorDataSet')) end
Создайте audioDatastore
объект для управления данными и разделения их на train и валидации.
ads = audioDatastore(downloadFolder,'IncludeSubfolders',true,'LabelSource','foldernames'); [adsTrain,adsValidation] = splitEachLabel(ads,0.8,0.2);
Считайте аудио файла из datastore и сохраните частоту дискретизации для дальнейшего использования. Сбросьте datastore, чтобы вернуть указатель на чтение в начало набора данных. Прослушайте аудиосигнал и постройте график сигнала во временном интервале.
[x,fileInfo] = read(adsTrain); fs = fileInfo.SampleRate; reset(adsTrain) sound(x,fs) figure t = (0:size(x,1)-1)/fs; plot(t,x) xlabel('Time (s)') title('State = ' + string(fileInfo.Label)) axis tight
Создайте audioFeatureExtractor
объект для извлечения спектра Корка из аудиосигналов. Используйте то же окно, длину перекрытия, частотную область значений и количество полос, на которых обучалась YAMNet. В зависимости от передачи обучения задачи можно более или менее изменить функции входа из входа функций, на которых обучалась YAMNet.
afe = audioFeatureExtractor('SampleRate',fs, ... 'Window',hann(0.025*fs,'periodic'), ... 'OverlapLength',round(0.015*fs), ... 'barkSpectrum',true); setExtractorParams(afe,'barkSpectrum','NumBands',64);
Извлеките спектрограммы коры из train. Существует несколько спектрограмм Корка для каждого аудиосигнала. Тиражируйте метки так, чтобы они находились в взаимном соответствии со спектрограммами.
numSpectrumsPerSpectrogram = 96; numSpectrumsOverlapBetweenSpectrograms = 48; numSpectrumsHopBetweenSpectrograms = numSpectrumsPerSpectrogram - numSpectrumsOverlapBetweenSpectrograms; emptyLabelVector = adsTrain.Labels; emptyLabelVector(:) = []; trainFeatures = []; trainLabels = emptyLabelVector; while hasdata(adsTrain) [audioIn,fileInfo] = read(adsTrain); features = extract(afe,audioIn); features = log10(features + single(0.001)); [numSpectrums,numBands] = size(features); numSpectrograms = floor((numSpectrums - numSpectrumsPerSpectrogram)/numSpectrumsHopBetweenSpectrograms) + 1; for hop = 1:numSpectrograms range = 1 + numSpectrumsHopBetweenSpectrograms*(hop-1):numSpectrumsHopBetweenSpectrograms*(hop-1) + numSpectrumsPerSpectrogram; trainFeatures = cat(4,trainFeatures,features(range,:)); trainLabels = cat(1,trainLabels,fileInfo.Label); end end
Извлеките функции из набора валидации и реплицируйте метки.
validationFeatures = []; validationLabels = emptyLabelVector; while hasdata(adsValidation) [audioIn,fileInfo] = read(adsValidation); features = extract(afe,audioIn); features = log10(features + single(0.001)); [numSpectrums,numBands] = size(features); numSpectrograms = floor((numSpectrums - numSpectrumsPerSpectrogram)/numSpectrumsHopBetweenSpectrograms) + 1; for hop = 1:numSpectrograms range = 1 + numSpectrumsHopBetweenSpectrograms*(hop-1):numSpectrumsHopBetweenSpectrograms*(hop-1) + numSpectrumsPerSpectrogram; validationFeatures = cat(4,validationFeatures,features(range,:)); validationLabels = cat(1,validationLabels,fileInfo.Label); end end
Набор данных компрессора воздуха имеет только восемь классов. Прочитайте в YAMNet, преобразуйте его в layerGraph
(Deep Learning Toolbox), а затем замените окончательный fullyConnectedLayer
(Deep Learning Toolbox) и окончательный classificationLayer
(Deep Learning Toolbox), чтобы отразить новую задачу.
uniqueLabels = unique(adsTrain.Labels); numLabels = numel(uniqueLabels); net = yamnet; lgraph = layerGraph(net.Layers); newDenseLayer = fullyConnectedLayer(numLabels,"Name","dense"); lgraph = replaceLayer(lgraph,"dense",newDenseLayer); newClassificationLayer = classificationLayer("Name","Sounds","Classes",uniqueLabels); lgraph = replaceLayer(lgraph,"Sound",newClassificationLayer);
Чтобы определить опции обучения, используйте trainingOptions
(Deep Learning Toolbox).
miniBatchSize = 128; validationFrequency = floor(numel(trainLabels)/miniBatchSize); options = trainingOptions('adam', ... 'InitialLearnRate',3e-4, ... 'MaxEpochs',2, ... 'MiniBatchSize',miniBatchSize, ... 'Shuffle','every-epoch', ... 'Plots','training-progress', ... 'Verbose',false, ... 'ValidationData',{single(validationFeatures),validationLabels}, ... 'ValidationFrequency',validationFrequency);
Для обучения сети используйте trainNetwork
(Deep Learning Toolbox).
trainNetwork(single(trainFeatures),trainLabels,lgraph,options);
Ссылки
[1] Verma, Nishchal K., et al. «Интеллектуальный мониторинг на основе условий с использованием акустических сигналов для воздушных компрессоров». Сделки IEEE по надежности, том 65, № 1, Мар. 2016, стр. 291-309. DOI.org (Crossref), doi:10.1109/TR.2015.2459684.
net
- Предварительно обученная нейронная сеть YAMNetSeriesNetwork
объектПредварительно обученная нейронная сеть YAMNet, возвращенная как SeriesNetwork
(Deep Learning Toolbox) объект.
[1] Gemmeke, Jort F., et al. «Audio Set: An Ontology and Human-Labeled Dataset for Audio Events». 2017 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP), IEEE, 2017, pp. 776-80. DOI.org (Crossref), doi:10.1109/ICASSP.2017.7952261.
[2] Hershey, Shawn, et al. «Архитектуры CNN для Крупномасштабной Аудио Классификации». Международная конференция IEEE 2017 года по вопросам Акустики, Речи и Сигнала, Обрабатывающего (ICASSP), IEEE, 2017, стр 131-35. DOI.org (Crossref), doi:10.1109/ICASSP.2017.7952132.
Указания и ограничения по применению:
Только activations
и predict
поддерживаются функции объекта.
Как создать SeriesNetwork
объект для генерации кода см. Загрузку предварительно обученных сетей для генерации кода (MATLAB Coder).
Указания и ограничения по применению:
Только activations
, classify
, predict
, predictAndUpdateState
, и resetState
поддерживаются функции объекта.
Как создать SeriesNetwork
объект для генерации кода см. Загрузку предварительно обученных сетей для генерации кода (GPU Coder).
audioFeatureExtractor
| classifySound
| designAuditoryFilterBank
| melSpectrogram
| vggish
| yamnetGraph
| yamnetPreprocess
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.